111#define PARAMETER_MODE 1
114static char *mode_name[MODES] = {
120#define COLUMN_REPLACE 0
121#define PARAMETER_REPLACE 1
122#define ARRAY_REPLACE 2
123#define REPLACE_TYPES 3
124static char *replace_type[REPLACE_TYPES] = {
125 "column",
"parameter",
"array"};
127#define PARAMETER_TRANSFER 0
128#define ARRAY_TRANSFER 1
129#define TRANSFER_TYPES 2
130static char *transfer_type[TRANSFER_TYPES] = {
131 "parameter",
"array"};
142 char **new_parameter;
145 char **orig_parameter;
159long expandTransferRequests(
char ***match, int32_t *matches,
long type,
TRANSFER_DEFINITION *transfer,
165 EDIT_NAME_REQUEST *edit_array_request,
long edit_array_requests,
long filenumber);
167char **process_editnames(
char **orig_name,
long **orig_flags,
long orig_names,
EDIT_NAME_REQUEST *edit_request,
168 long edit_requests,
long filenumber);
170 REFDATA new_data,
long columns,
char *input2);
174typedef char *STRING_PAIR[2];
176char *option[N_OPTIONS] = {
177 "take",
"leave",
"match",
"equate",
"transfer",
"reuse",
"ifnot",
178 "nowarnings",
"ifis",
"pipe",
"fillin",
"rename",
"editnames",
"wildmatch",
"majorOrder",
"replace",
"hashlookup",
"threads"};
182 " sddsxref [<input1>] <input2> [<input3>...] [<output>]\n\n"
184 " -pipe[=input][,output]\n"
185 " Enable piping. Optionally specify input and/or output streams.\n"
186 " -ifis={column|parameter|array},<name>[,...]\n"
187 " Specify names of parameters, arrays, or columns that must exist in <input1>.\n"
188 " -ifnot={parameter|column|array},<name>[,...]\n"
189 " Specify names of parameters, arrays, or columns that must not exist in <input1>.\n"
190 " -transfer={parameter|array},<name>[,...]\n"
191 " Specify parameters or arrays to transfer from <input2>.\n"
192 " -take=<column-name>[,...]\n"
193 " Specify columns to take from <input2>.\n"
194 " -leave=<column-name>[,...]\n"
195 " Specify columns not to take from <input2>. Overrides -take for specified columns.\n"
196 " Use -leave=* to exclude all columns.\n"
197 " -replace=column|parameter|array,<name list>\n"
198 " Replace specified columns, parameters, or arrays in <input1> with those from subsequent input files.\n"
200 " Fill in NULL and 0 values in rows where no match is found. By default, such rows are omitted.\n"
201 " -reuse[=[rows][,page]]\n"
202 " Allow reuse of rows from <input2>. Use -reuse=page to restrict to the first page of <input2>.\n"
203 " -match=<column-name>[=<column-name>]\n"
204 " Specify columns to match between <input1> and <input2> for data selection and placement.\n"
205 " -wildMatch=<column-name>[=<column-name>]\n"
206 " Similar to -match, but allows wildcards in the matching data from <input2>.\n"
207 " -rename={column|parameter|array},<oldname>=<newname>[,...]\n"
208 " Rename specified columns, parameters, or arrays in the output data set.\n"
209 " -editnames={column|parameter|array},<wildcard-string>,<edit-string>\n"
210 " Edit names of specified entities using wildcard patterns and edit commands.\n"
211 " -equate=<column-name>[=<column-name>]\n"
212 " Equate columns between <input1> and <input2> for data matching based on equality.\n"
213 " -majorOrder=row|column\n"
214 " Specify the major order of data in the output (row or column). Defaults to the order of <input1>.\n"
216 " Use a hash table for key lookups instead of sorted key groups. Applies to -match and -equate (non-wildcard).\n"
217 " -threads=<number>\n"
218 " Number of reference files to read concurrently. The default is 1.\n"
219 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
221int main(
int argc,
char **argv) {
224 REFDATA *new_data, rename_data, *take_RefData, *replace_RefData;
225 long j, i_arg, reuse, reusePage, endWarning, k;
226 int64_t i, i1, i2, i3, rows1, rows2, rows2Max;
230 char **take_column, **leave_column, **replace_column, **replace_parameter, **replace_array, **output_column = NULL;
231 char **inputfile, **referfile;
232 char **match_column, **equate_column;
233 long take_columns, replace_columns, leave_columns, match_columns, equate_columns, leave_all_columns, replace_parameters, replace_arrays;
234 int32_t output_columns = 0;
235 char *input1, *input2, *output;
236 long tmpfile_used, retval1, retval2, inputfiles, referfiles;
242 unsigned long pipeFlags, majorOrderFlag;
243 long fillIn, keyGroups = 0;
244 KEYED_EQUIVALENT **keyGroup = NULL;
245 long outputInitialized;
246 int z, it, itm, datatype1, datatype2;
248 int firstRun, copyInput1Only;
249 char **string1, **string2;
250 double *value1, *value2;
252 short columnMajorOrder = -1;
253 long useHashLookup = 0;
255 long *refReadCode = NULL;
257 EDIT_NAME_REQUEST *edit_column_request, *edit_parameter_request, *edit_array_request;
258 long edit_column_requests, edit_parameter_requests, edit_array_requests;
261 argc =
scanargs(&s_arg, argc, argv);
263 fprintf(stderr,
"%s", USAGE);
268 take_RefData = replace_RefData = NULL;
271 rename_data.columns = rename_data.parameters = rename_data.arrays = 0;
272 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;
273 edit_column_request = edit_parameter_request = edit_array_request = NULL;
274 edit_column_requests = edit_parameter_requests = edit_array_requests = 0;
276 input1 = input2 = output = NULL;
277 take_column = leave_column = replace_column = replace_parameter = replace_array = NULL;
278 match_column = equate_column = NULL;
279 inputfile = referfile = NULL;
280 take_columns = leave_columns = replace_columns = match_columns = equate_columns = reuse = reusePage = replace_parameters = replace_arrays = 0;
281 tmpfile_used = inputfiles = referfiles = 0;
284 ifnot_item.items = ifis_item.items = 0;
288 outputInitialized = 0;
289 rows1 = rows2 = output_columns = 0;
290 string1 = string2 = NULL;
293 for (i_arg = 1; i_arg < argc; i_arg++) {
294 if (s_arg[i_arg].arg_type == OPTION) {
296 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
297 case SET_MAJOR_ORDER:
299 s_arg[i_arg].n_items--;
300 if (s_arg[i_arg].n_items > 0 &&
301 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
302 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
303 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
304 SDDS_Bomb(
"invalid -majorOrder syntax/values");
305 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
306 columnMajorOrder = 1;
307 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
308 columnMajorOrder = 0;
310 case SET_LEAVE_COLUMNS:
311 if (s_arg[i_arg].n_items < 2)
313 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + s_arg[i_arg].n_items - 1));
314 for (i = 1; i < s_arg[i_arg].n_items; i++)
315 leave_column[i - 1 + leave_columns] = s_arg[i_arg].list[i];
316 leave_columns += s_arg[i_arg].n_items - 1;
318 case SET_TAKE_COLUMNS:
319 if (s_arg[i_arg].n_items < 2)
321 take_column =
trealloc(take_column,
sizeof(*take_column) * (take_columns + s_arg[i_arg].n_items - 1));
322 for (i = 1; i < s_arg[i_arg].n_items; i++)
323 take_column[i - 1 + take_columns] = s_arg[i_arg].list[i];
324 take_columns += s_arg[i_arg].n_items - 1;
329 case SET_MATCH_COLUMN:
330 if (s_arg[i_arg].n_items != 2)
331 SDDS_Bomb(
"invalid -match or -wildMatch syntax");
332 if (match_columns != 0)
333 SDDS_Bomb(
"only one -match or -wildMatch option may be given");
334 match_column =
tmalloc(
sizeof(*match_column) * 2);
335 if ((ptr = strchr(s_arg[i_arg].list[1],
'=')))
338 ptr = s_arg[i_arg].list[1];
339 match_column[0] = s_arg[i_arg].list[1];
340 match_column[1] = ptr;
343 case SET_EQUATE_COLUMN:
344 if (s_arg[i_arg].n_items != 2)
346 if (equate_columns != 0)
347 SDDS_Bomb(
"only one -equate option may be given");
348 equate_column =
tmalloc(
sizeof(*equate_column) * 2);
349 if ((ptr = strchr(s_arg[i_arg].list[1],
'=')))
352 ptr = s_arg[i_arg].list[1];
353 equate_column[0] = s_arg[i_arg].list[1];
354 equate_column[1] = ptr;
358 if (s_arg[i_arg].n_items < 3)
360 switch (
match_string(s_arg[i_arg].list[1], replace_type, REPLACE_TYPES, 0)) {
362 replace_column =
trealloc(replace_column,
sizeof(*replace_column) * (replace_columns + s_arg[i_arg].n_items - 2));
363 for (i = 2; i < s_arg[i_arg].n_items; i++)
364 replace_column[i - 2 + replace_columns] = s_arg[i_arg].list[i];
365 replace_columns += s_arg[i_arg].n_items - 2;
367 case PARAMETER_REPLACE:
368 replace_parameter =
trealloc(replace_parameter,
sizeof(*replace_parameter) * (replace_parameters + s_arg[i_arg].n_items - 2));
369 for (i = 2; i < s_arg[i_arg].n_items; i++)
370 replace_parameter[i - 2 + replace_parameters] = s_arg[i_arg].list[i];
371 replace_parameters += s_arg[i_arg].n_items - 2;
374 replace_array =
trealloc(replace_array,
sizeof(*replace_array) * (replace_arrays + s_arg[i_arg].n_items - 2));
375 for (i = 2; i < s_arg[i_arg].n_items; i++)
376 replace_array[i - 2 + replace_arrays] = s_arg[i_arg].list[i];
377 replace_arrays += s_arg[i_arg].n_items - 2;
385 if (s_arg[i_arg].n_items < 3)
387 transfer =
trealloc(transfer,
sizeof(*transfer) * (transfers + s_arg[i_arg].n_items - 2));
388 switch (
match_string(s_arg[i_arg].list[1], transfer_type, TRANSFER_TYPES, 0)) {
389 case PARAMETER_TRANSFER:
390 for (i = 2; i < s_arg[i_arg].n_items; i++) {
391 transfer[i - 2 + transfers].type = PARAMETER_TRANSFER;
392 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
396 for (i = 2; i < s_arg[i_arg].n_items; i++) {
397 transfer[i - 2 + transfers].type = ARRAY_TRANSFER;
398 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
405 transfers += s_arg[i_arg].n_items - 2;
408 if (s_arg[i_arg].n_items == 1)
411 char *reuseOptions[2] = {
"rows",
"page"};
412 for (i = 1; i < s_arg[i_arg].n_items; i++) {
413 switch (
match_string(s_arg[i_arg].list[i], reuseOptions, 2, 0)) {
428 if (s_arg[i_arg].n_items < 3)
430 add_ifitem(&ifnot_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
436 if (s_arg[i_arg].n_items < 3)
438 add_ifitem(&ifis_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
441 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
448 if (s_arg[i_arg].n_items < 3)
450 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
452 k = rename_data.columns;
453 rename_data.new_column =
trealloc(rename_data.new_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
454 rename_data.orig_column =
trealloc(rename_data.orig_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
455 for (i = 2; i < s_arg[i_arg].n_items; i++) {
456 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
459 rename_data.orig_column[k + i - 2] = s_arg[i_arg].list[i];
460 rename_data.new_column[k + i - 2] = ptr;
462 rename_data.columns += s_arg[i_arg].n_items - 2;
465 k = rename_data.parameters;
466 rename_data.new_parameter =
trealloc(rename_data.new_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
467 rename_data.orig_parameter =
trealloc(rename_data.orig_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
468 for (i = 2; i < s_arg[i_arg].n_items; i++) {
469 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
472 rename_data.orig_parameter[k + i - 2] = s_arg[i_arg].list[i];
473 rename_data.new_parameter[k + i - 2] = ptr;
475 rename_data.parameters += s_arg[i_arg].n_items - 2;
478 k = rename_data.arrays;
479 rename_data.new_array =
trealloc(rename_data.new_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
480 rename_data.orig_array =
trealloc(rename_data.orig_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
481 for (i = 2; i < s_arg[i_arg].n_items; i++) {
482 if (!(ptr = strchr(s_arg[i_arg].list[i],
'=')))
485 rename_data.orig_array[k + i - 2] = s_arg[i_arg].list[i];
486 rename_data.new_array[k + i - 2] = ptr;
488 rename_data.arrays += s_arg[i_arg].n_items - 2;
491 SDDS_Bomb(
"invalid -rename syntax: specify column, parameter, or array keyword");
496 if (s_arg[i_arg].n_items != 4)
498 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
500 edit_column_request =
trealloc(edit_column_request,
sizeof(*edit_column_request) * (edit_column_requests + 1));
501 edit_column_request[edit_column_requests].match_string = s_arg[i_arg].list[2];
502 edit_column_request[edit_column_requests].edit_string = s_arg[i_arg].list[3];
503 edit_column_requests++;
506 edit_parameter_request =
trealloc(edit_parameter_request,
sizeof(*edit_parameter_request) * (edit_parameter_requests + 1));
507 edit_parameter_request[edit_parameter_requests].match_string = s_arg[i_arg].list[2];
508 edit_parameter_request[edit_parameter_requests].edit_string = s_arg[i_arg].list[3];
509 edit_parameter_requests++;
512 edit_array_request =
trealloc(edit_array_request,
sizeof(*edit_array_request) * (edit_array_requests + 1));
513 edit_array_request[edit_array_requests].match_string = s_arg[i_arg].list[2];
514 edit_array_request[edit_array_requests].edit_string = s_arg[i_arg].list[3];
515 edit_array_requests++;
518 SDDS_Bomb(
"invalid -editnames syntax: specify column, parameter, or array keyword");
522 case SET_HASH_LOOKUP:
526 if (s_arg[i_arg].n_items != 2 ||
527 sscanf(s_arg[i_arg].list[1],
"%d", &threads) != 1 || threads < 1)
531 fprintf(stderr,
"error: unknown switch: %s\n", s_arg[i_arg].list[0]);
536 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
537 inputfile[inputfiles++] = s_arg[i_arg].list[0];
541 if (inputfiles == 0) {
542 SDDS_Bomb(
"too few reference files given");
544 if (!(pipeFlags & USE_STDIN) && !(pipeFlags & USE_STDOUT)) {
545 if (inputfiles < 2) {
546 SDDS_Bomb(
"too few reference files given");
547 }
else if (inputfiles == 2) {
548 input1 = output = inputfile[0];
549 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
550 referfile[0] = inputfile[1];
553 input1 = inputfile[0];
554 output = inputfile[--inputfiles];
555 for (z = 1; z < inputfiles; z++) {
556 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
557 referfile[z - 1] = inputfile[z];
561 }
else if (!(pipeFlags & USE_STDIN) && (pipeFlags & USE_STDOUT)) {
562 if (inputfiles < 2) {
563 SDDS_Bomb(
"too few reference files given");
565 input1 = inputfile[0];
566 for (z = 1; z < inputfiles; z++) {
567 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
568 referfile[z - 1] = inputfile[z];
572 }
else if ((pipeFlags & USE_STDIN) && !(pipeFlags & USE_STDOUT)) {
573 if (inputfiles < 2) {
574 SDDS_Bomb(
"too few reference files given");
576 output = inputfile[--inputfiles];
577 for (z = 0; z < inputfiles; z++) {
578 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
579 referfile[z] = inputfile[z];
584 for (z = 0; z < inputfiles; z++) {
585 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
586 referfile[z] = inputfile[z];
592 processFilenames(
"sddsxref", &input1, &output, pipeFlags, !warnings, &tmpfile_used);
594 if (equate_columns && match_columns)
595 SDDS_Bomb(
"only one of -equate or -match may be given");
596 if (threads > referfiles)
597 threads = referfiles;
604 if (!check_ifitems(&SDDS_1, &ifnot_item, 0, warnings) || !check_ifitems(&SDDS_1, &ifis_item, 1, warnings))
607 for (it = 0; it < ifnot_item.items; it++) {
608 switch (ifnot_item.type[it]) {
610 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + 1));
611 leave_column[leave_columns] = ifnot_item.name[it];
614 case PARAMETER_BASED:
615 for (itm = 0; itm < transfers; itm++) {
616 if (strcmp(transfer[itm].name, ifnot_item.name[it]) == 0) {
617 SDDS_Bomb(
"Excluded item is a part of -transfer list.");
623 for (itm = 0; itm < transfers; itm++) {
624 if (strcmp(transfer[itm].name, ifnot_item.name[it]) == 0) {
625 SDDS_Bomb(
"Excluded item is a part of -transfer list.");
631 SDDS_Bomb(
"internal error---unknown ifitem type");
638 new_data = malloc(
sizeof(*new_data) * referfiles);
639 for (z = 0; z < referfiles; z++) {
640 SDDS_ref =
trealloc(SDDS_ref,
sizeof(*SDDS_ref) * (z + 1));
641 input2 = referfile[z];
647 take_RefData =
trealloc(take_RefData,
sizeof(*take_RefData) * (z + 1));
648 take_RefData[z].columns = 0;
649 replace_RefData =
trealloc(replace_RefData,
sizeof(*replace_RefData) * (z + 1));
650 replace_RefData[z].columns = replace_RefData[z].parameters = replace_RefData[z].arrays = 0;
652 add_newnames(&SDDS_ref[z], &new_data[z], rename_data, edit_column_request, edit_column_requests,
653 edit_parameter_request, edit_parameter_requests, edit_array_request, edit_array_requests, z + 1);
659 for (i = 0; i < take_columns; i++) {
661 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);
670 leave_all_columns = 0;
671 if (leave_columns == 1 && strcmp(leave_column[0],
"*") == 0)
672 leave_all_columns = 1;
676 for (i = 0; i < leave_columns; i++) {
684 if (!(take_RefData[z].orig_column = (
char **)
SDDS_GetColumnNames(&SDDS_ref[z], &take_RefData[z].columns))) {
685 SDDS_SetError(
"error: no columns selected to take from input file");
689 if (replace_columns) {
691 for (i = 0; i < replace_columns; i++) {
693 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);
700 if (!(replace_RefData[z].orig_column = (
char **)
SDDS_GetColumnNames(&SDDS_ref[z], &replace_RefData[z].columns))) {
701 SDDS_SetError(
"error: no columns selected to replace from input file");
708 sprintf(s,
"error: column %s not found or not string type in file %s", match_column[0], input1 ? input1 :
"stdin");
714 sprintf(s,
"error: column %s not found or not string type in file %s", match_column[1], input2);
719 if (equate_columns) {
722 sprintf(s,
"error: column %s not found or not numeric type in file %s", equate_column[0], input1 ? input1 :
"stdin");
728 sprintf(s,
"error: column %s not found or not numeric type in file %s", equate_column[1], input2);
734 take_RefData[z].columns = 0;
735 leave_all_columns = 1;
737 if (!take_RefData[z].columns && !leave_all_columns && warnings)
738 fprintf(stderr,
"warning: there are no columns being taken from %s that are not already in %s\n", input2, input1 ? input1 :
"stdin");
740 if (leave_all_columns)
741 take_RefData[z].columns = 0;
743 if (!outputInitialized) {
748 outputInitialized = 1;
749 if (columnMajorOrder != -1)
750 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
752 SDDS_output.layout.data_mode.column_major = SDDS_1.layout.data_mode.column_major;
756 if (take_RefData[z].columns)
757 take_RefData[z].new_column = (
char **)malloc(
sizeof(
char *) * take_RefData[z].columns);
759 for (i = 0; i < take_RefData[z].columns; i++) {
763 if (new_data[z].columns) {
764 k =
match_string(take_RefData[z].orig_column[i], new_data[z].orig_column, new_data[z].columns, EXACT_MATCH);
766 SDDS_CopyString(&take_RefData[z].new_column[i], take_RefData[z].orig_column[i]);
768 SDDS_CopyString(&take_RefData[z].new_column[i], new_data[z].new_column[k]);
770 SDDS_CopyString(&take_RefData[z].new_column[i], take_RefData[z].orig_column[i]);
772 free(take_RefData[z].new_column[i]);
773 free(take_RefData[z].orig_column[i]);
774 for (j = i; j < take_RefData[z].columns - 1; j++)
775 take_RefData[z].orig_column[j] = take_RefData[z].orig_column[j + 1];
776 take_RefData[z].columns -= 1;
778 if (take_RefData[z].columns == 0)
787 if (!take_RefData[z].columns && !leave_all_columns && warnings)
788 fprintf(stderr,
"warning: there are no columns being taken from %s that are not already in %s\n", input2, input1 ? input1 :
"stdin");
790 if (take_RefData[z].columns &&
791 (!(output_column = (
char **)
SDDS_GetColumnNames(&SDDS_output, &output_columns)) || output_columns == 0)) {
795 if (output_columns) {
796 for (i = 0; i < output_columns; i++)
797 free(output_column[i]);
801 for (i = 0; i < replace_RefData[z].columns; i++) {
804 fprintf(stderr,
"Warning, %s replace column does not exist in the input1, ignore.\n", replace_RefData[z].orig_column[i]);
815 fprintf(stderr,
"Warning: cannot replace a numeric column with a string column, replace %s ignored.\n", replace_RefData[z].orig_column[i]);
817 fprintf(stderr,
"Warning: cannot replace a string column with a numeric column, replace %s ignored.\n", replace_RefData[z].orig_column[i]);
820 if (datatype1 != datatype2) {
822 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]);
824 fprintf(stderr,
"Problem redefining column type for %s\n", replace_RefData[z].orig_column[i]);
829 take_RefData[z].orig_column =
trealloc(take_RefData[z].orig_column,
sizeof(*(take_RefData[z].orig_column)) * (take_RefData[z].columns + 1));
830 take_RefData[z].new_column =
trealloc(take_RefData[z].new_column,
sizeof(*(take_RefData[z].new_column)) * (take_RefData[z].columns + 1));
831 SDDS_CopyString(&take_RefData[z].orig_column[take_RefData[z].columns], replace_RefData[z].orig_column[i]);
832 SDDS_CopyString(&take_RefData[z].new_column[take_RefData[z].columns], replace_RefData[z].orig_column[i]);
833 take_RefData[z].columns++;
836 free(replace_RefData[z].orig_column[i]);
839 take_RefData[z].parameters = take_RefData[z].arrays = 0;
841 if (!expandTransferRequests(&take_RefData[z].orig_parameter, &take_RefData[z].parameters, PARAMETER_TRANSFER, transfer, transfers, &SDDS_ref[z]) ||
842 !expandTransferRequests(&take_RefData[z].orig_array, &take_RefData[z].arrays, ARRAY_TRANSFER, transfer, transfers, &SDDS_ref[z]))
847 if (take_RefData[z].parameters)
848 take_RefData[z].new_parameter = (
char **)malloc(
sizeof(
char *) * take_RefData[z].parameters);
849 if (take_RefData[z].arrays)
850 take_RefData[z].new_array = (
char **)malloc(
sizeof(
char *) * take_RefData[z].arrays);
852 for (i = 0; i < take_RefData[z].parameters; i++) {
854 if (new_data[z].parameters) {
855 k =
match_string(take_RefData[z].orig_parameter[i], new_data[z].orig_parameter, new_data[z].parameters, EXACT_MATCH);
857 SDDS_CopyString(&take_RefData[z].new_parameter[i], new_data[z].new_parameter[k]);
859 SDDS_CopyString(&take_RefData[z].new_parameter[i], take_RefData[z].orig_parameter[i]);
861 SDDS_CopyString(&take_RefData[z].new_parameter[i], take_RefData[z].orig_parameter[i]);
863 free(take_RefData[z].orig_parameter[i]);
864 free(take_RefData[z].new_parameter[i]);
865 for (col = i; col < take_RefData[z].parameters - 1; col++)
866 take_RefData[z].orig_parameter[col] = take_RefData[z].orig_parameter[col + 1];
867 take_RefData[z].parameters -= 1;
869 if (take_RefData[z].parameters == 0)
877 for (i = 0; i < take_RefData[z].arrays; i++) {
879 if (new_data[z].arrays) {
880 k =
match_string(take_RefData[z].orig_array[i], new_data[z].orig_array, new_data[z].arrays, EXACT_MATCH);
882 SDDS_CopyString(&take_RefData[z].new_array[i], take_RefData[z].orig_array[i]);
884 SDDS_CopyString(&take_RefData[z].new_array[i], new_data[z].new_array[k]);
886 SDDS_CopyString(&take_RefData[z].new_array[i], take_RefData[z].orig_array[i]);
888 free(take_RefData[z].orig_array[i]);
889 free(take_RefData[z].new_array[i]);
890 for (col = i; col < take_RefData[z].arrays - 1; col++)
891 take_RefData[z].orig_array[col] = take_RefData[z].orig_array[col + 1];
892 take_RefData[z].arrays -= 1;
894 if (take_RefData[z].arrays == 0)
903 if (replace_parameters) {
904 for (i = 0; i < replace_parameters; i++) {
905 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);
909 for (i = 0; i < replace_RefData[z].parameters; i++) {
912 fprintf(stderr,
"Warning, parameter %s replace parameter does not exist in the input1, ignore.\n", replace_RefData[z].orig_parameter[i]);
923 fprintf(stderr,
"Warning: cannot replace a numeric parameter with a string parameter, replace %s ignored.\n", replace_RefData[z].orig_parameter[i]);
925 fprintf(stderr,
"Warning: cannot replace a string parameter with a numeric parameter, replace %s ignored.\n", replace_RefData[z].orig_parameter[i]);
928 if (datatype1 != datatype2) {
930 fprintf(stderr,
"Warning, replace parameter %s type is different from input1, redefining parameter type.\n", replace_RefData[z].orig_parameter[i]);
933 fprintf(stderr,
"Problem redefining parameter type for %s\n", replace_RefData[z].orig_parameter[i]);
938 take_RefData[z].orig_parameter =
trealloc(take_RefData[z].orig_parameter,
sizeof(*(take_RefData[z].orig_parameter)) * (take_RefData[z].parameters + 1));
939 take_RefData[z].new_parameter =
trealloc(take_RefData[z].new_parameter,
sizeof(*(take_RefData[z].new_parameter)) * (take_RefData[z].parameters + 1));
940 SDDS_CopyString(&take_RefData[z].orig_parameter[take_RefData[z].parameters], replace_RefData[z].orig_parameter[i]);
941 SDDS_CopyString(&take_RefData[z].new_parameter[take_RefData[z].parameters], replace_RefData[z].orig_parameter[i]);
942 take_RefData[z].parameters++;
945 free(replace_RefData[z].orig_parameter[i]);
948 if (replace_arrays) {
949 for (i = 0; i < replace_arrays; i++) {
950 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);
953 for (i = 0; i < replace_RefData[z].arrays; i++) {
956 fprintf(stderr,
"Warning, array %s replace array does not exist in the input, ignore.\n", replace_RefData[z].orig_array[i]);
967 fprintf(stderr,
"Warning: cannot replace a numeric array with a string array, replace %s ignored.\n", replace_RefData[z].orig_array[i]);
969 fprintf(stderr,
"Warning: cannot replace a string array with a numeric array, replace %s ignored.\n", replace_RefData[z].orig_array[i]);
972 if (datatype1 != datatype2) {
974 fprintf(stderr,
"Warning, replace array %s has different data type as the array in input1; redefining\n", replace_RefData[z].orig_array[i]);
976 fprintf(stderr,
"Problem redefining array type for %s\n", replace_RefData[z].orig_array[i]);
981 take_RefData[z].orig_array =
trealloc(take_RefData[z].orig_array,
sizeof(*(take_RefData[z].orig_array)) * (take_RefData[z].arrays + 1));
982 SDDS_CopyString(&take_RefData[z].orig_array[take_RefData[z].arrays], replace_RefData[z].orig_array[i]);
983 SDDS_CopyString(&take_RefData[z].new_array[take_RefData[z].arrays], replace_RefData[z].orig_array[i]);
984 take_RefData[z].arrays++;
987 free(replace_RefData[z].orig_array[i]);
996 refReadCode = malloc(
sizeof(*refReadCode) * referfiles);
1013 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1017 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1021 SDDS_SetError(
"Problem copying parameter or array data from first input file");
1022 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1025 if (!reusePage || retval1 == 1) {
1026#pragma omp parallel for if (threads > 1 && referfiles > 1) num_threads(threads) schedule(dynamic)
1027 for (z = 0; z < referfiles; z++)
1030 for (z = 0; z < referfiles; z++)
1034 for (z = 0; z < referfiles; z++) {
1035 input2 = referfile[z];
1037 if ((retval2 = refReadCode[z]) <= 0 && !endWarning) {
1039 fprintf(stderr,
"warning: %s ends prematurely\n", input2 ? input2 :
"stdin");
1043 if (retval1 == 1 && (retval2 = refReadCode[z]) <= 0) {
1044 if (!endWarning && warnings)
1045 fprintf(stderr,
"warning: %s has no data\n", input2 ? input2 :
"stdin");
1051 if (take_RefData[z].columns &&
1054 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1057 if (!CopyParametersFromSecondInput(&SDDS_output, &SDDS_ref[z], take_RefData[z])) {
1058 SDDS_SetError(
"Problem copying parameter from second input file");
1059 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1061 if (!CopyArraysFromSecondInput(&SDDS_output, &SDDS_ref[z], take_RefData[z])) {
1062 SDDS_SetError(
"Problem copying parameter from second input file");
1063 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1068 for (z = rows2Max = 0; z < referfiles; z++) {
1069 input2 = referfile[z];
1071 rows2Max = rows2 > rows2Max ? rows2 : rows2Max;
1077 rows1 = SDDS_RowCount(&SDDS_output);
1079 if (take_RefData[z].columns) {
1082 SDDS_SetError(
"Problem setting row flags for output file.");
1083 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1086 if (match_columns) {
1088 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_1, match_column[0]))) {
1089 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1090 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1093 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_output, match_column[0]))) {
1094 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1095 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1098 if (!(string2 = (
char **)
SDDS_GetColumn(&SDDS_ref[z], match_column[1]))) {
1099 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[1], input2);
1100 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1105 strHash = SDDS_BuildStrHash(string2, rows2);
1110 for (i1 = 0; i1 < rows1; i1++) {
1113 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1115 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1119 if ((&SDDS_output)->row_flag[i1]) {
1121 if (useHashLookup) {
1122 int64_t hv = SDDS_LookupStr(strHash, string1[i3], reuse);
1132 if ((i2 =
match_string(string1[i3], string2, rows2, WILDCARD_MATCH)) >= 0)
1136 if (!CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1137 fprintf(stderr,
"error in copying data to output!\n");
1142 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1144 fprintf(stderr,
"warning: no match for row %" PRId64
" (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1151 for (i = 0; i < i3; i++)
1156 for (i = 0; i < rows2; i++)
1162 if (useHashLookup) {
1163 SDDS_FreeStrHash(strHash);
1165 for (i = 0; i < keyGroups; i++) {
1166 free(keyGroup[i]->equivalent);
1172 }
else if (equate_columns) {
1175 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1176 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1180 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1181 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1185 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[1], input2);
1186 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1192 numHash = SDDS_BuildNumHash(value2, rows2);
1195 for (i1 = 0; i1 < rows1; i1++) {
1198 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1200 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1203 if ((&SDDS_output)->row_flag[i1]) {
1205 if (useHashLookup) {
1206 int64_t hv = SDDS_LookupNum(numHash, value1[i3], reuse);
1216 if (!CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1217 fprintf(stderr,
"error in copying data to output!\n");
1222 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1224 fprintf(stderr,
"warning: no equal for row %" PRId64
" (%s = %g)\n", i3, equate_column[0], value1[i3]);
1230 if (i3 && equate_columns)
1232 if (rows2 && equate_columns)
1234 if (useHashLookup) {
1235 SDDS_FreeNumHash(numHash);
1237 for (i = 0; i < keyGroups; i++) {
1238 free(keyGroup[i]->equivalent);
1244 for (i1 = 0; i1 < rows1; i1++) {
1250 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1252 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1256 fprintf(stderr,
"warning: no row in file 2 for row %" PRId64
" in file 1\n", i1);
1263 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1265 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1268 if (take_RefData[z].columns &&
1269 !CopyRowToNewColumn(&SDDS_output, i1, &SDDS_ref[z], i2, take_RefData[z], take_RefData[z].columns, input2)) {
1270 fprintf(stderr,
"error in copying data to output!\n");
1280 if (match_columns) {
1282 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_1, match_column[0]))) {
1283 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1284 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1287 if (!(string1 = (
char **)
SDDS_GetColumn(&SDDS_output, match_column[0]))) {
1288 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[0], input1 ? input1 :
"stdin");
1289 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1292 if (!(string2 = (
char **)
SDDS_GetColumn(&SDDS_ref[z], match_column[1]))) {
1293 fprintf(stderr,
"Error: problem getting column %s from file %s\n", match_column[1], input2);
1294 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1298 strHash2 = SDDS_BuildStrHash(string2, rows2);
1302 for (i1 = 0; i1 < rows1; i1++) {
1305 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1307 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1310 if ((&SDDS_output)->row_flag[i1]) {
1312 if (useHashLookup) {
1313 present = SDDS_LookupStr(strHash2, string1[i3], 1) >= 0;
1319 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1321 fprintf(stderr,
"warning: no match for row %" PRId64
" (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1328 for (i = 0; i < i3; i++)
1333 for (i = 0; i < rows2; i++)
1338 if (useHashLookup) {
1339 SDDS_FreeStrHash(strHash2);
1341 for (i = 0; i < keyGroups; i++) {
1342 free(keyGroup[i]->equivalent);
1347 }
else if (equate_columns) {
1350 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1351 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1355 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[0], input1 ? input1 :
"stdin");
1356 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1360 fprintf(stderr,
"Error: problem getting column %s from file %s\n", equate_column[1], input2);
1361 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1365 numHash2 = SDDS_BuildNumHash(value2, rows2);
1369 for (i1 = 0; i1 < rows1; i1++) {
1372 sprintf(s,
"Problem copying row %" PRId64
" of first data set", i1);
1374 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1377 if ((&SDDS_output)->row_flag[i1]) {
1379 if (useHashLookup) {
1380 presentEq = SDDS_LookupNum(numHash2, value1[i3], 1) >= 0;
1386 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1388 fprintf(stderr,
"warning: no equal for row %" PRId64
" (%s = %g)\n", i3, equate_column[0], value1[i3]);
1394 if (i3 && equate_columns)
1396 if (rows2 && equate_columns)
1398 if (useHashLookup) {
1399 SDDS_FreeNumHash(numHash2);
1401 for (i = 0; i < keyGroups; i++) {
1402 free(keyGroup[i]->equivalent);
1413 if ((rows2Max == 0 && fillIn) || (copyInput1Only == referfiles && !match_columns && !equate_columns)) {
1415 SDDS_SetError(
"Problem copying tabular data for output file.");
1416 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1422 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1426 for (z = 0; z < referfiles; z++) {
1429 if (take_RefData[z].columns) {
1430 for (i = 0; i < take_RefData[z].columns; i++) {
1431 free(take_RefData[z].new_column[i]);
1432 free(take_RefData[z].orig_column[i]);
1434 free(take_RefData[z].new_column);
1435 free(take_RefData[z].orig_column);
1438 if (take_RefData[z].parameters) {
1439 for (i = 0; i < take_RefData[z].parameters; i++) {
1440 free(take_RefData[z].new_parameter[i]);
1441 free(take_RefData[z].orig_parameter[i]);
1443 free(take_RefData[z].new_parameter);
1444 free(take_RefData[z].orig_parameter);
1447 if (take_RefData[z].arrays) {
1448 for (i = 0; i < take_RefData[z].arrays; i++) {
1449 free(take_RefData[z].new_array[i]);
1450 free(take_RefData[z].orig_array[i]);
1452 free(take_RefData[z].new_array);
1453 free(take_RefData[z].orig_array);
1456 if (new_data[z].columns) {
1457 for (i = 0; i < new_data[z].columns; i++) {
1458 free(new_data[z].new_column[i]);
1459 free(new_data[z].orig_column[i]);
1461 free(new_data[z].new_column);
1462 free(new_data[z].orig_column);
1465 if (new_data[z].parameters) {
1466 for (i = 0; i < new_data[z].parameters; i++) {
1467 free(new_data[z].new_parameter[i]);
1468 free(new_data[z].orig_parameter[i]);
1470 free(new_data[z].new_parameter);
1471 free(new_data[z].orig_parameter);
1473 if (new_data[z].arrays) {
1474 for (i = 0; i < new_data[z].arrays; i++) {
1475 free(new_data[z].new_array[i]);
1476 free(new_data[z].orig_array[i]);
1478 free(new_data[z].new_array);
1479 free(new_data[z].orig_array);
1485 if (edit_column_requests) {
1486 for (i = 0; i < edit_column_requests; i++) {
1490 free(edit_column_request);
1492 if (edit_parameter_requests) {
1493 for (i = 0; i < edit_parameter_requests; i++) {
1497 free(edit_parameter_request);
1500 if (edit_array_requests) {
1501 for (i = 0; i < edit_array_requests; i++) {
1505 free(edit_array_request);
1509 if (replace_RefData)
1510 free(replace_RefData);
1518 free(equate_column);
1525 for (z = 0; z < referfiles; z++) {
1537 return EXIT_SUCCESS;
1540long expandTransferRequests(
char ***match, int32_t *matches,
long type,
1543 int32_t (*matchRoutine)(
SDDS_DATASET *SDDS_dataset,
char ***nameReturn, int32_t matchMode, int32_t typeMode, ...);
1550 case PARAMETER_TRANSFER:
1553 case ARRAY_TRANSFER:
1557 SDDS_Bomb(
"invalid transfer type--this shouldn't happen");
1562 for (i = 0; i < transfers; i++) {
1563 if (transfer[i].type == type) {
1564 if ((*matches = (*matchRoutine)(inSet, match, SDDS_MATCH_STRING, FIND_ANY_TYPE, transfer[i].name, SDDS_OR | (first ? SDDS_0_PREVIOUS : 0))) == -1) {
1576 EDIT_NAME_REQUEST *edit_array_request,
long edit_array_requests,
long filenumber) {
1577 long i, k = 0, *orig_columnflags;
1578 int32_t columns, parameters, arrays;
1579 long *orig_parameterflags, *orig_arrayflags;
1580 char **column_names, **parameter_names, **array_names, **new_names;
1582 columns = parameters = arrays = 0;
1583 column_names = parameter_names = array_names = new_names = NULL;
1584 orig_columnflags = orig_parameterflags = orig_arrayflags = NULL;
1585 new_data->columns = new_data->parameters = new_data->arrays = 0;
1586 new_data->new_column = new_data->orig_column = NULL;
1587 new_data->new_parameter = new_data->orig_parameter = NULL;
1588 new_data->new_array = new_data->orig_array = NULL;
1591 if (!edit_column_requests && !edit_parameter_requests && !edit_array_requests &&
1592 !rename_data.columns && !rename_data.parameters && !rename_data.arrays)
1596 (*new_data).columns = rename_data.columns;
1597 (*new_data).parameters = rename_data.parameters;
1598 (*new_data).arrays = rename_data.arrays;
1599 if (rename_data.columns) {
1600 (*new_data).new_column = (
char **)malloc(
sizeof(
char *) * rename_data.columns);
1601 (*new_data).orig_column = (
char **)malloc(
sizeof(
char *) * rename_data.columns);
1602 for (i = 0; i < rename_data.columns; i++) {
1603 SDDS_CopyString(&(*new_data).new_column[i], rename_data.new_column[i]);
1604 SDDS_CopyString(&(*new_data).orig_column[i], rename_data.orig_column[i]);
1607 if (rename_data.parameters) {
1608 (*new_data).new_parameter = (
char **)malloc(
sizeof(
char *) * rename_data.parameters);
1609 (*new_data).orig_parameter = (
char **)malloc(
sizeof(
char *) * rename_data.parameters);
1610 for (i = 0; i < rename_data.parameters; i++) {
1611 SDDS_CopyString(&(*new_data).new_parameter[i], rename_data.new_parameter[i]);
1612 SDDS_CopyString(&(*new_data).orig_parameter[i], rename_data.orig_parameter[i]);
1615 if (rename_data.arrays) {
1616 (*new_data).new_array = (
char **)malloc(
sizeof(
char *) * rename_data.arrays);
1617 (*new_data).orig_array = (
char **)malloc(
sizeof(
char *) * rename_data.arrays);
1618 for (i = 0; i < rename_data.arrays; i++) {
1620 SDDS_CopyString(&(*new_data).orig_array[i], rename_data.orig_array[i]);
1639 if (edit_column_requests) {
1640 if ((new_names = process_editnames(column_names, &orig_columnflags, columns, edit_column_request, edit_column_requests, filenumber))) {
1641 for (i = 0; i < columns; i++) {
1642 if (orig_columnflags[i]) {
1643 k = (*new_data).columns;
1644 (*new_data).new_column =
trealloc((*new_data).new_column,
sizeof(
char *) * (k + 1));
1645 (*new_data).orig_column =
trealloc((*new_data).orig_column,
sizeof(
char *) * (k + 1));
1648 (*new_data).columns++;
1656 if (edit_parameter_requests) {
1657 if ((new_names = process_editnames(parameter_names, &orig_parameterflags, parameters, edit_parameter_request, edit_parameter_requests, filenumber))) {
1658 for (i = 0; i < parameters; i++) {
1659 if (orig_parameterflags[i]) {
1660 k = (*new_data).parameters;
1661 (*new_data).new_parameter =
trealloc((*new_data).new_parameter,
sizeof(
char *) * (k + 1));
1662 (*new_data).orig_parameter =
trealloc((*new_data).orig_parameter,
sizeof(
char *) * (k + 1));
1665 (*new_data).parameters++;
1673 if (edit_array_requests) {
1674 if ((new_names = process_editnames(array_names, &orig_arrayflags, arrays, edit_array_request, edit_array_requests, filenumber))) {
1675 for (i = 0; i < arrays; i++) {
1676 if (orig_arrayflags[i]) {
1677 k = (*new_data).arrays;
1678 (*new_data).new_array =
trealloc((*new_data).new_array,
sizeof(
char *) * (k + 1));
1679 (*new_data).orig_array =
trealloc((*new_data).orig_array,
sizeof(
char *) * (k + 1));
1682 (*new_data).arrays++;
1690 if (orig_columnflags)
1691 free(orig_columnflags);
1692 if (orig_parameterflags)
1693 free(orig_parameterflags);
1694 if (orig_arrayflags)
1695 free(orig_arrayflags);
1696 for (i = 0; i < columns; i++)
1697 free(column_names[i]);
1699 for (i = 0; i < parameters; i++)
1700 free(parameter_names[i]);
1701 free(parameter_names);
1702 for (i = 0; i < arrays; i++)
1703 free(array_names[i]);
1707char **process_editnames(
char **orig_name,
long **orig_flags,
long orig_names,
EDIT_NAME_REQUEST *edit_request,
1708 long edit_requests,
long filenumber) {
1709 long i, j, i1, i2 = 0, k;
1710 char **new_name, s[1024], tmpstr[1024];
1711 char *ptr, **editstr, *pch;
1712 char edit_buffer[1024];
1716 *orig_flags =
tmalloc(
sizeof(**orig_flags) * orig_names);
1717 new_name =
tmalloc(
sizeof(*new_name) * orig_names);
1719 editstr = (
char **)malloc(
sizeof(*editstr) * edit_requests);
1720 ptr = malloc(
sizeof(
char) * 256);
1721 sprintf(s,
"%ld", filenumber);
1723 for (i = 0; i < edit_requests; i++) {
1725 if (strstr(editstr[i],
"%%ld"))
1727 else if (strstr(editstr[i],
"%ld")) {
1728 sprintf(s,
"%ld", filenumber);
1730 }
else if (
wild_match(editstr[i],
"*%*ld*")) {
1733 pch = strchr(editstr[i],
'%');
1734 i1 = pch - editstr[i];
1736 for (k = 0; k < strlen(editstr[i]); k++) {
1737 if (editstr[i][k] ==
'd') {
1743 strncpy(tmpstr, pch, i2 - i1 + 1);
1744 tmpstr[i2 - i1 + 1] =
'\0';
1745 sprintf(s, tmpstr, filenumber);
1754 for (j = 0; j < orig_names; j++) {
1755 (*orig_flags)[j] = 0;
1757 for (i = 0; i < edit_requests; i++) {
1760 edit_request[i].match_string = ptr;
1762 strcpy(edit_buffer, new_name[j]);
1767 (*orig_flags)[j] = 1;
1772 for (i = 0; i < edit_requests; i++)
1779 REFDATA new_data,
long columns,
char *input2) {
1780 long i, j, k, type, size;
1786 for (i = 0; i < columns; i++) {
1788 sprintf(s,
"error: column %s not found in file %s\n", new_data.orig_column[i], input2);
1790 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1794 sprintf(s,
"error: column %s not defined in output\n", new_data.new_column[i]);
1796 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1801 if (!
SDDS_CopyString(((
char ***)target->data)[k] + target_row, ((
char ***)source->data)[j][source_row])) {
1802 SDDS_SetError(
"Unable to copy row--string copy failed (SDDS_CopyRow)");
1807 memcpy((
char *)target->data[k] + size * target_row, (
char *)source->data[j] + size * source_row, size);
1817 if (new_data.parameters == 0)
1819 if (new_data.parameters) {
1820 for (i = 0; i < new_data.parameters; i++) {
1826 fprintf(stderr,
"Warning, parameter %s not defined in output.\n", new_data.new_parameter[i]);
1829 if (!
SDDS_SetParameters(SDDS_target, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, k, SDDS_source->parameter[j], -1)) {
1830 sprintf(s,
"Unable to copy parameters for parameter %s", new_data.new_parameter[i]);
1843 if (new_data.arrays == 0)
1845 for (i = 0; i < new_data.arrays; i++) {
1849 sprintf(s,
"Warning, array %s not defined in output.\n", new_data.new_array[i]);
1853 if (SDDS_source->layout.array_definition[j].type != SDDS_target->layout.array_definition[k].type) {
1854 SDDS_SetError(
"Can't copy arrays between different types (SDDS_CopyArrays)");
1857 SDDS_target->array[k].definition = SDDS_target->layout.array_definition + k;
1858 SDDS_target->array[k].elements = SDDS_source->array[j].elements;
1859 if (!(SDDS_target->array[k].dimension = (int32_t *)
SDDS_Malloc(
sizeof(*SDDS_target->array[k].dimension) * SDDS_target->array[k].definition->dimensions)) ||
1860 !(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))) {
1861 SDDS_SetError(
"Unable to copy arrays--allocation failure (SDDS_CopyArrays)");
1864 for (m = 0; m < SDDS_target->array[k].definition->dimensions; m++)
1865 SDDS_target->array[k].dimension[m] = SDDS_source->array[j].dimension[m];
1867 if (SDDS_target->array[k].definition->type !=
SDDS_STRING)
1868 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);
1869 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.