85static char *option[N_OPTIONS] = {
102 " sddscombine [<SDDSinputfilelist>] [<SDDSoutputfile>]\n"
103 " [-pipe=[input][,output]]\n"
104 " [-delete={column|parameter|array},<matching-string>[,...]]\n"
105 " [-retain={column|parameter|array},<matching-string>[,...]]\n"
106 " [-sparse=<integer>[,{average|median|minimum|maximum}]]\n"
107 " [-merge[=<parameter-name>|<npages>]]\n"
111 " [-recover[=clip]]\n"
112 " [-majorOrder=row|column]\n"
113 " [-xzLevel=<0-9>]\n"
114 " [-threads=<number>]\n\n"
116 " -pipe=input,output Enable piping for input and/or output.\n"
117 " -delete=type,pattern Delete columns, parameters, or arrays matching the pattern.\n"
118 " -retain=type,pattern Retain only columns, parameters, or arrays matching the pattern.\n"
119 " -sparse=<n>,mode Sample every nth row with optional mode (average, median, minimum, maximum).\n"
120 " -merge=param|npages Merge pages based on a parameter or number of pages.\n"
121 " -append Append data to the first input file.\n"
122 " -overWrite Overwrite the output file if it exists.\n"
123 " -collapse Collapse the output as if processed through sddscollapse.\n"
124 " -recover=clip Recover incomplete/corrupted data, optionally clipping incomplete pages.\n"
125 " -majorOrder=row|column Specify data write order: row-major or column-major.\n"
126 " -xzLevel=<0-9> Set LZMA compression level when writing .xz files.\n\n"
127 " -threads=<number> Read this many input files concurrently in ordinary combine mode. The default is 1.\n\n"
129 " sddscombine combines data from a series of SDDS files into a single SDDS file, usually with one page for each page in each file. "
130 "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"
131 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
133long SDDS_CompareParameterValues(
void *param1,
void *param2,
long type);
134long keep_element(
char *name,
char **
delete,
long deletions,
char **retain,
long retentions);
135void *SDDS_GetParameterMod(
SDDS_DATASET *SDDS_dataset,
SDDS_DATASET *SDDS_output,
char *parameter_name,
void *memory);
136static void WriteStandardPage(
SDDS_DATASET *SDDS_output,
SDDS_DATASET *SDDS_input,
char *inputfile,
long inputfiles);
137static void CombineStandardInputThreaded(
SDDS_DATASET *SDDS_output,
char **inputfile,
long inputfiles,
long sparse, int32_t sparse_statistics,
long nColumns,
int threads);
140#define PARAMETER_MODE 1
143char *mode_name[MODES] = {
149#define SPARSE_AVERAGE 0
150#define SPARSE_MEDIAN 1
151#define SPARSE_MINIMUM 2
152#define SPARSE_MAXIMUM 3
153#define SPARSE_MODES 4
154char *sparse_mode[SPARSE_MODES] = {
161#define ROW_INCREMENT 100
163int main(
int argc,
char **argv) {
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;
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();
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;
190 argc =
scanargs(&s_arg, argc, argv);
194 setPageNumber = allocated_rows = param_type = param_size = 0;
195 last_param = this_param = NULL;
198 outputfile = param = NULL;
199 inputfiles = merge = overwrite = collapse = append = nMerge = 0;
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;
212 argc =
scanargs(&s_arg, argc, argv);
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:
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;
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);
238 if (s_arg[i_arg].n_items != 2 ||
239 sscanf(s_arg[i_arg].list[1],
"%d", &threads) != 1 ||
244 if (s_arg[i_arg].n_items > 2)
245 bomb(
"invalid -merge syntax", USAGE);
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);
254 param = s_arg[i_arg].list[1];
258 if (s_arg[i_arg].n_items > 1)
259 bomb(
"invalid -append syntax", USAGE);
262 SDDS_Bomb(
"-collapse and -append options cannot be used together");
270 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
275 if (s_arg[i_arg].n_items != 1) {
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)
282 if (s_arg[i_arg].n_items < 3)
284 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
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;
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;
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;
304 SDDS_Bomb(
"invalid -delete syntax: specify column or parameter keyword");
309 if (s_arg[i_arg].n_items < 3)
311 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
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;
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;
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;
331 SDDS_Bomb(
"invalid -retain syntax: specify column or parameter keyword");
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);
341 bomb(
"invalid -sparse syntax", USAGE);
343 if (s_arg[i_arg].n_items == 3) {
344 switch (
match_string(s_arg[i_arg].list[2], sparse_mode, SPARSE_MODES, 0)) {
346 sparse_statistics = 1;
349 sparse_statistics = 2;
352 sparse_statistics = 3;
355 sparse_statistics = 4;
363 bomb(
"invalid -sparse syntax", USAGE);
369 SDDS_Bomb(
"-collapse and -append options cannot be used together");
374 bomb(
"unrecognized option", USAGE);
378 inputfile =
trealloc(inputfile,
sizeof(*inputfile) * (inputfiles + 1));
379 inputfile[inputfiles++] = s_arg[i_arg].list[0];
384 if (inputfiles > 1) {
385 if (pipeFlags & USE_STDIN)
386 SDDS_Bomb(
"too many input files with -pipe option");
387 if (!(pipeFlags & USE_STDOUT)) {
389 outputfile = inputfile[--inputfiles];
390 if (
fexists(outputfile) && !overwrite)
391 SDDS_Bomb(
"output file exists already--give -overWrite option to force replacement");
394 }
else if (inputfiles == 1) {
395 if (pipeFlags & USE_STDIN) {
396 outputfile = inputfile[0];
399 if (pipeFlags & USE_STDOUT && outputfile)
400 SDDS_Bomb(
"too many filenames given with -pipe=output");
402 if (!(pipeFlags & USE_STDIN) || !(pipeFlags & USE_STDOUT))
405 inputfile =
tmalloc(
sizeof(*inputfile) * 1);
406 inputfile[0] = outputfile = NULL;
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.");
428 if (columnMajorOrder != -1)
429 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
431 SDDS_output.layout.data_mode.column_major = SDDS_input.layout.data_mode.column_major;
435 for (; iFile < inputfiles; iFile++) {
443 for (i = 0; i < names; i++) {
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]);
452 if (keep_element(name[i], delete_column, delete_columns, retain_column, retain_columns) &&
464 for (i = 0; i < names; i++) {
466 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
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]);
478 if (keep_element(name[i], delete_parameter, delete_parameters, retain_parameter, retain_parameters) &&
491 for (i = 0; i < names; i++) {
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]);
499 if (keep_element(name[i], delete_array, delete_arrays, retain_array, retain_arrays) &&
526 SDDS_DefineColumn(&SDDS_output,
"NumberCombined", NULL, NULL,
"Number of files combined to make this file", NULL,
SDDS_LONG, 0) < 0)
563 if (!
SDDS_StartPage(&SDDS_output, allocated_rows = ROW_INCREMENT)) {
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);
590 for (; iFile < inputfiles; iFile++) {
597 while (!recovered && (retval =
SDDS_ReadPageSparse(&SDDS_input, 0, nColumns ? sparse : INT64_MAX - 1, 0, sparse_statistics)) >= 0) {
610 SDDS_Bomb(
"-merge parameter not in input file(s)");
613 SDDS_Bomb(
"-merge parameter changes type in subsequent files");
616 this_param =
tmalloc(param_size);
617 last_param =
tmalloc(param_size);
619 SDDS_Bomb(
"error getting value for -merge parameter");
622 memcpy(last_param, this_param, param_size);
625 SDDS_Bomb(
"error getting value for -merge parameter");
629 fprintf(stderr,
"parameter %s = ", param);
631 fprintf(stderr,
" now (was ");
633 fprintf(stderr,
")\n");
637 if (merge && param) {
638 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0 && output_pending) {
642 if (!merge || (!param && first_data && first_page) || (param && !output_pending)) {
643 if (page > allocated_rows) {
648 allocated_rows += ROW_INCREMENT;
650 for (i = 0; i < columns; i++) {
651 if (!SDDS_GetParameterMod(&SDDS_input, &SDDS_output, column[i], buffer)) {
655 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, page - 1, column[i], buffer, NULL)) {
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)) {
666 if (!
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"NumberCombined", inputfiles, NULL)) {
671 if (setPageNumber && !
SDDS_SetRowValues(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, page - 1,
"PageNumber", page, NULL)) {
676 }
else if (merge && param && output_pending) {
687 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"Filename", inputfile[iFile] ? inputfile[iFile] :
"stdin", NULL)) {
693 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
702 }
else if (merge && !param) {
703 if (nMerge > 0 && (page - 1) % nMerge == 0 && page != 1) {
710 if ((first_data && first_page) || (nMerge > 0 && (page - 1) % nMerge == 0)) {
724 if (SDDS_CompareParameterValues(this_param, last_param, param_type) != 0)
725 fprintf(stderr,
"Parameter value has changed\n");
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)) {
740 if (!output_pending) {
763 if (!collapse && merge && output_pending) {
765 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
800static void WriteStandardPage(
SDDS_DATASET *SDDS_output,
SDDS_DATASET *SDDS_input,
char *inputfile,
long inputfiles) {
807 if (!
SDDS_SetParameters(SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"Filename", inputfile ? inputfile :
"stdin", NULL)) {
813 if (!
SDDS_SetParameters(SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"NumberCombined", inputfiles, NULL)) {
824static void CombineStandardInputThreaded(
SDDS_DATASET *SDDS_output,
char **inputfile,
long inputfiles,
long sparse, int32_t sparse_statistics,
long nColumns,
int threads) {
827 int64_t sparseInterval;
831 if (threads > inputfiles)
832 threads = inputfiles;
833 sparseInterval = nColumns ? sparse : INT64_MAX - 1;
835 for (batchStart = 0; batchStart < inputfiles; batchStart += threads) {
839 char (*errorMessage)[1024];
843 if (batchStart + batchSize > inputfiles)
844 batchSize = inputfiles - batchStart;
845 activeThreads = batchSize;
846 SDDS_input = calloc(batchSize,
sizeof(*SDDS_input));
847 initialized = calloc(batchSize,
sizeof(*initialized));
848 readCode = calloc(batchSize,
sizeof(*readCode));
849 errorMessage = calloc(batchSize,
sizeof(*errorMessage));
850 if (!SDDS_input || !initialized || !readCode || !errorMessage)
853#pragma omp parallel for if (activeThreads > 1) num_threads(activeThreads) schedule(dynamic)
854 for (slot = 0; slot < batchSize; slot++) {
856 initialized[slot] = 1;
857 readCode[slot] =
SDDS_ReadPageSparse(&SDDS_input[slot], 0, sparseInterval, 0, sparse_statistics);
858 if (readCode[slot] == 0)
859 snprintf(errorMessage[slot],
sizeof(*errorMessage),
"Error: unable to read '%s'.", inputfile[batchStart + slot]);
861 initialized[slot] = 0;
863 snprintf(errorMessage[slot],
sizeof(*errorMessage),
"Error: unable to open '%s'.", inputfile[batchStart + slot]);
867 for (slot = 0; slot < batchSize; slot++) {
868 if (!initialized[slot] || readCode[slot] == 0) {
869 fprintf(stderr,
"%s\n", errorMessage[slot]);
872 while (readCode[slot] > 0) {
873 WriteStandardPage(SDDS_output, &SDDS_input[slot], inputfile[batchStart + slot], inputfiles);
874 readCode[slot] =
SDDS_ReadPageSparse(&SDDS_input[slot], 0, sparseInterval, 0, sparse_statistics);
880 initialized[slot] = 0;
890void *SDDS_GetParameterMod(
SDDS_DATASET *SDDS_dataset,
SDDS_DATASET *SDDS_output,
char *parameter_name,
void *memory) {
891 long index, type, size;
895 uint64_t ulong64data;
899 unsigned short ushortdata;
916 if (!parameter_name) {
917 SDDS_SetError(
"Unable to get parameter value--parameter name pointer is NULL (SDDS_GetParameterMod)");
922 SDDS_SetError(
"Unable to get parameter value--parameter name is unrecognized (SDDS_GetParameterMod)");
926 SDDS_SetError(
"Unable to get parameter value--parameter data type is invalid (SDDS_GetParameterMod)");
933 SDDS_SetError(
"Unable to get parameter value--parameter data size is invalid (SDDS_GetParameterMod)");
938 data = memcpy(data, &floatdata, size);
941 data = memcpy(data, &doubledata, size);
944 data = memcpy(data, &ulong64data, size);
947 data = memcpy(data, &long64data, size);
950 data = memcpy(data, &ulongdata, size);
953 data = memcpy(data, &longdata, size);
956 data = memcpy(data, &ushortdata, size);
959 data = memcpy(data, &shortdata, size);
962 data = memcpy(data, &chardata, size);
970 SDDS_SetError(
"Unable to get parameter value--parameter data type is invalid (SDDS_GetParameterMod)");
973 if (!SDDS_dataset->parameter || !SDDS_dataset->parameter[index]) {
974 SDDS_SetError(
"Unable to get parameter value--parameter data array is NULL (SDDS_GetParameterMod)");
981 SDDS_SetError(
"Unable to get parameter value--parameter data size is invalid (SDDS_GetParameterMod)");
985 memcpy(data, SDDS_dataset->parameter[index], size);
986 else if (!
SDDS_CopyString((
char **)data, *(
char **)SDDS_dataset->parameter[index]))
992long SDDS_CompareParameterValues(
void *param1,
void *param2,
long type) {
999 ddiff = *((
float *)param1) - *((
float *)param2);
1000 return ddiff < 0 ? -1 : ddiff > 0 ? 1 : 0;
1002 ddiff = *((
double *)param1) - *((
double *)param2);
1003 return ddiff < 0 ? -1 : ddiff > 0 ? 1 : 0;
1005 ldiff = *((int64_t *)param1) - *((int64_t *)param2);
1006 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1008 ldiff = *((uint64_t *)param1) - *((uint64_t *)param2);
1009 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1011 ldiff = *((int32_t *)param1) - *((int32_t *)param2);
1012 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1014 ldiff = *((uint32_t *)param1) - *((uint32_t *)param2);
1015 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1017 ldiff = *((
short *)param1) - *((
short *)param2);
1018 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1020 ldiff = *((
unsigned short *)param1) - *((
unsigned short *)param2);
1021 return ldiff < 0 ? -1 : ldiff > 0 ? 1 : 0;
1023 cdiff = (short)*((
char *)param1) - (short)*((
char *)param2);
1024 return cdiff < 0 ? -1 : cdiff > 0 ? 1 : 0;
1026 return strcmp(*(
char **)param1, *(
char **)param2);
1028 SDDS_SetError(
"Problem doing data comparison--invalid data type (SDDS_CompareParameterValues)");
1029 SDDS_PrintErrors(stderr, SDDS_EXIT_PrintErrors | SDDS_VERBOSE_PrintErrors);
1034long keep_element(
char *name,
char **
delete,
long deletions,
char **retain,
long retentions) {
1040 for (i = 0; i < deletions; i++) {
1051 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.