79static char *option[N_OPTIONS] = {
94 " sddscombine [<SDDSinputfilelist>] [<SDDSoutputfile>]\n"
95 " [-pipe=[input][,output]]\n"
96 " [-delete={column|parameter|array},<matching-string>[,...]]\n"
97 " [-retain={column|parameter|array},<matching-string>[,...]]\n"
98 " [-sparse=<integer>[,{average|median|minimum|maximum}]]\n"
99 " [-merge[=<parameter-name>|<npages>]]\n"
103 " [-recover[=clip]]\n"
104 " [-majorOrder=row|column]\n\n"
106 " -pipe=input,output Enable piping for input and/or output.\n"
107 " -delete=type,pattern Delete columns, parameters, or arrays matching the pattern.\n"
108 " -retain=type,pattern Retain only columns, parameters, or arrays matching the pattern.\n"
109 " -sparse=<n>,mode Sample every nth row with optional mode (average, median, minimum, maximum).\n"
110 " -merge=param|npages Merge pages based on a parameter or number of pages.\n"
111 " -append Append data to the first input file.\n"
112 " -overWrite Overwrite the output file if it exists.\n"
113 " -collapse Collapse the output as if processed through sddscollapse.\n"
114 " -recover=clip Recover incomplete/corrupted data, optionally clipping incomplete pages.\n"
115 " -majorOrder=row|column Specify data write order: row-major or column-major.\n\n"
117 " sddscombine combines data from a series of SDDS files into a single SDDS file, usually with one page for each page in each file. "
118 "Data is added from files in the order that they are listed on the command line. A new parameter ('Filename') is added to show the source of each page.\n\n"
119 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
121long SDDS_CompareParameterValues(
void *param1,
void *param2,
long type);
122long keep_element(
char *name,
char **
delete,
long deletions,
char **retain,
long retentions);
123void *SDDS_GetParameterMod(
SDDS_DATASET *SDDS_dataset,
SDDS_DATASET *SDDS_output,
char *parameter_name,
void *memory);
126#define PARAMETER_MODE 1
129char *mode_name[MODES] = {
135#define SPARSE_AVERAGE 0
136#define SPARSE_MEDIAN 1
137#define SPARSE_MINIMUM 2
138#define SPARSE_MAXIMUM 3
139#define SPARSE_MODES 4
140char *sparse_mode[SPARSE_MODES] = {
147#define ROW_INCREMENT 100
149int main(
int argc,
char **argv) {
151 char **inputfile, *outputfile;
152 long inputfiles, i, i_arg, retval = 0, first_page;
153 long iFile, first_data, sparse, setPageNumber;
154 int32_t sparse_statistics = 0;
155 long merge, nMerge, overwrite, collapse, page, append;
156 int64_t allocated_rows;
160 char *param, *last_param, *this_param, *text, *contents, **column;
161 long param_index, param_type, param_size, output_pending;
162 unsigned long pipeFlags, majorOrderFlag;
164 char **retain_column, **delete_column;
165 long retain_columns, delete_columns;
166 char **retain_parameter, **delete_parameter;
167 long retain_parameters, delete_parameters;
168 char **retain_array, **delete_array;
169 long retain_arrays, delete_arrays;
170 long nColumns, recover, recovered;
171 short columnMajorOrder = -1;
174 argc =
scanargs(&s_arg, argc, argv);
178 setPageNumber = allocated_rows = param_type = param_size = 0;
179 last_param = this_param = NULL;
182 outputfile = param = NULL;
183 inputfiles = merge = overwrite = collapse = append = nMerge = 0;
188 retain_column = delete_column = NULL;
189 retain_columns = delete_columns = 0;
190 retain_parameter = delete_parameter = NULL;
191 retain_parameters = delete_parameters = 0;
192 retain_array = delete_array = NULL;
193 retain_arrays = delete_arrays = 0;
196 argc =
scanargs(&s_arg, argc, argv);
200 for (i_arg = 1; i_arg < argc; i_arg++) {
201 if (s_arg[i_arg].arg_type == OPTION) {
202 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
203 case SET_MAJOR_ORDER:
205 s_arg[i_arg].n_items -= 1;
206 if (s_arg[i_arg].n_items > 0 &&
207 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
208 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
209 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
210 SDDS_Bomb(
"invalid -majorOrder syntax/values");
211 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
212 columnMajorOrder = 1;
213 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
214 columnMajorOrder = 0;
217 if (s_arg[i_arg].n_items > 2)
218 bomb(
"invalid -merge syntax", USAGE);
222 if (s_arg[i_arg].n_items == 2) {
223 if (isdigit(s_arg[i_arg].list[1][0])) {
224 if (!sscanf(s_arg[i_arg].list[1],
"%ld", &nMerge))
225 bomb(
"invalid -merge syntax (could not scan number of pages)", USAGE);
227 param = s_arg[i_arg].list[1];
231 if (s_arg[i_arg].n_items > 1)
232 bomb(
"invalid -append syntax", USAGE);
235 SDDS_Bomb(
"-collapse and -append options cannot be used together");
243 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
248 if (s_arg[i_arg].n_items != 1) {
250 if (s_arg[i_arg].n_items > 2 || strncmp(s_arg[i_arg].list[1],
"clip", strlen(s_arg[i_arg].list[1])) != 0)
255 if (s_arg[i_arg].n_items < 3)
257 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
259 delete_column =
trealloc(delete_column,
sizeof(*delete_column) * (delete_columns + s_arg[i_arg].n_items - 2));
260 for (i = 2; i < s_arg[i_arg].n_items; i++)
261 delete_column[i - 2 + delete_columns] =
expand_ranges(s_arg[i_arg].list[i]);
262 delete_columns += s_arg[i_arg].n_items - 2;
265 delete_parameter =
trealloc(delete_parameter,
sizeof(*delete_parameter) * (delete_parameters + s_arg[i_arg].n_items - 2));
266 for (i = 2; i < s_arg[i_arg].n_items; i++)
267 delete_parameter[i - 2 + delete_parameters] =
expand_ranges(s_arg[i_arg].list[i]);
268 delete_parameters += s_arg[i_arg].n_items - 2;
271 delete_array =
trealloc(delete_array,
sizeof(*delete_array) * (delete_arrays + s_arg[i_arg].n_items - 2));
272 for (i = 2; i < s_arg[i_arg].n_items; i++)
273 delete_array[i - 2 + delete_arrays] =
expand_ranges(s_arg[i_arg].list[i]);
274 delete_arrays += s_arg[i_arg].n_items - 2;
277 SDDS_Bomb(
"invalid -delete syntax: specify column or parameter keyword");
282 if (s_arg[i_arg].n_items < 3)
284 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
286 retain_column =
trealloc(retain_column,
sizeof(*retain_column) * (retain_columns + s_arg[i_arg].n_items - 2));
287 for (i = 2; i < s_arg[i_arg].n_items; i++)
288 retain_column[i - 2 + retain_columns] =
expand_ranges(s_arg[i_arg].list[i]);
289 retain_columns += s_arg[i_arg].n_items - 2;
292 retain_parameter =
trealloc(retain_parameter,
sizeof(*retain_parameter) * (retain_parameters + s_arg[i_arg].n_items - 2));
293 for (i = 2; i < s_arg[i_arg].n_items; i++)
294 retain_parameter[i - 2 + retain_parameters] =
expand_ranges(s_arg[i_arg].list[i]);
295 retain_parameters += s_arg[i_arg].n_items - 2;
298 retain_array =
trealloc(retain_array,
sizeof(*retain_array) * (retain_arrays + s_arg[i_arg].n_items - 2));
299 for (i = 2; i < s_arg[i_arg].n_items; i++)
300 retain_array[i - 2 + retain_arrays] =
expand_ranges(s_arg[i_arg].list[i]);
301 retain_arrays += s_arg[i_arg].n_items - 2;
304 SDDS_Bomb(
"invalid -retain syntax: specify column or parameter keyword");
309 if ((s_arg[i_arg].n_items >= 2) && (s_arg[i_arg].n_items <= 3)) {
310 if (sscanf(s_arg[i_arg].list[1],
"%ld", &sparse) != 1) {
311 bomb(
"invalid -sparse syntax", USAGE);
314 bomb(
"invalid -sparse syntax", USAGE);
316 if (s_arg[i_arg].n_items == 3) {
317 switch (
match_string(s_arg[i_arg].list[2], sparse_mode, SPARSE_MODES, 0)) {
319 sparse_statistics = 1;
322 sparse_statistics = 2;
325 sparse_statistics = 3;
328 sparse_statistics = 4;
336 bomb(
"invalid -sparse syntax", USAGE);
342 SDDS_Bomb(
"-collapse and -append options cannot be used together");
347 bomb(
"unrecognized option", USAGE);
351 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
352 inputfile[inputfiles++] = s_arg[i_arg].list[0];
357 if (inputfiles > 1) {
358 if (pipeFlags & USE_STDIN)
359 SDDS_Bomb(
"too many input files with -pipe option");
360 if (!(pipeFlags & USE_STDOUT)) {
362 outputfile = inputfile[--inputfiles];
363 if (
fexists(outputfile) && !overwrite)
364 SDDS_Bomb(
"output file exists already--give -overWrite option to force replacement");
367 }
else if (inputfiles == 1) {
368 if (pipeFlags & USE_STDIN) {
369 outputfile = inputfile[0];
372 if (pipeFlags & USE_STDOUT && outputfile)
373 SDDS_Bomb(
"too many filenames given with -pipe=output");
375 if (!(pipeFlags & USE_STDIN) || !(pipeFlags & USE_STDOUT))
378 inputfile =
tmalloc(
sizeof(*inputfile) * 1);
379 inputfile[0] = outputfile = NULL;
382 for (i = 0; i < inputfiles; i++)
383 if (inputfile[i] && outputfile && strcmp(inputfile[i], outputfile) == 0)
384 SDDS_Bomb(
"Output file is also an input file.");
401 if (columnMajorOrder != -1)
402 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
404 SDDS_output.layout.data_mode.column_major = SDDS_input.layout.data_mode.column_major;
408 for (; iFile < inputfiles; iFile++) {
416 for (i = 0; i < names; i++) {
419 if (keep_element(name[i], delete_column, delete_columns, retain_column, retain_columns) &&
421 fprintf(stderr,
"Error (sddscombine): Problem appending data. Column %s does not exist in first page.\n", name[i]);
425 if (keep_element(name[i], delete_column, delete_columns, retain_column, retain_columns) &&
437 for (i = 0; i < names; i++) {
439 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
445 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
447 fprintf(stderr,
"Error (sddscombine): Problem appending data. Parameter %s does not exist in first page.\n", name[i]);
451 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
464 for (i = 0; i < names; i++) {
466 if (keep_element(name[i], delete_array, delete_arrays, retain_array, retain_arrays) &&
468 fprintf(stderr,
"Error (sddscombine): Problem appending data. Array %s does not exist in first page.\n", name[i]);
472 if (keep_element(name[i], delete_array, delete_arrays, retain_array, retain_arrays) &&
499 SDDS_DefineColumn(&SDDS_output,
"NumberCombined", NULL, NULL,
"Number of files combined to make this file", NULL,
SDDS_LONG, 0) < 0)
536 if (!
SDDS_StartPage(&SDDS_output, allocated_rows = ROW_INCREMENT)) {
553 for (; iFile < inputfiles; iFile++) {
560 while (!recovered && (retval =
SDDS_ReadPageSparse(&SDDS_input, 0, nColumns ? sparse : INT64_MAX - 1, 0, sparse_statistics)) >= 0) {
573 SDDS_Bomb(
"-merge parameter not in input file(s)");
576 SDDS_Bomb(
"-merge parameter changes type in subsequent files");
579 this_param =
tmalloc(param_size);
580 last_param =
tmalloc(param_size);
582 SDDS_Bomb(
"error getting value for -merge parameter");
585 memcpy(last_param, this_param, param_size);
588 SDDS_Bomb(
"error getting value for -merge parameter");
592 fprintf(stderr,
"parameter %s = ", param);
594 fprintf(stderr,
" now (was ");
596 fprintf(stderr,
")\n");
600 if (merge && param) {
601 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0 && output_pending) {
605 if (!merge || (!param && first_data && first_page) || (param && !output_pending)) {
606 if (page > allocated_rows) {
611 allocated_rows += ROW_INCREMENT;
613 for (i = 0; i < columns; i++) {
614 if (!SDDS_GetParameterMod(&SDDS_input, &SDDS_output, column[i], buffer)) {
618 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, page - 1, column[i], buffer, NULL)) {
624 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"Filename", inputfile[iFile] ? inputfile[iFile] :
"stdin",
"NumberCombined", inputfiles, NULL)) {
629 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"NumberCombined", inputfiles, NULL)) {
634 if (setPageNumber && !
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"PageNumber", page, NULL)) {
639 }
else if (merge && param && output_pending) {
650 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"Filename", inputfile[iFile] ? inputfile[iFile] :
"stdin", NULL)) {
656 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
665 }
else if (merge && !param) {
666 if (nMerge > 0 && (page - 1) % nMerge == 0 && page != 1) {
673 if ((first_data && first_page) || (nMerge > 0 && (page - 1) % nMerge == 0)) {
687 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0)
688 fprintf(stderr,
"Parameter value has changed\n");
690 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0 && output_pending) {
692 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
703 if (!output_pending) {
726 if (!collapse && merge && output_pending) {
728 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
763void *SDDS_GetParameterMod(
SDDS_DATASET *SDDS_dataset,
SDDS_DATASET *SDDS_output,
char *parameter_name,
void *memory) {
764 long index, type, size;
768 uint64_t ulong64data;
772 unsigned short ushortdata;
789 if (!parameter_name) {
790 SDDS_SetError(
"Unable to get parameter value--parameter name pointer is NULL (SDDS_GetParameterMod)");
795 SDDS_SetError(
"Unable to get parameter value--parameter name is unrecognized (SDDS_GetParameterMod)");
799 SDDS_SetError(
"Unable to get parameter value--parameter data type is invalid (SDDS_GetParameterMod)");
806 SDDS_SetError(
"Unable to get parameter value--parameter data size is invalid (SDDS_GetParameterMod)");
811 data = memcpy(data, &floatdata, size);
814 data = memcpy(data, &doubledata, size);
817 data = memcpy(data, &ulong64data, size);
820 data = memcpy(data, &long64data, size);
823 data = memcpy(data, &ulongdata, size);
826 data = memcpy(data, &longdata, size);
829 data = memcpy(data, &ushortdata, size);
832 data = memcpy(data, &shortdata, size);
835 data = memcpy(data, &chardata, size);
843 SDDS_SetError(
"Unable to get parameter value--parameter data type is invalid (SDDS_GetParameterMod)");
846 if (!SDDS_dataset->parameter || !SDDS_dataset->parameter[index]) {
847 SDDS_SetError(
"Unable to get parameter value--parameter data array is NULL (SDDS_GetParameterMod)");
854 SDDS_SetError(
"Unable to get parameter value--parameter data size is invalid (SDDS_GetParameterMod)");
858 memcpy(data, SDDS_dataset->parameter[index], size);
859 else if (!
SDDS_CopyString((
char **)data, *(
char **)SDDS_dataset->parameter[index]))
865long SDDS_CompareParameterValues(
void *param1,
void *param2,
long type) {
872 ddiff = *((
float *)param1) - *((
float *)param2);
873 return ddiff < 0 ? -1 : ddiff > 0 ? 1 : 0;
875 ddiff = *((
double *)param1) - *((
double *)param2);
876 return ddiff < 0 ? -1 : ddiff > 0 ? 1 : 0;
878 ldiff = *((int64_t *)param1) - *((int64_t *)param2);
879 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
881 ldiff = *((uint64_t *)param1) - *((uint64_t *)param2);
882 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
884 ldiff = *((int32_t *)param1) - *((int32_t *)param2);
885 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
887 ldiff = *((uint32_t *)param1) - *((uint32_t *)param2);
888 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
890 ldiff = *((
short *)param1) - *((
short *)param2);
891 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
893 ldiff = *((
unsigned short *)param1) - *((
unsigned short *)param2);
894 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
896 cdiff = (short)*((
char *)param1) - (short)*((
char *)param2);
897 return cdiff < 0 ? -1 : cdiff > 0 ? 1 : 0;
899 return strcmp(*(
char **)param1, *(
char **)param2);
901 SDDS_SetError(
"Problem doing data comparison--invalid data type (SDDS_CompareParameterValues)");
907long keep_element(
char *name,
char **
delete,
long deletions,
char **retain,
long retentions) {
913 for (i = 0; i < deletions; i++) {
924 for (i = 0; i < retentions; i++) {
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
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_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
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.
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_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_CheckDataset(SDDS_DATASET *SDDS_dataset, const char *caller)
Validates the SDDS dataset pointer.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
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.
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.
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_ULONG
Identifier for the unsigned 32-bit integer data type.
#define SDDS_FLOAT
Identifier for the float data type.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_ULONG64
Identifier for the unsigned 64-bit integer data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_SHORT
Identifier for the signed short integer data type.
#define SDDS_CHARACTER
Identifier for the character data type.
#define SDDS_USHORT
Identifier for the unsigned short integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
#define SDDS_LONG64
Identifier for the signed 64-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.
int wild_match(char *string, char *template)
Determine whether one string is a wildcard match for another.