428 {
430 long i_arg, iconv;
431 SCANNED_ARG *s_arg;
432 char *input, *output;
434 long conversions;
435 unsigned long pipeFlags, majorOrderFlag;
436 short columnMajorOrder = -1;
437
439 argc =
scanargs(&s_arg, argc, argv);
440 if (argc < 3) {
441 fprintf(stderr, "%s", USAGE);
442 exit(EXIT_FAILURE);
443 }
444
445 input = output = NULL;
446 conversions = 0;
447 conversion = NULL;
448 pipeFlags = 0;
449
450 for (i_arg = 1; i_arg < argc; i_arg++) {
451 if (s_arg[i_arg].arg_type == OPTION) {
452 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
453 case SET_MAJOR_ORDER:
454 majorOrderFlag = 0;
455 s_arg[i_arg].n_items--;
456 if (s_arg[i_arg].n_items > 0 &&
457 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
458 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
459 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
460 SDDS_Bomb(
"invalid -majorOrder syntax/values");
461 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
462 columnMajorOrder = 1;
463 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
464 columnMajorOrder = 0;
465 break;
466 case SET_EPOCH:
467 if (s_arg[i_arg].n_items < 4)
469 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
471 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
472 conversion[conversions].epochName = s_arg[i_arg].list[2];
473 s_arg[i_arg].list[2] = s_arg[i_arg].list[1];
474 s_arg[i_arg].n_items -= 2;
476 s_arg[i_arg].list + 2, &s_arg[i_arg].n_items, 0,
477 "column", -1, NULL, 0, IS_COLUMN,
478 "parameter", -1, NULL, 0, IS_PARAMETER,
479 "year",
SDDS_STRING, &conversion[conversions].yearName, 1, YEAR_GIVEN,
480 "julianday",
SDDS_STRING, &conversion[conversions].jDayName, 1, JDAY_GIVEN,
481 "month",
SDDS_STRING, &conversion[conversions].monthName, 1, MONTH_GIVEN,
482 "day",
SDDS_STRING, &conversion[conversions].dayName, 1, DAY_GIVEN,
483 "hour",
SDDS_STRING, &conversion[conversions].hourName, 1, HOUR_GIVEN, NULL))
485 conversion[conversions].flags |= EPOCH_GIVEN | DO_EPOCH;
486 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
487 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -epoch");
488 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
489 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -epoch");
490 if (!(conversion[conversions].flags & YEAR_GIVEN))
491 SDDS_Bomb(
"Specify year name with -epoch");
492 if (!(conversion[conversions].flags & JDAY_GIVEN) &&
493 (conversion[conversions].flags & (MONTH_GIVEN | DAY_GIVEN)) != (MONTH_GIVEN | DAY_GIVEN))
494 SDDS_Bomb(
"Specify either julianDay name, or both month and day names with -epoch");
495 if (conversion[conversions].flags & JDAY_GIVEN && conversion[conversions].flags & (MONTH_GIVEN | DAY_GIVEN))
496 SDDS_Bomb(
"Invalid combination of julianDay name with month or day name for -epoch");
497 conversions++;
498 break;
499 case SET_BREAKDOWN:
500 if (s_arg[i_arg].n_items < 4)
502 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
504 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
505 conversion[conversions].epochName = s_arg[i_arg].list[2];
506 s_arg[i_arg].list[2] = s_arg[i_arg].list[1];
507 s_arg[i_arg].n_items -= 2;
509 s_arg[i_arg].list + 2, &s_arg[i_arg].n_items, 0,
510 "column", -1, NULL, 0, IS_COLUMN,
511 "parameter", -1, NULL, 0, IS_PARAMETER,
512 "year",
SDDS_STRING, &conversion[conversions].yearName, 1, YEAR_GIVEN,
513 "julianday",
SDDS_STRING, &conversion[conversions].jDayName, 1, JDAY_GIVEN,
514 "month",
SDDS_STRING, &conversion[conversions].monthName, 1, MONTH_GIVEN,
515 "day",
SDDS_STRING, &conversion[conversions].dayName, 1, DAY_GIVEN,
516 "hour",
SDDS_STRING, &conversion[conversions].hourName, 1, HOUR_GIVEN,
517 "text",
SDDS_STRING, &conversion[conversions].textName, 1, TEXT_GIVEN, NULL))
519 conversion[conversions].flags |= EPOCH_GIVEN | DO_BREAKDOWN;
520 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
521 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -breakdown");
522 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
523 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -breakdown");
524 if (!(conversion[conversions].flags & (YEAR_GIVEN | JDAY_GIVEN | MONTH_GIVEN | DAY_GIVEN | HOUR_GIVEN | TEXT_GIVEN)))
525 SDDS_Bomb(
"Specify at least one of year, julianDay, month, day, hour, or text qualifiers with -breakdown");
526 conversions++;
527 break;
528 case SET_DATE:
529 if (s_arg[i_arg].n_items < 4)
531 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
533 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
534 conversion[conversions].textName = s_arg[i_arg].list[3];
535 conversion[conversions].epochName = s_arg[i_arg].list[2];
536 s_arg[i_arg].list[3] = s_arg[i_arg].list[1];
537 s_arg[i_arg].n_items -= 3;
539 s_arg[i_arg].list + 3, &s_arg[i_arg].n_items, 0,
540 "column", -1, NULL, 0, IS_COLUMN,
541 "parameter", -1, NULL, 0, IS_PARAMETER,
542 "format",
SDDS_STRING, &conversion[conversions].format, 1, FORMAT_GIVEN, NULL))
544 conversion[conversions].flags |= DO_DATECONVERSION;
545 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
546 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -dateToTime");
547 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
548 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -dateToTime");
549 if (!(conversion[conversions].flags & FORMAT_GIVEN))
550 SDDS_Bomb(
"Format string not provided for date to time conversion");
551 conversions++;
552 break;
553 case SET_PIPE:
554 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
556 break;
557 default:
558 fprintf(stderr, "Error: Unknown option: %s\n", s_arg[i_arg].list[0]);
560 break;
561 }
562 } else {
563 if (!input)
564 input = s_arg[i_arg].list[0];
565 else if (!output)
566 output = s_arg[i_arg].list[0];
567 else {
568 fprintf(stderr, "Error: Argument '%s' is invalid: too many filenames (sddstimeconvert)\n", s_arg[i_arg].list[0]);
569 exit(EXIT_FAILURE);
570 }
571 }
572 }
573
575
578 exit(EXIT_FAILURE);
579 }
580
581 CheckEpochConversionElements(&SDDSin, conversion, conversions);
582 CheckBreakdownConversionElements(&SDDSin, conversion, conversions);
583 CheckDateConversionElements(&SDDSin, conversion, conversions);
584
585 InitializeOutput(&SDDSout, output, conversion, conversions, &SDDSin, columnMajorOrder);
586
590 exit(EXIT_FAILURE);
591 }
592 for (iconv = 0; iconv < conversions; iconv++) {
593 if (conversion[iconv].flags & DO_EPOCH) {
594 if (conversion[iconv].flags & IS_PARAMETER)
595 DoParameterEpochConversion(&SDDSout, &SDDSin, conversion + iconv);
596 else
597 DoColumnEpochConversion(&SDDSout, &SDDSin, conversion + iconv);
598 } else if (conversion[iconv].flags & DO_BREAKDOWN) {
599 if (conversion[iconv].flags & IS_PARAMETER)
600 DoParameterBreakdownConversion(&SDDSout, &SDDSin, conversion + iconv);
601 else
602 DoColumnBreakdownConversion(&SDDSout, &SDDSin, conversion + iconv);
603 } else {
604
605 if (conversion[iconv].flags & IS_PARAMETER)
606 DoParameterDateToTimeConversion(&SDDSout, &SDDSin, conversion + iconv);
607 else
608 DoColumnDateToTimeConversion(&SDDSout, &SDDSin, conversion + iconv);
609 }
610 }
613 exit(EXIT_FAILURE);
614 }
615 }
618 exit(EXIT_FAILURE);
619 }
620
621 return EXIT_SUCCESS;
622}
int32_t SDDS_CopyPage(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
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)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
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.