40#include "match_string.h"
51static char *option[N_OPTIONS] = {
52 "signalname",
"description",
"mpllabels",
"majorOrder"};
55 "Usage: hpwf2sdds <inputfile> <outputfile> [options]\n"
58 " -signalname=<name> Specify the signal name in the SDDS file.\n"
59 " -description=<text>,<contents> Provide a description for the SDDS data set.\n"
60 " -mpllabels=<title>,<topline> Set the title and topline labels for MPL plots.\n"
61 " -majorOrder=row|column Set the major order of data storage.\n"
64 " hpwf2sdds waveform.txt waveform.sdds -signalname=Voltage -description=\"Test Signal\",\"Generated by HP oscilloscope\" \\\n"
65 " -mpllabels=\"Voltage Signal\",\"Time (s)\" -majorOrder=column\n"
67 "This program converts HP verbose format waveforms to SDDS format.\n\n"
68 "Program by Michael Borland (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
77#define HP_PARAMETERS 23
99 {
"Max Bandwidth",
"MaxBandwidth", NULL,
SDDS_DOUBLE},
100 {
"Min Bandwidth",
"MinBandwidth", NULL,
SDDS_DOUBLE},
101 {NULL, NULL, NULL, 0},
104char *HP_DataMarker =
"Data";
105char *HP_XIncrementName =
"XInc";
106char *HP_XOriginName =
"XOrg";
107char *HP_XReferenceName =
"XRef";
108char *HP_XUnitsName =
"X Units";
109char *HP_YUnitsName =
"Y Units";
110char *HP_PointsName =
"Points";
114int main(
int argc,
char **argv) {
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;
122 double xIncrement, xOrigin, xReference;
123 char *xUnits, *yUnits;
125 unsigned long majorOrderFlag;
126 short columnMajorOrder = -1;
128 argc =
scanargs(&scanned, argc, argv);
130 fprintf(stderr,
"Error: Insufficient arguments provided.\n\n%s", USAGE);
134 input = output = signal_name = xUnits = yUnits = NULL;
135 mpl_title = mpl_topline = descrip_text = descrip_contents = NULL;
137 for (i_arg = 1; i_arg < argc; i_arg++) {
138 if (scanned[i_arg].arg_type == OPTION) {
141 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
142 case SET_MAJOR_ORDER:
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");
152 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
153 columnMajorOrder = 1;
154 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
155 columnMajorOrder = 0;
157 case SET_SIGNAL_NAME:
158 if (scanned[i_arg].n_items != 2) {
159 fprintf(stderr,
"Error: Invalid syntax for -signalname option.\n");
162 signal_name = scanned[i_arg].list[1];
164 case SET_DESCRIPTION:
165 if (scanned[i_arg].n_items != 3) {
166 fprintf(stderr,
"Error: Invalid syntax for -description option.\n");
169 descrip_text = scanned[i_arg].list[1];
170 descrip_contents = scanned[i_arg].list[2];
173 if (scanned[i_arg].n_items != 3) {
174 fprintf(stderr,
"Error: Invalid syntax for -mpllabels option.\n");
177 mpl_title = scanned[i_arg].list[1];
178 mpl_topline = scanned[i_arg].list[2];
181 fprintf(stderr,
"Error: Unrecognized option '%s'.\n", scanned[i_arg].list[0]);
186 input = scanned[i_arg].list[0];
188 output = scanned[i_arg].list[0];
190 fprintf(stderr,
"Error: Too many filenames provided.\n");
197 fprintf(stderr,
"Error: Input file not specified.\n\n%s", USAGE);
201 fprintf(stderr,
"Error: Output file not specified.\n\n%s", USAGE);
205 fprintf(stderr,
"Error: -signalname option not specified.\n\n%s", USAGE);
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);
217 if (strcmp(HP_DataMarker, parameter_name) == 0)
220 while (HP_parameter[index].HP_name) {
221 if (strcmp(HP_parameter[index].HP_name, parameter_name) == 0)
225 if (!HP_parameter[index].HP_name) {
226 fprintf(stderr,
"Error: Unrecognized parameter name '%s'.\n", parameter_name);
229 if (HP_parameter[index].value_string) {
230 fprintf(stderr,
"Error: Duplicate entry for parameter '%s'.\n", parameter_name);
234 cp_str(&HP_parameter[index].value_string, ptr);
241 if (columnMajorOrder != -1)
242 SDDS_table.layout.data_mode.column_major = columnMajorOrder;
245 while (HP_parameter[index].HP_name) {
246 if (!HP_parameter[index].value_string) {
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");
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");
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");
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");
276 HP_parameter[index].HP_name, NULL,
277 HP_parameter[index].type, HP_parameter[index].value_string) < 0) {
293 !SDDS_StartTable(&SDDS_table, points)) {
297 fflush(SDDS_table.layout.fp);
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");
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);
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) ||
327char *process_column_definition(
char **argv,
long argc) {
328 char buffer[SDDS_MAXLINE], *ptr;
333 snprintf(buffer,
sizeof(buffer),
"&column name=%s, ", argv[0]);
334 for (i = 1; i < argc; i++) {
335 if (!strchr(argv[i],
'=')) {
338 strcat(buffer, argv[i]);
339 strcat(buffer,
", ");
341 if (!strstr(buffer,
"type="))
342 strcat(buffer,
"type=character ");
343 strcat(buffer,
"&end");
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
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_LONG
Identifier for the signed 32-bit integer 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.