50#include "match_string.h"
65char *commandline_option[N_OPTIONS] = {
75 "sddsregroup [<inputfile>] [<outputfile>]\n"
76 " [-pipe=[input][,output]]\n"
77 " [-newparameters=<oldcolumnname>[,...]]\n"
78 " [-newcolumns=<oldparametername>[,...]]\n"
81 " [-majorOrder=row|column]\n"
82 "Reorganizes the data in the input file by taking single rows from each page of the input file\n"
83 "to form single pages of the output file.\n\n"
85 " -pipe=[input][,output] Read input from and/or write output to a pipe.\n"
86 " -newparameters=<col1>[,<col2>,...]\n"
87 " Specify which columns of the input file will become\n"
88 " parameters in the output file. By default, no new parameters\n"
89 " are created, and all columns of the input file are transferred\n"
90 " to the output file.\n"
91 " -newcolumns=<param1>[,<param2>,...]\n"
92 " Specify which parameters of the input file will become\n"
93 " columns in the output file. These columns will be duplicated\n"
94 " across all pages. By default, all parameter values are lost.\n"
95 " -majorOrder=row|column Specify the data order of the output file as row-major or column-major.\n"
96 " -warning Enable warning messages.\n"
97 " -verbose Enable verbose output.\n\n"
98 "Program by Louis Emery, ANL (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
100int main(
int argc,
char **argv) {
102 SDDS_TABLE inputPage, *inputPages, outputPage;
104 char *inputfile, *outputfile;
105 char *InputDescription, *InputContents;
106 char *OutputDescription, *OutputContents;
107 char **InputParameters, **InputColumns, **ColToParNames, **ParToColNames;
108 int32_t NInputParameters, NInputColumns;
109 long NColToPar, NParToCol, NColToCol;
110 int64_t NInputRows, NOutputRows;
111 long NInputPages, NOutputPages;
112 long *ColToColInputIndex, *ColToParInputIndex, *ParToColInputIndex;
113 long *ColToColOutputIndex, *ColToParOutputIndex, *ParToColOutputIndex;
114 long pageIncrement = 20;
121 unsigned long pipeFlags, majorOrderFlag;
122 long tmpfile_used, noWarnings;
123 short columnMajorOrder = -1;
128 argc =
scanargs(&s_arg, argc, argv);
132 inputfile = outputfile = NULL;
133 InputDescription = InputContents = NULL;
134 OutputDescription = OutputContents = NULL;
135 InputParameters = InputColumns = ColToParNames = ParToColNames = NULL;
136 NInputParameters = NInputColumns = NColToPar = NParToCol = NColToCol = 0;
137 NInputRows = NOutputRows = NInputPages = NOutputPages = 0;
138 ColToColInputIndex = ColToParInputIndex = ParToColInputIndex = NULL;
139 ColToColOutputIndex = ColToParOutputIndex = ParToColOutputIndex = NULL;
146 for (i_arg = 1; i_arg < argc; i_arg++) {
147 if (s_arg[i_arg].arg_type == OPTION) {
148 switch (
match_string(s_arg[i_arg].list[0], commandline_option, N_OPTIONS, UNIQUE_MATCH)) {
149 case CLO_MAJOR_ORDER:
151 s_arg[i_arg].n_items--;
152 if (s_arg[i_arg].n_items > 0 && (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
"row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
"column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
153 SDDS_Bomb(
"invalid -majorOrder syntax/values");
154 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
155 columnMajorOrder = 1;
156 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
157 columnMajorOrder = 0;
166 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
170 NParToCol = s_arg[i_arg].n_items - 1;
172 SDDS_Bomb(
"No old parameter names given");
174 ParToColNames = (
char **)malloc(NParToCol *
sizeof(
char *));
175 for (i = 0; i < NParToCol; i++) {
176 ParToColNames[i] = s_arg[i_arg].list[i + 1];
179 case CLO_NEWPARAMETERS:
180 NColToPar = s_arg[i_arg].n_items - 1;
184 ColToParNames = (
char **)malloc(NColToPar *
sizeof(
char *));
185 for (i = 0; i < NColToPar; i++) {
186 ColToParNames[i] = s_arg[i_arg].list[i + 1];
194 inputfile = s_arg[i_arg].list[0];
195 else if (!outputfile)
196 outputfile = s_arg[i_arg].list[0];
202 processFilenames(
"sddsregroup", &inputfile, &outputfile, pipeFlags, noWarnings, &tmpfile_used);
206 if (0 < SDDS_ReadTable(&inputPage))
210 InputDescription = InputContents = NULL;
214 ColToParInputIndex = (
long *)malloc(NColToPar *
sizeof(
long));
215 ColToParOutputIndex = (
long *)malloc(NColToPar *
sizeof(
long));
216 NColToCol = NInputColumns - NColToPar;
217 ColToColInputIndex = (
long *)malloc(NColToCol *
sizeof(
long));
218 ColToColOutputIndex = (
long *)malloc(NColToCol *
sizeof(
long));
219 ParToColInputIndex = (
long *)malloc(NParToCol *
sizeof(
long));
220 ParToColOutputIndex = (
long *)malloc(NParToCol *
sizeof(
long));
226 for (i = 0; i < NColToPar; i++) {
228 case SDDS_CHECK_NONEXISTENT:
229 fprintf(stderr,
"Error: Input file doesn't contain column %s.\n", ColToParNames[i]);
233 for (i = 0; i < NParToCol; i++) {
235 case SDDS_CHECK_NONEXISTENT:
236 fprintf(stderr,
"Error: Input file doesn't contain parameter %s.\n", ParToColNames[i]);
252 }
else if (!(NInputPages % pageIncrement)) {
253 inputPages = (
SDDS_TABLE *)realloc(inputPages, (NInputPages + pageIncrement) *
sizeof(
SDDS_TABLE));
256 fprintf(stderr,
"Error: Number of rows in pages are not all equal.\n");
261 if (!SDDS_CopyTable(&inputPages[NInputPages], &inputPage))
264 fprintf(stderr,
"Reading page %ld...\n", NInputPages);
268 }
while (0 < SDDS_ReadTable(&inputPage));
273 if (InputDescription) {
274 OutputDescription = (
char *)malloc((strlen(InputDescription) + strlen(
", regrouped") + 1) *
sizeof(
char));
275 OutputDescription = strcat(strcpy(OutputDescription, InputDescription),
", regrouped");
277 OutputDescription = (
char *)malloc((strlen(
"File regrouped") + strlen(inputfile ? inputfile :
"from pipe") + 1) *
sizeof(
char));
278 sprintf(OutputDescription,
"File %s regrouped", inputfile ? inputfile :
"from pipe");
281 OutputContents = (
char *)malloc((strlen(InputContents) + strlen(
", regrouped") + 1) *
sizeof(
char));
282 OutputContents = strcat(strcpy(OutputContents, InputContents),
", regrouped");
284 OutputContents = (
char *)malloc((strlen(
"File regrouped") + strlen(inputfile ? inputfile :
"from pipe") + 1) *
sizeof(
char));
285 sprintf(OutputContents,
"File %s regrouped", inputfile ? inputfile :
"from pipe");
287 if (!
SDDS_InitializeOutput(&outputPage, SDDS_BINARY, 0, OutputDescription, OutputContents, outputfile))
289 if (columnMajorOrder != -1)
290 outputPage.layout.data_mode.column_major = columnMajorOrder;
292 outputPage.layout.data_mode.column_major = inputPage.layout.data_mode.column_major;
300 for (i = 0; i < NColToPar; i++) {
309 for (i = 0; i < NParToCol; i++) {
319 for (i = 0; i < NInputColumns; i++) {
320 if (0 >
match_string(InputColumns[i], ColToParNames, NColToPar, EXACT_MATCH)) {
329 SDDS_Bomb(
"Error: Something went wrong with counting the columns. Report to author.");
335 NOutputPages = NInputRows;
336 NOutputRows = NInputPages;
337 for (ipage = 0; ipage < NOutputPages; ipage++) {
339 fprintf(stderr,
"Starting page %ld...\n", ipage);
340 SDDS_StartTable(&outputPage, NOutputRows);
342 for (i = 0; i < NColToPar; i++) {
347 for (i = 0; i < NParToCol; i++) {
349 for (row = 0; row < NOutputRows; row++) {
350 if (!
SDDS_SetRowValues(&outputPage, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, row, ParToColOutputIndex[i],
SDDS_GetParameter(&inputPages[row], InputParameters[ParToColInputIndex[i]], NULL), -1))
354 for (i = 0; i < NColToCol; i++) {
355 for (row = 0; row < NOutputRows; row++) {
361 if (!SDDS_WriteTable(&outputPage))
365 for (i = 0; i < NInputPages; i++) {
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_InitializeCopy(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, char *filename, char *filemode)
int32_t SDDS_SetRowValues(SDDS_DATASET *SDDS_dataset, int32_t mode, int64_t row,...)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_TransferColumnDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a column definition from a source dataset to a target dataset.
int32_t SDDS_DefineParameterLikeColumn(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Defines a parameter in the target dataset based on a column definition from the source dataset.
int32_t SDDS_DefineColumnLikeParameter(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Defines a column in the target dataset based on a parameter definition from the source dataset.
char ** SDDS_GetParameterNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all parameters in the SDDS dataset.
int32_t SDDS_GetParameterIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named parameter in the SDDS dataset.
int32_t SDDS_GetColumnIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named column in the SDDS dataset.
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CheckParameter(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a parameter exists in the SDDS dataset with the specified name, units, and type.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
long replaceFileAndBackUp(char *file, char *replacement)
Replaces a file with a replacement file and creates a backup of the original.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
long scanItemList(unsigned long *flags, char **item, long *items, unsigned long mode,...)
Scans a list of items and assigns values based on provided keywords and types.