163 {
165 char **inputfile, *outputfile;
166 long inputfiles, i, i_arg, retval = 0, first_page;
167 long iFile, first_data, sparse, setPageNumber;
168 int32_t sparse_statistics = 0;
169 long merge, nMerge, overwrite, collapse, page, append;
170 int64_t allocated_rows;
171 int32_t columns;
172 SCANNED_ARG *s_arg;
173 long buffer[16];
174 char *param, *last_param, *this_param, *text, *contents, **column;
175 long param_index, param_type, param_size, output_pending;
176 unsigned long pipeFlags, majorOrderFlag;
177 long xzLevel = SDDS_GetLZMACompressionLevel();
178
179 char **retain_column, **delete_column;
180 long retain_columns, delete_columns;
181 char **retain_parameter, **delete_parameter;
182 long retain_parameters, delete_parameters;
183 char **retain_array, **delete_array;
184 long retain_arrays, delete_arrays;
185 long nColumns, recover, recovered;
186 short columnMajorOrder = -1;
187 int threads = 1;
188
190 argc =
scanargs(&s_arg, argc, argv);
191 if (argc < 3)
193
194 setPageNumber = allocated_rows = param_type = param_size = 0;
195 last_param = this_param = NULL;
196 column = NULL;
197 inputfile = NULL;
198 outputfile = param = NULL;
199 inputfiles = merge = overwrite = collapse = append = nMerge = 0;
200 pipeFlags = 0;
201 sparse = 1;
202 recover = 0;
203
204 retain_column = delete_column = NULL;
205 retain_columns = delete_columns = 0;
206 retain_parameter = delete_parameter = NULL;
207 retain_parameters = delete_parameters = 0;
208 retain_array = delete_array = NULL;
209 retain_arrays = delete_arrays = 0;
210
212 argc =
scanargs(&s_arg, argc, argv);
213 if (argc < 3)
215
216 for (i_arg = 1; i_arg < argc; i_arg++) {
217 if (s_arg[i_arg].arg_type == OPTION) {
218 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
219 case SET_MAJOR_ORDER:
220 majorOrderFlag = 0;
221 s_arg[i_arg].n_items -= 1;
222 if (s_arg[i_arg].n_items > 0 &&
223 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
224 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
225 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
226 SDDS_Bomb(
"invalid -majorOrder syntax/values");
227 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
228 columnMajorOrder = 1;
229 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
230 columnMajorOrder = 0;
231 break;
232 case SET_XZLEVEL:
233 if (s_arg[i_arg].n_items != 2 || sscanf(s_arg[i_arg].list[1], "%ld", &xzLevel) != 1 || xzLevel < 0 || xzLevel > 9)
235 SDDS_SetLZMACompressionLevel(xzLevel);
236 break;
237 case SET_THREADS:
238 if (s_arg[i_arg].n_items != 2 ||
239 sscanf(s_arg[i_arg].list[1], "%d", &threads) != 1 ||
240 threads < 1)
242 break;
243 case SET_MERGE:
244 if (s_arg[i_arg].n_items > 2)
245 bomb(
"invalid -merge syntax", USAGE);
246 merge = 1;
247 param = NULL;
248 nMerge = -1;
249 if (s_arg[i_arg].n_items == 2) {
250 if (isdigit(s_arg[i_arg].list[1][0])) {
251 if (!sscanf(s_arg[i_arg].list[1], "%ld", &nMerge))
252 bomb(
"invalid -merge syntax (could not scan number of pages)", USAGE);
253 } else
254 param = s_arg[i_arg].list[1];
255 }
256 break;
257 case SET_APPEND:
258 if (s_arg[i_arg].n_items > 1)
259 bomb(
"invalid -append syntax", USAGE);
260 append = 1;
261 if (collapse) {
262 SDDS_Bomb(
"-collapse and -append options cannot be used together");
263 break;
264 }
265 break;
266 case SET_OVERWRITE:
267 overwrite = 1;
268 break;
269 case SET_PIPE:
270 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
272 break;
273 case SET_RECOVER:
274 recover = 1;
275 if (s_arg[i_arg].n_items != 1) {
276 recover = 2;
277 if (s_arg[i_arg].n_items > 2 || strncmp(s_arg[i_arg].list[1], "clip", strlen(s_arg[i_arg].list[1])) != 0)
279 }
280 break;
281 case SET_DELETE:
282 if (s_arg[i_arg].n_items < 3)
284 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
285 case COLUMN_MODE:
286 delete_column =
trealloc(delete_column,
sizeof(*delete_column) * (delete_columns + s_arg[i_arg].n_items - 2));
287 for (i = 2; i < s_arg[i_arg].n_items; i++)
288 delete_column[i - 2 + delete_columns] =
expand_ranges(s_arg[i_arg].list[i]);
289 delete_columns += s_arg[i_arg].n_items - 2;
290 break;
291 case PARAMETER_MODE:
292 delete_parameter =
trealloc(delete_parameter,
sizeof(*delete_parameter) * (delete_parameters + s_arg[i_arg].n_items - 2));
293 for (i = 2; i < s_arg[i_arg].n_items; i++)
294 delete_parameter[i - 2 + delete_parameters] =
expand_ranges(s_arg[i_arg].list[i]);
295 delete_parameters += s_arg[i_arg].n_items - 2;
296 break;
297 case ARRAY_MODE:
298 delete_array =
trealloc(delete_array,
sizeof(*delete_array) * (delete_arrays + s_arg[i_arg].n_items - 2));
299 for (i = 2; i < s_arg[i_arg].n_items; i++)
300 delete_array[i - 2 + delete_arrays] =
expand_ranges(s_arg[i_arg].list[i]);
301 delete_arrays += s_arg[i_arg].n_items - 2;
302 break;
303 default:
304 SDDS_Bomb(
"invalid -delete syntax: specify column or parameter keyword");
305 break;
306 }
307 break;
308 case SET_RETAIN:
309 if (s_arg[i_arg].n_items < 3)
311 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
312 case COLUMN_MODE:
313 retain_column =
trealloc(retain_column,
sizeof(*retain_column) * (retain_columns + s_arg[i_arg].n_items - 2));
314 for (i = 2; i < s_arg[i_arg].n_items; i++)
315 retain_column[i - 2 + retain_columns] =
expand_ranges(s_arg[i_arg].list[i]);
316 retain_columns += s_arg[i_arg].n_items - 2;
317 break;
318 case PARAMETER_MODE:
319 retain_parameter =
trealloc(retain_parameter,
sizeof(*retain_parameter) * (retain_parameters + s_arg[i_arg].n_items - 2));
320 for (i = 2; i < s_arg[i_arg].n_items; i++)
321 retain_parameter[i - 2 + retain_parameters] =
expand_ranges(s_arg[i_arg].list[i]);
322 retain_parameters += s_arg[i_arg].n_items - 2;
323 break;
324 case ARRAY_MODE:
325 retain_array =
trealloc(retain_array,
sizeof(*retain_array) * (retain_arrays + s_arg[i_arg].n_items - 2));
326 for (i = 2; i < s_arg[i_arg].n_items; i++)
327 retain_array[i - 2 + retain_arrays] =
expand_ranges(s_arg[i_arg].list[i]);
328 retain_arrays += s_arg[i_arg].n_items - 2;
329 break;
330 default:
331 SDDS_Bomb(
"invalid -retain syntax: specify column or parameter keyword");
332 break;
333 }
334 break;
335 case SET_SPARSE:
336 if ((s_arg[i_arg].n_items >= 2) && (s_arg[i_arg].n_items <= 3)) {
337 if (sscanf(s_arg[i_arg].list[1], "%ld", &sparse) != 1) {
338 bomb(
"invalid -sparse syntax", USAGE);
339 }
340 if (sparse <= 0) {
341 bomb(
"invalid -sparse syntax", USAGE);
342 }
343 if (s_arg[i_arg].n_items == 3) {
344 switch (
match_string(s_arg[i_arg].list[2], sparse_mode, SPARSE_MODES, 0)) {
345 case SPARSE_AVERAGE:
346 sparse_statistics = 1;
347 break;
348 case SPARSE_MEDIAN:
349 sparse_statistics = 2;
350 break;
351 case SPARSE_MINIMUM:
352 sparse_statistics = 3;
353 break;
354 case SPARSE_MAXIMUM:
355 sparse_statistics = 4;
356 break;
357 default:
359 break;
360 }
361 }
362 } else {
363 bomb(
"invalid -sparse syntax", USAGE);
364 }
365 break;
366 case SET_COLLAPSE:
367 collapse = 1;
368 if (append) {
369 SDDS_Bomb(
"-collapse and -append options cannot be used together");
370 break;
371 }
372 break;
373 default:
374 bomb(
"unrecognized option", USAGE);
375 break;
376 }
377 } else {
378 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
379 inputfile[inputfiles++] = s_arg[i_arg].list[0];
380 }
381 }
382
383 outputfile = NULL;
384 if (inputfiles > 1) {
385 if (pipeFlags & USE_STDIN)
386 SDDS_Bomb(
"too many input files with -pipe option");
387 if (!(pipeFlags & USE_STDOUT)) {
388 if (!append) {
389 outputfile = inputfile[--inputfiles];
390 if (
fexists(outputfile) && !overwrite)
391 SDDS_Bomb(
"output file exists already--give -overWrite option to force replacement");
392 }
393 }
394 } else if (inputfiles == 1) {
395 if (pipeFlags & USE_STDIN) {
396 outputfile = inputfile[0];
397 inputfile[0] = NULL;
398 }
399 if (pipeFlags & USE_STDOUT && outputfile)
400 SDDS_Bomb(
"too many filenames given with -pipe=output");
401 } else {
402 if (!(pipeFlags & USE_STDIN) || !(pipeFlags & USE_STDOUT))
404 inputfiles = 1;
405 inputfile =
tmalloc(
sizeof(*inputfile) * 1);
406 inputfile[0] = outputfile = NULL;
407 }
408
409 for (i = 0; i < inputfiles; i++)
410 if (inputfile[i] && outputfile && strcmp(inputfile[i], outputfile) == 0)
411 SDDS_Bomb(
"Output file is also an input file.");
412
413 if (append) {
414 if (merge) {
415 int64_t rowsPresent;
418 } else {
421 }
422 iFile = 1;
423 } else {
428 if (columnMajorOrder != -1)
429 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
430 else
431 SDDS_output.layout.data_mode.column_major = SDDS_input.layout.data_mode.column_major;
432 iFile = 0;
433 }
434
435 for (; iFile < inputfiles; iFile++) {
436 char **name;
437 int32_t names;
440 if (!collapse) {
443 for (i = 0; i < names; i++) {
444 if (append) {
445
446 if (keep_element(name[i], delete_column, delete_columns, retain_column, retain_columns) &&
448 fprintf(stderr, "Error (sddscombine): Problem appending data. Column %s does not exist in first page.\n", name[i]);
449 exit(EXIT_FAILURE);
450 }
451 } else {
452 if (keep_element(name[i], delete_column, delete_columns, retain_column, retain_columns) &&
456 }
457 free(name[i]);
458 }
459 free(name);
460 }
461
464 for (i = 0; i < names; i++) {
465 if (collapse) {
466 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
470 } else {
471 if (append) {
472 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
474 fprintf(stderr, "Error (sddscombine): Problem appending data. Parameter %s does not exist in first page.\n", name[i]);
475 exit(EXIT_FAILURE);
476 }
477 } else {
478 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
482 }
483 }
484 free(name[i]);
485 }
486 free(name);
487
488 if (!collapse) {
491 for (i = 0; i < names; i++) {
492 if (append) {
493 if (keep_element(name[i], delete_array, delete_arrays, retain_array, retain_arrays) &&
495 fprintf(stderr, "Error (sddscombine): Problem appending data. Array %s does not exist in first page.\n", name[i]);
496 exit(EXIT_FAILURE);
497 }
498 } else {
499 if (keep_element(name[i], delete_array, delete_arrays, retain_array, retain_arrays) &&
503 }
504 free(name[i]);
505 }
506 free(name);
507 }
510 }
511
512 if (collapse) {
515 exit(EXIT_FAILURE);
516 }
517 }
518
519 if (collapse) {
520 if (!merge) {
524 }
526 SDDS_DefineColumn(&SDDS_output,
"NumberCombined", NULL, NULL,
"Number of files combined to make this file", NULL,
SDDS_LONG, 0) < 0)
528 } else {
529 if (!append) {
532 exit(EXIT_FAILURE);
533 }
534 if (!merge) {
538 }
542 }
543 }
544
545 if (collapse) {
549 exit(EXIT_FAILURE);
550 }
551 setPageNumber = 1;
552 } else {
553 setPageNumber = 0;
554 }
555 }
556 if (!append) {
559 exit(EXIT_FAILURE);
560 }
561 }
562 if (collapse) {
563 if (!
SDDS_StartPage(&SDDS_output, allocated_rows = ROW_INCREMENT)) {
565 exit(EXIT_FAILURE);
566 }
567 }
569 if (threads > inputfiles)
570 threads = inputfiles;
571 if (threads > 1 && inputfiles > 1 && !append && !merge && !collapse && !recover) {
572 CombineStandardInputThreaded(&SDDS_output, inputfile, inputfiles, sparse, sparse_statistics, nColumns, threads);
575 exit(EXIT_FAILURE);
576 }
577 return EXIT_SUCCESS;
578 }
579 if (append) {
580 iFile = 1;
581 first_data = 0;
582 output_pending = 1;
583 } else {
584 iFile = 0;
585 first_data = 1;
586 output_pending = 0;
587 }
588
589 page = 0;
590 for (; iFile < inputfiles; iFile++) {
593 exit(EXIT_FAILURE);
594 }
595 first_page = 1;
596 recovered = 0;
597 while (!recovered && (retval =
SDDS_ReadPageSparse(&SDDS_input, 0, nColumns ? sparse : INT64_MAX - 1, 0, sparse_statistics)) >= 0) {
598 page++;
599 if (retval == 0) {
600 if (!recover)
601 break;
602 recovered = 1;
604
605 break;
606 }
607 if (param) {
608 if (first_page) {
610 SDDS_Bomb(
"-merge parameter not in input file(s)");
611 if (param_type) {
613 SDDS_Bomb(
"-merge parameter changes type in subsequent files");
614 } else {
616 this_param =
tmalloc(param_size);
617 last_param =
tmalloc(param_size);
619 SDDS_Bomb(
"error getting value for -merge parameter");
620 }
621 } else {
622 memcpy(last_param, this_param, param_size);
623 }
625 SDDS_Bomb(
"error getting value for -merge parameter");
626 }
627#ifdef DEBUG
628 if (param) {
629 fprintf(stderr, "parameter %s = ", param);
631 fprintf(stderr, " now (was ");
633 fprintf(stderr, ")\n");
634 }
635#endif
636 if (collapse) {
637 if (merge && param) {
638 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0 && output_pending) {
639 output_pending = 0;
640 }
641 }
642 if (!merge || (!param && first_data && first_page) || (param && !output_pending)) {
643 if (page > allocated_rows) {
646 exit(EXIT_FAILURE);
647 }
648 allocated_rows += ROW_INCREMENT;
649 }
650 for (i = 0; i < columns; i++) {
651 if (!SDDS_GetParameterMod(&SDDS_input, &SDDS_output, column[i], buffer)) {
653 exit(EXIT_FAILURE);
654 }
655 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, page - 1, column[i], buffer, NULL)) {
657 exit(EXIT_FAILURE);
658 }
659 }
660 if (!merge) {
661 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"Filename", inputfile[iFile] ? inputfile[iFile] :
"stdin",
"NumberCombined", inputfiles, NULL)) {
663 exit(EXIT_FAILURE);
664 }
665 } else {
666 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"NumberCombined", inputfiles, NULL)) {
668 exit(EXIT_FAILURE);
669 }
670 }
671 if (setPageNumber && !
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"PageNumber", page, NULL)) {
673 exit(EXIT_FAILURE);
674 }
675 first_data = 0;
676 } else if (merge && param && output_pending) {
677 page--;
678 }
679 } else {
680 if (!merge) {
684 exit(EXIT_FAILURE);
685 }
687 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"Filename", inputfile[iFile] ? inputfile[iFile] :
"stdin", NULL)) {
689 exit(EXIT_FAILURE);
690 }
691 }
693 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
695 exit(EXIT_FAILURE);
696 }
697 }
700 exit(EXIT_FAILURE);
701 }
702 } else if (merge && !param) {
703 if (nMerge > 0 && (page - 1) % nMerge == 0 && page != 1) {
706 exit(EXIT_FAILURE);
707 }
708 output_pending = 0;
709 }
710 if ((first_data && first_page) || (nMerge > 0 && (page - 1) % nMerge == 0)) {
713 exit(EXIT_FAILURE);
714 }
715 first_data = 0;
716 } else {
719 exit(EXIT_FAILURE);
720 }
721 }
722 } else {
723#ifdef DEBUG
724 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0)
725 fprintf(stderr, "Parameter value has changed\n");
726#endif
727 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0 && output_pending) {
729 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
731 exit(EXIT_FAILURE);
732 }
733 }
736 exit(EXIT_FAILURE);
737 }
738 output_pending = 0;
739 }
740 if (!output_pending) {
743 exit(EXIT_FAILURE);
744 }
745 } else {
748 exit(EXIT_FAILURE);
749 }
750 }
751 }
752 }
753 if (merge) {
754 output_pending = 1;
755 }
756 first_page = 0;
757 }
760 exit(EXIT_FAILURE);
761 }
762 }
763 if (!collapse && merge && output_pending) {
765 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
767 exit(EXIT_FAILURE);
768 }
769 }
770 if (append) {
773 exit(EXIT_FAILURE);
774 }
775 } else {
778 exit(EXIT_FAILURE);
779 }
780 }
781 }
782 if (collapse) {
785 exit(EXIT_FAILURE);
786 }
787 if (page == 0) {
789 exit(EXIT_FAILURE);
790 }
791 }
794 exit(EXIT_FAILURE);
795 }
796
797 return EXIT_SUCCESS;
798}
int32_t SDDS_ReadRecoveryPossible(SDDS_DATASET *SDDS_dataset)
Checks if any data in an SDDS page was recovered after an error was detected.
int32_t SDDS_CopyAdditionalRows(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_CopyPage(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_LengthenTable(SDDS_DATASET *SDDS_dataset, int64_t n_additional_rows)
int32_t SDDS_SetRowValues(SDDS_DATASET *SDDS_dataset, int32_t mode, int64_t row,...)
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_InitializeAppend(SDDS_DATASET *SDDS_dataset, const char *filename)
Initializes the SDDS dataset for appending data by adding a new page to an existing file.
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_InitializeAppendToPage(SDDS_DATASET *SDDS_dataset, const char *filename, int64_t updateInterval, int64_t *rowsPresentReturn)
Initializes the SDDS dataset for appending data to the last page of an existing file.
int32_t SDDS_UpdatePage(SDDS_DATASET *SDDS_dataset, uint32_t mode)
Updates the current page of the SDDS dataset.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_DefineColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, int32_t field_length)
Defines a data column within the SDDS dataset.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_DefineParameter(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, char *fixed_value)
Defines a data parameter with a fixed string value.
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_DefineColumnLikeParameter(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Defines a column in the target dataset based on a parameter definition from the source dataset.
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_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_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_DeleteParameterFixedValues(SDDS_DATASET *SDDS_dataset)
Deletes fixed values from all parameters in the SDDS dataset.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_NumberOfErrors()
Retrieves the number of errors recorded by SDDS library routines.
int32_t SDDS_GetTypeSize(int32_t type)
Retrieves the size in bytes of a specified SDDS data type.
char ** SDDS_GetArrayNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all arrays in the SDDS dataset.
int32_t SDDS_PrintTypedValue(void *data, int64_t index, int32_t type, char *format, FILE *fp, uint32_t mode)
Prints a data value of a specified type using an optional printf format string.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data 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.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
long fexists(const char *filename)
Checks if a file exists.
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 scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
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 * expand_ranges(char *template)
Expand range specifiers in a wildcard template into explicit character lists.