221 {
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;
227 SCANNED_ARG *s_arg;
228 char s[200], *ptr;
229
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;
237 long wildMatch;
239 long transfers;
240 long warnings;
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;
247 long col;
248 int firstRun, copyInput1Only;
249 char **string1, **string2;
250 double *value1, *value2;
251 long matched;
252 short columnMajorOrder = -1;
253 long useHashLookup = 0;
254 int threads = 1;
255 long *refReadCode = NULL;
256
257 EDIT_NAME_REQUEST *edit_column_request, *edit_parameter_request, *edit_array_request;
258 long edit_column_requests, edit_parameter_requests, edit_array_requests;
259
261 argc =
scanargs(&s_arg, argc, argv);
262 if (argc < 3) {
263 fprintf(stderr, "%s", USAGE);
264 exit(EXIT_FAILURE);
265 }
266
267 SDDS_ref = NULL;
268 take_RefData = replace_RefData = NULL;
269 new_data = NULL;
270
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;
275
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;
282 transfer = NULL;
283 transfers = 0;
284 ifnot_item.items = ifis_item.items = 0;
285 warnings = 1;
286 pipeFlags = 0;
287 fillIn = 0;
288 outputInitialized = 0;
289 rows1 = rows2 = output_columns = 0;
290 string1 = string2 = NULL;
291 wildMatch = 0;
292
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:
298 majorOrderFlag = 0;
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;
309 break;
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;
317 break;
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;
325 break;
326 case SET_WILD_MATCH:
327 wildMatch = 1;
328
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], '=')))
336 *ptr++ = 0;
337 else
338 ptr = s_arg[i_arg].list[1];
339 match_column[0] = s_arg[i_arg].list[1];
340 match_column[1] = ptr;
341 match_columns = 1;
342 break;
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], '=')))
350 *ptr++ = 0;
351 else
352 ptr = s_arg[i_arg].list[1];
353 equate_column[0] = s_arg[i_arg].list[1];
354 equate_column[1] = ptr;
355 equate_columns = 1;
356 break;
357 case SET_REPLACE:
358 if (s_arg[i_arg].n_items < 3)
360 switch (
match_string(s_arg[i_arg].list[1], replace_type, REPLACE_TYPES, 0)) {
361 case COLUMN_REPLACE:
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;
366 break;
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;
372 break;
373 case ARRAY_REPLACE:
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;
378 break;
379 default:
381 break;
382 }
383 break;
384 case SET_TRANSFER:
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];
393 }
394 break;
395 case ARRAY_TRANSFER:
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];
399 }
400 break;
401 default:
403 break;
404 }
405 transfers += s_arg[i_arg].n_items - 2;
406 break;
407 case SET_REUSE:
408 if (s_arg[i_arg].n_items == 1)
409 reuse = 1;
410 else {
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)) {
414 case 0:
415 reuse = 1;
416 break;
417 case 1:
418 reusePage = 1;
419 break;
420 default:
422 break;
423 }
424 }
425 }
426 break;
427 case SET_IFNOT:
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);
431 break;
432 case SET_NOWARNINGS:
433 warnings = 0;
434 break;
435 case SET_IFIS:
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);
439 break;
440 case SET_PIPE:
441 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
443 break;
444 case SET_FILLIN:
445 fillIn = 1;
446 break;
447 case SET_RENAME:
448 if (s_arg[i_arg].n_items < 3)
450 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
451 case COLUMN_MODE:
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], '=')))
458 *ptr++ = 0;
459 rename_data.orig_column[k + i - 2] = s_arg[i_arg].list[i];
460 rename_data.new_column[k + i - 2] = ptr;
461 }
462 rename_data.columns += s_arg[i_arg].n_items - 2;
463 break;
464 case PARAMETER_MODE:
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], '=')))
471 *ptr++ = 0;
472 rename_data.orig_parameter[k + i - 2] = s_arg[i_arg].list[i];
473 rename_data.new_parameter[k + i - 2] = ptr;
474 }
475 rename_data.parameters += s_arg[i_arg].n_items - 2;
476 break;
477 case ARRAY_MODE:
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], '=')))
484 *ptr++ = 0;
485 rename_data.orig_array[k + i - 2] = s_arg[i_arg].list[i];
486 rename_data.new_array[k + i - 2] = ptr;
487 }
488 rename_data.arrays += s_arg[i_arg].n_items - 2;
489 break;
490 default:
491 SDDS_Bomb(
"invalid -rename syntax: specify column, parameter, or array keyword");
492 break;
493 }
494 break;
495 case SET_EDIT_NAMES:
496 if (s_arg[i_arg].n_items != 4)
498 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
499 case COLUMN_MODE:
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++;
504 break;
505 case PARAMETER_MODE:
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++;
510 break;
511 case ARRAY_MODE:
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++;
516 break;
517 default:
518 SDDS_Bomb(
"invalid -editnames syntax: specify column, parameter, or array keyword");
519 break;
520 }
521 break;
522 case SET_HASH_LOOKUP:
523 useHashLookup = 1;
524 break;
525 case SET_THREADS:
526 if (s_arg[i_arg].n_items != 2 ||
527 sscanf(s_arg[i_arg].list[1], "%d", &threads) != 1 || threads < 1)
529 break;
530 default:
531 fprintf(stderr, "error: unknown switch: %s\n", s_arg[i_arg].list[0]);
533 break;
534 }
535 } else {
536 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
537 inputfile[inputfiles++] = s_arg[i_arg].list[0];
538 }
539 }
540
541 if (inputfiles == 0) {
542 SDDS_Bomb(
"too few reference files given");
543 } else {
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];
551 referfiles++;
552 } else {
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];
558 referfiles++;
559 }
560 }
561 } else if (!(pipeFlags & USE_STDIN) && (pipeFlags & USE_STDOUT)) {
562 if (inputfiles < 2) {
563 SDDS_Bomb(
"too few reference files given");
564 } else {
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];
569 referfiles++;
570 }
571 }
572 } else if ((pipeFlags & USE_STDIN) && !(pipeFlags & USE_STDOUT)) {
573 if (inputfiles < 2) {
574 SDDS_Bomb(
"too few reference files given");
575 } else {
576 output = inputfile[--inputfiles];
577 for (z = 0; z < inputfiles; z++) {
578 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
579 referfile[z] = inputfile[z];
580 referfiles++;
581 }
582 }
583 } else {
584 for (z = 0; z < inputfiles; z++) {
585 referfile =
trealloc(referfile,
sizeof(*referfile) * (referfiles + 1));
586 referfile[z] = inputfile[z];
587 referfiles++;
588 }
589 }
590 }
591
592 processFilenames(
"sddsxref", &input1, &output, pipeFlags, !warnings, &tmpfile_used);
593
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;
598
601 exit(EXIT_FAILURE);
602 }
603
604 if (!check_ifitems(&SDDS_1, &ifnot_item, 0, warnings) || !check_ifitems(&SDDS_1, &ifis_item, 1, warnings))
605 exit(EXIT_SUCCESS);
606
607 for (it = 0; it < ifnot_item.items; it++) {
608 switch (ifnot_item.type[it]) {
609 case COLUMN_BASED:
610 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + 1));
611 leave_column[leave_columns] = ifnot_item.name[it];
612 leave_columns++;
613 break;
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.");
618 exit(EXIT_FAILURE);
619 }
620 }
621 break;
622 case ARRAY_BASED:
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.");
626 exit(EXIT_FAILURE);
627 }
628 }
629 break;
630 default:
631 SDDS_Bomb(
"internal error---unknown ifitem type");
632 exit(EXIT_FAILURE);
633 break;
634 }
635 }
636
637
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];
644 exit(EXIT_FAILURE);
645 }
646
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;
651
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);
654
657 if (take_columns) {
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);
664 }
667 }
668 }
669
670 leave_all_columns = 0;
671 if (leave_columns == 1 && strcmp(leave_column[0], "*") == 0)
672 leave_all_columns = 1;
673 else {
674 if (!take_columns)
676 for (i = 0; i < leave_columns; i++) {
679 continue;
682 }
683
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");
687 }
688 }
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);
696 }
699 }
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");
703 }
704 }
705 if (match_columns) {
708 sprintf(s, "error: column %s not found or not string type in file %s", match_column[0], input1 ? input1 : "stdin");
711 }
714 sprintf(s, "error: column %s not found or not string type in file %s", match_column[1], input2);
717 }
718 }
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");
725 }
728 sprintf(s, "error: column %s not found or not numeric type in file %s", equate_column[1], input2);
731 }
732 }
733 } else {
734 take_RefData[z].columns = 0;
735 leave_all_columns = 1;
736 }
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");
739
740 if (leave_all_columns)
741 take_RefData[z].columns = 0;
742
743 if (!outputInitialized) {
746 exit(EXIT_FAILURE);
747 }
748 outputInitialized = 1;
749 if (columnMajorOrder != -1)
750 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
751 else
752 SDDS_output.layout.data_mode.column_major = SDDS_1.layout.data_mode.column_major;
753 }
754
755
756 if (take_RefData[z].columns)
757 take_RefData[z].new_column = (char **)malloc(sizeof(char *) * take_RefData[z].columns);
758
759 for (i = 0; i < take_RefData[z].columns; i++) {
760 k = 0;
761
762
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);
765 if (k == -1)
766 SDDS_CopyString(&take_RefData[z].new_column[i], take_RefData[z].orig_column[i]);
767 else
768 SDDS_CopyString(&take_RefData[z].new_column[i], new_data[z].new_column[k]);
769 } else
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;
777 i--;
778 if (take_RefData[z].columns == 0)
779 break;
780 } else {
781
784 }
785 }
786
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");
789 output_columns = 0;
790 if (take_RefData[z].columns &&
791 (!(output_column = (
char **)
SDDS_GetColumnNames(&SDDS_output, &output_columns)) || output_columns == 0)) {
794 }
795 if (output_columns) {
796 for (i = 0; i < output_columns; i++)
797 free(output_column[i]);
798 free(output_column);
799 }
800
801 for (i = 0; i < replace_RefData[z].columns; i++) {
803 if (warnings) {
804 fprintf(stderr, "Warning, %s replace column does not exist in the input1, ignore.\n", replace_RefData[z].orig_column[i]);
805 }
806 } else {
807
813 if (warnings) {
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]);
818 }
819 } else {
820 if (datatype1 != datatype2) {
821 if (warnings)
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]);
825 exit(EXIT_FAILURE);
826 }
827 }
828
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++;
834 }
835 }
836 free(replace_RefData[z].orig_column[i]);
837 }
838
839 take_RefData[z].parameters = take_RefData[z].arrays = 0;
840 if (transfers) {
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]))
844 }
845
846
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);
851
852 for (i = 0; i < take_RefData[z].parameters; i++) {
853 k = 0;
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);
856 if (k != -1)
857 SDDS_CopyString(&take_RefData[z].new_parameter[i], new_data[z].new_parameter[k]);
858 else
859 SDDS_CopyString(&take_RefData[z].new_parameter[i], take_RefData[z].orig_parameter[i]);
860 } else
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;
868 i--;
869 if (take_RefData[z].parameters == 0)
870 break;
871 } else {
874 }
875 }
876
877 for (i = 0; i < take_RefData[z].arrays; i++) {
878 k = 0;
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);
881 if (k == -1)
882 SDDS_CopyString(&take_RefData[z].new_array[i], take_RefData[z].orig_array[i]);
883 else
884 SDDS_CopyString(&take_RefData[z].new_array[i], new_data[z].new_array[k]);
885 } else
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;
893 i--;
894 if (take_RefData[z].arrays == 0)
895 break;
896 } else {
899 }
900 }
901
902
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);
906 }
907
908
909 for (i = 0; i < replace_RefData[z].parameters; i++) {
911 if (warnings) {
912 fprintf(stderr, "Warning, parameter %s replace parameter does not exist in the input1, ignore.\n", replace_RefData[z].orig_parameter[i]);
913 }
914 } else {
915
921 if (warnings) {
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]);
926 }
927 } else {
928 if (datatype1 != datatype2) {
929 if (warnings)
930 fprintf(stderr, "Warning, replace parameter %s type is different from input1, redefining parameter type.\n", replace_RefData[z].orig_parameter[i]);
931
933 fprintf(stderr, "Problem redefining parameter type for %s\n", replace_RefData[z].orig_parameter[i]);
934 exit(EXIT_FAILURE);
935 }
936 }
937
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++;
943 }
944 }
945 free(replace_RefData[z].orig_parameter[i]);
946 }
947
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);
951 }
952
953 for (i = 0; i < replace_RefData[z].arrays; i++) {
955 if (warnings) {
956 fprintf(stderr, "Warning, array %s replace array does not exist in the input, ignore.\n", replace_RefData[z].orig_array[i]);
957 }
958 } else {
959
965 if (warnings) {
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]);
970 }
971 } else {
972 if (datatype1 != datatype2) {
973 if (warnings)
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]);
977 exit(EXIT_FAILURE);
978 }
979 }
980
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++;
985 }
986 }
987 free(replace_RefData[z].orig_array[i]);
988 }
989 }
990 }
991 }
992
995
996 refReadCode = malloc(sizeof(*refReadCode) * referfiles);
997 if (!refReadCode)
999
1000 free(leave_column);
1001 if (take_columns) {
1003 free(take_column);
1004 }
1005
1006 endWarning = 0;
1007
1009 copyInput1Only = 0;
1013 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1014 }
1017 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1018 }
1021 SDDS_SetError(
"Problem copying parameter or array data from first input file");
1022 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1023 }
1024
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++)
1029 } else {
1030 for (z = 0; z < referfiles; z++)
1031 refReadCode[z] = 1;
1032 }
1033
1034 for (z = 0; z < referfiles; z++) {
1035 input2 = referfile[z];
1036 if (!reusePage) {
1037 if ((retval2 = refReadCode[z]) <= 0 && !endWarning) {
1038 if (warnings)
1039 fprintf(stderr, "warning: %s ends prematurely\n", input2 ? input2 : "stdin");
1040 endWarning = 1;
1041 }
1042 } else {
1043 if (retval1 == 1 && (retval2 = refReadCode[z]) <= 0) {
1044 if (!endWarning && warnings)
1045 fprintf(stderr, "warning: %s has no data\n", input2 ? input2 : "stdin");
1046 endWarning = 1;
1047 } else
1049 }
1050
1051 if (take_RefData[z].columns &&
1054 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1055
1056
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);
1060 }
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);
1064 }
1065 }
1066
1067 firstRun = 1;
1068 for (z = rows2Max = 0; z < referfiles; z++) {
1069 input2 = referfile[z];
1071 rows2Max = rows2 > rows2Max ? rows2 : rows2Max;
1072
1073 if (!firstRun) {
1074
1075
1076
1077 rows1 = SDDS_RowCount(&SDDS_output);
1078 }
1079 if (take_RefData[z].columns) {
1080 if (!rows2) {
1082 SDDS_SetError(
"Problem setting row flags for output file.");
1083 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1084 }
1085 } else if (rows1) {
1086 if (match_columns) {
1087 if (firstRun) {
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);
1091 }
1092 } else {
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);
1096 }
1097 }
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);
1101 }
1103 if (!wildMatch) {
1104 if (useHashLookup)
1105 strHash = SDDS_BuildStrHash(string2, rows2);
1106 else
1108 }
1109 i3 = 0;
1110 for (i1 = 0; i1 < rows1; i1++) {
1111 if (firstRun) {
1113 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1115 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1116 }
1117 }
1118 matched = 0;
1119 if ((&SDDS_output)->row_flag[i1]) {
1120 if (!wildMatch) {
1121 if (useHashLookup) {
1122 int64_t hv = SDDS_LookupStr(strHash, string1[i3], reuse);
1123 if (hv >= 0) {
1124 i2 = hv;
1125 matched = 1;
1126 }
1127 } else {
1129 matched = 1;
1130 }
1131 } else {
1132 if ((i2 =
match_string(string1[i3], string2, rows2, WILDCARD_MATCH)) >= 0)
1133 matched = 1;
1134 }
1135 if (matched) {
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");
1138 exit(EXIT_FAILURE);
1139 }
1140 } else {
1142 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1143 if (warnings)
1144 fprintf(stderr, "warning: no match for row %" PRId64 " (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1145 }
1146 i3++;
1147 }
1148 }
1149 firstRun = 0;
1150 if (string1) {
1151 for (i = 0; i < i3; i++)
1152 free(string1[i]);
1153 free(string1);
1154 }
1155 if (string2) {
1156 for (i = 0; i < rows2; i++)
1157 free(string2[i]);
1158 free(string2);
1159 }
1160
1161 if (!wildMatch) {
1162 if (useHashLookup) {
1163 SDDS_FreeStrHash(strHash);
1164 } else {
1165 for (i = 0; i < keyGroups; i++) {
1166 free(keyGroup[i]->equivalent);
1167 free(keyGroup[i]);
1168 }
1169 free(keyGroup);
1170 }
1171 }
1172 } else if (equate_columns) {
1173 if (firstRun) {
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);
1177 }
1178 } else {
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);
1182 }
1183 }
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);
1187 }
1188
1189 i3 = 0;
1191 if (useHashLookup)
1192 numHash = SDDS_BuildNumHash(value2, rows2);
1193 else
1195 for (i1 = 0; i1 < rows1; i1++) {
1196 if (firstRun) {
1198 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1200 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1201 }
1202 }
1203 if ((&SDDS_output)->row_flag[i1]) {
1204 int matchedEq = 0;
1205 if (useHashLookup) {
1206 int64_t hv = SDDS_LookupNum(numHash, value1[i3], reuse);
1207 if (hv >= 0) {
1208 i2 = hv;
1209 matchedEq = 1;
1210 }
1211 } else {
1213 matchedEq = 1;
1214 }
1215 if (matchedEq) {
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");
1218 exit(EXIT_FAILURE);
1219 }
1220 } else {
1222 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1223 if (warnings)
1224 fprintf(stderr, "warning: no equal for row %" PRId64 " (%s = %g)\n", i3, equate_column[0], value1[i3]);
1225 }
1226 i3++;
1227 }
1228 }
1229 firstRun = 0;
1230 if (i3 && equate_columns)
1231 free(value1);
1232 if (rows2 && equate_columns)
1233 free(value2);
1234 if (useHashLookup) {
1235 SDDS_FreeNumHash(numHash);
1236 } else {
1237 for (i = 0; i < keyGroups; i++) {
1238 free(keyGroup[i]->equivalent);
1239 free(keyGroup[i]);
1240 }
1241 free(keyGroup);
1242 }
1243 } else {
1244 for (i1 = 0; i1 < rows1; i1++) {
1245 i2 = i1;
1246 if (i2 >= rows2) {
1247 if (!reuse) {
1248 if (fillIn) {
1250 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1252 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1253 }
1254 }
1255 if (warnings)
1256 fprintf(stderr, "warning: no row in file 2 for row %" PRId64 " in file 1\n", i1);
1257 continue;
1258 } else
1259 i2 = rows2 - 1;
1260 }
1261 if (firstRun) {
1263 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1265 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1266 }
1267 }
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");
1271 exit(EXIT_FAILURE);
1272 }
1273 }
1274 firstRun = 0;
1275 }
1276 }
1277 } else {
1278 if (rows2) {
1279 if (rows1) {
1280 if (match_columns) {
1281 if (firstRun) {
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);
1285 }
1286 } else {
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);
1290 }
1291 }
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);
1295 }
1297 if (useHashLookup)
1298 strHash2 = SDDS_BuildStrHash(string2, rows2);
1299 else
1301 i3 = 0;
1302 for (i1 = 0; i1 < rows1; i1++) {
1303 if (firstRun) {
1305 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1307 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1308 }
1309 }
1310 if ((&SDDS_output)->row_flag[i1]) {
1311 int present = 0;
1312 if (useHashLookup) {
1313 present = SDDS_LookupStr(strHash2, string1[i3], 1) >= 0;
1314 } else {
1316 }
1317 if (!present) {
1319 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1320 if (warnings)
1321 fprintf(stderr, "warning: no match for row %" PRId64 " (%s = \"%s\")\n", i3, match_column[0], string1[i3]);
1322 }
1323 i3++;
1324 }
1325 }
1326 firstRun = 0;
1327 if (string1) {
1328 for (i = 0; i < i3; i++)
1329 free(string1[i]);
1330 free(string1);
1331 }
1332 if (string2) {
1333 for (i = 0; i < rows2; i++)
1334 free(string2[i]);
1335 free(string2);
1336 }
1337
1338 if (useHashLookup) {
1339 SDDS_FreeStrHash(strHash2);
1340 } else {
1341 for (i = 0; i < keyGroups; i++) {
1342 free(keyGroup[i]->equivalent);
1343 free(keyGroup[i]);
1344 }
1345 free(keyGroup);
1346 }
1347 } else if (equate_columns) {
1348 if (firstRun) {
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);
1352 }
1353 } else {
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);
1357 }
1358 }
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);
1362 }
1364 if (useHashLookup)
1365 numHash2 = SDDS_BuildNumHash(value2, rows2);
1366 else
1368 i3 = 0;
1369 for (i1 = 0; i1 < rows1; i1++) {
1370 if (firstRun) {
1372 sprintf(s, "Problem copying row %" PRId64 " of first data set", i1);
1374 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1375 }
1376 }
1377 if ((&SDDS_output)->row_flag[i1]) {
1378 int presentEq = 0;
1379 if (useHashLookup) {
1380 presentEq = SDDS_LookupNum(numHash2, value1[i3], 1) >= 0;
1381 } else {
1383 }
1384 if (!presentEq) {
1386 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1387 if (warnings)
1388 fprintf(stderr, "warning: no equal for row %" PRId64 " (%s = %g)\n", i3, equate_column[0], value1[i3]);
1389 }
1390 i3++;
1391 }
1392 }
1393 firstRun = 0;
1394 if (i3 && equate_columns)
1395 free(value1);
1396 if (rows2 && equate_columns)
1397 free(value2);
1398 if (useHashLookup) {
1399 SDDS_FreeNumHash(numHash2);
1400 } else {
1401 for (i = 0; i < keyGroups; i++) {
1402 free(keyGroup[i]->equivalent);
1403 free(keyGroup[i]);
1404 }
1405 free(keyGroup);
1406 }
1407 }
1408 }
1409 }
1410 copyInput1Only++;
1411 }
1412 }
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);
1417 }
1418 }
1419
1422 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1423 }
1424 }
1425
1426 for (z = 0; z < referfiles; z++) {
1427 free(referfile[z]);
1428
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]);
1433 }
1434 free(take_RefData[z].new_column);
1435 free(take_RefData[z].orig_column);
1436 }
1437
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]);
1442 }
1443 free(take_RefData[z].new_parameter);
1444 free(take_RefData[z].orig_parameter);
1445 }
1446
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]);
1451 }
1452 free(take_RefData[z].new_array);
1453 free(take_RefData[z].orig_array);
1454 }
1455
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]);
1460 }
1461 free(new_data[z].new_column);
1462 free(new_data[z].orig_column);
1463 }
1464
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]);
1469 }
1470 free(new_data[z].new_parameter);
1471 free(new_data[z].orig_parameter);
1472 }
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]);
1477 }
1478 free(new_data[z].new_array);
1479 free(new_data[z].orig_array);
1480 }
1481 }
1482 if (new_data)
1483 free(new_data);
1484
1485 if (edit_column_requests) {
1486 for (i = 0; i < edit_column_requests; i++) {
1489 }
1490 free(edit_column_request);
1491 }
1492 if (edit_parameter_requests) {
1493 for (i = 0; i < edit_parameter_requests; i++) {
1496 }
1497 free(edit_parameter_request);
1498 }
1499
1500 if (edit_array_requests) {
1501 for (i = 0; i < edit_array_requests; i++) {
1504 }
1505 free(edit_array_request);
1506 }
1507
1508 free(take_RefData);
1509 if (replace_RefData)
1510 free(replace_RefData);
1511 free(refReadCode);
1512 free(referfile);
1513 free(inputfile);
1514
1515 if (match_columns)
1516 free(match_column);
1517 if (equate_columns)
1518 free(equate_column);
1519
1520
1523 exit(EXIT_FAILURE);
1524 }
1525 for (z = 0; z < referfiles; z++) {
1528 exit(EXIT_FAILURE);
1529 }
1530 }
1531 free(SDDS_ref);
1532
1534 exit(EXIT_FAILURE);
1535 free(input1);
1536 free(output);
1537 return EXIT_SUCCESS;
1538}
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)
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_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.
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_ColumnCount(SDDS_DATASET *page)
Retrieves the number of 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_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
long edit_string(char *text, char *edit)
Edits the provided text based on the specified edit commands.
#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 * 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.
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.