103#define PARAMETER_MODE 1
106static char *mode_name[MODES] = {
112#define COLUMN_REPLACE 0
113#define PARAMETER_REPLACE 1
114#define ARRAY_REPLACE 2
115#define REPLACE_TYPES 3
116static char *replace_type[REPLACE_TYPES] = {
117 "column",
"parameter",
"array"};
119#define PARAMETER_TRANSFER 0
120#define ARRAY_TRANSFER 1
121#define TRANSFER_TYPES 2
122static char *transfer_type[TRANSFER_TYPES] = {
123 "parameter",
"array"};
134 char **new_parameter;
137 char **orig_parameter;
151long expandTransferRequests(
char ***match, int32_t *matches,
long type,
TRANSFER_DEFINITION *transfer,
157 EDIT_NAME_REQUEST *edit_array_request,
long edit_array_requests,
long filenumber);
159char **process_editnames(
char **orig_name,
long **orig_flags,
long orig_names,
EDIT_NAME_REQUEST *edit_request,
160 long edit_requests,
long filenumber);
162 REFDATA new_data,
long columns,
char *input2);
166typedef char *STRING_PAIR[2];
168char *option[N_OPTIONS] = {
169 "take",
"leave",
"match",
"equate",
"transfer",
"reuse",
"ifnot",
170 "nowarnings",
"ifis",
"pipe",
"fillin",
"rename",
"editnames",
"wildmatch",
"majorOrder",
"replace"};
174 " sddsxref [<input1>] <input2> [<input3>...] [<output>]\n\n"
176 " -pipe[=input][,output]\n"
177 " Enable piping. Optionally specify input and/or output streams.\n"
178 " -ifis={column|parameter|array},<name>[,...]\n"
179 " Specify names of parameters, arrays, or columns that must exist in <input1>.\n"
180 " -ifnot={parameter|column|array},<name>[,...]\n"
181 " Specify names of parameters, arrays, or columns that must not exist in <input1>.\n"
182 " -transfer={parameter|array},<name>[,...]\n"
183 " Specify parameters or arrays to transfer from <input2>.\n"
184 " -take=<column-name>[,...]\n"
185 " Specify columns to take from <input2>.\n"
186 " -leave=<column-name>[,...]\n"
187 " Specify columns not to take from <input2>. Overrides -take for specified columns.\n"
188 " Use -leave=* to exclude all columns.\n"
189 " -replace=column|parameter|array,<name list>\n"
190 " Replace specified columns, parameters, or arrays in <input1> with those from subsequent input files.\n"
192 " Fill in NULL and 0 values in rows where no match is found. By default, such rows are omitted.\n"
193 " -reuse[=[rows][,page]]\n"
194 " Allow reuse of rows from <input2>. Use -reuse=page to restrict to the first page of <input2>.\n"
195 " -match=<column-name>[=<column-name>]\n"
196 " Specify columns to match between <input1> and <input2> for data selection and placement.\n"
197 " -wildMatch=<column-name>[=<column-name>]\n"
198 " Similar to -match, but allows wildcards in the matching data from <input2>.\n"
199 " -rename={column|parameter|array},<oldname>=<newname>[,...]\n"
200 " Rename specified columns, parameters, or arrays in the output data set.\n"
201 " -editnames={column|parameter|array},<wildcard-string>,<edit-string>\n"
202 " Edit names of specified entities using wildcard patterns and edit commands.\n"
203 " -equate=<column-name>[=<column-name>]\n"
204 " Equate columns between <input1> and <input2> for data matching based on equality.\n"
205 " -majorOrder=row|column\n"
206 " Specify the major order of data in the output (row or column). Defaults to the order of <input1>.\n"
207 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
209int main(
int argc,
char **argv) {
212 REFDATA *new_data, rename_data, *take_RefData, *replace_RefData;
213 long j, i_arg, reuse, reusePage, endWarning, k;
214 int64_t i, i1, i2, i3, rows1, rows2, rows2Max;
218 char **take_column, **leave_column, **replace_column, **replace_parameter, **replace_array, **output_column = NULL;
219 char **inputfile, **referfile;
220 char **match_column, **equate_column;
221 long take_columns, replace_columns, leave_columns, match_columns, equate_columns, leave_all_columns, replace_parameters, replace_arrays;
222 int32_t output_columns = 0;
223 char *input1, *input2, *output;
224 long tmpfile_used, retval1, retval2, inputfiles, referfiles;
230 unsigned long pipeFlags, majorOrderFlag;
231 long fillIn, keyGroups = 0;
232 KEYED_EQUIVALENT **keyGroup = NULL;
233 long outputInitialized;
234 int z, it, itm, datatype1, datatype2;
236 int firstRun, copyInput1Only;
237 char **string1, **string2;
238 double *value1, *value2;
240 short columnMajorOrder = -1;
242 EDIT_NAME_REQUEST *edit_column_request, *edit_parameter_request, *edit_array_request;
243 long edit_column_requests, edit_parameter_requests, edit_array_requests;
246 argc =
scanargs(&s_arg, argc, argv);
248 fprintf(stderr,
"%s", USAGE);
253 take_RefData = replace_RefData = NULL;
256 rename_data.columns = rename_data.parameters = rename_data.arrays = 0;
257 rename_data.new_column = rename_data.orig_column = rename_data.new_parameter = rename_data.orig_parameter = rename_data.new_array = rename_data.orig_array = NULL;
258 edit_column_request = edit_parameter_request = edit_array_request = NULL;
259 edit_column_requests = edit_parameter_requests = edit_array_requests = 0;
261 input1 = input2 = output = NULL;
262 take_column = leave_column = replace_column = replace_parameter = replace_array = NULL;
263 match_column = equate_column = NULL;
264 inputfile = referfile = NULL;
265 take_columns = leave_columns = replace_columns = match_columns = equate_columns = reuse = reusePage = replace_parameters = replace_arrays = 0;
266 tmpfile_used = inputfiles = referfiles = 0;
269 ifnot_item.items = ifis_item.items = 0;
273 outputInitialized = 0;
274 rows1 = rows2 = output_columns = 0;
275 string1 = string2 = NULL;
278 for (i_arg = 1; i_arg < argc; i_arg++) {
279 if (s_arg[i_arg].arg_type == OPTION) {
281 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
282 case SET_MAJOR_ORDER:
284 s_arg[i_arg].n_items--;
285 if (s_arg[i_arg].n_items > 0 &&
286 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
287 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
288 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
289 SDDS_Bomb(
"invalid -majorOrder syntax/values");
290 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
291 columnMajorOrder = 1;
292 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
293 columnMajorOrder = 0;
295 case SET_LEAVE_COLUMNS:
296 if (s_arg[i_arg].n_items < 2)
298 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + s_arg[i_arg].n_items - 1));
299 for (i = 1; i < s_arg[i_arg].n_items; i++)
300 leave_column[i - 1 + leave_columns] = s_arg[i_arg].list[i];
301 leave_columns += s_arg[i_arg].n_items - 1;
303 case SET_TAKE_COLUMNS:
304 if (s_arg[i_arg].n_items < 2)
306 take_column =
trealloc(take_column,
sizeof(*take_column) * (take_columns + s_arg[i_arg].n_items - 1));
307 for (i = 1; i < s_arg[i_arg].n_items; i++)
308 take_column[i - 1 + take_columns] = s_arg[i_arg].list[i];
309 take_columns += s_arg[i_arg].n_items - 1;
314 case SET_MATCH_COLUMN:
315 if (s_arg[i_arg].n_items != 2)
316 SDDS_Bomb(
"invalid -match or -wildMatch syntax");
317 if (match_columns != 0)
318 SDDS_Bomb(
"only one -match or -wildMatch option may be given");
319 match_column =
tmalloc(
sizeof(*match_column) * 2);
320 if ((ptr = strchr(s_arg[i_arg].list[1],
'=')))
323 ptr = s_arg[i_arg].list[1];
324 match_column[0] = s_arg[i_arg].list[1];
325 match_column[1] = ptr;
328 case SET_EQUATE_COLUMN:
329 if (s_arg[i_arg].n_items != 2)
331 if (equate_columns != 0)
332 SDDS_Bomb(
"only one -equate option may be given");
333 equate_column =
tmalloc(
sizeof(*equate_column) * 2);
334 if ((ptr = strchr(s_arg[i_arg].list[1],
'=')))
337 ptr = s_arg[i_arg].list[1];
338 equate_column[0] = s_arg[i_arg].list[1];
339 equate_column[1] = ptr;
343 if (s_arg[i_arg].n_items < 3)
345 switch (
match_string(s_arg[i_arg].list[1], replace_type, REPLACE_TYPES, 0)) {
347 replace_column =
trealloc(replace_column,
sizeof(*replace_column) * (replace_columns + s_arg[i_arg].n_items - 2));
348 for (i = 2; i < s_arg[i_arg].n_items; i++)
349 replace_column[i - 2 + replace_columns] = s_arg[i_arg].list[i];
350 replace_columns += s_arg[i_arg].n_items - 2;
352 case PARAMETER_REPLACE:
353 replace_parameter =
trealloc(replace_parameter,
sizeof(*replace_parameter) * (replace_parameters + s_arg[i_arg].n_items - 2));
354 for (i = 2; i < s_arg[i_arg].n_items; i++)
355 replace_parameter[i - 2 + replace_parameters] = s_arg[i_arg].list[i];
356 replace_parameters += s_arg[i_arg].n_items - 2;
359 replace_array =
trealloc(replace_array,
sizeof(*replace_array) * (replace_arrays + s_arg[i_arg].n_items - 2));
360 for (i = 2; i < s_arg[i_arg].n_items; i++)
361 replace_array[i - 2 + replace_arrays] = s_arg[i_arg].list[i];
362 replace_arrays += s_arg[i_arg].n_items - 2;
370 if (s_arg[i_arg].n_items < 3)
372 transfer =
trealloc(transfer,
sizeof(*transfer) * (transfers + s_arg[i_arg].n_items - 2));
373 switch (
match_string(s_arg[i_arg].list[1], transfer_type, TRANSFER_TYPES, 0)) {
374 case PARAMETER_TRANSFER:
375 for (i = 2; i < s_arg[i_arg].n_items; i++) {
376 transfer[i - 2 + transfers].type = PARAMETER_TRANSFER;
377 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
381 for (i = 2; i < s_arg[i_arg].n_items; i++) {
382 transfer[i - 2 + transfers].type = ARRAY_TRANSFER;
383 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
390 transfers += s_arg[i_arg].n_items - 2;
393 if (s_arg[i_arg].n_items == 1)
396 char *reuseOptions[2] = {
"rows",
"page"};
397 for (i = 1; i < s_arg[i_arg].n_items; i++) {
398 switch (
match_string(s_arg[i_arg].list[i], reuseOptions, 2, 0)) {
413 if (s_arg[i_arg].n_items < 3)
415 add_ifitem(&ifnot_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
421 if (s_arg[i_arg].n_items < 3)
423 add_ifitem(&ifis_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
426 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
433 if (s_arg[i_arg].n_items < 3)
435 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
437 k = rename_data.columns;
438 rename_data.new_column =
trealloc(rename_data.new_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
439 rename_data.orig_column =
trealloc(rename_data.orig_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
440 for (i = 2; i < s_arg[i_arg].n_items; i++) {
441 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
444 rename_data.orig_column[k + i - 2] = s_arg[i_arg].list[i];
445 rename_data.new_column[k + i - 2] = ptr;
447 rename_data.columns += s_arg[i_arg].n_items - 2;
450 k = rename_data.parameters;
451 rename_data.new_parameter =
trealloc(rename_data.new_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
452 rename_data.orig_parameter =
trealloc(rename_data.orig_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
453 for (i = 2; i < s_arg[i_arg].n_items; i++) {
454 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
457 rename_data.orig_parameter[k + i - 2] = s_arg[i_arg].list[i];
458 rename_data.new_parameter[k + i - 2] = ptr;
460 rename_data.parameters += s_arg[i_arg].n_items - 2;
463 k = rename_data.arrays;
464 rename_data.new_array =
trealloc(rename_data.new_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
465 rename_data.orig_array =
trealloc(rename_data.orig_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
466 for (i = 2; i < s_arg[i_arg].n_items; i++) {
467 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
470 rename_data.orig_array[k + i - 2] = s_arg[i_arg].list[i];
471 rename_data.new_array[k + i - 2] = ptr;
473 rename_data.arrays += s_arg[i_arg].n_items - 2;
476 SDDS_Bomb(
"invalid -rename syntax: specify column, parameter, or array keyword");
481 if (s_arg[i_arg].n_items != 4)
483 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
485 edit_column_request =
trealloc(edit_column_request,
sizeof(*edit_column_request) * (edit_column_requests + 1));
486 edit_column_request[edit_column_requests].match_string = s_arg[i_arg].list[2];
487 edit_column_request[edit_column_requests].edit_string = s_arg[i_arg].list[3];
488 edit_column_requests++;
491 edit_parameter_request =
trealloc(edit_parameter_request,
sizeof(*edit_parameter_request) * (edit_parameter_requests + 1));
492 edit_parameter_request[edit_parameter_requests].match_string = s_arg[i_arg].list[2];
493 edit_parameter_request[edit_parameter_requests].edit_string = s_arg[i_arg].list[3];
494 edit_parameter_requests++;
497 edit_array_request =
trealloc(edit_array_request,
sizeof(*edit_array_request) * (edit_array_requests + 1));
498 edit_array_request[edit_array_requests].match_string = s_arg[i_arg].list[2];
499 edit_array_request[edit_array_requests].edit_string = s_arg[i_arg].list[3];
500 edit_array_requests++;
503 SDDS_Bomb(
"invalid -editnames syntax: specify column, parameter, or array keyword");
508 fprintf(stderr,
"error: unknown switch: %s\n", s_arg[i_arg].list[0]);
513 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
514 inputfile[inputfiles++] = s_arg[i_arg].list[0];
518 if (inputfiles == 0) {
519 SDDS_Bomb(
"too few reference files given");
521 if (!(pipeFlags & USE_STDIN) && !(pipeFlags & USE_STDOUT)) {
522 if (inputfiles < 2) {
523 SDDS_Bomb(
"too few reference files given");
524 }
else if (inputfiles == 2) {
525 input1 = output = inputfile[0];
526 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
527 referfile[0] = inputfile[1];
530 input1 = inputfile[0];
531 output = inputfile[--inputfiles];
532 for (z = 1; z < inputfiles; z++) {
533 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
534 referfile[z - 1] = inputfile[z];
538 }
else if (!(pipeFlags & USE_STDIN) && (pipeFlags & USE_STDOUT)) {
539 if (inputfiles < 2) {
540 SDDS_Bomb(
"too few reference files given");
542 input1 = inputfile[0];
543 for (z = 1; z < inputfiles; z++) {
544 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
545 referfile[z - 1] = inputfile[z];
549 }
else if ((pipeFlags & USE_STDIN) && !(pipeFlags & USE_STDOUT)) {
550 if (inputfiles < 2) {
551 SDDS_Bomb(
"too few reference files given");
553 output = inputfile[--inputfiles];
554 for (z = 0; z < inputfiles; z++) {
555 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
556 referfile[z] = inputfile[z];
561 for (z = 0; z < inputfiles; z++) {
562 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
563 referfile[z] = inputfile[z];
569 processFilenames(
"sddsxref", &input1, &output, pipeFlags, !warnings, &tmpfile_used);
571 if (equate_columns && match_columns)
572 SDDS_Bomb(
"only one of -equate or -match may be given");
579 if (!check_ifitems(&SDDS_1, &ifnot_item, 0, warnings) || !check_ifitems(&SDDS_1, &ifis_item, 1, warnings))
582 for (it = 0; it < ifnot_item.items; it++) {
583 switch (ifnot_item.type[it]) {
585 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + 1));
586 leave_column[leave_columns] = ifnot_item.name[it];
589 case PARAMETER_BASED:
590 for (itm = 0; itm < transfers; itm++) {
591 if (strcmp(transfer[itm].name, ifnot_item.name[it]) == 0) {
592 SDDS_Bomb(
"Excluded item is a part of -transfer list.");
598 for (itm = 0; itm < transfers; itm++) {
599 if (strcmp(transfer[itm].name, ifnot_item.name[it]) == 0) {
600 SDDS_Bomb(
"Excluded item is a part of -transfer list.");
606 SDDS_Bomb(
"internal error---unknown ifitem type");
613 new_data = malloc(
sizeof(*new_data) * referfiles);
614 for (z = 0; z < referfiles; z++) {
615 SDDS_ref =
trealloc(SDDS_ref,
sizeof(*SDDS_ref) * (z + 1));
616 input2 = referfile[z];
622 take_RefData =
trealloc(take_RefData,
sizeof(*take_RefData) * (z + 1));
623 take_RefData[z].columns = 0;
624 replace_RefData =
trealloc(replace_RefData,
sizeof(*replace_RefData) * (z + 1));
625 replace_RefData[z].columns = replace_RefData[z].parameters = replace_RefData[z].arrays = 0;
627 add_newnames(&SDDS_ref[z], &new_data[z], rename_data, edit_column_request, edit_column_requests,
628 edit_parameter_request, edit_parameter_requests, edit_array_request, edit_array_requests, z + 1);
634 for (i = 0; i < take_columns; i++) {
636 sprintf(s,
"error: column %s not found in file %s take_columns %ld SDDS_ref[z] %" PRId64
"\n", take_column[i], input2, take_columns, SDDS_ref[z].n_rows);
645 leave_all_columns = 0;
646 if (leave_columns == 1 && strcmp(leave_column[0],
"*") == 0)
647 leave_all_columns = 1;
651 for (i = 0; i < leave_columns; i++) {
659 if (!(take_RefData[z].orig_column = (
char **)
SDDS_GetColumnNames(&SDDS_ref[z], &take_RefData[z].columns))) {
660 SDDS_SetError(
"error: no columns selected to take from input file");
664 if (replace_columns) {
666 for (i = 0; i < replace_columns; i++) {
668 sprintf(s,
"error: column %s not found in file %s replace_columns %ld SDDS_ref[z] %" PRId64
"\n", replace_column[i], input2, replace_columns, SDDS_ref[z].n_rows);
675 if (!(replace_RefData[z].orig_column = (
char **)
SDDS_GetColumnNames(&SDDS_ref[z], &replace_RefData[z].columns))) {
676 SDDS_SetError(
"error: no columns selected to replace from input file");
683 sprintf(s,
"error: column %s not found or not string type in file %s", match_column[0], input1 ? input1 :
"stdin");
689 sprintf(s,
"error: column %s not found or not string type in file %s", match_column[1], input2);
694 if (equate_columns) {
697 sprintf(s,
"error: column %s not found or not numeric type in file %s", equate_column[0], input1 ? input1 :
"stdin");
703 sprintf(s,
"error: column %s not found or not numeric type in file %s", equate_column[1], input2);
709 take_RefData[z].columns = 0;
710 leave_all_columns = 1;
712 if (!take_RefData[z].columns && !leave_all_columns && warnings)
713 fprintf(stderr,
"warning: there are no columns being taken from %s that are not already in %s\n", input2, input1 ? input1 :
"stdin");
715 if (leave_all_columns)
716 take_RefData[z].columns = 0;
718 if (!outputInitialized) {
723 outputInitialized = 1;
724 if (columnMajorOrder != -1)
725 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
727 SDDS_output.layout.data_mode.column_major = SDDS_1.layout.data_mode.column_major;
731 if (take_RefData[z].columns)
732 take_RefData[z].new_column = (
char **)malloc(
sizeof(
char *) * take_RefData[z].columns);
734 for (i = 0; i < take_RefData[z].columns; i++) {
738 if (new_data[z].columns) {
739 k =
match_string(take_RefData[z].orig_column[i], new_data[z].orig_column, new_data[z].columns, EXACT_MATCH);
741 SDDS_CopyString(&take_RefData[z].new_column[i], take_RefData[z].orig_column[i]);
743 SDDS_CopyString(&take_RefData[z].new_column[i], new_data[z].new_column[k]);
745 SDDS_CopyString(&take_RefData[z].new_column[i], take_RefData[z].orig_column[i]);
747 free(take_RefData[z].new_column[i]);
748 free(take_RefData[z].orig_column[i]);
749 for (j = i; j < take_RefData[z].columns - 1; j++)
750 take_RefData[z].orig_column[j] = take_RefData[z].orig_column[j + 1];
751 take_RefData[z].columns -= 1;
753 if (take_RefData[z].columns == 0)
762 if (!take_RefData[z].columns && !leave_all_columns && warnings)
763 fprintf(stderr,
"warning: there are no columns being taken from %s that are not already in %s\n", input2, input1 ? input1 :
"stdin");
765 if (take_RefData[z].columns &&
766 (!(output_column = (
char **)
SDDS_GetColumnNames(&SDDS_output, &output_columns)) || output_columns == 0)) {
770 if (output_columns) {
771 for (i = 0; i < output_columns; i++)
772 free(output_column[i]);
776 for (i = 0; i < replace_RefData[z].columns; i++) {
779 fprintf(stderr,
"Warning, %s replace column does not exist in the input1, ignore.\n", replace_RefData[z].orig_column[i]);
790 fprintf(stderr,
"Warning: cannot replace a numeric column with a string column, replace %s ignored.\n", replace_RefData[z].orig_column[i]);
792 fprintf(stderr,
"Warning: cannot replace a string column with a numeric column, replace %s ignored.\n", replace_RefData[z].orig_column[i]);
795 if (datatype1 != datatype2) {
797 fprintf(stderr,
"Warning, replace column %s has different data type as the column in input1; redefining the column type\n", replace_RefData[z].orig_column[i]);
799 fprintf(stderr,
"Problem redefining column type for %s\n", replace_RefData[z].orig_column[i]);
804 take_RefData[z].orig_column =
trealloc(take_RefData[z].orig_column,
sizeof(*(take_RefData[z].orig_column)) * (take_RefData[z].columns + 1));
805 take_RefData[z].new_column =
trealloc(take_RefData[z].new_column,
sizeof(*(take_RefData[z].new_column)) * (take_RefData[z].columns + 1));
806 SDDS_CopyString(&take_RefData[z].orig_column[take_RefData[z].columns], replace_RefData[z].orig_column[i]);
807 SDDS_CopyString(&take_RefData[z].new_column[take_RefData[z].columns], replace_RefData[z].orig_column[i]);
808 take_RefData[z].columns++;
811 free(replace_RefData[z].orig_column[i]);
814 take_RefData[z].parameters = take_RefData[z].arrays = 0;
816 if (!expandTransferRequests(&take_RefData[z].orig_parameter, &take_RefData[z].parameters, PARAMETER_TRANSFER, transfer, transfers, &SDDS_ref[z]) ||
817 !expandTransferRequests(&take_RefData[z].orig_array, &take_RefData[z].arrays, ARRAY_TRANSFER, transfer, transfers, &SDDS_ref[z]))
822 if (take_RefData[z].parameters)
823 take_RefData[z].new_parameter = (
char **)malloc(
sizeof(
char *) * take_RefData[z].parameters);
824 if (take_RefData[z].arrays)
825 take_RefData[z].new_array = (
char **)malloc(
sizeof(
char *) * take_RefData[z].arrays);
827 for (i = 0; i < take_RefData[z].parameters; i++) {
829 if (new_data[z].parameters) {
830 k =
match_string(take_RefData[z].orig_parameter[i], new_data[z].orig_parameter, new_data[z].parameters, EXACT_MATCH);
832 SDDS_CopyString(&take_RefData[z].new_parameter[i], new_data[z].new_parameter[k]);
834 SDDS_CopyString(&take_RefData[z].new_parameter[i], take_RefData[z].orig_parameter[i]);
836 SDDS_CopyString(&take_RefData[z].new_parameter[i], take_RefData[z].orig_parameter[i]);
838 free(take_RefData[z].orig_parameter[i]);
839 free(take_RefData[z].new_parameter[i]);
840 for (col = i; col < take_RefData[z].parameters - 1; col++)
841 take_RefData[z].orig_parameter[col] = take_RefData[z].orig_parameter[col + 1];
842 take_RefData[z].parameters -= 1;
844 if (take_RefData[z].parameters == 0)
852 for (i = 0; i < take_RefData[z].arrays; i++) {
854 if (new_data[z].arrays) {
855 k =
match_string(take_RefData[z].orig_array[i], new_data[z].orig_array, new_data[z].arrays, EXACT_MATCH);
857 SDDS_CopyString(&take_RefData[z].new_array[i], take_RefData[z].orig_array[i]);
859 SDDS_CopyString(&take_RefData[z].new_array[i], new_data[z].new_array[k]);
861 SDDS_CopyString(&take_RefData[z].new_array[i], take_RefData[z].orig_array[i]);
863 free(take_RefData[z].orig_array[i]);
864 free(take_RefData[z].new_array[i]);
865 for (col = i; col < take_RefData[z].arrays - 1; col++)
866 take_RefData[z].orig_array[col] = take_RefData[z].orig_array[col + 1];
867 take_RefData[z].arrays -= 1;
869 if (take_RefData[z].arrays == 0)
878 if (replace_parameters) {
879 for (i = 0; i < replace_parameters; i++) {
880 replace_RefData[z].parameters +=
SDDS_MatchParameters(&SDDS_ref[z], &replace_RefData[z].orig_parameter, SDDS_MATCH_STRING, FIND_ANY_TYPE, replace_parameter[i], SDDS_OR | SDDS_1_PREVIOUS);
884 for (i = 0; i < replace_RefData[z].parameters; i++) {
887 fprintf(stderr,
"Warning, parameter %s replace parameter does not exist in the input1, ignore.\n", replace_RefData[z].orig_parameter[i]);
898 fprintf(stderr,
"Warning: cannot replace a numeric parameter with a string parameter, replace %s ignored.\n", replace_RefData[z].orig_parameter[i]);
900 fprintf(stderr,
"Warning: cannot replace a string parameter with a numeric parameter, replace %s ignored.\n", replace_RefData[z].orig_parameter[i]);
903 if (datatype1 != datatype2) {
905 fprintf(stderr,
"Warning, replace parameter %s type is different from input1, redefining parameter type.\n", replace_RefData[z].orig_parameter[i]);
908 fprintf(stderr,
"Problem redefining parameter type for %s\n", replace_RefData[z].orig_parameter[i]);
913 take_RefData[z].orig_parameter =
trealloc(take_RefData[z].orig_parameter,
sizeof(*(take_RefData[z].orig_parameter)) * (take_RefData[z].parameters + 1));
914 take_RefData[z].new_parameter =
trealloc(take_RefData[z].new_parameter,
sizeof(*(take_RefData[z].new_parameter)) * (take_RefData[z].parameters + 1));
915 SDDS_CopyString(&take_RefData[z].orig_parameter[take_RefData[z].parameters], replace_RefData[z].orig_parameter[i]);
916 SDDS_CopyString(&take_RefData[z].new_parameter[take_RefData[z].parameters], replace_RefData[z].orig_parameter[i]);
917 take_RefData[z].parameters++;
920 free(replace_RefData[z].orig_parameter[i]);
923 if (replace_arrays) {
924 for (i = 0; i < replace_arrays; i++) {
925 replace_RefData[z].arrays +=
SDDS_MatchArrays(&SDDS_ref[z], &replace_RefData[z].orig_array, SDDS_MATCH_STRING, FIND_ANY_TYPE, replace_array[i], SDDS_OR | SDDS_1_PREVIOUS);
928 for (i = 0; i < replace_RefData[z].arrays; i++) {
931 fprintf(stderr,
"Warning, array %s replace array does not exist in the input, ignore.\n", replace_RefData[z].orig_array[i]);
942 fprintf(stderr,
"Warning: cannot replace a numeric array with a string array, replace %s ignored.\n", replace_RefData[z].orig_array[i]);
944 fprintf(stderr,
"Warning: cannot replace a string array with a numeric array, replace %s ignored.\n", replace_RefData[z].orig_array[i]);
947 if (datatype1 != datatype2) {
949 fprintf(stderr,
"Warning, replace array %s has different data type as the array in input1; redefining\n", replace_RefData[z].orig_array[i]);
951 fprintf(stderr,
"Problem redefining array type for %s\n", replace_RefData[z].orig_array[i]);
956 take_RefData[z].orig_array =
trealloc(take_RefData[z].orig_array,
sizeof(*(take_RefData[z].orig_array)) * (take_RefData[z].arrays + 1));
957 SDDS_CopyString(&take_RefData[z].orig_array[take_RefData[z].arrays], replace_RefData[z].orig_array[i]);
958 SDDS_CopyString(&take_RefData[z].new_array[take_RefData[z].arrays], replace_RefData[z].orig_array[i]);
959 take_RefData[z].arrays++;
962 free(replace_RefData[z].orig_array[i]);
992 SDDS_SetError(
"Problem copying parameter or array data from first input file");
996 for (z = 0; z < referfiles; z++) {
997 input2 = referfile[z];
999 if ((retval2 =
SDDS_ReadPage(&SDDS_ref[z])) <= 0 && !endWarning) {
1001 fprintf(stderr,
"warning: %s ends prematurely\n", input2 ? input2 :
"stdin");
1005 if (retval1 == 1 && (retval2 =
SDDS_ReadPage(&SDDS_ref[z])) <= 0) {
1006 if (!endWarning && warnings)
1007 fprintf(stderr,
"warning: %s has no data\n", input2 ? input2 :
"stdin");
1013 if (take_RefData[z].columns &&
1016 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1019 if (!CopyParametersFromSecondInput(&SDDS_output, &SDDS_ref[z], take_RefData[z])) {
1020 SDDS_SetError(
"Problem copying parameter from second input file");
1021 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1023 if (!CopyArraysFromSecondInput(&SDDS_output, &SDDS_ref[z], take_RefData[z])) {
1024 SDDS_SetError(
"Problem copying parameter from second input file");
1025 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1030 for (z = rows2Max = 0; z < referfiles; z++) {
1031 input2 = referfile[z];
1033 rows2Max = rows2 > rows2Max ? rows2 : rows2Max;
1039 rows1 = SDDS_RowCount(&SDDS_output);
1041 if (take_RefData[z].columns) {
1044 SDDS_SetError(
"Problem setting row flags for output file.");
1045 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1048 if (match_columns) {
1050 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_1, match_column[0]))) {
1051 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1052 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1055 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_output, match_column[0]))) {
1056 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1057 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1060 if (!(string2 = (
char **)
SDDS_GetColumn(&SDDS_ref[z], match_column[1]))) {
1061 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[1], input2);
1062 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1067 for (i1 = 0; i1 < rows1; i1++) {
1070 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1072 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1076 if ((&SDDS_output)->row_flag[i1]) {
1081 if ((i2 =
match_string(string1[i3], string2, rows2, WILDCARD_MATCH)) >= 0)
1085 if (!CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1086 fprintf(stderr,
"error in copying data to output!\n");
1091 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1093 fprintf(stderr,
"warning: no match for row %" PRId64
" (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1100 for (i = 0; i < i3; i++)
1105 for (i = 0; i < rows2; i++)
1110 for (i = 0; i < keyGroups; i++) {
1111 free(keyGroup[i]->equivalent);
1115 }
else if (equate_columns) {
1118 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1119 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1123 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1124 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1128 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[1], input2);
1129 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1134 for (i1 = 0; i1 < rows1; i1++) {
1137 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1139 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1142 if ((&SDDS_output)->row_flag[i1]) {
1144 if (!CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1145 fprintf(stderr,
"error in copying data to output!\n");
1150 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1152 fprintf(stderr,
"warning: no equal for row %" PRId64
" (%s = %g)\n", i3, equate_column[0], value1[i3]);
1158 if (i3 && equate_columns)
1160 if (rows2 && equate_columns)
1162 for (i = 0; i < keyGroups; i++) {
1163 free(keyGroup[i]->equivalent);
1168 for (i1 = 0; i1 < rows1; i1++) {
1174 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1176 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1180 fprintf(stderr,
"warning: no row in file 2 for row %" PRId64
" in file 1\n", i1);
1187 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1189 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1192 if (take_RefData[z].columns &&
1193 !CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1194 fprintf(stderr,
"error in copying data to output!\n");
1204 if (match_columns) {
1206 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_1, match_column[0]))) {
1207 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1208 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1211 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_output, match_column[0]))) {
1212 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1213 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1216 if (!(string2 = (
char **)
SDDS_GetColumn(&SDDS_ref[z], match_column[1]))) {
1217 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[1], input2);
1218 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1222 for (i1 = 0; i1 < rows1; i1++) {
1225 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1227 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1230 if ((&SDDS_output)->row_flag[i1]) {
1233 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1235 fprintf(stderr,
"warning: no match for row %" PRId64
" (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1242 for (i = 0; i < i3; i++)
1247 for (i = 0; i < rows2; i++)
1252 for (i = 0; i < keyGroups; i++) {
1253 free(keyGroup[i]->equivalent);
1257 }
else if (equate_columns) {
1260 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1261 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1265 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1266 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1270 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[1], input2);
1271 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1275 for (i1 = 0; i1 < rows1; i1++) {
1278 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1280 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1283 if ((&SDDS_output)->row_flag[i1]) {
1286 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1288 fprintf(stderr,
"warning: no equal for row %" PRId64
" (%s = %g)\n", i3, equate_column[0], value1[i3]);
1294 if (i3 && equate_columns)
1296 if (rows2 && equate_columns)
1298 for (i = 0; i < keyGroups; i++) {
1299 free(keyGroup[i]->equivalent);
1309 if ((rows2Max == 0 && fillIn) || (copyInput1Only == referfiles && !match_columns && !equate_columns)) {
1311 SDDS_SetError(
"Problem copying tabular data for output file.");
1312 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1318 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1322 for (z = 0; z < referfiles; z++) {
1325 if (take_RefData[z].columns) {
1326 for (i = 0; i < take_RefData[z].columns; i++) {
1327 free(take_RefData[z].new_column[i]);
1328 free(take_RefData[z].orig_column[i]);
1330 free(take_RefData[z].new_column);
1331 free(take_RefData[z].orig_column);
1334 if (take_RefData[z].parameters) {
1335 for (i = 0; i < take_RefData[z].parameters; i++) {
1336 free(take_RefData[z].new_parameter[i]);
1337 free(take_RefData[z].orig_parameter[i]);
1339 free(take_RefData[z].new_parameter);
1340 free(take_RefData[z].orig_parameter);
1343 if (take_RefData[z].arrays) {
1344 for (i = 0; i < take_RefData[z].arrays; i++) {
1345 free(take_RefData[z].new_array[i]);
1346 free(take_RefData[z].orig_array[i]);
1348 free(take_RefData[z].new_array);
1349 free(take_RefData[z].orig_array);
1352 if (new_data[z].columns) {
1353 for (i = 0; i < new_data[z].columns; i++) {
1354 free(new_data[z].new_column[i]);
1355 free(new_data[z].orig_column[i]);
1357 free(new_data[z].new_column);
1358 free(new_data[z].orig_column);
1361 if (new_data[z].parameters) {
1362 for (i = 0; i < new_data[z].parameters; i++) {
1363 free(new_data[z].new_parameter[i]);
1364 free(new_data[z].orig_parameter[i]);
1366 free(new_data[z].new_parameter);
1367 free(new_data[z].orig_parameter);
1369 if (new_data[z].arrays) {
1370 for (i = 0; i < new_data[z].arrays; i++) {
1371 free(new_data[z].new_array[i]);
1372 free(new_data[z].orig_array[i]);
1374 free(new_data[z].new_array);
1375 free(new_data[z].orig_array);
1381 if (edit_column_requests) {
1382 for (i = 0; i < edit_column_requests; i++) {
1386 free(edit_column_request);
1388 if (edit_parameter_requests) {
1389 for (i = 0; i < edit_parameter_requests; i++) {
1393 free(edit_parameter_request);
1396 if (edit_array_requests) {
1397 for (i = 0; i < edit_array_requests; i++) {
1401 free(edit_array_request);
1405 if (replace_RefData)
1406 free(replace_RefData);
1413 free(equate_column);
1420 for (z = 0; z < referfiles; z++) {
1432 return EXIT_SUCCESS;
1435long expandTransferRequests(
char ***match, int32_t *matches,
long type,
1438 int32_t (*matchRoutine)(
SDDS_DATASET *SDDS_dataset,
char ***nameReturn, int32_t matchMode, int32_t typeMode, ...);
1445 case PARAMETER_TRANSFER:
1448 case ARRAY_TRANSFER:
1452 SDDS_Bomb(
"invalid transfer type--this shouldn't happen");
1457 for (i = 0; i < transfers; i++) {
1458 if (transfer[i].type == type) {
1459 if ((*matches = (*matchRoutine)(inSet, match, SDDS_MATCH_STRING, FIND_ANY_TYPE, transfer[i].name, SDDS_OR | (first ? SDDS_0_PREVIOUS : 0))) == -1) {
1471 EDIT_NAME_REQUEST *edit_array_request,
long edit_array_requests,
long filenumber) {
1472 long i, k = 0, *orig_columnflags;
1473 int32_t columns, parameters, arrays;
1474 long *orig_parameterflags, *orig_arrayflags;
1475 char **column_names, **parameter_names, **array_names, **new_names;
1477 columns = parameters = arrays = 0;
1478 column_names = parameter_names = array_names = new_names = NULL;
1479 orig_columnflags = orig_parameterflags = orig_arrayflags = NULL;
1480 new_data->columns = new_data->parameters = new_data->arrays = 0;
1481 new_data->new_column = new_data->orig_column = NULL;
1482 new_data->new_parameter = new_data->orig_parameter = NULL;
1483 new_data->new_array = new_data->orig_array = NULL;
1486 if (!edit_column_requests && !edit_parameter_requests && !edit_array_requests &&
1487 !rename_data.columns && !rename_data.parameters && !rename_data.arrays)
1491 (*new_data).columns = rename_data.columns;
1492 (*new_data).parameters = rename_data.parameters;
1493 (*new_data).arrays = rename_data.arrays;
1494 if (rename_data.columns) {
1495 (*new_data).new_column = (
char **)malloc(
sizeof(
char *) * rename_data.columns);
1496 (*new_data).orig_column = (
char **)malloc(
sizeof(
char *) * rename_data.columns);
1497 for (i = 0; i < rename_data.columns; i++) {
1498 SDDS_CopyString(&(*new_data).new_column[i], rename_data.new_column[i]);
1499 SDDS_CopyString(&(*new_data).orig_column[i], rename_data.orig_column[i]);
1502 if (rename_data.parameters) {
1503 (*new_data).new_parameter = (
char **)malloc(
sizeof(
char *) * rename_data.parameters);
1504 (*new_data).orig_parameter = (
char **)malloc(
sizeof(
char *) * rename_data.parameters);
1505 for (i = 0; i < rename_data.parameters; i++) {
1506 SDDS_CopyString(&(*new_data).new_parameter[i], rename_data.new_parameter[i]);
1507 SDDS_CopyString(&(*new_data).orig_parameter[i], rename_data.orig_parameter[i]);
1510 if (rename_data.arrays) {
1511 (*new_data).new_array = (
char **)malloc(
sizeof(
char *) * rename_data.arrays);
1512 (*new_data).orig_array = (
char **)malloc(
sizeof(
char *) * rename_data.arrays);
1513 for (i = 0; i < rename_data.arrays; i++) {
1515 SDDS_CopyString(&(*new_data).orig_array[i], rename_data.orig_array[i]);
1534 if (edit_column_requests) {
1535 if ((new_names = process_editnames(column_names, &orig_columnflags, columns, edit_column_request, edit_column_requests, filenumber))) {
1536 for (i = 0; i < columns; i++) {
1537 if (orig_columnflags[i]) {
1538 k = (*new_data).columns;
1539 (*new_data).new_column =
trealloc((*new_data).new_column,
sizeof(
char *) * (k + 1));
1540 (*new_data).orig_column =
trealloc((*new_data).orig_column,
sizeof(
char *) * (k + 1));
1543 (*new_data).columns++;
1551 if (edit_parameter_requests) {
1552 if ((new_names = process_editnames(parameter_names, &orig_parameterflags, parameters, edit_parameter_request, edit_parameter_requests, filenumber))) {
1553 for (i = 0; i < parameters; i++) {
1554 if (orig_parameterflags[i]) {
1555 k = (*new_data).parameters;
1556 (*new_data).new_parameter =
trealloc((*new_data).new_parameter,
sizeof(
char *) * (k + 1));
1557 (*new_data).orig_parameter =
trealloc((*new_data).orig_parameter,
sizeof(
char *) * (k + 1));
1560 (*new_data).parameters++;
1568 if (edit_array_requests) {
1569 if ((new_names = process_editnames(array_names, &orig_arrayflags, arrays, edit_array_request, edit_array_requests, filenumber))) {
1570 for (i = 0; i < arrays; i++) {
1571 if (orig_arrayflags[i]) {
1572 k = (*new_data).arrays;
1573 (*new_data).new_array =
trealloc((*new_data).new_array,
sizeof(
char *) * (k + 1));
1574 (*new_data).orig_array =
trealloc((*new_data).orig_array,
sizeof(
char *) * (k + 1));
1577 (*new_data).arrays++;
1585 if (orig_columnflags)
1586 free(orig_columnflags);
1587 if (orig_parameterflags)
1588 free(orig_parameterflags);
1589 if (orig_arrayflags)
1590 free(orig_arrayflags);
1591 for (i = 0; i < columns; i++)
1592 free(column_names[i]);
1594 for (i = 0; i < parameters; i++)
1595 free(parameter_names[i]);
1596 free(parameter_names);
1597 for (i = 0; i < arrays; i++)
1598 free(array_names[i]);
1602char **process_editnames(
char **orig_name,
long **orig_flags,
long orig_names,
EDIT_NAME_REQUEST *edit_request,
1603 long edit_requests,
long filenumber) {
1604 long i, j, i1, i2 = 0, k;
1605 char **new_name, s[1024], tmpstr[1024];
1606 char *ptr, **editstr, *pch;
1607 char edit_buffer[1024];
1611 *orig_flags =
tmalloc(
sizeof(**orig_flags) * orig_names);
1612 new_name =
tmalloc(
sizeof(*new_name) * orig_names);
1614 editstr = (
char **)malloc(
sizeof(*editstr) * edit_requests);
1615 ptr = malloc(
sizeof(
char) * 256);
1616 sprintf(s,
"%ld", filenumber);
1618 for (i = 0; i < edit_requests; i++) {
1620 if (strstr(editstr[i],
"%%ld"))
1622 else if (strstr(editstr[i],
"%ld")) {
1623 sprintf(s,
"%ld", filenumber);
1625 }
else if (
wild_match(editstr[i],
"*%*ld*")) {
1628 pch = strchr(editstr[i],
'%');
1629 i1 = pch - editstr[i];
1631 for (k = 0; k < strlen(editstr[i]); k++) {
1632 if (editstr[i][k] ==
'd') {
1638 strncpy(tmpstr, pch, i2 - i1 + 1);
1639 tmpstr[i2 - i1 + 1] =
'\0';
1640 sprintf(s, tmpstr, filenumber);
1649 for (j = 0; j < orig_names; j++) {
1650 (*orig_flags)[j] = 0;
1652 for (i = 0; i < edit_requests; i++) {
1655 edit_request[i].match_string = ptr;
1657 strcpy(edit_buffer, new_name[j]);
1662 (*orig_flags)[j] = 1;
1667 for (i = 0; i < edit_requests; i++)
1674 REFDATA new_data,
long columns,
char *input2) {
1675 long i, j, k, type, size;
1681 for (i = 0; i < columns; i++) {
1683 sprintf(s,
"error: column %s not found in file %s\n", new_data.orig_column[i], input2);
1685 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1689 sprintf(s,
"error: column %s not defined in output\n", new_data.new_column[i]);
1691 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1696 if (!
SDDS_CopyString(((
char ***)target->data)[k] + target_row, ((
char ***)source->data)[j][source_row])) {
1697 SDDS_SetError(
"Unable to copy row--string copy failed (SDDS_CopyRow)");
1702 memcpy((
char *)target->data[k] + size * target_row, (
char *)source->data[j] + size * source_row, size);
1712 if (new_data.parameters == 0)
1714 if (new_data.parameters) {
1715 for (i = 0; i < new_data.parameters; i++) {
1721 fprintf(stderr,
"Warning, parameter %s not defined in output.\n", new_data.new_parameter[i]);
1724 if (!
SDDS_SetParameters(SDDS_target, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, k, SDDS_source->parameter[j], -1)) {
1725 sprintf(s,
"Unable to copy parameters for parameter %s", new_data.new_parameter[i]);
1738 if (new_data.arrays == 0)
1740 for (i = 0; i < new_data.arrays; i++) {
1744 sprintf(s,
"Warning, array %s not defined in output.\n", new_data.new_array[i]);
1748 if (SDDS_source->layout.array_definition[j].type != SDDS_target->layout.array_definition[k].type) {
1749 SDDS_SetError(
"Can't copy arrays between different types (SDDS_CopyArrays)");
1752 SDDS_target->array[k].definition = SDDS_target->layout.array_definition + k;
1753 SDDS_target->array[k].elements = SDDS_source->array[j].elements;
1754 if (!(SDDS_target->array[k].dimension = (int32_t *)
SDDS_Malloc(
sizeof(*SDDS_target->array[k].dimension) * SDDS_target->array[k].definition->dimensions)) ||
1755 !(SDDS_target->array[k].data =
SDDS_Realloc(SDDS_target->array[k].data,
SDDS_type_size[SDDS_target->array[k].definition->type - 1] * SDDS_target->array[k].elements))) {
1756 SDDS_SetError(
"Unable to copy arrays--allocation failure (SDDS_CopyArrays)");
1759 for (m = 0; m < SDDS_target->array[k].definition->dimensions; m++)
1760 SDDS_target->array[k].dimension[m] = SDDS_source->array[j].dimension[m];
1762 if (SDDS_target->array[k].definition->type !=
SDDS_STRING)
1763 memcpy(SDDS_target->array[k].data, SDDS_source->array[j].data,
SDDS_type_size[SDDS_target->array[k].definition->type - 1] * SDDS_target->array[k].elements);
1764 else if (!
SDDS_CopyStringArray(SDDS_target->array[k].data, SDDS_source->array[j].data, SDDS_target->array[k].elements)) {
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_CopyColumns(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_CopyParameters(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_InitializeCopy(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, char *filename, char *filemode)
int32_t SDDS_CopyRowDirect(SDDS_DATASET *SDDS_target, int64_t target_row, SDDS_DATASET *SDDS_source, int64_t source_row)
int32_t SDDS_CopyArrays(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
char * SDDS_type_name[SDDS_NUM_TYPES]
Array of supported data type names.
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_ClearPage(SDDS_DATASET *SDDS_dataset)
int32_t SDDS_ChangeParameterInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a parameter definition within the SDDS dataset.
int32_t SDDS_ChangeArrayInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in an array definition within the SDDS dataset.
int32_t SDDS_ChangeColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a column definition within the SDDS dataset.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
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_TransferArrayDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers an array definition from a source dataset to a target dataset.
int32_t SDDS_TransferParameterDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a parameter definition from a source dataset to a target dataset.
int32_t SDDS_FreeStringArray(char **string, int64_t strings)
Frees an array of strings by deallocating each individual string.
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
int32_t SDDS_GetParameterType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a parameter in the SDDS dataset by its index.
int32_t SDDS_GetArrayIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named array in the SDDS 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_MatchParameters(SDDS_DATASET *SDDS_dataset, char ***nameReturn, int32_t matchMode, int32_t typeMode,...)
Matches and retrieves parameter names from an SDDS dataset based on specified criteria.
int32_t SDDS_ColumnCount(SDDS_DATASET *page)
Retrieves the number of columns in the SDDS dataset.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
int32_t SDDS_GetArrayType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of an array in the SDDS dataset by its index.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
int32_t SDDS_CopyStringArray(char **target, char **source, int64_t n_strings)
Copies an array of strings from source to target.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_GetColumnType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a column in the SDDS dataset by its index.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
char ** SDDS_GetArrayNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all arrays in the SDDS dataset.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
int32_t SDDS_MatchArrays(SDDS_DATASET *SDDS_dataset, char ***nameReturn, int32_t matchMode, int32_t typeMode,...)
Matches and retrieves array names from an SDDS dataset based on specified criteria.
Header file for routines used by SDDS command-line applications.
long edit_string(char *text, char *edit)
Edits the provided text based on the specified edit commands.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_DOUBLE
Identifier for the double data type.
#define SDDS_NUMERIC_TYPE(type)
Checks if the given type identifier corresponds to any numeric type.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
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.
int replace_string(char *t, char *s, char *orig, char *repl)
Replace all occurrences of one string with another string.
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.
KEYED_EQUIVALENT ** MakeSortedKeyGroups(long *keyGroups, long keyType, void *data, long points)
Create sorted key groups from data.
long FindMatchingKeyGroup(KEYED_EQUIVALENT **keyGroup, long keyGroups, long keyType, void *searchKeyData, long reuse)
Find a matching key group for a search key.
int has_wildcards(char *template)
Check if a template string contains any wildcard characters.
char * expand_ranges(char *template)
Expand range specifiers in a wildcard template into explicit character lists.
int wild_match(char *string, char *template)
Determine whether one string is a wildcard match for another.