126#include <sys/types.h>
128# include <sys/time.h>
132#define PARAMETER_MODE 1
135 static char *mode_name[MODES] = {
181char *option[N_OPTIONS] = {
185 "rpndefinitionsfiles",
219char *usageArray[] = {
221 " sddsprocess [<SDDSinputfile>] [<SDDSoutputfile>] [OPTIONS]\n",
224 " -pipe=[input][,output]\n",
225 " Use pipe mode with optional input and output streams.\n",
226 " -ifis={column|parameter},<name>[,...]\n",
227 " Include only the specified columns or parameters.\n",
228 " -ifnot={column|parameter},<name>[,...]\n",
229 " Exclude the specified columns or parameters.\n",
230 " -match={column|parameter},<match-test>[,<match-test>,...]\n",
231 " Filter data based on matching criteria for columns or parameters.\n",
232 " -filter={column|parameter},<range-spec>[,<range-spec>,...]\n",
233 " Apply range-based filtering on specified columns or parameters.\n",
234 " -timeFilter={parameter|column},[,before=YYYY/MM/DD@HH:MM:SS][,after=YYYY/MM/DD@HH:MM:SS][,invert]\n",
235 " Filter data based on time constraints.\n",
236 " -clip=<head>,<tail>,[invert]\n",
237 " Clip the dataset by removing a specified number of rows from the head and tail.\n",
238 " -sparse=<interval>[,<offset>]\n",
239 " Retain every <interval>-th row starting from <offset>.\n",
240 " -sample=<fraction>\n",
241 " Randomly sample rows based on the specified fraction.\n",
242 " -fclip=<head>,<tail>,[invert]\n",
243 " Fractional clipping based on the fraction of rows.\n",
244 " -test={column|parameter},<test>[,autostop][,algebraic]\n",
245 " Apply RPN-based tests on columns or parameters with optional autostop.\n",
246 " -numberTest={column|parameter},<name>[,invert]\n",
247 " Perform numerical tests on specified columns or parameters.\n",
248 " -rpndefinitionsfiles=<filename>[,...]\n",
249 " Specify files containing RPN definitions.\n",
250 " -rpnexpression=<expression>[,repeat][,algebraic]\n",
251 " Define RPN expressions to be evaluated.\n",
252 " -convertunits={column|parameter},<name>,<new-units>,<old-units>[,<factor>]\n",
253 " Convert units of a specified column or parameter.\n",
254 " -define={column|parameter},<name>,{<equation>|@<parameterName>}[,<definition_entries>][,algebraic]\n",
255 " Define new columns or parameters based on equations or existing parameters.\n",
256 " -redefine={column|parameter},<name>,{<equation>|@<parameterName>}[,<definition_entries>][,algebraic]\n",
257 " Redefine existing columns or parameters.\n",
258 " -cast={column|parameter},<newName>,<sourceName>,<newType>\n",
259 " Cast a column or parameter to a new data type.\n",
260 " -scan={column|parameter},<new-name>,<source-name>,<sscanf-string>[,<definition-entries>][,edit=<string>]\n",
261 " Scan and parse data from a source column or parameter.\n",
262 " -edit={column|parameter},<new-name>,<source-name>,<edit-string>[,<definition-entries>]\n",
263 " Edit values of a column or parameter based on specified rules.\n",
264 " -reedit={column|parameter},<name>,<edit-string>[,<definition-entries>]\n",
265 " Re-edit existing columns or parameters.\n",
266 " -print={column|parameter},<new-name>,<sprintf-string>,<source-name>[,...][,<definition-entries>]\n",
267 " Print formatted data from a source to a new column or parameter.\n",
268 " -reprint={column|parameter},<new-name>,<sprintf-string>,<source-name>[,...][,<definition-entries>]\n",
269 " Reprint existing columns or parameters with new formatting.\n",
270 " -format={column|parameter},<new-name>,<source-name>[,stringFormat=<sprintfString>][,doubleFormat=<sprintfString>][,longFormat=<sprintfString>]\n",
271 " Apply formatting to columns or parameters.\n",
272 " -system={column|parameter},<new-name>,<command-name>[,<definition_entries>]\n",
273 " Execute system commands and capture their output.\n",
274 " -evaluate={column|parameter},<new-name>,<expression-name>[,<definition_entries>]\n",
275 " Evaluate expressions to compute new columns or parameters.\n",
276 " -process=<column-name>,<analysis-name>,<result-name>[,description=<string>][,symbol=<string>][,weightBy=<column-name>][,functionOf=<column-name>[,lowerLimit=<value>][,upperLimit=<value>][,position]][,head=<number>][,tail=<number>][fhead=<fraction>][ftail=<fraction>][,topLimit=<value>][,bottomLimit=<value>][,offset=<value>][,factor=<value>][match=<column-name>,value=<string>][,overwrite],[default=<value>]\n",
277 " Perform various processing operations on specified columns.\n",
279 " Display a summary of the processing operations performed.\n",
281 " Enable verbose output for detailed processing information.\n",
283 " Suppress warning messages.\n",
284 " -delete={column|parameter|array},<matching-string>[,...]\n",
285 " Delete specified columns, parameters, or arrays.\n",
286 " -retain={column|parameter|array},<matching-string>[,...]\n",
287 " Retain only the specified columns, parameters, or arrays.\n",
288 " -description=[text=<string>][,contents=<string>]\n",
289 " Add or modify the description of the output SDDS file.\n",
290 " -majorOrder=row|column\n",
291 " Set the major order of the output data (row-major or column-major).\n",
292 " -threads=<number>\n",
293 " Specify the number of threads to use for processing.\n",
295 "Additional Information:\n",
296 " A <match-test> is of the form <name>=<matching-string>[,!], where ! signifies logical negation.\n",
297 " A <logic-operation> is one of & (logical and) or | (logical or), optionally followed by a ! to logically negate the value of the expression.\n",
298 " A <range-spec> is of the form <name>,<lower-value>,<upper-value>[,!].\n",
299 " A <test> is an RPN expression leaving a value on the logic stack.\n",
300 " A <definition-entry> is of the form <entry-name>=<value>, where <entry-name> is one of \"symbol\", \"units\", \"description\", \"format_string\", and \"type\".\n",
303 " sddsprocess reads data from an SDDS file, processes it according to the specified options, and writes the results to a new SDDS file.\n",
304 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n",
307#define PARAMETER_OR_COLUMN(is_param) ((is_param) ? "parameter" : "column")
309#define REDEFINABLE_TYPE(type) (SDDS_NUMERIC_TYPE(type) || (type) == SDDS_CHARACTER)
314static long table_number_mem = -1, i_page_mem = -1, n_rows_mem = -1, i_row_mem = -1;
316typedef char *STRING_PAIR[2];
323char **process_name_options(
char **orig_name,
long **orig_flag,
long orig_names,
char **
delete,
long deletes,
324 char **retain,
long retains, STRING_PAIR *rename,
long renames,
326long SDDS_ComputeSetOfColumns(
SDDS_DATASET *SDDS_dataset,
long equ_begin,
long equ_end,
DEFINITION *definition);
332int main(
int argc,
char **argv) {
336 char *description_text, *description_contents;
340 long processing_definitions;
344 long edit_definitions;
346 long equation_definitions;
348 long evaluate_definitions;
350 long scan_definitions;
352 long print_definitions;
354 long format_definitions;
357 long filter_definitions;
359 long time_filter_definitions;
362 long match_definitions;
364 long rpntest_definitions;
366 long numbertest_definitions;
368 long system_definitions;
370 long rpnexpression_definitions;
373 long clip_definitions, fclip_definitions;
375 long sparse_definitions;
377 long sample_definitions;
381 long cast_definitions;
384 char *inputfile, *outputfile;
387 long i, k, i_arg, summarize, verbose, index = 0, tmpfile_used, nowarnings, udfCounter;
388 long page_number, accept;
390 char s[SDDS_MAXLINE];
392 char **rpn_definitions_file, *stringResult;
393 long rpn_definitions_files;
395 long original_parameters;
397 long i_page_memory, table_number_memory, n_rows_memory, row_deletion, skip_page;
398 long random_number_seed;
399 unsigned long pipeFlags, majorOrderFlag;
401 char **retain_column, **delete_column;
402 long retain_columns, delete_columns, rename_columns, edit_column_requests;
404 STRING_PAIR *rename_column;
405 char **orig_column_name, **new_column_name;
406 long *orig_column_flag;
407 int32_t orig_column_names;
409 char **retain_parameter, **delete_parameter;
410 long retain_parameters, delete_parameters, rename_parameters, edit_parameter_requests;
412 STRING_PAIR *rename_parameter;
413 char **orig_parameter_name, **new_parameter_name;
414 long *orig_parameter_flag;
415 int32_t orig_parameter_names;
417 char **retain_array, **delete_array;
418 long retain_arrays, delete_arrays, rename_arrays, edit_array_requests;
420 STRING_PAIR *rename_array;
421 char **orig_array_name, **new_array_name;
422 long *orig_array_flag;
423 int32_t orig_array_names;
424 short columnMajorOrder = -1;
428 char buffer[SDDS_MAXLINE];
432 argc =
scanargs(&s_arg, argc, argv);
433 argc = add_sddsfile_arguments(&s_arg, argc);
435 random_number_seed = (long)time((time_t *)NULL);
436 random_number_seed = 2 * (random_number_seed / 2) + 1;
438 random_1(-labs((
double)random_number_seed));
440 random_1(-FABS((
double)random_number_seed));
443 retain_column = delete_column = NULL;
444 retain_columns = delete_columns = rename_columns = edit_column_requests = 0;
445 rename_column = NULL;
446 edit_column_request = NULL;
448 retain_parameter = delete_parameter = NULL;
449 retain_parameters = delete_parameters = rename_parameters = edit_parameter_requests = 0;
450 rename_parameter = NULL;
451 edit_parameter_request = NULL;
453 retain_array = delete_array = NULL;
454 retain_arrays = delete_arrays = rename_arrays = edit_array_requests = 0;
456 edit_array_request = NULL;
458 description_text = description_contents = NULL;
459 new_parameter_name = new_column_name = new_array_name = NULL;
465 fprintf(stderr,
"%s", *ptr);
468 show_process_modes(stderr);
472 inputfile = outputfile = NULL;
473 rpn_definitions_file = NULL;
474 rpn_definitions_files = 0;
475 summarize = verbose = nowarnings = udfCounter = 0;
477 processing_definition = NULL;
478 processing_definitions = 0;
481 edit_definition = NULL;
482 edit_definitions = 0;
483 equation_definition = NULL;
484 equation_definitions = 0;
485 evaluate_definition = NULL;
486 evaluate_definitions = 0;
487 scan_definition = NULL;
488 scan_definitions = 0;
489 print_definition = NULL;
490 print_definitions = 0;
491 format_definition = NULL;
492 format_definitions = 0;
493 filter_definition = NULL;
494 filter_definitions = 0;
495 time_filter_definition = NULL;
496 time_filter_definitions = 0;
497 match_definition = NULL;
498 match_definitions = 0;
499 rpntest_definition = NULL;
500 rpntest_definitions = 0;
501 numbertest_definition = NULL;
502 numbertest_definitions = 0;
503 system_definition = NULL;
504 system_definitions = 0;
505 rpnexpression_definition = NULL;
506 rpnexpression_definitions = 0;
507 clip_definition = NULL;
508 fclip_definition = NULL;
509 clip_definitions = fclip_definitions = 0;
510 sparse_definition = NULL;
511 sparse_definitions = 0;
512 sample_definition = NULL;
513 sample_definitions = 0;
514 cast_definition = NULL;
515 cast_definitions = 0;
518 ifnot_item.items = 0;
522 for (i_arg = 1; i_arg < argc; i_arg++) {
523 if (s_arg[i_arg].arg_type == OPTION) {
525 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
526 case SET_MAJOR_ORDER:
528 s_arg[i_arg].n_items--;
529 if (s_arg[i_arg].n_items > 0 &&
530 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
531 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
532 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
533 SDDS_Bomb(
"invalid -majorOrder syntax/values");
534 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
535 columnMajorOrder = 1;
536 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
537 columnMajorOrder = 0;
540 if (s_arg[i_arg].n_items < 3)
542 match_definition = (
MATCH_DEFINITION **)
trealloc(match_definition,
sizeof(*match_definition) * (match_definitions + 1));
543 if (!(match_definition[match_definitions] = process_new_match_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
545 add_definition(&definition, &definitions, (
void *)match_definition[match_definitions], IS_MATCH_DEFINITION);
549 if (s_arg[i_arg].n_items < 3)
551 filter_definition = (
FILTER_DEFINITION **)
trealloc(filter_definition,
sizeof(*filter_definition) * (filter_definitions + 1));
552 if (!(filter_definition[filter_definitions] = process_new_filter_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
554 add_definition(&definition, &definitions, (
void *)filter_definition[filter_definitions], IS_FILTER_DEFINITION);
555 filter_definitions++;
557 case SET_TIME_FILTER:
558 if (s_arg[i_arg].n_items < 3)
561 if (!(time_filter_definition[time_filter_definitions] = process_new_time_filter_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
563 add_definition(&definition, &definitions, (
void *)time_filter_definition[time_filter_definitions], IS_TIME_FILTER_DEFINITION);
564 time_filter_definitions++;
566 case SET_RPN_DEFNS_FILES:
567 if (s_arg[i_arg].n_items < 2)
568 SDDS_Bomb(
"invalid -rpndefinitionsfiles syntax");
569 rpn_definitions_file =
trealloc(rpn_definitions_file,
sizeof(*rpn_definitions_file) * (rpn_definitions_files + s_arg[i_arg].n_items));
570 for (i = 1; i < s_arg[i_arg].n_items; i++)
571 if (!
fexists(rpn_definitions_file[rpn_definitions_files + i - 1] = s_arg[i_arg].list[i]))
572 SDDS_Bomb(
"one or more rpn definitions files do not exist");
573 rpn_definitions_files += s_arg[i_arg].n_items - 1;
575 case SET_RPN_EXPRESSION:
576 if (s_arg[i_arg].n_items < 2 && s_arg[i_arg].n_items > 4)
577 SDDS_Bomb(
"invalid -rpnexpression syntax");
578 rpnexpression_definition = (
RPNEXPRESSION_DEFINITION **)
trealloc(rpnexpression_definition,
sizeof(*rpnexpression_definition) * (rpnexpression_definitions + 1));
579 if (!(rpnexpression_definition[rpnexpression_definitions] = process_new_rpnexpression_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
580 SDDS_Bomb(
"invalid -rpnexpression syntax");
581 add_definition(&definition, &definitions, (
void *)rpnexpression_definition[rpnexpression_definitions], IS_RPNEXPRESSION_DEFINITION);
582 rpnexpression_definitions++;
585 if (s_arg[i_arg].n_items < 4)
587 equation_definition = (
EQUATION_DEFINITION **)
trealloc(equation_definition,
sizeof(*equation_definition) * (equation_definitions + 1));
588 if (!(equation_definition[equation_definitions] = process_new_equation_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
590 equation_definition[equation_definitions]->redefinition = 0;
591 add_definition(&definition, &definitions, (
void *)equation_definition[equation_definitions], IS_EQUATION_DEFINITION);
592 equation_definitions++;
594 case SET_REDEFINITION:
595 if (s_arg[i_arg].n_items < 4)
596 SDDS_Bomb(
"invalid -redefinition syntax");
597 equation_definition = (
EQUATION_DEFINITION **)
trealloc(equation_definition,
sizeof(*equation_definition) * (equation_definitions + 1));
598 if (!(equation_definition[equation_definitions] = process_new_equation_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
599 SDDS_Bomb(
"invalid -redefinition syntax");
600 equation_definition[equation_definitions]->redefinition = 1;
601 add_definition(&definition, &definitions, (
void *)equation_definition[equation_definitions], IS_EQUATION_DEFINITION);
602 equation_definitions++;
605 if (s_arg[i_arg].n_items < 4)
607 evaluate_definition = (
EVALUATE_DEFINITION **)
trealloc(evaluate_definition,
sizeof(*evaluate_definition) * (evaluate_definitions + 1));
608 if (!(evaluate_definition[evaluate_definitions] = process_new_evaluate_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
610 add_definition(&definition, &definitions, (
void *)evaluate_definition[evaluate_definitions], IS_EVALUATE_DEFINITION);
611 evaluate_definitions++;
614 if (s_arg[i_arg].n_items < 3 && s_arg[i_arg].n_items > 5)
616 rpntest_definition = (
RPNTEST_DEFINITION **)
trealloc(rpntest_definition,
sizeof(*rpntest_definition) * (rpntest_definitions + 1));
617 if (!(rpntest_definition[rpntest_definitions] = process_new_rpntest_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
619 add_definition(&definition, &definitions, (
void *)rpntest_definition[rpntest_definitions], IS_RPNTEST_DEFINITION);
620 rpntest_definitions++;
632 processing_definition = (
PROCESSING_DEFINITION **)
trealloc(processing_definition,
sizeof(*processing_definition) * (processing_definitions + 1));
633 if (!(processing_definition[processing_definitions] = record_processing_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
634 SDDS_Bomb(
"invalid -process syntax--parsing problem");
635 add_definition(&definition, &definitions, (
void *)processing_definition[processing_definitions], IS_PROCESSING_DEFINITION);
636 processing_definitions++;
638 case SET_CONVERT_UNITS:
639 if (s_arg[i_arg].n_items != 6)
640 SDDS_Bomb(
"invalid -convertunits syntax--wrong number of items");
642 if (!(conversion[conversions] = process_conversion_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
643 SDDS_Bomb(
"invalid -convertunits syntax");
644 add_definition(&definition, &definitions, (
void *)conversion[conversions], IS_CONVERSION_DEFINITION);
649 if (s_arg[i_arg].n_items < 3)
651 numbertest_definition = (
NUMBERTEST_DEFINITION **)
trealloc(numbertest_definition,
sizeof(*numbertest_definition) * (numbertest_definitions + 1));
652 if (!(numbertest_definition[numbertest_definitions] = process_new_numbertest_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
654 add_definition(&definition, &definitions, (
void *)numbertest_definition[numbertest_definitions], IS_NUMBERTEST_DEFINITION);
655 numbertest_definitions++;
658 if (s_arg[i_arg].n_items < 5)
660 scan_definition = (
SCAN_DEFINITION **)
trealloc(scan_definition,
sizeof(*scan_definition) * (scan_definitions + 1));
661 if (!(scan_definition[scan_definitions] = process_new_scan_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
663 add_definition(&definition, &definitions, (
void *)scan_definition[scan_definitions], IS_SCAN_DEFINITION);
667 if (s_arg[i_arg].n_items < 4)
669 print_definition = (
PRINT_DEFINITION **)
trealloc(print_definition,
sizeof(*print_definition) * (print_definitions + 1));
670 if (!(print_definition[print_definitions] = process_new_print_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
672 print_definition[print_definitions]->reprint = 0;
673 add_definition(&definition, &definitions, (
void *)print_definition[print_definitions], IS_PRINT_DEFINITION);
677 if (s_arg[i_arg].n_items < 4)
679 print_definition = (
PRINT_DEFINITION **)
trealloc(print_definition,
sizeof(*print_definition) * (print_definitions + 1));
680 if (!(print_definition[print_definitions] = process_new_print_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
682 print_definition[print_definitions]->reprint = 1;
683 add_definition(&definition, &definitions, (
void *)print_definition[print_definitions], IS_PRINT_DEFINITION);
687 if (s_arg[i_arg].n_items < 5)
689 edit_definition = (
EDIT_DEFINITION **)
trealloc(edit_definition,
sizeof(*edit_definition) * (edit_definitions + 1));
690 if (!(edit_definition[edit_definitions] = process_new_edit_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, 0)))
692 add_definition(&definition, &definitions, (
void *)edit_definition[edit_definitions], IS_EDIT_DEFINITION);
696 if (s_arg[i_arg].n_items < 4)
698 edit_definition = (
EDIT_DEFINITION **)
trealloc(edit_definition,
sizeof(*edit_definition) * (edit_definitions + 1));
699 if (!(edit_definition[edit_definitions] = process_new_edit_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, 1)))
701 edit_definition[edit_definitions]->reedit = 1;
702 add_definition(&definition, &definitions, (
void *)edit_definition[edit_definitions], IS_EDIT_DEFINITION);
706 if (s_arg[i_arg].n_items < 4)
708 system_definition = (
SYSTEM_DEFINITION **)
trealloc(system_definition,
sizeof(*system_definition) * (system_definitions + 1));
709 if (!(system_definition[system_definitions] = process_new_system_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
711 add_definition(&definition, &definitions, (
void *)system_definition[system_definitions], IS_SYSTEM_DEFINITION);
712 system_definitions++;
715 if (s_arg[i_arg].n_items < 3)
717 add_ifitem(&ifnot_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
720 if (s_arg[i_arg].n_items < 3)
722 add_ifitem(&ifis_item, s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1);
725 clip_definition = (
CLIP_DEFINITION **)
trealloc(clip_definition,
sizeof(*clip_definition) * (clip_definitions + 1));
726 if (!(clip_definition[clip_definitions] = process_new_clip_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
728 add_definition(&definition, &definitions, (
void *)clip_definition[clip_definitions], IS_CLIP_DEFINITION);
732 fclip_definition = (
FCLIP_DEFINITION **)
trealloc(fclip_definition,
sizeof(*fclip_definition) * (fclip_definitions + 1));
733 if (!(fclip_definition[fclip_definitions] = process_new_fclip_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
735 add_definition(&definition, &definitions, (
void *)fclip_definition[fclip_definitions], IS_FCLIP_DEFINITION);
739 sparse_definition = (
SPARSE_DEFINITION **)
trealloc(sparse_definition,
sizeof(*sparse_definition) * (sparse_definitions + 1));
740 if (!(sparse_definition[sparse_definitions] = process_new_sparse_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
742 add_definition(&definition, &definitions, (
void *)sparse_definition[sparse_definitions], IS_SPARSE_DEFINITION);
743 sparse_definitions++;
746 sample_definition = (
SAMPLE_DEFINITION **)
trealloc(sample_definition,
sizeof(*sample_definition) * (sample_definitions + 1));
747 if (!(sample_definition[sample_definitions] = process_new_sample_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
749 add_definition(&definition, &definitions, (
void *)sample_definition[sample_definitions], IS_SAMPLE_DEFINITION);
750 sample_definitions++;
753 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
757 if (s_arg[i_arg].n_items < 4)
759 format_definition = (
FORMAT_DEFINITION **)
trealloc(format_definition,
sizeof(*format_definition) * (format_definitions + 1));
760 if (!(format_definition[format_definitions] = process_new_format_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
762 add_definition(&definition, &definitions, (
void *)format_definition[format_definitions], IS_FORMAT_DEFINITION);
763 format_definitions++;
766 if (s_arg[i_arg].n_items != 5)
768 cast_definition = (
CAST_DEFINITION **)
trealloc(cast_definition,
sizeof(*cast_definition) * (cast_definitions + 1));
769 if (!(cast_definition[cast_definitions] = process_new_cast_definition(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1)))
771 add_definition(&definition, &definitions, (
void *)cast_definition[cast_definitions], IS_CAST_DEFINITION);
775 if (s_arg[i_arg].n_items < 3)
777 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
779 delete_column =
trealloc(delete_column,
sizeof(*delete_column) * (delete_columns + s_arg[i_arg].n_items - 2));
780 for (i = 2; i < s_arg[i_arg].n_items; i++)
781 delete_column[i - 2 + delete_columns] = s_arg[i_arg].list[i];
782 delete_columns += s_arg[i_arg].n_items - 2;
785 delete_parameter =
trealloc(delete_parameter,
sizeof(*delete_parameter) * (delete_parameters + s_arg[i_arg].n_items - 2));
786 for (i = 2; i < s_arg[i_arg].n_items; i++)
787 delete_parameter[i - 2 + delete_parameters] = s_arg[i_arg].list[i];
788 delete_parameters += s_arg[i_arg].n_items - 2;
791 delete_array =
trealloc(delete_array,
sizeof(*delete_array) * (delete_arrays + s_arg[i_arg].n_items - 2));
792 for (i = 2; i < s_arg[i_arg].n_items; i++)
793 delete_array[i - 2 + delete_arrays] = s_arg[i_arg].list[i];
794 delete_arrays += s_arg[i_arg].n_items - 2;
797 SDDS_Bomb(
"invalid -delete syntax: specify column or parameter keyword");
802 if (s_arg[i_arg].n_items < 3)
804 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
806 retain_column =
trealloc(retain_column,
sizeof(*retain_column) * (retain_columns + s_arg[i_arg].n_items - 2));
807 for (i = 2; i < s_arg[i_arg].n_items; i++)
808 retain_column[i - 2 + retain_columns] = s_arg[i_arg].list[i];
809 retain_columns += s_arg[i_arg].n_items - 2;
812 retain_parameter =
trealloc(retain_parameter,
sizeof(*retain_parameter) * (retain_parameters + s_arg[i_arg].n_items - 2));
813 for (i = 2; i < s_arg[i_arg].n_items; i++)
814 retain_parameter[i - 2 + retain_parameters] = s_arg[i_arg].list[i];
815 retain_parameters += s_arg[i_arg].n_items - 2;
818 retain_array =
trealloc(retain_array,
sizeof(*retain_array) * (retain_arrays + s_arg[i_arg].n_items - 2));
819 for (i = 2; i < s_arg[i_arg].n_items; i++)
820 retain_array[i - 2 + retain_arrays] = s_arg[i_arg].list[i];
821 retain_arrays += s_arg[i_arg].n_items - 2;
824 SDDS_Bomb(
"invalid -retain syntax: specify column or parameter keyword");
828 case SET_DESCRIPTION:
829 s_arg[i_arg].n_items -= 1;
830 if (!
scanItemList(&flags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
832 "contents",
SDDS_STRING, &description_contents, 1, 0, NULL))
833 SDDS_Bomb(
"invalid -description syntax");
836 if (s_arg[i_arg].n_items != 2 ||
837 !sscanf(s_arg[i_arg].list[1],
"%d", &threads) || threads < 1)
841 snprintf(buffer, SDDS_MAXLINE,
"unknown switch: %s", s_arg[i_arg].list[0]);
846 if (inputfile == NULL)
847 inputfile = s_arg[i_arg].list[0];
848 else if (outputfile == NULL)
849 outputfile = s_arg[i_arg].list[0];
851 fprintf(stderr,
"argument %s is invalid: too many filenames (sddsprocess)\n", s_arg[i_arg].list[0]);
857 processFilenames(
"sddsprocess", &inputfile, &outputfile, pipeFlags, nowarnings, &tmpfile_used);
859 if (rpn_definitions_files) {
860 rpn(rpn_definitions_file[0]);
861 if (rpn_check_error())
863 for (i = 1; i < rpn_definitions_files; i++) {
864 sprintf(s,
"\"%s,s\" @", rpn_definitions_file[i]);
866 if (rpn_check_error())
870 rpn(getenv(
"RPN_DEFNS"));
871 if (rpn_check_error())
874 i_page_memory = rpn_create_mem(
"i_page", 0);
875 table_number_memory = rpn_create_mem(
"table_number", 0);
876 n_rows_memory = rpn_create_mem(
"n_rows", 0);
882 if (!check_ifitems(&SDDS_input, &ifnot_item, 0, !nowarnings) ||
883 !check_ifitems(&SDDS_input, &ifis_item, 1, !nowarnings))
885 original_parameters = SDDS_input.layout.n_parameters;
887 if (!description_text)
889 if (!
SDDS_InitializeOutput(&SDDS_output, SDDS_input.layout.data_mode.mode, 1, description_text, description_contents, outputfile)) {
893 if (columnMajorOrder != -1)
894 SDDS_output.layout.data_mode.column_major = columnMajorOrder;
896 SDDS_output.layout.data_mode.column_major = SDDS_input.layout.data_mode.column_major;
900 fprintf(stderr,
"Getting column, parameter, and array names from input file.\n");
906 if (orig_column_names && !(new_column_name = process_name_options(orig_column_name, &orig_column_flag, orig_column_names, delete_column, delete_columns, retain_column, retain_columns, rename_column, rename_columns, edit_column_request, edit_column_requests)))
915 fprintf(stderr,
"processing name options\n");
917 if (orig_parameter_names && !(new_parameter_name = process_name_options(orig_parameter_name, &orig_parameter_flag, orig_parameter_names, delete_parameter, delete_parameters, retain_parameter, retain_parameters, rename_parameter, rename_parameters, edit_parameter_request, edit_parameter_requests)))
924 if (orig_array_names && !(new_array_name = process_name_options(orig_array_name, &orig_array_flag, orig_array_names, delete_array, delete_arrays, retain_array, retain_arrays, rename_array, rename_arrays, edit_array_request, edit_array_requests)))
928 for (i = 0; i < orig_parameter_names; i++) {
929 fprintf(stderr,
"parameter %s goes to %s\n", orig_parameter_name[i], orig_parameter_flag[i] ? new_parameter_name[i] :
"<deleted>");
931 for (i = 0; i < orig_array_names; i++) {
932 fprintf(stderr,
"array %s goes to %s\n", orig_array_name[i], orig_array_flag[i] ? new_array_name[i] :
"<deleted>");
934 for (i = 0; i < orig_column_names; i++) {
935 fprintf(stderr,
"column %s goes to %s\n", orig_column_name[i], orig_column_flag[i] ? new_column_name[i] :
"<deleted>");
940 fprintf(stderr,
"Transferring definitions to new file.\n");
942 for (i = 0; i < orig_parameter_names; i++) {
943 if (orig_parameter_flag[i]) {
945 fprintf(stderr,
"unable to transfer parameter %s to %s\n", orig_parameter_name[i], new_parameter_name[i]);
951 for (i = 0; i < orig_array_names; i++) {
952 if (orig_array_flag[i]) {
954 fprintf(stderr,
"unable to transfer array %s to %s\n", orig_array_name[i], new_array_name[i]);
961 for (i = 0; i < orig_column_names; i++) {
962 if (orig_column_flag[i]) {
965 fprintf(stderr,
"unable to transfer column %s to %s\n", orig_column_name[i], new_column_name[i]);
971 for (i = 0; i < orig_column_names; i++) {
972 free(new_column_name[i]);
973 free(orig_column_name[i]);
975 free(new_column_name);
976 free(orig_column_name);
978 expandDefinitions(&definition, &definitions, &SDDS_output);
980 for (i = 0; i < definitions; i++) {
981 switch (definition[i].type) {
982 case IS_EQUATION_DEFINITION:
984 sprintf(s,
"%sUDF%ld", equation_ptr->name, udfCounter++);
987 SDDS_Bomb(
"string copying failed (making udf name)");
988 if (equation_ptr->equation[0] ==
'@') {
989 if (equation_ptr->equation[1] ==
'@') {
994 fprintf(stderr,
"Error (sddsprocess): parameter %s does not exist or is not string type\n", equation_ptr->equation + 2);
1001 fprintf(stderr,
"Error (sddsprocess): parameter %s does not exist or is not string type\n", equation_ptr->equation + 1);
1006 if (strstr(equation_ptr->equation,
"xstr") == NULL)
1007 create_udf(equation_ptr->udf_name, equation_ptr->equation);
1010 equation_ptr->udf_name = equation_ptr->equation;
1012 if (equation_ptr->redefinition) {
1013 if (equation_ptr->is_parameter) {
1015 equation_ptr->redefinition = 0;
1017 equation_ptr->redefinition = 0;
1019 if (equation_ptr->redefinition == 0) {
1020 if (equation_ptr->is_parameter) {
1023 fprintf(stderr,
"Bad parameter string: %s\n", equation_ptr->text);
1028 fprintf(stderr,
"Bad column string: %s\n", equation_ptr->text);
1032 if (equation_ptr->is_parameter) {
1034 fprintf(stderr,
"can't redefine parameter %s--non-numeric\n", equation_ptr->name);
1037 if (equation_ptr->argc && !SDDS_RedefineParameterCL(&SDDS_output, equation_ptr->name, equation_ptr->argv, equation_ptr->argc)) {
1038 fprintf(stderr,
"can't redefine parameter %s as requested\n", equation_ptr->name);
1043 fprintf(stderr,
"can't redefine column %s--non-numeric\n", equation_ptr->name);
1046 if (equation_ptr->argc && !SDDS_RedefineColumnCL(&SDDS_output, equation_ptr->name, equation_ptr->argv, equation_ptr->argc)) {
1047 fprintf(stderr,
"can't redefine column %s as requested\n", equation_ptr->name);
1053 case IS_EDIT_DEFINITION:
1057 edit_ptr->reedit = 0;
1058 else if (!edit_ptr->reedit) {
1059 fprintf(stderr,
"Can't define new -edit %s %s--already exists (sddsprocess)\n", edit_ptr->is_parameter ?
"parameter" :
"column", edit_ptr->new_name);
1062 if (!edit_ptr->reedit) {
1063 if (!(edit_ptr->is_parameter ? SDDS_ProcessParameterString(&SDDS_output, edit_ptr->text, SDDS_WRITEONLY_DEFINITION) : SDDS_ProcessColumnString(&SDDS_output, edit_ptr->text, SDDS_WRITEONLY_DEFINITION))) {
1064 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors);
1069 fprintf(stderr,
"Can't reedit %s %s--not string type (sddsprocess)\n", edit_ptr->is_parameter ?
"parameter" :
"column", edit_ptr->new_name);
1072 if (edit_ptr->argc && !(edit_ptr->is_parameter ? SDDS_RedefineParameterCL(&SDDS_output, edit_ptr->new_name, edit_ptr->argv, edit_ptr->argc) : SDDS_RedefineColumnCL(&SDDS_output, edit_ptr->new_name, edit_ptr->argv, edit_ptr->argc))) {
1073 fprintf(stderr,
"Can't reedit %s %s as requested (sddsprocess)\n", edit_ptr->is_parameter ?
"parameter" :
"column", edit_ptr->new_name);
1078 case IS_SCAN_DEFINITION:
1080 if (scan_ptr->is_parameter) {
1090 case IS_PRINT_DEFINITION:
1094 print_ptr->reprint = 0;
1095 else if (!print_ptr->reprint) {
1096 fprintf(stderr,
"Can't define new -print %s %s--already exists (sddsprocess)\n", print_ptr->is_parameter ?
"parameter" :
"column", print_ptr->new_name);
1099 if (!print_ptr->reprint) {
1100 if (!(print_ptr->is_parameter ? SDDS_ProcessParameterString(&SDDS_output, print_ptr->text, SDDS_WRITEONLY_DEFINITION) : SDDS_ProcessColumnString(&SDDS_output, print_ptr->text, SDDS_WRITEONLY_DEFINITION))) {
1101 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors);
1106 fprintf(stderr,
"Can't reprint %s %s--not string type (sddsprocess)\n", print_ptr->is_parameter ?
"parameter" :
"column", print_ptr->new_name);
1111 case IS_PROCESSING_DEFINITION:
1113 if (!complete_processing_definitions(&processing_ptr, 1, &SDDS_output)) {
1114 fprintf(stderr,
"error: problem completing processing definition\n");
1120 case IS_CONVERSION_DEFINITION:
1122 if (conversion_ptr->is_parameter) {
1124 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1131 fprintf(stderr,
"error: unknown error processing conversion for parameter %s\n", conversion_ptr->name);
1136 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1143 fprintf(stderr,
"error: unknown error processing conversion for column %s\n", conversion_ptr->name);
1148 case IS_SYSTEM_DEFINITION:
1150 if (system_ptr->is_parameter) {
1160 case IS_FORMAT_DEFINITION:
1162 if (strcmp(format_ptr->source, format_ptr->target)) {
1163 if (format_ptr->is_parameter) {
1169 fprintf(stderr,
"Problem setting up to format %s from %s\n", format_ptr->target, format_ptr->source);
1175 case IS_EVALUATE_DEFINITION:
1179 fprintf(stderr,
"Can't define new -evaluate %s %s--already exists (sddsprocess)\n", evaluate_ptr->is_parameter ?
"parameter" :
"column", evaluate_ptr->name);
1183 fprintf(stderr,
"Can't evaluate %s %s--doesn't exist (sddsprocess)\n", evaluate_ptr->is_parameter ?
"parameter" :
"column", evaluate_ptr->source);
1187 fprintf(stderr,
"Can't evaluate %s %s--not string type (sddsprocess)\n", evaluate_ptr->is_parameter ?
"parameter" :
"column", evaluate_ptr->source);
1191 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors);
1195 case IS_FILTER_DEFINITION:
1196 case IS_MATCH_DEFINITION:
1197 case IS_RPNTEST_DEFINITION:
1198 case IS_RPNEXPRESSION_DEFINITION:
1199 case IS_CLIP_DEFINITION:
1200 case IS_FCLIP_DEFINITION:
1201 case IS_SPARSE_DEFINITION:
1202 case IS_SAMPLE_DEFINITION:
1203 case IS_NUMBERTEST_DEFINITION:
1204 case IS_TIME_FILTER_DEFINITION:
1206 case IS_CAST_DEFINITION:
1207 if (!complete_cast_definition(&SDDS_output, (
CAST_DEFINITION *)definition[i].structure, &SDDS_input)) {
1213 fprintf(stderr,
"error: unknown definition type code %ld seen--this shouldn't happen!\n", definition[i].type);
1230 for (i = 0; i < definitions; i++) {
1231 switch (definition[i].type) {
1232 case IS_EQUATION_DEFINITION:
1234 fprintf(stderr,
"%s %s created from equation %s:\n %s\n", equation_ptr->is_parameter ?
"parameter" :
"column", equation_ptr->name, equation_ptr->equation, equation_ptr->text);
1236 case IS_EVALUATE_DEFINITION:
1238 fprintf(stderr,
"evaluating to %s %s from %s\n", evaluate_ptr->is_parameter ?
"parameter" :
"column", evaluate_ptr->name, evaluate_ptr->source);
1240 case IS_EDIT_DEFINITION:
1242 fprintf(stderr,
"%s %s edit from %s using %s:\n %s\n", edit_ptr->is_parameter ?
"parameter" :
"column", edit_ptr->new_name, edit_ptr->source, edit_ptr->edit_command, edit_ptr->text);
1244 case IS_SCAN_DEFINITION:
1246 fprintf(stderr,
"%s %s scanned from %s using %s:\n %s\n", scan_ptr->is_parameter ?
"parameter" :
"column", scan_ptr->new_name, scan_ptr->source, scan_ptr->sscanf_string, scan_ptr->text);
1248 case IS_PRINT_DEFINITION:
1250 fprintf(stderr,
"printing to %s %s from ", print_ptr->is_parameter ?
"parameter" :
"column", print_ptr->new_name);
1251 for (j = 0; j < print_ptr->sources; j++)
1252 fprintf(stderr,
"%s ", print_ptr->source[j]);
1253 fprintf(stderr,
":\n %s\n", print_ptr->text);
1255 case IS_PROCESSING_DEFINITION:
1257 fprintf(stderr,
"column %s will be processed to give %s in parameter %s\n", processing_ptr->column_name, processing_ptr->description, processing_ptr->parameter_name);
1259 case IS_CONVERSION_DEFINITION:
1261 fprintf(stderr,
"%s %s will be converted to %s using factor %e\n", conversion_ptr->is_parameter ?
"parameter" :
"column", conversion_ptr->name, conversion_ptr->new_units, conversion_ptr->factor);
1263 case IS_FILTER_DEFINITION:
1265 show_filters(filter_ptr->is_parameter ?
"parameter" :
"column", filter_ptr->filter_term, filter_ptr->filter_terms);
1267 case IS_TIME_FILTER_DEFINITION:
1269 fprintf(stderr,
"Time filter: <%s> %22.15e, %22.15e\n", time_filter_ptr->name, time_filter_ptr->before, time_filter_ptr->after);
1270 case IS_MATCH_DEFINITION:
1272 show_matches(match_ptr->is_parameter ?
"parameter" :
"column", match_ptr->match_term, match_ptr->match_terms);
1274 case IS_RPNTEST_DEFINITION:
1276 if (rpntest_ptr->autostop)
1277 fprintf(stderr,
"%s-based autostop rpn test:\n %s\n", rpntest_ptr->is_parameter ?
"parameter" :
"column", rpntest_ptr->expression);
1279 fprintf(stderr,
"%s-based rpn test:\n %s\n", rpntest_ptr->is_parameter ?
"parameter" :
"column", rpntest_ptr->expression);
1281 case IS_NUMBERTEST_DEFINITION:
1283 fprintf(stderr,
"%s-based number test:\n %s %s%s\n", numbertest_ptr->is_parameter ?
"parameter" :
"column", numbertest_ptr->name, numbertest_ptr->flags & NUMSCANFILTER_INVERT ?
" inverted" :
"", numbertest_ptr->flags & NUMSCANFILTER_STRICT ?
" strict" :
"");
1285 case IS_RPNEXPRESSION_DEFINITION:
1287 fprintf(stderr,
"%srepeated rpn expression:\n %s\n", (rpnexpression_ptr->repeat ?
"" :
"un"), rpnexpression_ptr->expression);
1289 case IS_SYSTEM_DEFINITION:
1291 fprintf(stderr,
"%s %s system-call from %s:\n %s\n", system_ptr->is_parameter ?
"parameter" :
"column", system_ptr->new_name, system_ptr->source, system_ptr->text);
1293 case IS_FORMAT_DEFINITION:
1295 fprintf(stderr,
"formating %s %s from %s using ", format_ptr->is_parameter ?
"parameter" :
"column", format_ptr->target, format_ptr->source);
1296 fprintf(stderr,
"string: %s double: %s long: %s\n", format_ptr->stringFormat ? format_ptr->stringFormat :
"<none>", format_ptr->doubleFormat ? format_ptr->doubleFormat :
"<none>", format_ptr->longFormat ? format_ptr->longFormat :
"<none>");
1298 case IS_CLIP_DEFINITION:
1300 fprintf(stderr,
"page clip operation:\n head = %" PRId64
" tail = %" PRId64
" invert = %hd\n", clip_ptr->head, clip_ptr->tail, clip_ptr->invert);
1302 case IS_FCLIP_DEFINITION:
1304 fprintf(stderr,
"page clip operation:\n head = %f tail = %f invert = %hd\n", fclip_ptr->fhead, fclip_ptr->ftail, fclip_ptr->invert);
1306 case IS_SPARSE_DEFINITION:
1308 fprintf(stderr,
"page sparse operation:\n interval = %" PRId64
" offset = %" PRId64
"\n", sparse_ptr->interval, sparse_ptr->offset);
1310 case IS_SAMPLE_DEFINITION:
1312 fprintf(stderr,
"page sample operation:\n fraction = %.8g\n", sample_ptr->fraction);
1314 case IS_CAST_DEFINITION:
1316 fprintf(stderr,
"%s %s cast from %s to type %s\n", cast_ptr->isParameter ?
"parameter" :
"column", cast_ptr->newName, cast_ptr->source, cast_ptr->newTypeName);
1319 fprintf(stderr,
"error: unknown definition type code %ld seen--this shouldn't happen!\n", definition[i].type);
1337 fprintf(stderr,
"warning: no rows selected for page %" PRId32
"\n", SDDS_output.page_number);
1341 SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
1344 fprintf(stderr,
"page number %ld read in, with %" PRId64
" rows of data\n", page_number, n_rows);
1345 for (i = 0; i < original_parameters; i++) {
1346 SDDS_PrintTypedValue(SDDS_output.parameter[i], 0, SDDS_output.layout.parameter_definition[i].type, NULL, stderr, 0);
1347 fputc(
'\n', stderr);
1350 rpn_store((
double)page_number, NULL, table_number_memory);
1351 rpn_store((
double)page_number, NULL, i_page_memory);
1352 row_deletion = skip_page = 0;
1354 while (++i < definitions && !skip_page) {
1355 rpn_store((
double)n_rows, NULL, n_rows_memory);
1356 switch (definition[i].type) {
1357 case IS_CONVERSION_DEFINITION:
1359 if (conversion_ptr->is_parameter) {
1369 fprintf(stderr,
"conversion done: %s %s from %s to %s using factor %e\n", conversion_ptr->is_parameter ?
"parameter" :
"column", conversion_ptr->name, conversion_ptr->old_units, conversion_ptr->new_units, conversion_ptr->factor);
1371 case IS_PROCESSING_DEFINITION:
1374 if (!process_column(&SDDS_output, processing_ptr, &result, &stringResult, !nowarnings, threads))
1377 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, processing_ptr->parameter_name, result, NULL)) {
1381 rpn_store(result, NULL, processing_ptr->memory_number);
1383 fprintf(stderr,
"processing result: %s = %e\n", processing_ptr->parameter_name, result);
1385 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, processing_ptr->parameter_name, stringResult, NULL)) {
1390 fprintf(stderr,
"processing result: %s = %s\n", processing_ptr->parameter_name, stringResult);
1394 if (!(stringResult = process_string_column(&SDDS_output, processing_ptr, !nowarnings)) ||
1395 !
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, processing_ptr->parameter_name, stringResult, NULL)) {
1402 case IS_EDIT_DEFINITION:
1404 if (edit_ptr->is_parameter) {
1405 if (!edit_parameter_value(&SDDS_output, edit_ptr->new_name, edit_ptr->source, edit_ptr->edit_command)) {
1406 fprintf(stderr,
"couldn't edit %s to make %s\n", edit_ptr->source, edit_ptr->new_name);
1409 }
else if (n_rows && !edit_column_value(&SDDS_output, edit_ptr->new_name, edit_ptr->source, edit_ptr->edit_command)) {
1410 fprintf(stderr,
"couldn't edit %s to make %s\n", edit_ptr->source, edit_ptr->new_name);
1414 fprintf(stderr,
"edited %s %s to produce %s, using edit-command %s\n", edit_ptr->is_parameter ?
"parameter" :
"column", edit_ptr->source, edit_ptr->new_name, edit_ptr->edit_command);
1416 case IS_SCAN_DEFINITION:
1418 if (scan_ptr->is_parameter) {
1419 if (!scan_parameter_value(&SDDS_output, scan_ptr->new_name, scan_ptr->source, scan_ptr->sscanf_string, scan_ptr->edit)) {
1420 fprintf(stderr,
"couldn't scan %s to make %s\n", scan_ptr->source, scan_ptr->new_name);
1423 }
else if (n_rows && !scan_column_value(&SDDS_output, scan_ptr->new_name, scan_ptr->source, scan_ptr->sscanf_string, scan_ptr->edit)) {
1424 fprintf(stderr,
"couldn't scan %s to make %s\n", scan_ptr->source, scan_ptr->new_name);
1428 fprintf(stderr,
"scanned %s %s to produce %s, using sscanf string %s\n", scan_ptr->is_parameter ?
"parameter" :
"column", scan_ptr->source, scan_ptr->new_name, scan_ptr->sscanf_string);
1430 case IS_PRINT_DEFINITION:
1432 if (print_ptr->is_parameter) {
1433 if (!print_parameter_value(&SDDS_output, print_ptr->new_name, print_ptr->source, print_ptr->sources, print_ptr->printf_string)) {
1434 fprintf(stderr,
"couldn't print to make parameter %s\n", print_ptr->new_name);
1437 }
else if (n_rows && !print_column_value(&SDDS_output, print_ptr->new_name, print_ptr->source, print_ptr->sources, print_ptr->printf_string)) {
1438 fprintf(stderr,
"couldn't print to make column %s\n", print_ptr->new_name);
1442 case IS_EQUATION_DEFINITION:
1444 if (equation_ptr->is_parameter) {
1445 if (!SDDS_ComputeParameter(&SDDS_output,
SDDS_GetParameterIndex(&SDDS_output, equation_ptr->name), equation_ptr->udf_name)) {
1449 }
else if (n_rows) {
1451 while (i < definitions && definition[i].type == IS_EQUATION_DEFINITION) {
1453 if (equation_ptr->is_parameter)
1458 if (!SDDS_ComputeSetOfColumns(&SDDS_output, k, i, definition)) {
1465 fprintf(stderr,
"computed %s %s using expression %s\n", equation_ptr->is_parameter ?
"parameter" :
"column", equation_ptr->name, equation_ptr->equation);
1467 case IS_EVALUATE_DEFINITION:
1469 if (evaluate_ptr->is_parameter) {
1470 if (!SDDS_EvaluateParameter(&SDDS_output, evaluate_ptr)) {
1474 }
else if (n_rows) {
1475 if (!SDDS_EvaluateColumn(&SDDS_output, evaluate_ptr)) {
1481 fprintf(stderr,
"computed %s %s using expressions from %s\n", evaluate_ptr->is_parameter ?
"parameter" :
"column", evaluate_ptr->name, evaluate_ptr->source);
1483 case IS_FORMAT_DEFINITION:
1485 if (format_ptr->is_parameter) {
1486 if (!format_parameter_value(&SDDS_output, format_ptr)) {
1487 fprintf(stderr,
"couldn't format parameter %s\n", format_ptr->target);
1490 }
else if (n_rows && !format_column_value(&SDDS_output, format_ptr)) {
1491 fprintf(stderr,
"couldn't format column %s\n", format_ptr->target);
1495 fprintf(stderr,
"formatted %s %s\n", format_ptr->is_parameter ?
"parameter" :
"column", format_ptr->target);
1497 case IS_TIME_FILTER_DEFINITION:
1499 if (time_filter_ptr->is_parameter) {
1502 fprintf(stderr,
"error: unknown or non-numeric parameter %s given for time filter\n", time_filter_ptr->name);
1509 if (time_filter_ptr->flags & TIMEFILTER_INVERT_GIVEN)
1510 skip_page = !skip_page;
1513 fputs(
" * page outside parameter filter--continuing to next page", stderr);
1516 }
else if (n_rows) {
1519 fprintf(stderr,
" * applying time filter (column %s)", time_filter_ptr->name);
1522 if ((nleft =
SDDS_FilterRowsOfInterest(&SDDS_output, time_filter_ptr->name, time_filter_ptr->after, time_filter_ptr->before, time_filter_ptr->flags & TIMEFILTER_INVERT_GIVEN ? SDDS_NEGATE_EXPRESSION : SDDS_AND)) < 0) {
1527 fprintf(stderr,
"---%" PRId64
" rows left\n", nleft);
1533 case IS_FILTER_DEFINITION:
1535 filter_term = filter_ptr->filter_term;
1536 for (j = 0; j < filter_ptr->filter_terms; j++) {
1537 if (filter_term[j].lowerPar && !
SDDS_GetParameterAsDouble(&SDDS_input, filter_term[j].lowerPar, &(filter_term[j].lower))) {
1538 fprintf(stderr,
"Error: unable to get parameter %s value for the lower filter from input file.\n", filter_term[j].lowerPar);
1542 if (filter_term[j].upperPar && !
SDDS_GetParameterAsDouble(&SDDS_input, filter_term[j].upperPar, &(filter_term[j].upper))) {
1543 fprintf(stderr,
"Error: unable to get parameter %s value for the upper filter from input file.\n", filter_term[j].upperPar);
1547 if (filter_term[j].upper < filter_term[j].lower) {
1548 fprintf(stderr,
"Error: invalid %s filter provided.\n", filter_term[j].name);
1552 if (filter_ptr->is_parameter) {
1554 filter_term = filter_ptr->filter_term;
1555 for (j = 0; j < filter_ptr->filter_terms; j++) {
1558 fprintf(stderr,
"error: unknown or non-numeric parameter %s given for filter\n", filter_term[j].name);
1565 fputs(
" * page failed parameter matching--continuing to next page", stderr);
1569 }
else if (n_rows) {
1571 filter_term = filter_ptr->filter_term;
1572 for (j = 0; j < filter_ptr->filter_terms; j++) {
1574 fprintf(stderr,
" * applying filter term %" PRId64
" (column %s)", j, filter_term[j].name);
1577 if ((nleft =
SDDS_FilterRowsOfInterest(&SDDS_output, filter_term[j].name, filter_term[j].lower, filter_term[j].upper, filter_term[j].logic)) < 0) {
1582 fprintf(stderr,
"---%" PRId64
" rows left\n", nleft);
1589 fprintf(stderr,
"applied %s filter\n", filter_ptr->is_parameter ?
"parameter" :
"column");
1591 case IS_MATCH_DEFINITION:
1593 if (match_ptr->is_parameter) {
1595 match_term = match_ptr->match_term;
1596 for (j = 0; j < match_ptr->match_terms; j++) {
1599 fprintf(stderr,
"error: unknown or numeric parameter %s given for match\n", match_term[j].name);
1609 sprintf(s,
"%c", *pc);
1611 accept =
SDDS_Logic(accept, (match_term[j].logic & SDDS_NOCASE_COMPARE ?
wild_match_ci(s, match_term[j].
string) :
wild_match(s, match_term[j].
string)), match_term[j].logic);
1615 fputs(
" * page failed parameter matching--continuing to next page", stderr);
1619 }
else if (n_rows) {
1620 match_term = match_ptr->match_term;
1621 for (j = 0; j < match_ptr->match_terms; j++)
1629 fprintf(stderr,
"applied %s match\n", match_ptr->is_parameter ?
"parameter" :
"column");
1631 case IS_RPNTEST_DEFINITION:
1633 SDDS_StoreParametersInRpnMemories(&SDDS_output);
1634 if (rpntest_ptr->is_parameter) {
1636 rpn(rpntest_ptr->expression);
1637 if (rpn_check_error())
1639 if (!pop_log(&test_result))
1640 SDDS_Bomb(
"aborted due to rpn logical stack/result error for parameter-based test");
1643 if (!rpntest_ptr->autostop) {
1645 fputs(
" * page failed rpn test--continuing to next page", stderr);
1650 fputs(
" * page failed rpn test--ignore remainder of file", stderr);
1654 }
else if (n_rows) {
1655 if (!SDDS_FilterRowsWithRpnTest(&SDDS_output, rpntest_ptr->expression)) {
1662 fprintf(stderr,
"applied %s-based rpn test:\n %s\n", rpntest_ptr->is_parameter ?
"parameter" :
"column", rpntest_ptr->expression);
1664 case IS_NUMBERTEST_DEFINITION:
1666 if (numbertest_ptr->is_parameter) {
1667 skip_page = !ParameterScansAsNumber(&SDDS_output, numbertest_ptr->name, numbertest_ptr->flags & NUMSCANFILTER_INVERT);
1668 }
else if (n_rows) {
1676 fprintf(stderr,
"applied %s-based %s%snumber test\n", numbertest_ptr->is_parameter ?
"parameter" :
"column", numbertest_ptr->flags & NUMSCANFILTER_INVERT ?
" inverted " :
"", numbertest_ptr->flags & NUMSCANFILTER_STRICT ?
" strict " :
"");
1678 case IS_SYSTEM_DEFINITION:
1680 if (system_ptr->is_parameter) {
1681 if (!system_parameter_value(&SDDS_output, system_ptr->new_name, system_ptr->source)) {
1682 fprintf(stderr,
"couldn't system %s to make %s\n", system_ptr->source, system_ptr->new_name);
1686 }
else if (n_rows && !system_column_value(&SDDS_output, system_ptr->new_name, system_ptr->source)) {
1687 fprintf(stderr,
"couldn't system %s to make %s\n", system_ptr->source, system_ptr->new_name);
1692 fprintf(stderr,
"systemed %s %s to produce %s\n", system_ptr->is_parameter ?
"parameter" :
"column", system_ptr->source, system_ptr->new_name);
1694 case IS_RPNEXPRESSION_DEFINITION:
1696 if (rpnexpression_ptr->repeat == -1)
1698 SDDS_StoreParametersInRpnMemories(&SDDS_output);
1699 SDDS_StoreColumnsInRpnArrays(&SDDS_output);
1700 rpn(rpnexpression_ptr->expression);
1701 if (rpn_check_error())
1705 fprintf(stderr,
"executed rpn expression:\n %s\n", rpnexpression_ptr->expression);
1706 if (!rpnexpression_ptr->repeat)
1707 rpnexpression_ptr->repeat = -1;
1709 case IS_CLIP_DEFINITION:
1714 !
SDDS_AssertRowFlags(&SDDS_output, SDDS_INDEX_LIMITS, (int64_t)0, (int64_t)(clip_ptr->head - 1), clip_ptr->invert ? 1 : 0)) ||
1715 (n_rows >= clip_ptr->tail && clip_ptr->tail && !
SDDS_AssertRowFlags(&SDDS_output, SDDS_INDEX_LIMITS, (int64_t)(n_rows - clip_ptr->tail), (int64_t)(n_rows - 1), clip_ptr->invert ? 1 : 0))) {
1722 case IS_FCLIP_DEFINITION:
1725 fclip_ptr->head = fclip_ptr->fhead * n_rows;
1726 fclip_ptr->tail = fclip_ptr->ftail * n_rows;
1729 !
SDDS_AssertRowFlags(&SDDS_output, SDDS_INDEX_LIMITS, (int64_t)0, (int64_t)(fclip_ptr->head - 1), fclip_ptr->invert ? 1 : 0)) ||
1730 (n_rows >= fclip_ptr->tail && fclip_ptr->tail && !
SDDS_AssertRowFlags(&SDDS_output, SDDS_INDEX_LIMITS, (int64_t)(n_rows - fclip_ptr->tail), (int64_t)(n_rows - 1), fclip_ptr->invert ? 1 : 0))) {
1737 case IS_SPARSE_DEFINITION:
1739 int32_t *sparse_row_flag;
1741 sparse_row_flag =
tmalloc(
sizeof(*sparse_row_flag) * n_rows);
1742 for (j = 0; j < n_rows; j++)
1743 sparse_row_flag[j] = 0;
1744 for (j = sparse_ptr->offset; j < n_rows; j += sparse_ptr->interval)
1745 sparse_row_flag[j] = 1;
1750 free(sparse_row_flag);
1754 case IS_SAMPLE_DEFINITION:
1756 int32_t *sample_row_flag;
1758 sample_row_flag =
tmalloc(
sizeof(*sample_row_flag) * n_rows);
1759 for (j = 0; j < n_rows; j++)
1760 sample_row_flag[j] =
random_1(1) < sample_ptr->fraction ? 1 : 0;
1765 free(sample_row_flag);
1769 case IS_CAST_DEFINITION:
1771 if (cast_ptr->isParameter) {
1772 if (!cast_parameter_value(&SDDS_output, cast_ptr))
1774 }
else if (n_rows && !cast_column_value(&SDDS_output, cast_ptr)) {
1779 fprintf(stderr,
"error: unknown definition type code %ld seen--this shouldn't happen!\n", definition[i].type);
1783 if (n_rows && row_deletion) {
1791 fprintf(stderr,
"warning: no rows selected for page %" PRId32
"\n", SDDS_output.page_number);
1797 fprintf(stderr,
" %" PRId64
" rows left\n", n_rows);
1803 fprintf(stderr,
" %" PRId64
" rows selected for output\n", n_rows);
1810 if (page_number == 0) {
1811 fprintf(stderr,
"Error: problem reading input file\n");
1825 if (processing_definition)
1826 free_processing_definiton(processing_definition, processing_definitions);
1827 if (equation_definition)
1828 free_equation_definition(equation_definition, equation_definitions);
1830 return EXIT_SUCCESS;
1835 for (i = 0; i < n; i++) {
1836 if (processing_definition[i]->parameter_name)
1837 free(processing_definition[i]->parameter_name);
1838 if (processing_definition[i]->column_name)
1839 free(processing_definition[i]->column_name);
1840 if (processing_definition[i]->description)
1841 free(processing_definition[i]->description);
1842 if (processing_definition[i]->symbol)
1843 free(processing_definition[i]->symbol);
1844 if (processing_definition[i]->functionOf)
1845 free(processing_definition[i]->functionOf);
1846 if (processing_definition[i]->weightBy)
1847 free(processing_definition[i]->weightBy);
1848 if (processing_definition[i]->match_value)
1849 free(processing_definition[i]->match_value);
1850 if (processing_definition[i]->match_column)
1851 free(processing_definition[i]->match_column);
1852 free(processing_definition[i]);
1854 if (processing_definition)
1855 free(processing_definition);
1860 for (i = 0; i < n; i++) {
1861 if (equation_definition[i]->text)
1862 free(equation_definition[i]->text);
1863 if (equation_definition[i]->name)
1864 free(equation_definition[i]->name);
1865 if (equation_definition[i]->equation)
1866 free(equation_definition[i]->equation);
1867 if (equation_definition[i]->udf_name && equation_definition[i]->udf_name != equation_definition[i]->equation)
1868 free(equation_definition[i]->udf_name);
1869 if (equation_definition[i]->editSelection)
1870 free(equation_definition[i]->editSelection);
1871 if (equation_definition[i]->select)
1872 free(equation_definition[i]->select);
1873 if (equation_definition[i]->argv) {
1874 for (j = 0; j < equation_definition[i]->argc; j++)
1875 free(equation_definition[i]->argv[j]);
1876 free(equation_definition[i]->argv);
1878 free(equation_definition[i]);
1880 if (equation_definition)
1881 free(equation_definition);
1890long SDDS_ComputeSetOfColumns(
SDDS_DATASET *SDDS_dataset,
long equ_begin,
long equ_end,
DEFINITION *definition) {
1895 long equations_present;
1897 long column_list_ptr, max_column_list_counter;
1901 column_list_ptr = -1;
1902 max_column_list_counter = 0;
1905 layout = &SDDS_dataset->layout;
1907 column_list_ptr = -1;
1908 max_column_list_counter = 0;
1909 for (equations_present = equ_begin; equations_present < equ_end; equations_present++) {
1912 if (++column_list_ptr >= max_column_list_counter || !column_list)
1913 column_list =
trealloc(column_list,
sizeof(*column_list) * (max_column_list_counter += 4));
1914 column_list[column_list_ptr].column =
SDDS_GetColumnIndex(SDDS_dataset, equation_ptr->name);
1915 if (equation_ptr->equation[0] ==
'@') {
1916 char **equation, *ptr, pfix[IFPF_BUF_SIZE];
1917 if (equation_ptr->equation[1] ==
'@') {
1919 if (!(equation =
SDDS_GetParameter(SDDS_dataset, equation_ptr->equation + 2, NULL)))
1920 SDDS_Bomb(
"unable to read parameter for equation definition");
1921 ptr = addOuterParentheses(*equation);
1922 if2pf(pfix, ptr,
sizeof pfix);
1925 fprintf(stderr,
"error: problem copying argument string\n");
1929 if (!(equation =
SDDS_GetParameter(SDDS_dataset, equation_ptr->equation + 1, NULL)))
1930 SDDS_Bomb(
"unable to read parameter for equation definition");
1933 create_udf(equation_ptr->udf_name, *equation);
1936 cp_str(&column_list[column_list_ptr].equation, equation_ptr->udf_name);
1937 if (column_list[column_list_ptr].column < 0 || column_list[column_list_ptr].column >= layout->n_columns)
1941 if (!SDDS_StoreParametersInRpnMemories(SDDS_dataset))
1943 if (!SDDS_StoreColumnsInRpnArrays(SDDS_dataset))
1946 if (table_number_mem == -1) {
1947 table_number_mem = rpn_create_mem(
"table_number", 0);
1948 i_page_mem = rpn_create_mem(
"i_page", 0);
1949 n_rows_mem = rpn_create_mem(
"n_rows", 0);
1950 i_row_mem = rpn_create_mem(
"i_row", 0);
1953 rpn_store((
double)SDDS_dataset->page_number, NULL, table_number_mem);
1954 rpn_store((
double)SDDS_dataset->page_number, NULL, i_page_mem);
1955 rpn_store((
double)SDDS_dataset->n_rows, NULL, n_rows_mem);
1957 for (j = 0; j < SDDS_dataset->n_rows; j++) {
1959 fprintf(stderr,
"Working on row %ld\n", j);
1961 if (!SDDS_StoreRowInRpnMemories(SDDS_dataset, j))
1963 column_list_ptr = 0;
1964 for (equations_present = equ_begin; equations_present < equ_end; equations_present++, column_list_ptr++) {
1965 column = column_list[column_list_ptr].column;
1967 rpn_store((
double)j, NULL, i_row_mem);
1968 value = rpn(column_list[column_list_ptr].equation);
1969 rpn_store(value, NULL, layout->column_definition[column].memory_number);
1970 if (rpn_check_error()) {
1971 SDDS_SetError(
"Unable to compute rpn expression--rpn error (SDDS_ComputeDefinedColumn)");
1975 fprintf(stderr,
"computed row value: %s = %e\n", layout->column_definition[column].name, value);
1977 switch (layout->column_definition[column].type) {
1979 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
char)value, -1);
1982 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
short)value, -1);
1985 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
unsigned short)value, -1);
1988 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (int32_t)value, -1);
1991 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (uint32_t)value, -1);
1994 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (int64_t)value, -1);
1997 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (uint64_t)value, -1);
2000 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
float)value, -1);
2003 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
double)value, -1);
2006 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
long double)value, -1);
2023 if (!SDDS_StoreParametersInRpnMemories(SDDS_dataset))
2025 if (!SDDS_StoreColumnsInRpnArrays(SDDS_dataset))
2028 if (table_number_mem == -1) {
2029 table_number_mem = rpn_create_mem(
"table_number", 0);
2030 i_page_mem = rpn_create_mem(
"i_page", 0);
2031 n_rows_mem = rpn_create_mem(
"n_rows", 0);
2032 i_row_mem = rpn_create_mem(
"i_row", 0);
2035 rpn_store((
double)SDDS_dataset->page_number, NULL, table_number_mem);
2036 rpn_store((
double)SDDS_dataset->page_number, NULL, i_page_mem);
2037 rpn_store((
double)SDDS_dataset->n_rows, NULL, n_rows_mem);
2039 if (!(equation = (
char **)
SDDS_GetColumn(SDDS_dataset, definition->source)))
2044 for (j = 0; j < SDDS_dataset->n_rows; j++) {
2045 if (!SDDS_StoreRowInRpnMemories(SDDS_dataset, j))
2048 rpn_store((
double)j, NULL, i_row_mem);
2049 value = rpn(equation[j]);
2050 if (rpn_check_error()) {
2051 SDDS_SetError(
"Unable to compute rpn expression--rpn error (SDDS_EvaluateColumn)");
2056 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
char)value, -1);
2059 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
short)value, -1);
2062 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
unsigned short)value, -1);
2065 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (int32_t)value, -1);
2068 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (uint32_t)value, -1);
2071 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (int64_t)value, -1);
2074 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (uint64_t)value, -1);
2077 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
float)value, -1);
2080 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
double)value, -1);
2083 SDDS_SetRowValues(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, j, column, (
long double)value, -1);
2096 if (!SDDS_StoreParametersInRpnMemories(SDDS_dataset))
2099 if (table_number_mem == -1) {
2100 table_number_mem = rpn_create_mem(
"table_number", 0);
2101 i_page_mem = rpn_create_mem(
"i_page", 0);
2102 n_rows_mem = rpn_create_mem(
"n_rows", 0);
2103 i_row_mem = rpn_create_mem(
"i_row", 0);
2106 rpn_store((
double)SDDS_dataset->page_number, NULL, table_number_mem);
2107 rpn_store((
double)SDDS_dataset->page_number, NULL, i_page_mem);
2108 rpn_store((
double)SDDS_dataset->n_rows, NULL, n_rows_mem);
2110 if (!(equation = (
char **)
SDDS_GetParameter(SDDS_dataset, definition->source, NULL)))
2114 value = rpn(*equation);
2115 fprintf(stderr,
"value = %e\n", value);
2117 if (rpn_check_error()) {
2118 SDDS_SetError(
"Unable to compute rpn expression--rpn error (SDDS_EvaluateParameter)");
2123 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
char)value, -1);
2126 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
short)value, -1);
2129 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
unsigned short)value, -1);
2132 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (int32_t)value, -1);
2135 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (uint32_t)value, -1);
2138 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (int64_t)value, -1);
2141 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (uint64_t)value, -1);
2144 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
float)value, -1);
2147 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
double)value, -1);
2150 SDDS_SetParameters(SDDS_dataset, SDDS_SET_BY_INDEX | SDDS_PASS_BY_VALUE, parameter, (
long double)value, -1);
2157char **process_name_options(
char **orig_name,
long **orig_flag,
long orig_names,
char **
delete,
long deletes,
char **retain,
2158 long retains, STRING_PAIR *rename,
long renames,
EDIT_NAME_REQUEST *edit_request,
long edit_requests) {
2163 *orig_flag =
tmalloc(
sizeof(**orig_flag) * orig_names);
2164 for (i = 0; i < orig_names; i++)
2165 (*orig_flag)[i] = 1;
2168 for (i = 0; i < deletes; i++) {
2173 for (j = 0; j < orig_names; j++) {
2174 for (i = 0; i < deletes; i++) {
2176 (*orig_flag)[j] = 0;
2184 for (i = 0; i < retains; i++) {
2190 for (j = 0; j < orig_names; j++)
2191 (*orig_flag)[j] = 0;
2192 for (j = 0; j < orig_names; j++) {
2193 if ((*orig_flag)[j])
2195 for (i = 0; i < retains; i++) {
2197 (*orig_flag)[j] = 1;
2204 new_name =
tmalloc(
sizeof(*new_name) * orig_names);
2205 for (j = 0; j < orig_names; j++) {
2206 for (i = 0; i < renames; i++) {
2207 if (strcmp(rename[i][0], orig_name[j]) == 0) {
2214 for (i = 0; i < edit_requests; i++) {
2215 char edit_buffer[256];
2218 edit_request[i].match_string = ptr;
2220 strcpy(edit_buffer, new_name[j]);
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_CopyPage(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_SetRowValues(SDDS_DATASET *SDDS_dataset, int32_t mode, int64_t row,...)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_ChangeParameterInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a parameter definition within the SDDS dataset.
int32_t SDDS_ChangeColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a column definition within the 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_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_ProcessParameterString(SDDS_DATASET *SDDS_dataset, char *string, int32_t mode)
Process a parameter definition string.
int32_t SDDS_ProcessColumnString(SDDS_DATASET *SDDS_dataset, char *string, int32_t mode)
Process a column definition string.
int32_t SDDS_TransferColumnDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a column definition from a source dataset to a target dataset.
int32_t SDDS_TransferArrayDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers an array definition from a source dataset to a target dataset.
int32_t SDDS_TransferParameterDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a parameter definition from a source dataset to a target dataset.
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
int32_t SDDS_GetParameterType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a parameter in the SDDS dataset by its index.
PARAMETER_DEFINITION * SDDS_GetParameterDefinition(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the definition of a specified parameter from the SDDS dataset.
char ** SDDS_GetParameterNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all 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.
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
int32_t SDDS_CheckDataset(SDDS_DATASET *SDDS_dataset, const char *caller)
Validates the SDDS dataset pointer.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
int32_t SDDS_DeleteParameterFixedValues(SDDS_DATASET *SDDS_dataset)
Deletes fixed values from all parameters in the SDDS dataset.
void SDDS_ClearErrors()
Clears all recorded error messages from the SDDS error stack.
int32_t SDDS_ApplyFactorToColumn(SDDS_DATASET *SDDS_dataset, char *name, double factor)
Applies a scaling factor to all elements of a specific column in the SDDS dataset.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_NumberOfErrors()
Retrieves the number of errors recorded by SDDS library routines.
int32_t SDDS_ApplyFactorToParameter(SDDS_DATASET *SDDS_dataset, char *name, double factor)
Applies a scaling factor to a specific parameter in the SDDS dataset.
int32_t SDDS_GetColumnType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a column in the SDDS dataset by its index.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CheckParameter(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a parameter exists in the SDDS dataset with the specified name, units, and type.
char ** SDDS_GetArrayNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all arrays in the SDDS dataset.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
int32_t SDDS_PrintTypedValue(void *data, int64_t index, int32_t type, char *format, FILE *fp, uint32_t mode)
Prints a data value of a specified type using an optional printf format string.
Header file for routines used by SDDS command-line applications.
long edit_string(char *text, char *edit)
Edits the provided text based on the specified edit commands.
#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.
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.
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.
double random_1(long iseed)
Generate a uniform random double in [0,1] using a custom seed initialization.
long fexists(const char *filename)
Checks if a file exists.
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.
int wild_match_ci(char *string, char *template)
Determine whether one string is a case-insensitive wildcard match for another.
char * expand_ranges(char *template)
Expand range specifiers in a wildcard template into explicit character lists.
int wild_match(char *string, char *template)
Determine whether one string is a wildcard match for another.