77char *option[N_OPTIONS] = {
91 "sddsquery [<SDDSfilename>...]\n"
93 " [-sddsOutput[=<filename>]]\n"
99 " [-delimiter=<delimiting-string>] \n"
100 " [-appendunits[=bare]] \n"
103 " -pipe[=input] Read input from a pipe.\n"
104 " -sddsOutput[=<filename>] Write SDDS output to a file.\n"
105 " -arraylist List arrays.\n"
106 " -associatelist List associates.\n"
107 " -columnlist List columns.\n"
108 " -parameterlist List parameters.\n"
109 " -version Show version information.\n"
110 " -delimiter=<string> Use <string> as a delimiter.\n"
111 " -appendunits[=bare] Append units to the output.\n"
112 " -readAll Read all pages.\n"
115 " sddsquery accesses a series of SDDS files and summarizes the file header for each. "
116 "It also provides lists of arrays, columns, parameters, or associates.\n"
118 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
120long InitializeSDDSHeaderOutput(
SDDS_DATASET *outSet,
char *filename);
126int main(
int argc,
char **argv) {
133 char s[SDDS_MAXLINE];
134 char **filename, *ptr, *sddsOutputFile;
135 long i, i_arg, filenames, file, append_units, sddsOutput;
137 char *text, *contents, *delimiter, *unitsTemplate;
139 unsigned long pipeFlags;
145 filenames = append_units = 0;
146 delimiter = sddsOutputFile = unitsTemplate = NULL;
151 argc =
scanargs(&s_arg, argc, argv);
153 for (i_arg = 1; i_arg < argc; i_arg++) {
154 if (s_arg[i_arg].arg_type == OPTION) {
156 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
157 case SET_COLUMN_LIST:
158 list_request = SET_COLUMN_LIST;
160 case SET_PARAMETER_LIST:
161 list_request = SET_PARAMETER_LIST;
163 case SET_ASSOCIATE_LIST:
164 list_request = SET_ASSOCIATE_LIST;
167 list_request = SET_ARRAY_LIST;
170 list_request = SET_VERSION;
173 if (s_arg[i_arg].n_items < 2)
175 delimiter = s_arg[i_arg].list[1];
177 case SET_APPEND_UNITS:
179 if (s_arg[i_arg].n_items == 2) {
180 if (strncmp(s_arg[i_arg].list[1],
"bare", strlen(s_arg[i_arg].list[1])) == 0)
181 unitsTemplate =
" %s";
183 SDDS_Bomb(
"invalid -appendUnits syntax");
184 }
else if (s_arg[i_arg].n_items > 2)
185 SDDS_Bomb(
"invalid -appendUnits syntax");
187 unitsTemplate =
" (%s)";
190 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
195 sddsOutputFile = NULL;
196 if ((s_arg[i_arg].n_items != 1 && s_arg[i_arg].n_items != 2) ||
197 (s_arg[i_arg].n_items == 2 &&
SDDS_StringIsBlank(sddsOutputFile = s_arg[i_arg].list[1])))
204 bomb(
"unknown switch", USAGE);
208 filename =
trealloc(filename,
sizeof(*filename) * (filenames + 1));
209 filename[filenames++] = s_arg[i_arg].list[0];
213 if (!filenames && !(pipeFlags & USE_STDIN))
215 if (pipeFlags & USE_STDIN) {
217 filename1 =
tmalloc(
sizeof(*filename1) * (filenames + 1));
219 for (file = 0; file < filenames; file++)
220 filename1[file + 1] = filename[file];
223 filename = filename1;
227 fprintf(stderr,
"files: ");
228 for (file = 0; file < filenames; file++)
229 fprintf(stderr,
"%s ", filename[file] ? filename[file] :
"NULL");
230 fprintf(stderr,
"\n");
233 if (sddsOutput && !InitializeSDDSHeaderOutput(&SDDSout, sddsOutputFile)) {
238 for (file = 0; file < filenames; file++) {
240 fprintf(stderr,
"working on file %ld\n", file);
247 fprintf(stderr,
"file initialized\n");
251 fprintf(stderr,
"Making SDDS header summary\n");
253 if (!MakeSDDSHeaderSummary(&SDDSout, &SDDS_dataset, list_request, filename[file])) {
265 layout = &SDDS_dataset.layout;
266 if (list_request >= 0) {
267 switch (list_request) {
268 case SET_COLUMN_LIST:
270 fprintf(stderr,
"printing column info\n");
272 for (i = 0; i < layout->n_columns; i++) {
273 fputs(layout->column_definition[i].name, stdout);
274 if (append_units && layout->column_definition[i].units &&
276 fprintf(stdout, unitsTemplate, layout->column_definition[i].units);
277 fputs(delimiter ? delimiter :
"\n", stdout);
280 case SET_PARAMETER_LIST:
282 fprintf(stderr,
"printing parameter info\n");
284 for (i = 0; i < layout->n_parameters; i++) {
285 fputs(layout->parameter_definition[i].name, stdout);
286 if (append_units && layout->parameter_definition[i].units &&
288 fprintf(stdout, unitsTemplate, layout->parameter_definition[i].units);
289 fputs(delimiter ? delimiter :
"\n", stdout);
292 case SET_ASSOCIATE_LIST:
294 fprintf(stderr,
"printing associate info\n");
296 for (i = 0; i < layout->n_associates; i++) {
297 fputs(layout->associate_definition[i].filename, stdout);
298 fputs(delimiter ? delimiter :
"\n", stdout);
303 fprintf(stderr,
"printing array info\n");
305 for (i = 0; i < layout->n_arrays; i++) {
306 fputs(layout->array_definition[i].name, stdout);
307 if (append_units && layout->array_definition[i].units &&
309 fprintf(stdout, unitsTemplate, layout->array_definition[i].units);
310 fputs(delimiter ? delimiter :
"\n", stdout);
315 fprintf(stderr,
"printing version info\n");
318 if (!(fp = fopen(filename[file],
"r")) || !fgets(s, SDDS_MAXLINE, fp)) {
322 if (strncmp(s,
"SDDS", 4) != 0)
325 if (!(ptr = strchr(s,
'\n')))
335 SDDS_Bomb(
"something impossible happened!");
343 if (list_request != SET_VERSION && !
SDDS_Terminate(&SDDS_dataset)) {
351 fprintf(stdout,
"\nfile %s is in SDDS protocol version %" PRId32
"\n",
352 filename[file] ? filename[file] :
"stdin", layout->version);
356 fprintf(stdout,
"description: %s\n", text);
358 fprintf(stdout,
"contents: %s\n", contents);
359 if (layout->data_mode.mode == SDDS_ASCII) {
360 fprintf(stdout,
"\ndata is ASCII with %" PRId32
" lines per row and %" PRId32
" additional header lines expected.\n",
361 layout->data_mode.lines_per_row, layout->data_mode.additional_header_lines);
362 fprintf(stdout,
"row counts: %s\n", layout->data_mode.no_row_counts ?
"no" :
"yes");
364 if (!SDDS_dataset.layout.byteOrderDeclared)
365 fprintf(stdout,
"data is binary (no byte order declared)\n");
367 if (SDDS_dataset.swapByteOrder)
368 fprintf(stdout,
"data is little-endian binary\n");
370 fprintf(stdout,
"data is big-endian binary\n");
372 if (SDDS_dataset.swapByteOrder)
373 fprintf(stdout,
"data is big-endian binary\n");
375 fprintf(stdout,
"data is little-endian binary\n");
379 if (layout->n_columns) {
380 fprintf(stdout,
"\n%" PRId32
" columns of data:\n", layout->n_columns);
381 fprintf(stdout,
"NAME UNITS SYMBOL FORMAT TYPE FIELD DESCRIPTION\n");
382 fprintf(stdout,
" LENGTH\n");
383 for (i = 0; i < layout->n_columns; i++) {
384 coldef = layout->column_definition + i;
385 fprintf(stdout,
"%-15s %-15s %-15s %-15s %-7s %-7" PRId32
" %s\n",
386 coldef->name ? coldef->name :
"NULL",
387 coldef->units ? coldef->units :
"NULL",
388 coldef->symbol ? coldef->symbol :
"NULL",
389 coldef->format_string ? coldef->format_string :
"NULL",
391 coldef->field_length, coldef->description ? coldef->description :
"NULL");
395 if (layout->n_parameters) {
396 fprintf(stdout,
"\n%" PRId32
" parameters:\n", layout->n_parameters);
397 fprintf(stdout,
"NAME UNITS SYMBOL TYPE DESCRIPTION\n");
398 for (i = 0; i < layout->n_parameters; i++) {
399 pardef = layout->parameter_definition + i;
400 fprintf(stdout,
"%-19s %-19s %-19s %-19s %s\n",
401 pardef->name ? pardef->name :
"NULL",
402 pardef->units ? pardef->units :
"NULL",
403 pardef->symbol ? pardef->symbol :
"NULL",
405 pardef->description ? pardef->description :
"NULL");
409 if (layout->n_arrays) {
410 fprintf(stdout,
"\n%" PRId32
" arrays of data:\n", layout->n_arrays);
411 fprintf(stdout,
"NAME UNITS SYMBOL FORMAT TYPE FIELD GROUP DESCRIPTION\n");
412 fprintf(stdout,
" LENGTH NAME\n");
413 for (i = 0; i < layout->n_arrays; i++) {
414 arraydef = layout->array_definition + i;
415 fprintf(stdout,
"%-15s %-15s %-15s %-7s %-8s*^%-5" PRId32
" %-7" PRId32
" %-15s %s\n",
416 arraydef->name ? arraydef->name :
"NULL",
417 arraydef->units ? arraydef->units :
"NULL",
418 arraydef->symbol ? arraydef->symbol :
"NULL",
419 arraydef->format_string ? arraydef->format_string :
"NULL",
421 arraydef->dimensions,
422 arraydef->field_length,
423 arraydef->group_name ? arraydef->group_name :
"NULL",
424 arraydef->description ? arraydef->description :
"NULL");
428 if (layout->n_associates) {
429 fprintf(stdout,
"\n%" PRId32
" associates:\n", layout->n_associates);
430 fprintf(stdout,
"SDDS FILENAME PATH CONTENTS DESCRIPTION\n");
431 for (i = 0; i < layout->n_associates; i++)
432 fprintf(stdout,
"%-5s %-19s %-29s %-19s %s\n",
433 layout->associate_definition[i].sdds ?
"yes" :
"no",
434 layout->associate_definition[i].filename ? layout->associate_definition[i].filename :
"NULL",
435 layout->associate_definition[i].path ? layout->associate_definition[i].path :
"NULL",
436 layout->associate_definition[i].contents ? layout->associate_definition[i].contents :
"NULL",
437 layout->associate_definition[i].description ? layout->associate_definition[i].description :
"NULL");
456static long indexName, indexUnits, indexSymbol, indexFormat, indexType, indexDescription, indexGroup;
458long InitializeSDDSHeaderOutput(
SDDS_DATASET *outSet,
char *filename) {
478 switch (listRequest) {
479 case SET_COLUMN_LIST:
480 if (!MakeColumnHeaderSummary(outSet, inSet, inputFile))
483 case SET_PARAMETER_LIST:
484 if (!MakeParameterHeaderSummary(outSet, inSet, inputFile))
488 if (!MakeArrayHeaderSummary(outSet, inSet, inputFile))
492 if (!MakeColumnHeaderSummary(outSet, inSet, inputFile) ||
493 !MakeParameterHeaderSummary(outSet, inSet, inputFile) ||
494 !MakeArrayHeaderSummary(outSet, inSet, inputFile))
506 layout = &inSet->layout;
507 if (!layout->n_columns)
511 for (i = 0; i < layout->n_columns; i++) {
512 coldef = layout->column_definition + i;
514 indexName, coldef->name,
515 indexUnits, coldef->units,
516 indexSymbol, coldef->symbol,
517 indexFormat, coldef->format_string,
519 indexDescription, coldef->description,
520 indexGroup, NULL, -1))
525 "Filename", inputFile,
538 layout = &inSet->layout;
539 if (!layout->n_parameters)
543 for (i = 0; i < layout->n_parameters; i++) {
544 pardef = layout->parameter_definition + i;
546 indexName, pardef->name,
547 indexUnits, pardef->units,
548 indexSymbol, pardef->symbol,
549 indexFormat, pardef->format_string,
551 indexDescription, pardef->description,
552 indexGroup, NULL, -1))
556 "Class",
"parameter",
557 "Filename", inputFile,
570 layout = &inSet->layout;
571 if (!layout->n_arrays)
575 for (i = 0; i < layout->n_arrays; i++) {
576 arrdef = layout->array_definition + i;
578 indexName, arrdef->name,
579 indexUnits, arrdef->units,
580 indexSymbol, arrdef->symbol,
581 indexFormat, arrdef->format_string,
583 indexDescription, arrdef->description,
584 indexGroup, arrdef->group_name,
590 "Filename", inputFile,
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
char * SDDS_type_name[SDDS_NUM_TYPES]
Array of supported data type names.
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_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
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_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.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_StringIsBlank(char *s)
Checks if a string is blank (contains only whitespace characters).
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_IsBigEndianMachine()
Determines whether the current machine uses big-endian byte ordering.
#define SDDS_STRING
Identifier for the string data type.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
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.
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 processPipeOption(char **item, long items, unsigned long *flags)