86char *option[N_OPTIONS] = {
102 "Usage: sddsmakedataset [<outputFile> | -pipe=out]\n"
103 " [-defaultType={double|float|long64|ulong64|long|ulong|short|ushort|string|character}]\n"
104 " [-parameter=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]]\n"
105 " [-data=<value>] -parameter=.... -data=...\n"
106 " [-column=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]]\n"
107 " [-data=<listOfCommaSeparatedValue>] -column=... -data=...\n"
108 " [-array=<name>[,type=string][,units=string>][,symbol=<string>][,description=<string>]]\n"
109 " [-data=<listOfCommaSeparatedValue>] -array=... -data=...\n"
112 " [-description=<string>]\n"
113 " [-contents=<string>]\n"
114 " [-append[=merge]]\n"
115 " [-majorOrder=row|column]\n"
117 " -defaultType=<type>\n"
118 " Specify the default data type for parameters and columns if not specified.\n"
119 " Available types: double, float, long64, ulong64, long, ulong, short, ushort, string, character.\n\n"
120 " -parameter=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
121 " Define a parameter with optional type, units, symbol, and description.\n"
122 " Must be followed by -data=<value> to provide the parameter's value.\n\n"
124 " Provide the data value for the preceding -parameter, -column, or -array option.\n\n"
125 " -column=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
126 " Define a column with optional type, units, symbol, and description.\n"
127 " Must be followed by -data=<listOfCommaSeparatedValues> to provide the column's data.\n\n"
128 " -array=<name>[,type=<string>][,units=<string>][,symbol=<string>][,description=<string>]\n"
129 " Define an array with optional type, units, symbol, and description.\n"
130 " Must be followed by -data=<listOfCommaSeparatedValues> to provide the array's data.\n"
131 " Currently supports only one-dimensional arrays.\n\n"
133 " Do not print out warning messages.\n\n"
135 " Output file in ASCII mode. The default is binary.\n\n"
136 " -description=<string>\n"
137 " Provide a description of the output file.\n\n"
138 " -contents=<string>\n"
139 " Provide contents of the description.\n\n"
141 " Append data to an existing file. Use 'merge' to append to the current page.\n\n"
142 " -majorOrder=row|column\n"
143 " Specify output file in row or column major order.\n\n"
145 " SDDS output file for writing the data.\n\n"
147 " Output the data in SDDS format to the pipe instead of to a file.\n\n"
148 "Program by Hairong Shang. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
153 char *name, *dataString;
155 char *description, *symbol, *unit, *
typename;
161 char *name, **dataList;
163 char *description, *symbol, *unit, *
typename;
172 char *defaultType,
long noWarnings,
long maxrows);
176int main(
int argc,
char **argv) {
179 char *defaultType, *outputFile;
180 unsigned long pipeFlags, dummyFlags, majorOrderFlag;
184 long parameters, columns, arrays, previousOption, i, j, i_arg, currentOption, tmpfile_used, noWarnings, maxrows = 0, outputMode;
185 char *input =
"obset";
186 char *description, *contents;
187 short columnMajorOrder = 0, append = 0;
189 int32_t colIndex, arrayIndex, dsize, startIndex;
192 description = contents = NULL;
196 parameters = columns = arrays = 0;
197 outputFile = defaultType = NULL;
199 tmpfile_used = noWarnings = 0;
200 outputMode = SDDS_BINARY;
205 argc =
scanargs(&s_arg, argc, argv);
207 fprintf(stderr,
"Error: Insufficient arguments provided.\n\n%s", USAGE);
212 for (i_arg = 1; i_arg < argc; i_arg++) {
213 if (s_arg[i_arg].arg_type == OPTION) {
215 currentOption =
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0);
216 if (currentOption == CLO_DATA && previousOption != CLO_PARAMETER && previousOption != CLO_COLUMN && previousOption != CLO_ARRAY) {
217 SDDS_Bomb(
"-data option must follow a -parameter, -column, or -array option.");
219 switch (currentOption) {
220 case CLO_MAJOR_ORDER:
222 s_arg[i_arg].n_items -= 1;
223 if (s_arg[i_arg].n_items > 0 &&
224 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
225 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
226 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
227 SDDS_Bomb(
"Invalid -majorOrder syntax or value.");
228 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
229 columnMajorOrder = 1;
230 if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
231 columnMajorOrder = 0;
237 if (s_arg[i_arg].n_items < 2)
239 parameter =
SDDS_Realloc(parameter,
sizeof(*parameter) * (parameters + 1));
240 parameter[parameters] = InitializeParameteterInfo();
242 s_arg[i_arg].list += 2;
243 s_arg[i_arg].n_items -= 2;
244 if (!(parameter[parameters]->name) || !strlen(parameter[parameters]->name))
245 SDDS_Bomb(
"Invalid -parameter syntax (no name).");
246 if (s_arg[i_arg].n_items > 0 &&
247 !
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
248 "type",
SDDS_STRING, &(parameter[parameters]->
typename), 1, 0,
249 "units",
SDDS_STRING, &(parameter[parameters]->unit), 1, 0,
250 "symbol",
SDDS_STRING, &(parameter[parameters]->symbol), 1, 0,
251 "description",
SDDS_STRING, &(parameter[parameters]->description), 1, 0, NULL))
254 s_arg[i_arg].list -= 2;
255 s_arg[i_arg].n_items += 2;
258 if (s_arg[i_arg].n_items < 2)
260 column =
SDDS_Realloc(column,
sizeof(*column) * (columns + 1));
261 column[columns] = InitializeColumnInfo();
263 s_arg[i_arg].list += 2;
264 s_arg[i_arg].n_items -= 2;
265 if (!(column[columns]->name) || !strlen(column[columns]->name))
266 SDDS_Bomb(
"Invalid -column syntax (no name).");
267 if (s_arg[i_arg].n_items > 0 &&
268 (!
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
269 "type",
SDDS_STRING, &(column[columns]->
typename), 1, 0,
270 "unit",
SDDS_STRING, &(column[columns]->unit), 1, 0,
271 "symbol",
SDDS_STRING, &(column[columns]->symbol), 1, 0,
272 "description",
SDDS_STRING, &(column[columns]->description), 1, 0, NULL)))
275 s_arg[i_arg].list -= 2;
276 s_arg[i_arg].n_items += 2;
279 if (s_arg[i_arg].n_items < 2)
281 array =
SDDS_Realloc(array,
sizeof(*array) * (arrays + 1));
282 array[arrays] = InitializeColumnInfo();
284 s_arg[i_arg].list += 2;
285 s_arg[i_arg].n_items -= 2;
286 if (!(array[arrays]->name) || !strlen(array[arrays]->name))
287 SDDS_Bomb(
"Invalid -array syntax (no name).");
288 if (s_arg[i_arg].n_items > 0 &&
289 (!
scanItemList(&dummyFlags, s_arg[i_arg].list, &s_arg[i_arg].n_items, 0,
290 "type",
SDDS_STRING, &(array[arrays]->
typename), 1, 0,
292 "symbol",
SDDS_STRING, &(array[arrays]->symbol), 1, 0,
293 "description",
SDDS_STRING, &(array[arrays]->description), 1, 0, NULL)))
296 s_arg[i_arg].list -= 2;
297 s_arg[i_arg].n_items += 2;
300 if (previousOption == CLO_PARAMETER) {
301 parameter[parameters - 1]->dataString = s_arg[i_arg].list[1];
303 if (previousOption == CLO_COLUMN) {
304 if (((s_arg[i_arg].n_items - 1) == 1) &&
305 (strlen(s_arg[i_arg].list[1]) > 1) &&
306 (((column[columns - 1]->
typename) && (strcmp(column[columns - 1]->
typename,
"character") == 0)) ||
307 ((defaultType) && (strcmp(defaultType,
"character") == 0)))) {
309 column[columns - 1]->rows = strlen(s_arg[i_arg].list[1]);
310 column[columns - 1]->dataList = malloc(
sizeof(*(column[columns - 1]->dataList)) * column[columns - 1]->rows);
311 for (j = 0; j < column[columns - 1]->rows; j++) {
312 char buffer[2] = {s_arg[i_arg].list[1][j],
'\0'};
316 column[columns - 1]->rows = s_arg[i_arg].n_items - 1;
317 column[columns - 1]->dataList = malloc(
sizeof(*(column[columns - 1]->dataList)) * column[columns - 1]->rows);
318 for (j = 0; j < column[columns - 1]->rows; j++)
319 SDDS_CopyString(&column[columns - 1]->dataList[j], s_arg[i_arg].list[j + 1]);
322 if (previousOption == CLO_ARRAY) {
323 if (((s_arg[i_arg].n_items - 1) == 1) &&
324 (strlen(s_arg[i_arg].list[1]) > 1) &&
325 (((array[arrays - 1]->
typename) && (strcmp(array[arrays - 1]->
typename,
"character") == 0)) ||
326 ((defaultType) && (strcmp(defaultType,
"character") == 0)))) {
328 array[arrays - 1]->rows = strlen(s_arg[i_arg].list[1]);
329 array[arrays - 1]->dataList = malloc(
sizeof(*(array[arrays - 1]->dataList)) * array[arrays - 1]->rows);
330 for (j = 0; j < array[arrays - 1]->rows; j++) {
331 char buffer[2] = {s_arg[i_arg].list[1][j],
'\0'};
335 array[arrays - 1]->rows = s_arg[i_arg].n_items - 1;
336 array[arrays - 1]->dataList = malloc(
sizeof(*(array[arrays - 1]->dataList)) * array[arrays - 1]->rows);
337 for (j = 0; j < array[arrays - 1]->rows; j++)
338 SDDS_CopyString(&array[arrays - 1]->dataList[j], s_arg[i_arg].list[j + 1]);
342 case CLO_DEFAULTTYPE:
343 if (s_arg[i_arg].n_items != 2)
344 SDDS_Bomb(
"Invalid -defaultType option.");
348 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
350 if (pipeFlags != USE_STDOUT)
351 SDDS_Bomb(
"Only -pipe=out syntax is valid.");
353 case CLO_DESCRIPTION:
354 if (s_arg[i_arg].n_items != 2)
355 SDDS_Bomb(
"Invalid -description option.");
359 if (s_arg[i_arg].n_items != 2)
364 outputMode = SDDS_ASCII;
368 if (s_arg[i_arg].n_items != 1) {
370 if (s_arg[i_arg].n_items > 2 || strncmp(s_arg[i_arg].list[1],
"merge", strlen(s_arg[i_arg].list[1])) != 0)
375 fprintf(stderr,
"Error: Option %s is invalid.\n", s_arg[i_arg].list[0]);
379 previousOption = currentOption;
381 if (outputFile == NULL)
384 fprintf(stderr,
"Error: Too many filenames provided (%s).\n", s_arg[i_arg].list[0]);
390 if (!outputFile && !pipeFlags) {
391 fprintf(stderr,
"Error: Either an output file or -pipe=out must be specified.\n\n%s", USAGE);
394 if (outputFile && pipeFlags) {
395 fprintf(stderr,
"Error: Only one of output file and -pipe=out can be specified.\n\n%s", USAGE);
399 processFilenames(
"sddsmakedataset", &input, &outputFile, pipeFlags, 1, &tmpfile_used);
400 if (!columns && !parameters && !arrays) {
401 fprintf(stderr,
"Error: No data provided for writing.\n\n%s", USAGE);
404 if (contents && !description) {
406 fprintf(stderr,
"Warning: Description text is provided for contents without a description. No description will be written.\n");
411 for (i = 0; i < columns; i++)
412 if (maxrows < column[i]->rows)
413 maxrows = column[i]->rows;
414 SetInfoData(parameter, parameters, column, columns, array, arrays, defaultType, noWarnings, maxrows);
420 outTable.layout.data_mode.column_major = columnMajorOrder;
421 for (i = 0; i < parameters; i++) {
422 if (parameter[i]->dataString) {
423 if (
SDDS_DefineParameter(&outTable, parameter[i]->name, parameter[i]->symbol, parameter[i]->unit, parameter[i]->description, NULL, parameter[i]->type, NULL) < 0)
428 for (i = 0; i < columns; i++) {
429 if (column[i]->dataList) {
430 if (
SDDS_DefineColumn(&outTable, column[i]->name, column[i]->symbol, column[i]->unit, column[i]->description, NULL, column[i]->type, 0) < 0)
434 for (i = 0; i < arrays; i++) {
435 if (array[i]->dataList) {
436 if (
SDDS_DefineArray(&outTable, array[i]->name, array[i]->symbol, array[i]->unit, array[i]->description, NULL, array[i]->type, 0, 1, NULL) < 0)
455 for (i = 0; i < parameters; i++) {
456 if (parameter[i]->dataString) {
458 fprintf(stderr,
"Error: Parameter '%s' does not exist in the existing file.\n", parameter[i]->name);
464 fprintf(stderr,
"Error: Parameter count does not match the existing file.\n");
467 for (i = 0; i < columns; i++) {
468 if (column[i]->dataList) {
470 fprintf(stderr,
"Error: Column '%s' does not exist in the existing file.\n", column[i]->name);
476 fprintf(stderr,
"Error: Column count does not match the existing file.\n");
479 for (i = 0; i < arrays; i++) {
480 if (array[i]->dataList) {
482 fprintf(stderr,
"Error: Array '%s' does not exist in the existing file.\n", array[i]->name);
488 fprintf(stderr,
"Error: Array count does not match the existing file.\n");
493 if (append == 0 || append == 1) {
496 for (i = 0; i < parameters; i++) {
497 if (parameter[i]->data) {
498 if (!
SDDS_SetParameters(&outTable, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, parameter[i]->name, parameter[i]->data, NULL))
502 for (i = 0; i < columns; i++) {
503 if (column[i]->data) {
504 if (!
SDDS_SetColumn(&outTable, SDDS_SET_BY_NAME, column[i]->data, maxrows, column[i]->name))
508 for (i = 0; i < arrays; i++) {
509 if (array[i]->data) {
510 if (!
SDDS_SetArrayVararg(&outTable, array[i]->name, SDDS_CONTIGUOUS_DATA, array[i]->data, array[i]->rows))
516 for (i = 0; i < columns; i++) {
517 if (column[i]->data) {
519 for (j = 0; j < maxrows; j++) {
520 switch (column[i]->type) {
522 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
523 colIndex, ((
long double *)(column[i]->data))[j], -1) == 0)
527 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
528 colIndex, ((
double *)(column[i]->data))[j], -1) == 0)
532 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
533 colIndex, ((
float *)(column[i]->data))[j], -1) == 0)
537 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
538 colIndex, ((int64_t *)(column[i]->data))[j], -1) == 0)
542 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
543 colIndex, ((uint64_t *)(column[i]->data))[j], -1) == 0)
547 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
548 colIndex, ((int32_t *)(column[i]->data))[j], -1) == 0)
552 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
553 colIndex, ((uint32_t *)(column[i]->data))[j], -1) == 0)
557 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
558 colIndex, ((
short *)(column[i]->data))[j], -1) == 0)
562 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
563 colIndex, ((
unsigned short *)(column[i]->data))[j], -1) == 0)
567 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
568 colIndex, ((
char *)(column[i]->data))[j], -1) == 0)
572 if (
SDDS_SetRowValues(&outTable, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, rowsPresent + j,
573 colIndex, ((
char **)(column[i]->data))[j], -1) == 0)
577 SDDS_Bomb(
"Invalid data type provided.");
583 for (i = 0; i < arrays; i++) {
584 if (array[i]->data) {
586 sdds_array = outTable.array + arrayIndex;
588 startIndex = sdds_array->elements;
589 sdds_array->elements += array[i]->rows;
590 sdds_array->data =
SDDS_Realloc(sdds_array->data, dsize * sdds_array->elements);
592 if (!
SDDS_CopyStringArray(((
char **)sdds_array->data) + startIndex, array[i]->data, array[i]->rows))
595 memcpy((
char *)sdds_array->data + dsize * startIndex, array[i]->data, dsize * array[i]->rows);
613 FreeMemory(parameter, parameters, column, columns, array, arrays, maxrows);
628 fprintf(stderr,
"Error: Memory allocation failed for COLUMN_INFO.\n");
631 column->name = column->unit = column->description = column->symbol = NULL;
633 column->typename = NULL;
636 column->dataList = NULL;
643 fprintf(stderr,
"Error: Memory allocation failed for PARAMETER_INFO.\n");
646 parameter->name = parameter->unit = parameter->description = parameter->symbol = NULL;
647 parameter->typename = NULL;
648 parameter->data = NULL;
649 parameter->type = -1;
650 parameter->dataString = NULL;
655 long noWarnings,
long maxrows) {
661 for (i = 0; i < parameters; i++) {
663 if (!par->dataString) {
665 fprintf(stderr,
"Warning: No data provided for parameter '%s'. It will not be written to the output file.\n", par->name);
677 fprintf(stderr,
"Error: Invalid data type '%s' for parameter '%s'.\n", type, par->name);
680 par->data = malloc(
sizeof(
double));
682 fprintf(stderr,
"Error: Memory allocation failed for parameter data.\n");
687 *((
long double *)par->data) = strtold(par->dataString, NULL);
690 *((
double *)par->data) = atof(par->dataString);
693 *((
float *)par->data) = (float)atof(par->dataString);
696 *((int64_t *)par->data) = atoll(par->dataString);
699 *((uint64_t *)par->data) = strtoull(par->dataString, NULL, 10);
702 *((int32_t *)par->data) = atol(par->dataString);
705 *((uint32_t *)par->data) = strtoul(par->dataString, NULL, 10);
708 *((
short *)par->data) = (short)atol(par->dataString);
711 *((
unsigned short *)par->data) = (
unsigned short)atol(par->dataString);
714 cp_str((
char **)par->data, par->dataString);
717 *((
char *)par->data) = par->dataString[0];
720 SDDS_Bomb(
"Invalid data type encountered while setting parameter data.");
726 for (i = 0; i < columns; i++) {
728 if (!col->dataList) {
730 fprintf(stderr,
"Warning: No data provided for column '%s'. It will not be written to the output file.\n", col->name);
742 fprintf(stderr,
"Error: Invalid data type '%s' for column '%s'.\n", type, col->name);
745 if (col->rows < maxrows && !noWarnings)
746 fprintf(stderr,
"Warning: Missing data for column '%s'. Filling with zeros.\n", col->name);
749 col->data = malloc(
sizeof(
long double) * maxrows);
751 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
754 for (j = 0; j < col->rows; j++)
755 ((
long double *)col->data)[j] = strtold(col->dataList[j], NULL);
756 for (j = col->rows; j < maxrows; j++)
757 ((
long double *)col->data)[j] = 0.0L;
760 col->data = malloc(
sizeof(
double) * maxrows);
762 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
765 for (j = 0; j < col->rows; j++)
766 ((
double *)col->data)[j] = atof(col->dataList[j]);
767 for (j = col->rows; j < maxrows; j++)
768 ((
double *)col->data)[j] = 0.0;
771 col->data = malloc(
sizeof(
float) * maxrows);
773 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
776 for (j = 0; j < col->rows; j++)
777 ((
float *)col->data)[j] = (float)atof(col->dataList[j]);
778 for (j = col->rows; j < maxrows; j++)
779 ((
float *)col->data)[j] = 0.0f;
782 col->data = malloc(
sizeof(int64_t) * maxrows);
784 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
787 for (j = 0; j < col->rows; j++)
788 ((int64_t *)col->data)[j] = atoll(col->dataList[j]);
789 for (j = col->rows; j < maxrows; j++)
790 ((int64_t *)col->data)[j] = 0;
793 col->data = malloc(
sizeof(uint64_t) * maxrows);
795 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
798 for (j = 0; j < col->rows; j++)
799 ((uint64_t *)col->data)[j] = strtoull(col->dataList[j], NULL, 10);
800 for (j = col->rows; j < maxrows; j++)
801 ((uint64_t *)col->data)[j] = 0;
804 col->data = malloc(
sizeof(int32_t) * maxrows);
806 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
809 for (j = 0; j < col->rows; j++)
810 ((int32_t *)col->data)[j] = (int32_t)atol(col->dataList[j]);
811 for (j = col->rows; j < maxrows; j++)
812 ((int32_t *)col->data)[j] = 0;
815 col->data = malloc(
sizeof(uint32_t) * maxrows);
817 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
820 for (j = 0; j < col->rows; j++)
821 ((uint32_t *)col->data)[j] = strtoul(col->dataList[j], NULL, 10);
822 for (j = col->rows; j < maxrows; j++)
823 ((uint32_t *)col->data)[j] = 0;
826 col->data = malloc(
sizeof(
short) * maxrows);
828 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
831 for (j = 0; j < col->rows; j++)
832 ((
short *)col->data)[j] = (short)atol(col->dataList[j]);
833 for (j = col->rows; j < maxrows; j++)
834 ((
short *)col->data)[j] = 0;
837 col->data = malloc(
sizeof(
unsigned short) * maxrows);
839 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
842 for (j = 0; j < col->rows; j++)
843 ((
unsigned short *)col->data)[j] = (
unsigned short)atol(col->dataList[j]);
844 for (j = col->rows; j < maxrows; j++)
845 ((
unsigned short *)col->data)[j] = 0;
848 col->data = malloc(
sizeof(
char) * maxrows);
850 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
853 for (j = 0; j < col->rows; j++)
854 ((
char *)col->data)[j] = col->dataList[j][0];
855 for (j = col->rows; j < maxrows; j++)
856 ((
char *)col->data)[j] =
'\0';
859 col->data = malloc(
sizeof(
char *) * maxrows);
861 fprintf(stderr,
"Error: Memory allocation failed for column '%s' data.\n", col->name);
864 for (j = 0; j < col->rows; j++)
866 for (j = col->rows; j < maxrows; j++)
870 SDDS_Bomb(
"Invalid data type encountered while setting column data.");
876 for (i = 0; i < arrays; i++) {
878 if (!col->dataList) {
880 fprintf(stderr,
"Warning: No data provided for array '%s'. It will not be written to the output file.\n", col->name);
892 fprintf(stderr,
"Error: Invalid data type '%s' for array '%s'.\n", type, col->name);
897 col->data = malloc(
sizeof(
long double) * 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 ((
long double *)col->data)[j] = strtold(col->dataList[j], NULL);
906 col->data = malloc(
sizeof(
double) * 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 ((
double *)col->data)[j] = atof(col->dataList[j]);
915 col->data = malloc(
sizeof(
float) * 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 ((
float *)col->data)[j] = (float)atof(col->dataList[j]);
924 col->data = malloc(
sizeof(int64_t) * 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 ((int64_t *)col->data)[j] = atoll(col->dataList[j]);
933 col->data = malloc(
sizeof(uint64_t) * 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 ((uint64_t *)col->data)[j] = strtoull(col->dataList[j], NULL, 10);
942 col->data = malloc(
sizeof(int32_t) * 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 ((int32_t *)col->data)[j] = (int32_t)atol(col->dataList[j]);
951 col->data = malloc(
sizeof(uint32_t) * col->rows);
953 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
956 for (j = 0; j < col->rows; j++)
957 ((uint32_t *)col->data)[j] = strtoul(col->dataList[j], NULL, 10);
960 col->data = malloc(
sizeof(
short) * col->rows);
962 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
965 for (j = 0; j < col->rows; j++)
966 ((
short *)col->data)[j] = (short)atol(col->dataList[j]);
969 col->data = malloc(
sizeof(
unsigned short) * col->rows);
971 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
974 for (j = 0; j < col->rows; j++)
975 ((
unsigned short *)col->data)[j] = (
unsigned short)atol(col->dataList[j]);
978 col->data = malloc(
sizeof(
char) * col->rows);
980 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
983 for (j = 0; j < col->rows; j++)
984 ((
char *)col->data)[j] = col->dataList[j][0];
987 col->data = malloc(
sizeof(
char *) * col->rows);
989 fprintf(stderr,
"Error: Memory allocation failed for array '%s' data.\n", col->name);
992 for (j = 0; j < col->rows; j++)
996 SDDS_Bomb(
"Invalid data type encountered while setting array data.");
1007 for (i = 0; i < parameters; i++) {
1008 if (parameter[i]->name)
1009 free(parameter[i]->name);
1010 if (parameter[i]->data)
1011 free(parameter[i]->data);
1012 if (parameter[i]->unit)
1013 free(parameter[i]->unit);
1014 if (parameter[i]->description)
1015 free(parameter[i]->description);
1016 if (parameter[i]->symbol)
1017 free(parameter[i]->symbol);
1018 if (parameter[i]->
typename)
1019 free(parameter[i]->
typename);
1026 for (i = 0; i < columns; i++) {
1027 if (column[i]->name)
1028 free(column[i]->name);
1029 if (column[i]->dataList) {
1030 for (j = 0; j < column[i]->rows; j++)
1031 free(column[i]->dataList[j]);
1032 free(column[i]->dataList);
1035 if (column[i]->data)
1036 free(column[i]->data);
1038 if (column[i]->data) {
1039 for (j = 0; j < maxrows; j++)
1040 free(((
char **)column[i]->data)[j]);
1041 free(column[i]->data);
1044 if (column[i]->unit)
1045 free(column[i]->unit);
1046 if (column[i]->symbol)
1047 free(column[i]->symbol);
1048 if (column[i]->description)
1049 free(column[i]->description);
1056 for (i = 0; i < arrays; i++) {
1058 free(array[i]->name);
1059 if (array[i]->dataList) {
1060 for (j = 0; j < array[i]->rows; j++)
1061 free(array[i]->dataList[j]);
1062 free(array[i]->dataList);
1066 free(array[i]->data);
1068 if (array[i]->data) {
1069 for (j = 0; j < array[i]->rows; j++)
1070 free(((
char **)array[i]->data)[j]);
1071 free(array[i]->data);
1075 free(array[i]->unit);
1076 if (array[i]->symbol)
1077 free(array[i]->symbol);
1078 if (array[i]->description)
1079 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.