62char *option[N_OPTIONS] = {
78 "Usage: sddsmakedataset [<outputFile> | -pipe=out]\n"
81 " -defaultType=<type>\n"
82 " Specify the default data type for parameters and columns if not specified.\n"
83 " Available types: double, float, long64, ulong64, long, ulong, short, ushort, string, character.\n\n"
84 " -parameter=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
85 " Define a parameter with optional type, units, symbol, and description.\n"
86 " Must be followed by -data=<value> to provide the parameter's value.\n\n"
88 " Provide the data value for the preceding -parameter, -column, or -array option.\n\n"
89 " -column=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
90 " Define a column with optional type, units, symbol, and description.\n"
91 " Must be followed by -data=<listOfCommaSeparatedValues> to provide the column's data.\n\n"
92 " -array=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
93 " Define an array with optional type, units, symbol, and description.\n"
94 " Must be followed by -data=<listOfCommaSeparatedValues> to provide the array's data.\n"
95 " Currently supports only one-dimensional arrays.\n\n"
97 " Do not print out warning messages.\n\n"
99 " Output file in ASCII mode. The default is binary.\n\n"
100 " -description=<string>\n"
101 " Provide a description of the output file.\n\n"
102 " -contents=<string>\n"
103 " Provide contents of the description.\n\n"
105 " Append data to an existing file. Use 'merge' to append to the current page.\n\n"
106 " -majorOrder=row|column\n"
107 " Specify output file in row or column major order.\n\n"
109 " SDDS output file for writing the data.\n\n"
111 " Output the data in SDDS format to the pipe instead of to a file.\n\n"
112 "Program by Hairong Shang. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
117 char *name, *dataString;
119 char *description, *symbol, *unit, *
typename;
125 char *name, **dataList;
127 char *description, *symbol, *unit, *
typename;
136 char *defaultType,
long noWarnings,
long maxrows);
140int main(
int argc,
char **argv) {
143 char *defaultType, *outputFile;
144 unsigned long pipeFlags, dummyFlags, majorOrderFlag;
148 long parameters, columns, arrays, previousOption, i, j, i_arg, currentOption, tmpfile_used, noWarnings, maxrows = 0, outputMode;
149 char *input =
"obset";
150 char *description, *contents;
151 short columnMajorOrder = 0, append = 0;
153 int32_t colIndex, arrayIndex, dsize, startIndex;
156 description = contents = NULL;
160 parameters = columns = arrays = 0;
161 outputFile = defaultType = NULL;
163 tmpfile_used = noWarnings = 0;
164 outputMode = SDDS_BINARY;
169 argc =
scanargs(&s_arg, argc, argv);
171 fprintf(stderr,
"Error: Insufficient arguments provided.\n\n%s", USAGE);
176 for (i_arg = 1; i_arg < argc; i_arg++) {
177 if (s_arg[i_arg].arg_type == OPTION) {
179 currentOption =
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0);
180 if (currentOption == CLO_DATA && previousOption != CLO_PARAMETER && previousOption != CLO_COLUMN && previousOption != CLO_ARRAY) {
181 SDDS_Bomb(
"-data option must follow a -parameter, -column, or -array option.");
183 switch (currentOption) {
184 case CLO_MAJOR_ORDER:
186 s_arg[i_arg].n_items -= 1;
187 if (s_arg[i_arg].n_items > 0 &&
188 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
189 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
190 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
191 SDDS_Bomb(
"Invalid -majorOrder syntax or value.");
192 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
193 columnMajorOrder = 1;
194 if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
195 columnMajorOrder = 0;
201 if (s_arg[i_arg].n_items < 2)
203 parameter =
SDDS_Realloc(parameter,
sizeof(*parameter) * (parameters + 1));
204 parameter[parameters] = InitializeParameteterInfo();
206 s_arg[i_arg].list += 2;
207 s_arg[i_arg].n_items -= 2;
208 if (!(parameter[parameters]->name) || !strlen(parameter[parameters]->name))
209 SDDS_Bomb(
"Invalid -parameter syntax (no name).");
210 if (s_arg[i_arg].n_items > 0 &&
211 !
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
212 "type",
SDDS_STRING, &(parameter[parameters]->
typename), 1, 0,
213 "units",
SDDS_STRING, &(parameter[parameters]->unit), 1, 0,
214 "symbol",
SDDS_STRING, &(parameter[parameters]->symbol), 1, 0,
215 "description",
SDDS_STRING, &(parameter[parameters]->description), 1, 0, NULL))
218 s_arg[i_arg].list -= 2;
219 s_arg[i_arg].n_items += 2;
222 if (s_arg[i_arg].n_items < 2)
224 column =
SDDS_Realloc(column,
sizeof(*column) * (columns + 1));
225 column[columns] = InitializeColumnInfo();
227 s_arg[i_arg].list += 2;
228 s_arg[i_arg].n_items -= 2;
229 if (!(column[columns]->name) || !strlen(column[columns]->name))
230 SDDS_Bomb(
"Invalid -column syntax (no name).");
231 if (s_arg[i_arg].n_items > 0 &&
232 (!
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
233 "type",
SDDS_STRING, &(column[columns]->
typename), 1, 0,
234 "unit",
SDDS_STRING, &(column[columns]->unit), 1, 0,
235 "symbol",
SDDS_STRING, &(column[columns]->symbol), 1, 0,
236 "description",
SDDS_STRING, &(column[columns]->description), 1, 0, NULL)))
239 s_arg[i_arg].list -= 2;
240 s_arg[i_arg].n_items += 2;
243 if (s_arg[i_arg].n_items < 2)
245 array =
SDDS_Realloc(array,
sizeof(*array) * (arrays + 1));
246 array[arrays] = InitializeColumnInfo();
248 s_arg[i_arg].list += 2;
249 s_arg[i_arg].n_items -= 2;
250 if (!(array[arrays]->name) || !strlen(array[arrays]->name))
251 SDDS_Bomb(
"Invalid -array syntax (no name).");
252 if (s_arg[i_arg].n_items > 0 &&
253 (!
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
254 "type",
SDDS_STRING, &(array[arrays]->
typename), 1, 0,
256 "symbol",
SDDS_STRING, &(array[arrays]->symbol), 1, 0,
257 "description",
SDDS_STRING, &(array[arrays]->description), 1, 0, NULL)))
260 s_arg[i_arg].list -= 2;
261 s_arg[i_arg].n_items += 2;
264 if (previousOption == CLO_PARAMETER) {
265 parameter[parameters - 1]->dataString = s_arg[i_arg].list[1];
267 if (previousOption == CLO_COLUMN) {
268 if (((s_arg[i_arg].n_items - 1) == 1) &&
269 (strlen(s_arg[i_arg].list[1]) > 1) &&
270 (((column[columns - 1]->
typename) && (strcmp(column[columns - 1]->
typename,
"character") == 0)) ||
271 ((defaultType) && (strcmp(defaultType,
"character") == 0)))) {
273 column[columns - 1]->rows = strlen(s_arg[i_arg].list[1]);
274 column[columns - 1]->dataList = malloc(
sizeof(*(column[columns - 1]->dataList)) * column[columns - 1]->rows);
275 for (j = 0; j < column[columns - 1]->rows; j++) {
276 char buffer[2] = {s_arg[i_arg].list[1][j],
'\0'};
280 column[columns - 1]->rows = s_arg[i_arg].n_items - 1;
281 column[columns - 1]->dataList = malloc(
sizeof(*(column[columns - 1]->dataList)) * column[columns - 1]->rows);
282 for (j = 0; j < column[columns - 1]->rows; j++)
283 SDDS_CopyString(&column[columns - 1]->dataList[j], s_arg[i_arg].list[j + 1]);
286 if (previousOption == CLO_ARRAY) {
287 if (((s_arg[i_arg].n_items - 1) == 1) &&
288 (strlen(s_arg[i_arg].list[1]) > 1) &&
289 (((array[arrays - 1]->
typename) && (strcmp(array[arrays - 1]->
typename,
"character") == 0)) ||
290 ((defaultType) && (strcmp(defaultType,
"character") == 0)))) {
292 array[arrays - 1]->rows = strlen(s_arg[i_arg].list[1]);
293 array[arrays - 1]->dataList = malloc(
sizeof(*(array[arrays - 1]->dataList)) * array[arrays - 1]->rows);
294 for (j = 0; j < array[arrays - 1]->rows; j++) {
295 char buffer[2] = {s_arg[i_arg].list[1][j],
'\0'};
299 array[arrays - 1]->rows = s_arg[i_arg].n_items - 1;
300 array[arrays - 1]->dataList = malloc(
sizeof(*(array[arrays - 1]->dataList)) * array[arrays - 1]->rows);
301 for (j = 0; j < array[arrays - 1]->rows; j++)
302 SDDS_CopyString(&array[arrays - 1]->dataList[j], s_arg[i_arg].list[j + 1]);
306 case CLO_DEFAULTTYPE:
307 if (s_arg[i_arg].n_items != 2)
308 SDDS_Bomb(
"Invalid -defaultType option.");
312 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
314 if (pipeFlags != USE_STDOUT)
315 SDDS_Bomb(
"Only -pipe=out syntax is valid.");
317 case CLO_DESCRIPTION:
318 if (s_arg[i_arg].n_items != 2)
319 SDDS_Bomb(
"Invalid -description option.");
323 if (s_arg[i_arg].n_items != 2)
328 outputMode = SDDS_ASCII;
332 if (s_arg[i_arg].n_items != 1) {
334 if (s_arg[i_arg].n_items > 2 || strncmp(s_arg[i_arg].list[1],
"merge", strlen(s_arg[i_arg].list[1])) != 0)
339 fprintf(stderr,
"Error: Option %s is invalid.\n", s_arg[i_arg].list[0]);
343 previousOption = currentOption;
345 if (outputFile == NULL)
348 fprintf(stderr,
"Error: Too many filenames provided (%s).\n", s_arg[i_arg].list[0]);
354 if (!outputFile && !pipeFlags) {
355 fprintf(stderr,
"Error: Either an output file or -pipe=out must be specified.\n\n%s", USAGE);
358 if (outputFile && pipeFlags) {
359 fprintf(stderr,
"Error: Only one of output file and -pipe=out can be specified.\n\n%s", USAGE);
363 processFilenames(
"sddsmakedataset", &input, &outputFile, pipeFlags, 1, &tmpfile_used);
364 if (!columns && !parameters && !arrays) {
365 fprintf(stderr,
"Error: No data provided for writing.\n\n%s", USAGE);
368 if (contents && !description) {
370 fprintf(stderr,
"Warning: Description text is provided for contents without a description. No description will be written.\n");
375 for (i = 0; i < columns; i++)
376 if (maxrows < column[i]->rows)
377 maxrows = column[i]->rows;
378 SetInfoData(parameter, parameters, column, columns, array, arrays, defaultType, noWarnings, maxrows);
384 outTable.layout.data_mode.column_major = columnMajorOrder;
385 for (i = 0; i < parameters; i++) {
386 if (parameter[i]->dataString) {
387 if (
SDDS_DefineParameter(&outTable, parameter[i]->name, parameter[i]->symbol, parameter[i]->unit, parameter[i]->description, NULL, parameter[i]->type, NULL) < 0)
392 for (i = 0; i < columns; i++) {
393 if (column[i]->dataList) {
394 if (
SDDS_DefineColumn(&outTable, column[i]->name, column[i]->symbol, column[i]->unit, column[i]->description, NULL, column[i]->type, 0) < 0)
398 for (i = 0; i < arrays; i++) {
399 if (array[i]->dataList) {
400 if (
SDDS_DefineArray(&outTable, array[i]->name, array[i]->symbol, array[i]->unit, array[i]->description, NULL, array[i]->type, 0, 1, NULL) < 0)
419 for (i = 0; i < parameters; i++) {
420 if (parameter[i]->dataString) {
422 fprintf(stderr,
"Error: Parameter '%s' does not exist in the existing file.\n", parameter[i]->name);
428 fprintf(stderr,
"Error: Parameter count does not match the existing file.\n");
431 for (i = 0; i < columns; i++) {
432 if (column[i]->dataList) {
434 fprintf(stderr,
"Error: Column '%s' does not exist in the existing file.\n", column[i]->name);
440 fprintf(stderr,
"Error: Column count does not match the existing file.\n");
443 for (i = 0; i < arrays; i++) {
444 if (array[i]->dataList) {
446 fprintf(stderr,
"Error: Array '%s' does not exist in the existing file.\n", array[i]->name);
452 fprintf(stderr,
"Error: Array count does not match the existing file.\n");
457 if (append == 0 || append == 1) {
460 for (i = 0; i < parameters; i++) {
461 if (parameter[i]->data) {
462 if (!
SDDS_SetParameters(&outTable, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, parameter[i]->name, parameter[i]->data, NULL))
466 for (i = 0; i < columns; i++) {
467 if (column[i]->data) {
468 if (!
SDDS_SetColumn(&outTable, SDDS_SET_BY_NAME, column[i]->data, maxrows, column[i]->name))
472 for (i = 0; i < arrays; i++) {
473 if (array[i]->data) {
474 if (!
SDDS_SetArrayVararg(&outTable, array[i]->name, SDDS_CONTIGUOUS_DATA, array[i]->data, array[i]->rows))
480 for (i = 0; i < columns; i++) {
481 if (column[i]->data) {
483 for (j = 0; j < maxrows; j++) {
484 switch (column[i]->type) {
486 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
487 colIndex, ((
long double *)(column[i]->data))[j], -1) == 0)
491 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
492 colIndex, ((
double *)(column[i]->data))[j], -1) == 0)
496 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
497 colIndex, ((
float *)(column[i]->data))[j], -1) == 0)
501 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
502 colIndex, ((int64_t *)(column[i]->data))[j], -1) == 0)
506 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
507 colIndex, ((uint64_t *)(column[i]->data))[j], -1) == 0)
511 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
512 colIndex, ((int32_t *)(column[i]->data))[j], -1) == 0)
516 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
517 colIndex, ((uint32_t *)(column[i]->data))[j], -1) == 0)
521 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
522 colIndex, ((
short *)(column[i]->data))[j], -1) == 0)
526 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
527 colIndex, ((
unsigned short *)(column[i]->data))[j], -1) == 0)
531 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
532 colIndex, ((
char *)(column[i]->data))[j], -1) == 0)
536 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
537 colIndex, ((
char **)(column[i]->data))[j], -1) == 0)
541 SDDS_Bomb(
"Invalid data type provided.");
547 for (i = 0; i < arrays; i++) {
548 if (array[i]->data) {
550 sdds_array = outTable.array + arrayIndex;
552 startIndex = sdds_array->elements;
553 sdds_array->elements += array[i]->rows;
554 sdds_array->data =
SDDS_Realloc(sdds_array->data, dsize * sdds_array->elements);
556 if (!
SDDS_CopyStringArray(((
char **)sdds_array->data) + startIndex, array[i]->data, array[i]->rows))
559 memcpy((
char *)sdds_array->data + dsize * startIndex, array[i]->data, dsize * array[i]->rows);
577 FreeMemory(parameter, parameters, column, columns, array, arrays, maxrows);
592 fprintf(stderr,
"Error: Memory allocation failed for COLUMN_INFO.\n");
595 column->name = column->unit = column->description = column->symbol = NULL;
597 column->typename = NULL;
600 column->dataList = NULL;
607 fprintf(stderr,
"Error: Memory allocation failed for PARAMETER_INFO.\n");
610 parameter->name = parameter->unit = parameter->description = parameter->symbol = NULL;
611 parameter->typename = NULL;
612 parameter->data = NULL;
613 parameter->type = -1;
614 parameter->dataString = NULL;
619 long noWarnings,
long maxrows) {
625 for (i = 0; i < parameters; i++) {
627 if (!par->dataString) {
629 fprintf(stderr,
"Warning: No data provided for parameter '%s'. It will not be written to the output file.\n", par->name);
641 fprintf(stderr,
"Error: Invalid data type '%s' for parameter '%s'.\n", type, par->name);
644 par->data = malloc(
sizeof(
double));
646 fprintf(stderr,
"Error: Memory allocation failed for parameter data.\n");
651 *((
long double *)par->data) = strtold(par->dataString, NULL);
654 *((
double *)par->data) = atof(par->dataString);
657 *((
float *)par->data) = (float)atof(par->dataString);
660 *((int64_t *)par->data) = atoll(par->dataString);
663 *((uint64_t *)par->data) = strtoull(par->dataString, NULL, 10);
666 *((int32_t *)par->data) = atol(par->dataString);
669 *((uint32_t *)par->data) = strtoul(par->dataString, NULL, 10);
672 *((
short *)par->data) = (short)atol(par->dataString);
675 *((
unsigned short *)par->data) = (
unsigned short)atol(par->dataString);
678 cp_str((
char **)par->data, par->dataString);
681 *((
char *)par->data) = par->dataString[0];
684 SDDS_Bomb(
"Invalid data type encountered while setting parameter data.");
690 for (i = 0; i < columns; i++) {
692 if (!col->dataList) {
694 fprintf(stderr,
"Warning: No data provided for column '%s'. It will not be written to the output file.\n", col->name);
706 fprintf(stderr,
"Error: Invalid data type '%s' for column '%s'.\n", type, col->name);
709 if (col->rows < maxrows && !noWarnings)
710 fprintf(stderr,
"Warning: Missing data for column '%s'. Filling with zeros.\n", col->name);
713 col->data = malloc(
sizeof(
long double) * maxrows);
715 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
718 for (j = 0; j < col->rows; j++)
719 ((
long double *)col->data)[j] = strtold(col->dataList[j], NULL);
720 for (j = col->rows; j < maxrows; j++)
721 ((
long double *)col->data)[j] = 0.0L;
724 col->data = malloc(
sizeof(
double) * maxrows);
726 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
729 for (j = 0; j < col->rows; j++)
730 ((
double *)col->data)[j] = atof(col->dataList[j]);
731 for (j = col->rows; j < maxrows; j++)
732 ((
double *)col->data)[j] = 0.0;
735 col->data = malloc(
sizeof(
float) * maxrows);
737 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
740 for (j = 0; j < col->rows; j++)
741 ((
float *)col->data)[j] = (float)atof(col->dataList[j]);
742 for (j = col->rows; j < maxrows; j++)
743 ((
float *)col->data)[j] = 0.0f;
746 col->data = malloc(
sizeof(int64_t) * maxrows);
748 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
751 for (j = 0; j < col->rows; j++)
752 ((int64_t *)col->data)[j] = atoll(col->dataList[j]);
753 for (j = col->rows; j < maxrows; j++)
754 ((int64_t *)col->data)[j] = 0;
757 col->data = malloc(
sizeof(uint64_t) * maxrows);
759 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
762 for (j = 0; j < col->rows; j++)
763 ((uint64_t *)col->data)[j] = strtoull(col->dataList[j], NULL, 10);
764 for (j = col->rows; j < maxrows; j++)
765 ((uint64_t *)col->data)[j] = 0;
768 col->data = malloc(
sizeof(int32_t) * maxrows);
770 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
773 for (j = 0; j < col->rows; j++)
774 ((int32_t *)col->data)[j] = (int32_t)atol(col->dataList[j]);
775 for (j = col->rows; j < maxrows; j++)
776 ((int32_t *)col->data)[j] = 0;
779 col->data = malloc(
sizeof(uint32_t) * maxrows);
781 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
784 for (j = 0; j < col->rows; j++)
785 ((uint32_t *)col->data)[j] = strtoul(col->dataList[j], NULL, 10);
786 for (j = col->rows; j < maxrows; j++)
787 ((uint32_t *)col->data)[j] = 0;
790 col->data = malloc(
sizeof(
short) * maxrows);
792 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
795 for (j = 0; j < col->rows; j++)
796 ((
short *)col->data)[j] = (short)atol(col->dataList[j]);
797 for (j = col->rows; j < maxrows; j++)
798 ((
short *)col->data)[j] = 0;
801 col->data = malloc(
sizeof(
unsigned short) * maxrows);
803 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
806 for (j = 0; j < col->rows; j++)
807 ((
unsigned short *)col->data)[j] = (
unsigned short)atol(col->dataList[j]);
808 for (j = col->rows; j < maxrows; j++)
809 ((
unsigned short *)col->data)[j] = 0;
812 col->data = malloc(
sizeof(
char) * maxrows);
814 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
817 for (j = 0; j < col->rows; j++)
818 ((
char *)col->data)[j] = col->dataList[j][0];
819 for (j = col->rows; j < maxrows; j++)
820 ((
char *)col->data)[j] =
'\0';
823 col->data = malloc(
sizeof(
char *) * maxrows);
825 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
828 for (j = 0; j < col->rows; j++)
830 for (j = col->rows; j < maxrows; j++)
834 SDDS_Bomb(
"Invalid data type encountered while setting column data.");
840 for (i = 0; i < arrays; i++) {
842 if (!col->dataList) {
844 fprintf(stderr,
"Warning: No data provided for array '%s'. It will not be written to the output file.\n", col->name);
856 fprintf(stderr,
"Error: Invalid data type '%s' for array '%s'.\n", type, col->name);
861 col->data = malloc(
sizeof(
long double) * col->rows);
863 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
866 for (j = 0; j < col->rows; j++)
867 ((
long double *)col->data)[j] = strtold(col->dataList[j], NULL);
870 col->data = malloc(
sizeof(
double) * col->rows);
872 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
875 for (j = 0; j < col->rows; j++)
876 ((
double *)col->data)[j] = atof(col->dataList[j]);
879 col->data = malloc(
sizeof(
float) * col->rows);
881 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
884 for (j = 0; j < col->rows; j++)
885 ((
float *)col->data)[j] = (float)atof(col->dataList[j]);
888 col->data = malloc(
sizeof(int64_t) * col->rows);
890 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
893 for (j = 0; j < col->rows; j++)
894 ((int64_t *)col->data)[j] = atoll(col->dataList[j]);
897 col->data = malloc(
sizeof(uint64_t) * col->rows);
899 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
902 for (j = 0; j < col->rows; j++)
903 ((uint64_t *)col->data)[j] = strtoull(col->dataList[j], NULL, 10);
906 col->data = malloc(
sizeof(int32_t) * col->rows);
908 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
911 for (j = 0; j < col->rows; j++)
912 ((int32_t *)col->data)[j] = (int32_t)atol(col->dataList[j]);
915 col->data = malloc(
sizeof(uint32_t) * col->rows);
917 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
920 for (j = 0; j < col->rows; j++)
921 ((uint32_t *)col->data)[j] = strtoul(col->dataList[j], NULL, 10);
924 col->data = malloc(
sizeof(
short) * col->rows);
926 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
929 for (j = 0; j < col->rows; j++)
930 ((
short *)col->data)[j] = (short)atol(col->dataList[j]);
933 col->data = malloc(
sizeof(
unsigned short) * col->rows);
935 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
938 for (j = 0; j < col->rows; j++)
939 ((
unsigned short *)col->data)[j] = (
unsigned short)atol(col->dataList[j]);
942 col->data = malloc(
sizeof(
char) * col->rows);
944 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
947 for (j = 0; j < col->rows; j++)
948 ((
char *)col->data)[j] = col->dataList[j][0];
951 col->data = malloc(
sizeof(
char *) * col->rows);
953 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
956 for (j = 0; j < col->rows; j++)
960 SDDS_Bomb(
"Invalid data type encountered while setting array data.");
971 for (i = 0; i < parameters; i++) {
972 if (parameter[i]->name)
973 free(parameter[i]->name);
974 if (parameter[i]->data)
975 free(parameter[i]->data);
976 if (parameter[i]->unit)
977 free(parameter[i]->unit);
978 if (parameter[i]->description)
979 free(parameter[i]->description);
980 if (parameter[i]->symbol)
981 free(parameter[i]->symbol);
982 if (parameter[i]->
typename)
983 free(parameter[i]->
typename);
990 for (i = 0; i < columns; i++) {
992 free(column[i]->name);
993 if (column[i]->dataList) {
994 for (j = 0; j < column[i]->rows; j++)
995 free(column[i]->dataList[j]);
996 free(column[i]->dataList);
1000 free(column[i]->data);
1002 if (column[i]->data) {
1003 for (j = 0; j < maxrows; j++)
1004 free(((
char **)column[i]->data)[j]);
1005 free(column[i]->data);
1008 if (column[i]->unit)
1009 free(column[i]->unit);
1010 if (column[i]->symbol)
1011 free(column[i]->symbol);
1012 if (column[i]->description)
1013 free(column[i]->description);
1020 for (i = 0; i < arrays; i++) {
1022 free(array[i]->name);
1023 if (array[i]->dataList) {
1024 for (j = 0; j < array[i]->rows; j++)
1025 free(array[i]->dataList[j]);
1026 free(array[i]->dataList);
1030 free(array[i]->data);
1032 if (array[i]->data) {
1033 for (j = 0; j < array[i]->rows; j++)
1034 free(((
char **)array[i]->data)[j]);
1035 free(array[i]->data);
1039 free(array[i]->unit);
1040 if (array[i]->symbol)
1041 free(array[i]->symbol);
1042 if (array[i]->description)
1043 free(array[i]->description);
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
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_SetArrayVararg(SDDS_DATASET *SDDS_dataset, char *array_name, int32_t mode, void *data_pointer,...)
Sets the values of an array variable in the SDDS dataset using variable arguments for dimensions.
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_SetColumn(SDDS_DATASET *SDDS_dataset, int32_t mode, void *data, int64_t rows,...)
Sets the values for one data column in the current data table of an 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_DefineArray(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, int32_t dimensions, const char *group_name)
Defines a data array within the SDDS dataset.
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_GetArrayIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named array in the SDDS dataset.
int32_t SDDS_ParameterCount(SDDS_DATASET *page)
Retrieves the number of 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.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
int32_t SDDS_CopyStringArray(char **target, char **source, int64_t n_strings)
Copies an array of strings from source to target.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_IdentifyType(char *typeName)
Identifies the SDDS data type based on its string name.
int32_t SDDS_ArrayCount(SDDS_DATASET *page)
Retrieves the number of arrays in the SDDS dataset.
int32_t SDDS_CheckDatasetStructureSize(int32_t size)
Verifies that the size of the SDDS_DATASET structure matches the expected size.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#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_LONGDOUBLE
Identifier for the long double data type.
#define SDDS_LONG64
Identifier for the signed 64-bit integer data type.
char * cp_str(char **s, char *t)
Copies a string, allocating memory for storage.
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)
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.