49static char *USAGE =
"Usage: sddsunwrap [<input>] [<output>]\n\
51 -pipe=[input][,output] Use pipes for input/output.\n\
52 -column=list Specify columns to be unwrapped, separated by commas.\n\
54 -threshold=<value> Set the discontinuity threshold to identify a wrap.\n\
56 -modulo=<value> Set the value used to unwrap the data.\n\
58 -majorOrder=<row|column> Specify the data order (row-major or column-major).\n\
60 sddsunwrap identifies discontinuities greater than the threshold in a set of data\n\
61 and adds the appropriate multiple of the modulo to the data set.\n\
62Program by Hairong Shang. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")";
64static char *option[N_OPTIONS] = {
72int main(
int argc,
char **argv) {
73 double *x_data, *y_data, threshold, modulo = 0;
74 char *input = NULL, *output = NULL, **column_match = NULL, **column_name = NULL, **column;
76 char output_column[256];
80 unsigned long pipe_flags = 0, major_order_flag = 0;
81 int32_t column_type, columns0 = 0;
83 int32_t columns = 0, column_matches = 0;
84 short column_major_order = -1, phase = 1, threshold_provided = 0;
88 argc =
scanargs(&scanned, argc, argv);
92 input = output = NULL;
93 x_data = y_data = NULL;
96 for (i_arg = 1; i_arg < argc; i_arg++) {
97 if (scanned[i_arg].arg_type == OPTION) {
102 switch (option_type) {
103 case OPTION_MAJOR_ORDER:
104 major_order_flag = 0;
105 scanned[i_arg].n_items--;
106 if (scanned[i_arg].n_items > 0 && (!
scanItemList(&major_order_flag, scanned[i_arg].list + 1,
107 &scanned[i_arg].n_items, 0,
"row", -1,
108 NULL, 0, SDDS_ROW_MAJOR_ORDER,
"column", -1,
109 NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
110 SDDS_Bomb(
"invalid -majorOrder syntax/values");
111 if (major_order_flag & SDDS_COLUMN_MAJOR_ORDER)
112 column_major_order = 1;
113 else if (major_order_flag & SDDS_ROW_MAJOR_ORDER)
114 column_major_order = 0;
116 case OPTION_THRESHOLD:
117 if (scanned[i_arg].n_items != 2)
119 if (!
get_double(&threshold, scanned[i_arg].list[1]))
120 SDDS_Bomb(
"invalid -threshold value given");
121 threshold_provided = 1;
124 if (scanned[i_arg].n_items != 2)
126 if (!
get_double(&modulo, scanned[i_arg].list[1]))
127 SDDS_Bomb(
"invalid -modulo value given");
130 if ((scanned[i_arg].n_items < 2))
132 column_matches = scanned[i_arg].n_items - 1;
133 column_match =
tmalloc(
sizeof(*column_match) * column_matches);
134 for (i = 0; i < column_matches; i++)
135 column_match[i] = scanned[i_arg].list[i + 1];
139 scanned[i_arg].n_items - 1,
144 fprintf(stderr,
"Unknown option %s provided\n",
145 scanned[i_arg].list[0]);
151 input = scanned[i_arg].list[0];
153 output = scanned[i_arg].list[0];
159 if (phase && !threshold_provided)
163 modulo = 2 * threshold;
167 if (column_matches) {
169 &columns, SDDS_MATCH_COLUMN);
171 column =
tmalloc(
sizeof(*column) * 1);
174 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
175 for (i = 0; i < columns0; i++) {
188 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
189 if (column_major_order != -1)
190 sdds_out.layout.data_mode.column_major = column_major_order;
192 sdds_out.layout.data_mode.column_major = sdds_in.layout.data_mode.column_major;
194 for (i = 0; i < columns; i++) {
195 sprintf(output_column,
"Unwrap%s", column[i]);
199 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
209 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
211 y_data =
tmalloc(
sizeof(*y_data) * rows);
212 for (i = 0; i < columns; i++) {
213 sprintf(output_column,
"Unwrap%s", column[i]);
216 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
218 for (j = 0; j < rows - 1; j++) {
219 y_data[j] = x_data[j] + modulo * k;
221 if (fabs(x_data[j + 1] - x_data[j]) > fabs(threshold)) {
222 if (x_data[j + 1] < x_data[j])
228 y_data[rows - 1] = x_data[rows - 1] + modulo * k;
235 rows, output_column))
237 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
243 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_InitializeCopy(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, char *filename, char *filemode)
int32_t SDDS_CopyPage(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetColumnFromDoubles(SDDS_DATASET *SDDS_dataset, int32_t mode, double *data, int64_t rows,...)
Sets the values for a single data column using double-precision floating-point numbers.
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_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_FreeStringArray(char **string, int64_t strings)
Frees an array of strings by deallocating each individual string.
char ** getMatchingSDDSNames(SDDS_DATASET *dataset, char **matchName, int32_t matches, int32_t *names, short type)
Retrieves an array of matching SDDS entity names based on specified criteria.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
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_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_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
#define SDDS_NUMERIC_TYPE(type)
Checks if the given type identifier corresponds to any numeric type.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
int get_double(double *dptr, char *s)
Parses a double value from the given string.
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)
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.
OptionType
Enumeration for command-line options.