114 {
116 SCANNED_ARG *scanned;
117 long i, i_arg, index, points;
118 char *input, *output, buffer[BUFSIZE];
119 char *signal_name, *ptr, *parameter_name;
120 char *mpl_title, *mpl_topline, *descrip_text, *descrip_contents;
121 FILE *fpi;
122 double xIncrement, xOrigin, xReference;
123 char *xUnits, *yUnits;
124 double *time, *data;
125 unsigned long majorOrderFlag;
126 short columnMajorOrder = -1;
127
128 argc =
scanargs(&scanned, argc, argv);
129 if (argc < 3) {
130 fprintf(stderr, "Error: Insufficient arguments provided.\n\n%s", USAGE);
131 return EXIT_FAILURE;
132 }
133
134 input = output = signal_name = xUnits = yUnits = NULL;
135 mpl_title = mpl_topline = descrip_text = descrip_contents = NULL;
136
137 for (i_arg = 1; i_arg < argc; i_arg++) {
138 if (scanned[i_arg].arg_type == OPTION) {
140
141 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
142 case SET_MAJOR_ORDER:
143 majorOrderFlag = 0;
144 scanned[i_arg].n_items--;
145 if (scanned[i_arg].n_items > 0 &&
146 !
scanItemList(&majorOrderFlag, scanned[i_arg].list + 1, &scanned[i_arg].n_items, 0,
147 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
148 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)) {
149 fprintf(stderr, "Error: Invalid syntax or value for -majorOrder option.\n");
150 return EXIT_FAILURE;
151 }
152 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
153 columnMajorOrder = 1;
154 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
155 columnMajorOrder = 0;
156 break;
157 case SET_SIGNAL_NAME:
158 if (scanned[i_arg].n_items != 2) {
159 fprintf(stderr, "Error: Invalid syntax for -signalname option.\n");
160 return EXIT_FAILURE;
161 }
162 signal_name = scanned[i_arg].list[1];
163 break;
164 case SET_DESCRIPTION:
165 if (scanned[i_arg].n_items != 3) {
166 fprintf(stderr, "Error: Invalid syntax for -description option.\n");
167 return EXIT_FAILURE;
168 }
169 descrip_text = scanned[i_arg].list[1];
170 descrip_contents = scanned[i_arg].list[2];
171 break;
172 case SET_MPL_LABELS:
173 if (scanned[i_arg].n_items != 3) {
174 fprintf(stderr, "Error: Invalid syntax for -mpllabels option.\n");
175 return EXIT_FAILURE;
176 }
177 mpl_title = scanned[i_arg].list[1];
178 mpl_topline = scanned[i_arg].list[2];
179 break;
180 default:
181 fprintf(stderr, "Error: Unrecognized option '%s'.\n", scanned[i_arg].list[0]);
182 return EXIT_FAILURE;
183 }
184 } else {
185 if (!input)
186 input = scanned[i_arg].list[0];
187 else if (!output)
188 output = scanned[i_arg].list[0];
189 else {
190 fprintf(stderr, "Error: Too many filenames provided.\n");
191 return EXIT_FAILURE;
192 }
193 }
194 }
195
196 if (!input) {
197 fprintf(stderr, "Error: Input file not specified.\n\n%s", USAGE);
198 return EXIT_FAILURE;
199 }
200 if (!output) {
201 fprintf(stderr, "Error: Output file not specified.\n\n%s", USAGE);
202 return EXIT_FAILURE;
203 }
204 if (!signal_name) {
205 fprintf(stderr, "Error: -signalname option not specified.\n\n%s", USAGE);
206 return EXIT_FAILURE;
207 }
208
210 parameter_name = buffer;
211 while (fgets(buffer, BUFSIZE, fpi)) {
212 if (!(ptr = strchr(buffer, ':'))) {
213 fprintf(stderr, "Error: Missing colon in parameter tag '%s'.\n", buffer);
214 return EXIT_FAILURE;
215 }
216 *ptr++ = '\0';
217 if (strcmp(HP_DataMarker, parameter_name) == 0)
218 break;
219 index = 0;
220 while (HP_parameter[index].HP_name) {
221 if (strcmp(HP_parameter[index].HP_name, parameter_name) == 0)
222 break;
223 index++;
224 }
225 if (!HP_parameter[index].HP_name) {
226 fprintf(stderr, "Error: Unrecognized parameter name '%s'.\n", parameter_name);
227 return EXIT_FAILURE;
228 }
229 if (HP_parameter[index].value_string) {
230 fprintf(stderr, "Error: Duplicate entry for parameter '%s'.\n", parameter_name);
231 return EXIT_FAILURE;
232 }
234 cp_str(&HP_parameter[index].value_string, ptr);
235 }
236
239 return EXIT_FAILURE;
240 }
241 if (columnMajorOrder != -1)
242 SDDS_table.layout.data_mode.column_major = columnMajorOrder;
243
244 index = 0;
245 while (HP_parameter[index].HP_name) {
246 if (!HP_parameter[index].value_string) {
247 index++;
248 continue;
249 }
250 if (strcmp(HP_parameter[index].HP_name, HP_XIncrementName) == 0) {
251 if (sscanf(HP_parameter[index].value_string, "%lf", &xIncrement) != 1) {
252 fprintf(stderr, "Error: Unable to parse value for X increment.\n");
253 return EXIT_FAILURE;
254 }
255 } else if (strcmp(HP_parameter[index].HP_name, HP_XOriginName) == 0) {
256 if (sscanf(HP_parameter[index].value_string, "%lf", &xOrigin) != 1) {
257 fprintf(stderr, "Error: Unable to parse value for X origin.\n");
258 return EXIT_FAILURE;
259 }
260 } else if (strcmp(HP_parameter[index].HP_name, HP_XReferenceName) == 0) {
261 if (sscanf(HP_parameter[index].value_string, "%lf", &xReference) != 1) {
262 fprintf(stderr, "Error: Unable to parse value for X reference.\n");
263 return EXIT_FAILURE;
264 }
265 } else if (strcmp(HP_parameter[index].HP_name, HP_XUnitsName) == 0) {
266 xUnits = HP_parameter[index].value_string;
267 } else if (strcmp(HP_parameter[index].HP_name, HP_YUnitsName) == 0) {
268 yUnits = HP_parameter[index].value_string;
269 } else if (strcmp(HP_parameter[index].HP_name, HP_PointsName) == 0) {
270 if (sscanf(HP_parameter[index].value_string, "%ld", &points) != 1) {
271 fprintf(stderr, "Error: Unable to parse value for number of points.\n");
272 return EXIT_FAILURE;
273 }
274 }
276 HP_parameter[index].HP_name, NULL,
277 HP_parameter[index].type, HP_parameter[index].value_string) < 0) {
279 return EXIT_FAILURE;
280 }
281 index++;
282 }
283
287 return EXIT_FAILURE;
288 }
289
293 !SDDS_StartTable(&SDDS_table, points)) {
295 return EXIT_FAILURE;
296 }
297 fflush(SDDS_table.layout.fp);
298
299 data =
tmalloc(
sizeof(*data) * points);
300 time =
tmalloc(
sizeof(*time) * points);
301 for (i = 0; i < points; i++) {
302 if (!fgets(buffer, BUFSIZE, fpi)) {
303 fprintf(stderr, "Error: Insufficient data in input file.\n");
304 return EXIT_FAILURE;
305 }
306 time[i] = xOrigin + (i - xReference) * xIncrement;
307 if (sscanf(buffer, "%lf", &data[i]) != 1) {
308 fprintf(stderr, "Error: Invalid data format in input file at line %ld.\n", i + 1);
309 return EXIT_FAILURE;
310 }
311 }
312
313 if (!
SDDS_SetColumn(&SDDS_table, SDDS_SET_BY_NAME, time, points,
"t") ||
314 !
SDDS_SetColumn(&SDDS_table, SDDS_SET_BY_NAME, data, points, signal_name) ||
315 !SDDS_WriteTable(&SDDS_table) ||
318 return EXIT_FAILURE;
319 }
320
321 free(data);
322 free(time);
323 fclose(fpi);
324 return EXIT_SUCCESS;
325}
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_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_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.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RemovePadding(char *s)
Removes leading and trailing whitespace from a string.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_DOUBLE
Identifier for the double data type.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
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.
FILE * fopen_e(char *file, char *open_mode, long mode)
Opens a file with error checking, messages, and aborts.
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 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.