93 {
94 SCANNED_ARG *s_arg;
96
97 char *inputfile, *outputfile;
98 char *InputDescription, *InputContents;
99 char *OutputDescription, *OutputContents;
100 char **InputParameters, **InputColumns, **ColToParNames, **ParToColNames;
101 int32_t NInputParameters, NInputColumns;
102 long NColToPar, NParToCol, NColToCol;
103 int64_t NInputRows, NOutputRows;
104 long NInputPages, NOutputPages;
105 long *ColToColInputIndex, *ColToParInputIndex, *ParToColInputIndex;
106 long *ColToColOutputIndex, *ColToParOutputIndex, *ParToColOutputIndex;
107 long pageIncrement = 20;
108
109 long i, i_arg, j;
110 long ipage;
111 int64_t row;
112 long verbose;
113
114 unsigned long pipeFlags, majorOrderFlag;
115 long tmpfile_used, noWarnings;
116 short columnMajorOrder = -1;
117
118 inputPages = NULL;
119
121 argc =
scanargs(&s_arg, argc, argv);
122 if (argc == 1)
124
125 inputfile = outputfile = NULL;
126 InputDescription = InputContents = NULL;
127 OutputDescription = OutputContents = NULL;
128 InputParameters = InputColumns = ColToParNames = ParToColNames = NULL;
129 NInputParameters = NInputColumns = NColToPar = NParToCol = NColToCol = 0;
130 NInputRows = NOutputRows = NInputPages = NOutputPages = 0;
131 ColToColInputIndex = ColToParInputIndex = ParToColInputIndex = NULL;
132 ColToColOutputIndex = ColToParOutputIndex = ParToColOutputIndex = NULL;
133
134 verbose = 0;
135
136 pipeFlags = 0;
137 tmpfile_used = 0;
138 noWarnings = 0;
139 for (i_arg = 1; i_arg < argc; i_arg++) {
140 if (s_arg[i_arg].arg_type == OPTION) {
141 switch (
match_string(s_arg[i_arg].list[0], commandline_option, N_OPTIONS, UNIQUE_MATCH)) {
142 case CLO_MAJOR_ORDER:
143 majorOrderFlag = 0;
144 s_arg[i_arg].n_items--;
145 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)))
146 SDDS_Bomb(
"invalid -majorOrder syntax/values");
147 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
148 columnMajorOrder = 1;
149 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
150 columnMajorOrder = 0;
151 break;
152 case CLO_VERBOSE:
153 verbose = 1;
154 break;
155 case CLO_WARNING:
156
157 break;
158 case CLO_PIPE:
159 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
161 break;
162 case CLO_NEWCOLUMNS:
163 NParToCol = s_arg[i_arg].n_items - 1;
164 if (!NParToCol) {
165 SDDS_Bomb(
"No old parameter names given");
166 }
167 ParToColNames = (char **)malloc(NParToCol * sizeof(char *));
168 for (i = 0; i < NParToCol; i++) {
169 ParToColNames[i] = s_arg[i_arg].list[i + 1];
170 }
171 break;
172 case CLO_NEWPARAMETERS:
173 NColToPar = s_arg[i_arg].n_items - 1;
174 if (!NColToPar) {
176 }
177 ColToParNames = (char **)malloc(NColToPar * sizeof(char *));
178 for (i = 0; i < NColToPar; i++) {
179 ColToParNames[i] = s_arg[i_arg].list[i + 1];
180 }
181 break;
182 default:
184 }
185 } else {
186 if (!inputfile)
187 inputfile = s_arg[i_arg].list[0];
188 else if (!outputfile)
189 outputfile = s_arg[i_arg].list[0];
190 else
192 }
193 }
194
195 processFilenames(
"sddsregroup", &inputfile, &outputfile, pipeFlags, noWarnings, &tmpfile_used);
196
199 if (0 < SDDS_ReadTable(&inputPage))
203 InputDescription = InputContents = NULL;
207 ColToParInputIndex = (long *)malloc(NColToPar * sizeof(long));
208 ColToParOutputIndex = (long *)malloc(NColToPar * sizeof(long));
209 NColToCol = NInputColumns - NColToPar;
210 ColToColInputIndex = (long *)malloc(NColToCol * sizeof(long));
211 ColToColOutputIndex = (long *)malloc(NColToCol * sizeof(long));
212 ParToColInputIndex = (long *)malloc(NParToCol * sizeof(long));
213 ParToColOutputIndex = (long *)malloc(NParToCol * sizeof(long));
214
215
216
217
218
219 for (i = 0; i < NColToPar; i++) {
221 case SDDS_CHECK_NONEXISTENT:
222 fprintf(stderr, "Error: Input file doesn't contain column %s.\n", ColToParNames[i]);
223 exit(EXIT_FAILURE);
224 }
225 }
226 for (i = 0; i < NParToCol; i++) {
228 case SDDS_CHECK_NONEXISTENT:
229 fprintf(stderr, "Error: Input file doesn't contain parameter %s.\n", ParToColNames[i]);
230 exit(EXIT_FAILURE);
231 }
232 }
233
234
235
236
237 NInputPages = 0;
238 if (verbose) {
239 init_stats();
240 }
241
242 do {
243 if (!NInputPages) {
245 } else if (!(NInputPages % pageIncrement)) {
246 inputPages = (
SDDS_TABLE *)realloc(inputPages, (NInputPages + pageIncrement) *
sizeof(
SDDS_TABLE));
247 }
249 fprintf(stderr, "Error: Number of rows in pages are not all equal.\n");
250 exit(EXIT_FAILURE);
251 }
254 if (!SDDS_CopyTable(&inputPages[NInputPages], &inputPage))
256 if (verbose) {
257 fprintf(stderr, "Reading page %ld...\n", NInputPages);
258 }
259
260 NInputPages++;
261 } while (0 < SDDS_ReadTable(&inputPage));
262
265
266 if (InputDescription) {
267 OutputDescription = (char *)malloc((strlen(InputDescription) + strlen(", regrouped") + 1) * sizeof(char));
268 OutputDescription = strcat(strcpy(OutputDescription, InputDescription), ", regrouped");
269 } else {
270 OutputDescription = (char *)malloc((strlen("File regrouped") + strlen(inputfile ? inputfile : "from pipe") + 1) * sizeof(char));
271 sprintf(OutputDescription, "File %s regrouped", inputfile ? inputfile : "from pipe");
272 }
273 if (InputContents) {
274 OutputContents = (char *)malloc((strlen(InputContents) + strlen(", regrouped") + 1) * sizeof(char));
275 OutputContents = strcat(strcpy(OutputContents, InputContents), ", regrouped");
276 } else {
277 OutputContents = (char *)malloc((strlen("File regrouped") + strlen(inputfile ? inputfile : "from pipe") + 1) * sizeof(char));
278 sprintf(OutputContents, "File %s regrouped", inputfile ? inputfile : "from pipe");
279 }
280 if (!
SDDS_InitializeOutput(&outputPage, SDDS_BINARY, 0, OutputDescription, OutputContents, outputfile))
282 if (columnMajorOrder != -1)
283 outputPage.layout.data_mode.column_major = columnMajorOrder;
284 else
285 outputPage.layout.data_mode.column_major = inputPage.layout.data_mode.column_major;
286
287
288
289
290
291
292
293 for (i = 0; i < NColToPar; i++) {
298 }
299
300
301
302 for (i = 0; i < NParToCol; i++) {
307 }
308
309
310
311 j = 0;
312 for (i = 0; i < NInputColumns; i++) {
313 if (0 >
match_string(InputColumns[i], ColToParNames, NColToPar, EXACT_MATCH)) {
318 j++;
319 }
320 }
321 if (j != NColToCol)
322 SDDS_Bomb(
"Error: Something went wrong with counting the columns. Report to author.");
325
326
327
328 NOutputPages = NInputRows;
329 NOutputRows = NInputPages;
330 for (ipage = 0; ipage < NOutputPages; ipage++) {
331 if (verbose)
332 fprintf(stderr, "Starting page %ld...\n", ipage);
333 SDDS_StartTable(&outputPage, NOutputRows);
334
335 for (i = 0; i < NColToPar; i++) {
338 }
339
340 for (i = 0; i < NParToCol; i++) {
341
342 for (row = 0; row < NOutputRows; row++) {
343 if (!
SDDS_SetRowValues(&outputPage, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, row, ParToColOutputIndex[i],
SDDS_GetParameter(&inputPages[row], InputParameters[ParToColInputIndex[i]], NULL), -1))
345 }
346 }
347 for (i = 0; i < NColToCol; i++) {
348 for (row = 0; row < NOutputRows; row++) {
351 }
352 }
353
354 if (!SDDS_WriteTable(&outputPage))
356 }
357
358 for (i = 0; i < NInputPages; i++) {
361 }
362 if (inputPages)
363 free(inputPages);
366
368 exit(EXIT_FAILURE);
369 return EXIT_SUCCESS;
370}
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.