199 {
201 long i_arg, reuse, reusePage;
202 int64_t i, j, k, rows1, rows2, n;
203 SCANNED_ARG *s_arg;
204 char s[200], *ptr;
205 char **take_column, **leave_column, **output_column;
206 STRING_PAIR *match_column, *equate_column;
207 double *equate_tolerance;
208 long take_columns, leave_columns, match_columns, equate_columns, leave_all_columns;
209 int32_t output_columns;
210 char *input1, *input2, *output, *match_value;
211 long tmpfile_used, retval1, retval2;
212 long *row_used;
214 long transfers;
215 long warnings, fillIn;
217 unsigned long pipeFlags, majorOrderFlag;
218 REFDATA rename_data, take_RefData;
219 EDIT_NAME_REQUEST *edit_column_request, *edit_parameter_request, *edit_array_request;
220 long edit_column_requests, edit_parameter_requests, edit_array_requests;
221 short columnMajorOrder = -1;
222
224 argc =
scanargs(&s_arg, argc, argv);
225 if (argc < 3) {
226 fprintf(stderr, "%s\n", USAGE);
227 exit(EXIT_FAILURE);
228 }
229
230 input1 = input2 = output = NULL;
231 take_column = leave_column = NULL;
232 match_column = equate_column = NULL;
233 equate_tolerance = NULL;
234 take_columns = leave_columns = match_columns = equate_columns = reuse = reusePage = 0;
235 tmpfile_used = 0;
236 transfer = NULL;
237 transfers = 0;
238 ifnot_item.items = ifis_item.items = 0;
239 warnings = 1;
240 pipeFlags = 0;
241 fillIn = 0;
242 leave_all_columns = 0;
243
244 rename_data.columns = rename_data.parameters = rename_data.arrays = 0;
245 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;
246 edit_column_request = edit_parameter_request = edit_array_request = NULL;
247 edit_column_requests = edit_parameter_requests = edit_array_requests = 0;
248 take_RefData.columns = take_RefData.parameters = take_RefData.arrays = 0;
249 take_RefData.orig_column = take_RefData.new_column = take_RefData.orig_parameter = take_RefData.new_parameter = take_RefData.orig_array = take_RefData.new_array = NULL;
250
251 for (i_arg = 1; i_arg < argc; i_arg++) {
252 if (s_arg[i_arg].arg_type == OPTION) {
254 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
255 case SET_MAJOR_ORDER:
256 majorOrderFlag = 0;
257 s_arg[i_arg].n_items--;
258 if (s_arg[i_arg].n_items > 0 && (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
"row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
"column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
259 SDDS_Bomb(
"invalid -majorOrder syntax/values");
260 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
261 columnMajorOrder = 1;
262 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
263 columnMajorOrder = 0;
264 break;
265 case SET_LEAVE_COLUMNS:
266 if (s_arg[i_arg].n_items < 2) {
267 fprintf(stderr, "%s\n", USAGE);
268 exit(EXIT_FAILURE);
269 }
270 leave_column =
trealloc(leave_column,
sizeof(*leave_column) * (leave_columns + s_arg[i_arg].n_items - 1));
271 for (i = 1; i < s_arg[i_arg].n_items; i++)
272 leave_column[i - 1 + leave_columns] = s_arg[i_arg].list[i];
273 leave_columns += s_arg[i_arg].n_items - 1;
274 break;
275 case SET_TAKE_COLUMNS:
276 if (s_arg[i_arg].n_items < 2) {
277 fprintf(stderr, "%s\n", USAGE);
278 exit(EXIT_FAILURE);
279 }
280 take_column =
trealloc(take_column,
sizeof(*take_column) * (take_columns + s_arg[i_arg].n_items - 1));
281 for (i = 1; i < s_arg[i_arg].n_items; i++)
282 take_column[i - 1 + take_columns] = s_arg[i_arg].list[i];
283 take_columns += s_arg[i_arg].n_items - 1;
284 break;
285 case SET_MATCH_COLUMNS:
286 if (s_arg[i_arg].n_items < 2) {
287 fprintf(stderr, "%s\n", USAGE);
288 exit(EXIT_FAILURE);
289 }
290 match_column =
trealloc(match_column,
sizeof(*match_column) * (match_columns + s_arg[i_arg].n_items - 1));
291 for (i = 1; i < s_arg[i_arg].n_items; i++) {
292 if ((ptr = strchr(s_arg[i_arg].list[i], '=')))
293 *ptr++ = 0;
294 else
295 ptr = s_arg[i_arg].list[i];
296 match_column[i - 1 + match_columns][0] = s_arg[i_arg].list[i];
297 match_column[i - 1 + match_columns][1] = ptr;
298 }
299 match_columns += s_arg[i_arg].n_items - 1;
300 break;
301 case SET_EQUATE_COLUMNS:
302 if (s_arg[i_arg].n_items < 2)
304 equate_column =
trealloc(equate_column,
sizeof(*equate_column) * (equate_columns + s_arg[i_arg].n_items - 1));
305 equate_tolerance =
trealloc(equate_tolerance,
sizeof(*equate_tolerance) * (equate_columns + s_arg[i_arg].n_items - 1));
306 for (i = 1; i < s_arg[i_arg].n_items; i++) {
308 if ((ptr = strchr(s_arg[i_arg].list[i], '=')))
309 *ptr++ = 0;
310 else
311 ptr = s_arg[i_arg].list[i];
312 equate_column[equate_columns][0] = s_arg[i_arg].list[i];
313 equate_column[equate_columns][1] = ptr;
314 equate_tolerance[equate_columns] = 0;
315 equate_columns += 1;
316 } else {
317 sscanf(s_arg[i_arg].list[i], "%le", &equate_tolerance[equate_columns - 1]);
318 }
319 }
320 break;
321 case SET_TRANSFER:
322 if (s_arg[i_arg].n_items < 3)
324 transfer =
trealloc(transfer,
sizeof(*transfer) * (transfers + s_arg[i_arg].n_items - 2));
325 switch (
match_string(s_arg[i_arg].list[1], transfer_type, TRANSFER_TYPES, 0)) {
326 case PARAMETER_TRANSFER:
327 for (i = 2; i < s_arg[i_arg].n_items; i++) {
328 transfer[i - 2 + transfers].type = PARAMETER_TRANSFER;
329 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
330 }
331 break;
332 case ARRAY_TRANSFER:
333 for (i = 2; i < s_arg[i_arg].n_items; i++) {
334 transfer[i - 2 + transfers].type = ARRAY_TRANSFER;
335 transfer[i - 2 + transfers].name = s_arg[i_arg].list[i];
336 }
337 break;
338 default:
340 break;
341 }
342 transfers += s_arg[i_arg].n_items - 2;
343 break;
344 case SET_REUSE:
345 if (s_arg[i_arg].n_items == 1)
346 reuse = 1;
347 else {
348 char *reuseOptions[2] = {"rows", "page"};
349 for (i = 1; i < s_arg[i_arg].n_items; i++) {
350 switch (
match_string(s_arg[i_arg].list[i], reuseOptions, 2, 0)) {
351 case 0:
352 reuse = 1;
353 break;
354 case 1:
355 reusePage = 1;
356 break;
357 default:
359 break;
360 }
361 }
362 }
363 break;
364 case SET_IFNOT:
365 if (s_arg[i_arg].n_items < 3)
367 add_ifitem(&ifnot_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
368 break;
369 case SET_NOWARNINGS:
370 warnings = 0;
371 break;
372 case SET_IFIS:
373 if (s_arg[i_arg].n_items < 3)
375 add_ifitem(&ifis_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
376 break;
377 case SET_PIPE:
378 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
380 break;
381 case SET_FILLIN:
382 fillIn = 1;
383 break;
384 case SET_RENAME:
385 if (s_arg[i_arg].n_items < 3)
387 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
388 case COLUMN_MODE:
389 k = rename_data.columns;
390 rename_data.new_column =
trealloc(rename_data.new_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
391 rename_data.orig_column =
trealloc(rename_data.orig_column,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
392 for (i = 2; i < s_arg[i_arg].n_items; i++) {
393 if (!(ptr = strchr(s_arg[i_arg].list[i], '=')))
395 *ptr++ = 0;
396 rename_data.orig_column[k + i - 2] = s_arg[i_arg].list[i];
397 rename_data.new_column[k + i - 2] = ptr;
398 }
399 rename_data.columns += s_arg[i_arg].n_items - 2;
400 break;
401 case PARAMETER_MODE:
402 k = rename_data.parameters;
403 rename_data.new_parameter =
trealloc(rename_data.new_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
404 rename_data.orig_parameter =
trealloc(rename_data.orig_parameter,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
405 for (i = 2; i < s_arg[i_arg].n_items; i++) {
406 if (!(ptr = strchr(s_arg[i_arg].list[i], '=')))
408 *ptr++ = 0;
409 rename_data.orig_parameter[k + i - 2] = s_arg[i_arg].list[i];
410 rename_data.new_parameter[k + i - 2] = ptr;
411 }
412 rename_data.parameters += s_arg[i_arg].n_items - 2;
413 break;
414 case ARRAY_MODE:
415 k = rename_data.arrays;
416 rename_data.new_array =
trealloc(rename_data.new_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
417 rename_data.orig_array =
trealloc(rename_data.orig_array,
sizeof(
char *) * (k + s_arg[i_arg].n_items - 2));
418 for (i = 2; i < s_arg[i_arg].n_items; i++) {
419 if (!(ptr = strchr(s_arg[i_arg].list[i], '=')))
421 *ptr++ = 0;
422 rename_data.orig_array[k + i - 2] = s_arg[i_arg].list[i];
423 rename_data.new_array[k + i - 2] = ptr;
424 }
425 rename_data.arrays += s_arg[i_arg].n_items - 2;
426 break;
427 default:
428 SDDS_Bomb(
"invalid -rename syntax: specify column, parameter, or array keyword");
429 break;
430 }
431 break;
432 case SET_EDIT:
433 if (s_arg[i_arg].n_items != 4)
435 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
436 case COLUMN_MODE:
437 edit_column_request =
trealloc(edit_column_request,
sizeof(*edit_column_request) * (edit_column_requests + 1));
440 edit_column_requests++;
441 break;
442 case PARAMETER_MODE:
443 edit_parameter_request =
trealloc(edit_parameter_request,
sizeof(*edit_parameter_request) * (edit_parameter_requests + 1));
446 edit_parameter_requests++;
447 break;
448 case ARRAY_MODE:
449 edit_array_request =
trealloc(edit_array_request,
sizeof(*edit_array_request) * (edit_array_requests + 1));
452 edit_array_requests++;
453 break;
454 default:
455 SDDS_Bomb(
"invalid -editnames syntax: specify column, parameter, or array keyword");
456 break;
457 }
458 break;
459 default:
460 fprintf(stderr, "Error: Unknown switch: %s\n%s\n", s_arg[i_arg].list[0], USAGE);
462 break;
463 }
464 } else {
465 if (input1 == NULL)
466 input1 = s_arg[i_arg].list[0];
467 else if (input2 == NULL)
468 input2 = s_arg[i_arg].list[0];
469 else if (output == NULL)
470 output = s_arg[i_arg].list[0];
471 else {
472 fprintf(stderr, "Error: Too many filenames specified.\n%s\n", USAGE);
474 }
475 }
476 }
477
478 if (pipeFlags & USE_STDIN && input1) {
479 if (output) {
480 fprintf(stderr, "Error: Too many filenames specified with -pipe option.\n%s\n", USAGE);
481 SDDS_Bomb(
"too many filenames (sddsmxref)");
482 }
483 output = input2;
484 input2 = input1;
485 input1 = NULL;
486 }
487 processFilenames(
"sddsmxref", &input1, &output, pipeFlags, !warnings, &tmpfile_used);
488 if (!input2) {
489 SDDS_Bomb(
"Second input file not specified");
490 exit(EXIT_FAILURE);
491 }
492
495 exit(EXIT_FAILURE);
496 }
497 if (!check_ifitems(&SDDS_1, &ifnot_item, 0, warnings) || !check_ifitems(&SDDS_1, &ifis_item, 1, warnings))
498 exit(EXIT_SUCCESS);
501 exit(EXIT_FAILURE);
502 }
503
504 if (transfers) {
505 if (!expandTransferRequests(&take_RefData.orig_parameter, &take_RefData.parameters, PARAMETER_TRANSFER, transfer, transfers, &SDDS_2) ||
506 !expandTransferRequests(&take_RefData.orig_array, &take_RefData.arrays, ARRAY_TRANSFER, transfer, transfers, &SDDS_2))
508 }
511 if (take_columns) {
513 for (i = 0; i < take_columns; i++) {
515 sprintf(s, "Error: Column '%s' not found in file '%s'", take_column[i], input2);
518 }
521 }
522 }
523
524 leave_all_columns = 0;
525 if (leave_columns == 1 && strcmp(leave_column[0], "*") == 0)
526 leave_all_columns = 1;
527 else {
528 if (!take_columns)
530 for (i = 0; i < leave_columns; i++) {
533 continue;
536 }
537 if (leave_columns)
538 free(leave_column);
539 if (take_columns)
540 free(take_column);
541
543 SDDS_SetError(
"Error: No columns selected to take from input file.");
545 }
546 }
547
548 for (i = 0; i < match_columns; i++) {
551 sprintf(s, "Error: Column '%s' not found or not of string type in file '%s'.", match_column[i][0], input1 ? input1 : "stdin");
554 }
557 sprintf(s, "Error: Column '%s' not found or not of string type in file '%s'.", match_column[i][1], input2);
560 }
561 }
562 for (i = 0; i < equate_columns; i++) {
565 sprintf(s, "Error: Column '%s' not found or not of numeric type in file '%s'.", equate_column[i][0], input1 ? input1 : "stdin");
568 }
571 sprintf(s, "Error: Column '%s' not found or not of numeric type in file '%s'.", equate_column[i][1], input2);
574 }
575 }
576
577 } else {
578 take_columns = 0;
579 take_RefData.columns = 0;
580 leave_all_columns = 1;
581 }
582 if (!take_RefData.columns && !leave_all_columns && warnings)
583 fprintf(stderr, "Warning: No columns being taken from '%s' that are not already in '%s'.\n",
584 input1 ? input1 : "stdin", input2);
585 if (leave_all_columns) {
586 take_RefData.columns = 0;
587 take_columns = 0;
588 }
589
590 if (output && (pipeFlags & USE_STDOUT))
591 SDDS_Bomb(
"Too many filenames specified with -pipe option.");
592 if (!output && !(pipeFlags & USE_STDOUT)) {
593 if (warnings)
594 fprintf(stderr, "Warning: Existing file '%s' will be replaced.\n", input1 ? input1 : "stdin");
595 tmpfile_used = 1;
597 }
600 exit(EXIT_FAILURE);
601 }
602 if (columnMajorOrder != -1)
603 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
604 else
605 SDDS_output.layout.data_mode.column_major = SDDS_1.layout.data_mode.column_major;
606
607
608 process_newnames(&SDDS_2, &take_RefData, rename_data, edit_column_request, edit_column_requests,
609 edit_parameter_request, edit_parameter_requests, edit_array_request, edit_array_requests);
610
611 for (i = 0; i < take_RefData.columns; i++) {
613 if (warnings)
614 fprintf(stderr, "Warning: Column '%s' already exists in the first input file. No data will be taken from column '%s' of the second input file.\n",
615 take_RefData.new_column[i], take_RefData.orig_column[i]);
616 free(take_RefData.new_column[i]);
617 free(take_RefData.orig_column[i]);
618 for (j = i; j < take_RefData.columns - 1; j++) {
619 take_RefData.new_column[j] = take_RefData.new_column[j + 1];
620 take_RefData.orig_column[j] = take_RefData.orig_column[j + 1];
621 }
622
623 take_RefData.columns -= 1;
624 i--;
625 if (take_RefData.columns == 0)
626 break;
627 } else {
630 }
631 }
632 if (!(output_column = (
char **)
SDDS_GetColumnNames(&SDDS_output, &output_columns)) || output_columns == 0) {
633 SDDS_SetError(
"Error: Problem getting output column names.");
635 }
636
637 for (i = 0; i < take_RefData.parameters; i++) {
639 free(take_RefData.orig_parameter[i]);
640 free(take_RefData.new_parameter[i]);
641 for (j = i; j < take_RefData.parameters - 1; j++)
642 take_RefData.orig_parameter[j] = take_RefData.orig_parameter[j + 1];
643 take_RefData.parameters -= 1;
644 i--;
645 if (take_RefData.parameters == 0)
646 break;
647 } else {
650 }
651 }
652
653 for (i = 0; i < take_RefData.arrays; i++) {
655 free(take_RefData.orig_array[i]);
656 free(take_RefData.new_array[i]);
657 for (j = i; j < take_RefData.arrays - 1; j++)
658 take_RefData.orig_array[j] = take_RefData.orig_array[j + 1];
659 take_RefData.arrays -= 1;
660 i--;
661 if (take_RefData.arrays == 0)
662 break;
663 } else {
666 }
667 }
670 if (!take_RefData.columns && !leave_all_columns && warnings)
671 fprintf(stderr, "Warning: No columns being taken from '%s' that are not already in '%s'.\n", input2, input1 ? input1 : "stdin");
672 if (output_columns) {
673 for (i = 0; i < output_columns; i++)
674 free(output_column[i]);
675 free(output_column);
676 }
677 row_used = NULL;
679 if (!reusePage) {
681 fprintf(stderr, "Warning: <input2> ends before <input1>.\n");
682 break;
683 }
684 } else {
688 }
689 if (take_RefData.columns &&
695 row_used =
SDDS_Realloc(row_used,
sizeof(*row_used) * rows2);
697 }
701 }
705 }
706
707 if (!CopyParametersFromSecondInput(&SDDS_output, &SDDS_2, take_RefData)) {
708 SDDS_SetError(
"Error: Problem copying parameters from second input file.");
710 }
711 if (!CopyArraysFromSecondInput(&SDDS_output, &SDDS_2, take_RefData)) {
712 SDDS_SetError(
"Error: Problem copying arrays from second input file.");
714 }
717 SDDS_SetError(
"Error: Problem copying parameters or arrays from first input file.");
719 }
720 for (j = 0; j < rows1; j++) {
722 sprintf(s, "Error: Problem copying row %" PRId64 " of first data set.", j);
725 }
726 SDDS_output.row_flag[j] = 1;
727 if (!match_columns && !equate_columns && !leave_all_columns) {
728 if (j >= rows2) {
729 if (warnings)
730 fprintf(stderr, "Warning: No match for row %" PRId64 " (value %s)\n", j, match_value);
731 SDDS_output.row_flag[j] = 0;
732 continue;
733 }
734 if (!CopyRowToNewColumn(&SDDS_output, j, &SDDS_2, j, take_RefData, take_RefData.columns, input2)) {
735 fprintf(stderr, "Error: Failed to copy data to output.\n");
736 exit(EXIT_FAILURE);
737 }
738 continue;
739 }
740 if (!leave_all_columns) {
742 for (i = 0; i < match_columns; i++) {
743 if (!
SDDS_GetValue(&SDDS_1, match_column[i][0], j, &match_value)) {
744 sprintf(s, "Error: Problem getting column '%s' from file '%s'.", match_column[i][0], input1 ? input1 : "stdin");
747 }
749 sprintf(s, "Error: Problem setting rows of interest for column '%s'.", match_column[i][1]);
752 }
753 free(match_value);
754 }
756 if (warnings)
757 fprintf(stderr, "Warning: No match for row %" PRId64 "\n", j);
758 SDDS_output.row_flag[j] = 0;
759 continue;
760 }
761 i = -1;
762 for (k = 0; k < rows2; k++) {
763 if (!SDDS_2.row_flag[k])
764 continue;
765 i++;
766 if (!row_used[k] && rows_equate(&SDDS_1, j, &SDDS_2, k, equate_columns, equate_column, equate_tolerance)) {
767 row_used[k] = reuse ? 0 : 1;
768 if (!CopyRowToNewColumn(&SDDS_output, j, &SDDS_2, k, take_RefData, take_RefData.columns, input2)) {
769 fprintf(stderr, "Error: Failed to copy data to output.\n");
770 exit(EXIT_FAILURE);
771 }
772 break;
773 }
774 }
775 if (k == rows2) {
776 if (warnings)
777 fprintf(stderr, "Warning: No match for row %" PRId64 "\n", j);
778 if (!fillIn)
779 SDDS_output.row_flag[j] = 0;
780 continue;
781 }
782 }
783 }
785 SDDS_SetError(
"Error: Problem writing data to output file.");
787 }
788 }
789
792 exit(EXIT_FAILURE);
793 }
795 exit(EXIT_FAILURE);
797 if (row_used)
798 free(row_used);
799
800 free_refdata(&take_RefData, 0);
801 free_refdata(&rename_data, 1);
802
803 free_edit_request(edit_column_request, edit_column_requests);
804 free_edit_request(edit_parameter_request, edit_parameter_requests);
805 free_edit_request(edit_array_request, edit_array_requests);
806 if (match_columns)
807 free(match_column);
808 if (equate_columns)
809 free(equate_column);
810
811 return EXIT_SUCCESS;
812}
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_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_ClearPage(SDDS_DATASET *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_ZeroMemory(void *mem, int64_t n_bytes)
Sets a block of memory to zero.
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.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
#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.
char * cp_str(char **s, char *t)
Copies a string, allocating memory for storage.
long tokenIsNumber(char *token)
Checks if the given token represents a valid number.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
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)
void free_scanargs(SCANNED_ARG **scanned, int argc)
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.
char * tmpname(char *s)
Supplies a unique temporary filename.
int has_wildcards(char *template)
Check if a template string contains any wildcard characters.