126 {
128 SCANNED_ARG *scanned;
129 long i, i_arg, index, points, bytes_per_number;
130
131 char *input, *output, buffer[BUFSIZE];
132 char *signal_name, *ptr, *parameter_name;
133 char *mpl_title, *mpl_topline, *descrip_text, *descrip_contents;
134 FILE *fpi;
135 long code, binary;
136 double xIncrement, xZero, yMultiplier, yZero;
137 char *xUnits, *yUnits;
138 double *time, *data;
139 short columnMajorOrder = 0;
140 unsigned long majorOrderFlag;
141
142 xUnits = yUnits = NULL;
143
144 argc =
scanargs(&scanned, argc, argv);
145 if (argc < 3) {
147 }
148
149 input = output = signal_name = NULL;
150 mpl_title = mpl_topline = descrip_text = descrip_contents = NULL;
151 binary = 0;
152
153 for (i_arg = 1; i_arg < argc; i_arg++) {
154 if (scanned[i_arg].arg_type == OPTION) {
156
157 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
158 case SET_MAJOR_ORDER:
159 majorOrderFlag = 0;
160 scanned[i_arg].n_items--;
161 if (scanned[i_arg].n_items > 0 &&
162 (!
scanItemList(&majorOrderFlag, scanned[i_arg].list + 1, &scanned[i_arg].n_items, 0,
163 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
164 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
165 SDDS_Bomb(
"invalid -majorOrder syntax/values");
166 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
167 columnMajorOrder = 1;
168 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
169 columnMajorOrder = 0;
170 break;
171 case SET_SIGNAL_NAME:
172 if (scanned[i_arg].n_items != 2) {
173 bomb(
"invalid -signalname syntax", USAGE);
174 }
175 signal_name = scanned[i_arg].list[1];
176 break;
177 case SET_DESCRIPTION:
178 if (scanned[i_arg].n_items != 3) {
179 bomb(
"invalid -description syntax", USAGE);
180 }
181 descrip_text = scanned[i_arg].list[1];
182 descrip_contents = scanned[i_arg].list[2];
183 break;
184 case SET_MPL_LABELS:
185 if (scanned[i_arg].n_items != 3) {
186 bomb(
"invalid -mpllabels syntax", USAGE);
187 }
188 mpl_title = scanned[i_arg].list[1];
189 mpl_topline = scanned[i_arg].list[2];
190 break;
191 default:
192 bomb(
"invalid option seen", USAGE);
193 break;
194 }
195 } else {
196 if (!input)
197 input = scanned[i_arg].list[0];
198 else if (!output)
199 output = scanned[i_arg].list[0];
200 else
201 bomb(
"too many filenames", USAGE);
202 }
203 }
204 if (!input)
206 if (!output)
208 if (!signal_name)
209 signal_name = "V";
210
212 if (fread(buffer, 1, strlen(TEK_PreambleString), fpi) != strlen(TEK_PreambleString) ||
213 strncmp(TEK_PreambleString, buffer, strlen(TEK_PreambleString)) != 0)
214 SDDS_Bomb(
"file does not appear to be in Tektronix format");
215
216 parameter_name = buffer;
217 while ((code = GetNextItem(buffer, BUFSIZE, fpi)) < 3) {
218 if (!(ptr = strchr(buffer, ':')))
219 SDDS_Bomb(
"error parsing input file--missing colon on parameter tag");
220 *ptr++ = 0;
221 if (strcmp(TEK_DataMarker, parameter_name) == 0)
222 break;
223 index = 0;
224 while (TEK_parameter[index].TEK_name) {
225 if (strcmp(TEK_parameter[index].TEK_name, parameter_name) == 0)
226 break;
227 index++;
228 }
229 if (!TEK_parameter[index].TEK_name) {
230 fprintf(stderr, "warning: parameter %s is not recognized\n", parameter_name);
231 continue;
232 }
233 if (TEK_parameter[index].value_string) {
234 fprintf(stderr, "error: duplicate entries for parameter %s\n", parameter_name);
235 exit(EXIT_FAILURE);
236 }
239 if (code == 2 || code == 3)
240 break;
241 }
242 if (code != 2)
244
245 if (fread(buffer, 1, strlen(TEK_DataMarker), fpi) != strlen(TEK_DataMarker) ||
246 strncmp(TEK_DataMarker, buffer, strlen(TEK_DataMarker)) != 0)
247 SDDS_Bomb(
"CURVE item missing or not in right place");
248
251 SDDS_table.layout.data_mode.column_major = columnMajorOrder;
252
253 index = 0;
254 while (TEK_parameter[index].TEK_name) {
255 if (!TEK_parameter[index].value_string) {
256 index++;
257 continue;
258 }
259 if (strcmp(TEK_parameter[index].TEK_name, TEK_XIncrementName) == 0) {
260 if (sscanf(TEK_parameter[index].value_string, "%lf", &xIncrement) != 1)
261 SDDS_Bomb(
"unable to scan value for x increment");
262 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_XZeroName) == 0) {
263 if (sscanf(TEK_parameter[index].value_string, "%lf", &xZero) != 1)
264 SDDS_Bomb(
"unable to scan value for x zero");
265 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_YZeroName) == 0) {
266 if (sscanf(TEK_parameter[index].value_string, "%lf", &yZero) != 1)
267 SDDS_Bomb(
"unable to scan value for y zero");
268 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_YMultiplierName) == 0) {
269 if (sscanf(TEK_parameter[index].value_string, "%lf", &yMultiplier) != 1)
270 SDDS_Bomb(
"unable to scan value for y multiplier");
271 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_XUnitsName) == 0) {
272 xUnits = TEK_parameter[index].value_string;
274 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_YUnitsName) == 0) {
275 yUnits = TEK_parameter[index].value_string;
277 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_PointsName) == 0) {
278 if (sscanf(TEK_parameter[index].value_string, "%ld", &points) != 1)
279 SDDS_Bomb(
"unable to scan value for number of points");
280 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_EncodingName) == 0) {
281 if (strcmp(TEK_parameter[index].value_string, "ASCII") == 0)
282 binary = 0;
283 else if (strcmp(TEK_parameter[index].value_string, "BINARY") == 0)
284 binary = 1;
285 else
286 SDDS_Bomb(
"data encoding is neither ASCII nor BINARY");
287 } else if (strcmp(TEK_parameter[index].TEK_name, TEK_BytesPerNumberName) == 0) {
288 if (sscanf(TEK_parameter[index].value_string, "%ld", &bytes_per_number) != 1)
289 SDDS_Bomb(
"unable to scan value bytes per number");
290 } else if (strcmp(TEK_parameter[index].value_string, TEK_ByteOrderName) == 0) {
291
292 if (strcmp(TEK_parameter[index].value_string, "LSB") != 0) {
293
294 }
295 }
296 if (
SDDS_DefineParameter(&SDDS_table, TEK_parameter[index].SDDS_name, NULL, NULL, TEK_parameter[index].TEK_name,
297 NULL, TEK_parameter[index].type, TEK_parameter[index].value_string) < 0)
299 index++;
300 }
301
302 if (mpl_title &&
306
311
312 data =
tmalloc(
sizeof(*data) * points);
313 time =
tmalloc(
sizeof(*time) * points);
314 if (!binary) {
315 for (i = 0; i < points; i++) {
316
317 if (!(code = GetNextItem(buffer, BUFSIZE, fpi)))
318 SDDS_Bomb(
"insufficient data in input file");
319 if (code == 4) {
320 points = i;
321 break;
322 }
323 time[i] = xZero + i * xIncrement;
324 if (sscanf(buffer, "%lf", data + i) != 1)
326 data[i] = yZero + data[i] * yMultiplier;
327 }
328 } else {
329 short sdata;
330 fread(buffer, sizeof(char), 4, fpi);
331 for (i = 0; i < points; i++) {
332 if (fread(&sdata, sizeof(sdata), 1, fpi) != 1) {
333 fprintf(stderr, "file ends unexpectedly\n");
334 points = i;
335 break;
336 }
337 time[i] = xZero + i * xIncrement;
338 data[i] = sdata;
339 data[i] = yZero + data[i] * yMultiplier;
340 }
341 }
342
343 if (!
SDDS_SetColumn(&SDDS_table, SDDS_SET_BY_NAME, time, points,
"t") ||
344 !
SDDS_SetColumn(&SDDS_table, SDDS_SET_BY_NAME, data, points, signal_name) ||
345 !SDDS_WriteTable(&SDDS_table) ||
348 return EXIT_SUCCESS;
349}
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_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_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.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
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.
char * str_tolower(char *s)
Convert a string to lower case.