88 {
89 double *x_data, *y_data, threshold, modulo = 0;
90 char *input = NULL, *output = NULL, **column_match = NULL, **column_name = NULL, **column;
91 long i, i_arg;
92 char output_column[256];
93
95 SCANNED_ARG *scanned;
96 unsigned long pipe_flags = 0, major_order_flag = 0;
97 int32_t column_type, columns0 = 0;
98 int64_t j, k, rows;
99 int32_t columns = 0, column_matches = 0;
100 short column_major_order = -1, phase = 1, threshold_provided = 0;
101
103
104 argc =
scanargs(&scanned, argc, argv);
105 if (argc == 1)
107
108 input = output = NULL;
109 x_data = y_data = NULL;
110 column_name = NULL;
111
112 for (i_arg = 1; i_arg < argc; i_arg++) {
113 if (scanned[i_arg].arg_type == OPTION) {
114
115 OptionType option_type =
116 (OptionType)
match_string(scanned[i_arg].list[0], option,
117 N_OPTIONS, 0);
118 switch (option_type) {
119 case OPTION_MAJOR_ORDER:
120 major_order_flag = 0;
121 scanned[i_arg].n_items--;
122 if (scanned[i_arg].n_items > 0 && (!
scanItemList(&major_order_flag, scanned[i_arg].list + 1,
123 &scanned[i_arg].n_items, 0, "row", -1,
124 NULL, 0, SDDS_ROW_MAJOR_ORDER, "column", -1,
125 NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
126 SDDS_Bomb(
"invalid -majorOrder syntax/values");
127 if (major_order_flag & SDDS_COLUMN_MAJOR_ORDER)
128 column_major_order = 1;
129 else if (major_order_flag & SDDS_ROW_MAJOR_ORDER)
130 column_major_order = 0;
131 break;
132 case OPTION_THRESHOLD:
133 if (scanned[i_arg].n_items != 2)
135 if (!
get_double(&threshold, scanned[i_arg].list[1]))
136 SDDS_Bomb(
"invalid -threshold value given");
137 threshold_provided = 1;
138 break;
139 case OPTION_MODULO:
140 if (scanned[i_arg].n_items != 2)
142 if (!
get_double(&modulo, scanned[i_arg].list[1]))
143 SDDS_Bomb(
"invalid -modulo value given");
144 break;
145 case OPTION_COLUMN:
146 if ((scanned[i_arg].n_items < 2))
148 column_matches = scanned[i_arg].n_items - 1;
149 column_match =
tmalloc(
sizeof(*column_match) * column_matches);
150 for (i = 0; i < column_matches; i++)
151 column_match[i] = scanned[i_arg].list[i + 1];
152 break;
153 case OPTION_PIPE:
155 scanned[i_arg].n_items - 1,
156 &pipe_flags))
158 break;
159 default:
160 fprintf(stderr, "Unknown option %s provided\n",
161 scanned[i_arg].list[0]);
162 exit(1);
163 break;
164 }
165 } else {
166 if (!input)
167 input = scanned[i_arg].list[0];
168 else if (!output)
169 output = scanned[i_arg].list[0];
170 else
172 }
173 }
175 if (phase && !threshold_provided)
176 threshold = PI;
177
178 if (!modulo)
179 modulo = 2 * threshold;
180
183 if (column_matches) {
185 &columns, SDDS_MATCH_COLUMN);
186 } else {
187 column =
tmalloc(
sizeof(*column) * 1);
190 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
191 for (i = 0; i < columns0; i++) {
195 break;
196 }
197 }
199 columns = 1;
200 }
201
204 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
205 if (column_major_order != -1)
206 sdds_out.layout.data_mode.column_major = column_major_order;
207 else
208 sdds_out.layout.data_mode.column_major = sdds_in.layout.data_mode.column_major;
209
210 for (i = 0; i < columns; i++) {
211 sprintf(output_column, "Unwrap%s", column[i]);
213 output_column))
215 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
216 }
219
222 continue;
225 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
226
227 y_data =
tmalloc(
sizeof(*y_data) * rows);
228 for (i = 0; i < columns; i++) {
229 sprintf(output_column, "Unwrap%s", column[i]);
232 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
233 k = 0;
234 for (j = 0; j < rows - 1; j++) {
235 y_data[j] = x_data[j] + modulo * k;
236
237 if (fabs(x_data[j + 1] - x_data[j]) > fabs(threshold)) {
238 if (x_data[j + 1] < x_data[j])
239 k = k + 1;
240 else
241 k = k - 1;
242 }
243 }
244 y_data[rows - 1] = x_data[rows - 1] + modulo * k;
245
246 if (x_data)
247 free(x_data);
248 x_data = NULL;
249
251 rows, output_column))
253 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
254 }
255 free(y_data);
256 y_data = NULL;
259 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
260 }
263 exit(1);
264 }
265 if (column_name) {
267 free(column_name);
268 }
270 free(column);
271 if (column_match)
272 free(column_match);
274 return 0;
275}
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.