72 {
73 double *x_data, *y_data, threshold, modulo = 0;
74 char *input = NULL, *output = NULL, **column_match = NULL, **column_name = NULL, **column;
75 long i, i_arg;
76 char output_column[256];
77
79 SCANNED_ARG *scanned;
80 unsigned long pipe_flags = 0, major_order_flag = 0;
81 int32_t column_type, columns0 = 0;
82 int64_t j, k, rows;
83 int32_t columns = 0, column_matches = 0;
84 short column_major_order = -1, phase = 1, threshold_provided = 0;
85
87
88 argc =
scanargs(&scanned, argc, argv);
89 if (argc == 1)
91
92 input = output = NULL;
93 x_data = y_data = NULL;
94 column_name = NULL;
95
96 for (i_arg = 1; i_arg < argc; i_arg++) {
97 if (scanned[i_arg].arg_type == OPTION) {
98
101 N_OPTIONS, 0);
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;
115 break;
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;
122 break;
123 case OPTION_MODULO:
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");
128 break;
129 case OPTION_COLUMN:
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];
136 break;
137 case OPTION_PIPE:
139 scanned[i_arg].n_items - 1,
140 &pipe_flags))
142 break;
143 default:
144 fprintf(stderr, "Unknown option %s provided\n",
145 scanned[i_arg].list[0]);
146 exit(1);
147 break;
148 }
149 } else {
150 if (!input)
151 input = scanned[i_arg].list[0];
152 else if (!output)
153 output = scanned[i_arg].list[0];
154 else
156 }
157 }
159 if (phase && !threshold_provided)
160 threshold = PI;
161
162 if (!modulo)
163 modulo = 2 * threshold;
164
167 if (column_matches) {
169 &columns, SDDS_MATCH_COLUMN);
170 } else {
171 column =
tmalloc(
sizeof(*column) * 1);
174 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
175 for (i = 0; i < columns0; i++) {
179 break;
180 }
181 }
183 columns = 1;
184 }
185
188 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
189 if (column_major_order != -1)
190 sdds_out.layout.data_mode.column_major = column_major_order;
191 else
192 sdds_out.layout.data_mode.column_major = sdds_in.layout.data_mode.column_major;
193
194 for (i = 0; i < columns; i++) {
195 sprintf(output_column, "Unwrap%s", column[i]);
197 output_column))
199 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
200 }
203
206 continue;
209 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
210
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);
217 k = 0;
218 for (j = 0; j < rows - 1; j++) {
219 y_data[j] = x_data[j] + modulo * k;
220
221 if (fabs(x_data[j + 1] - x_data[j]) > fabs(threshold)) {
222 if (x_data[j + 1] < x_data[j])
223 k = k + 1;
224 else
225 k = k - 1;
226 }
227 }
228 y_data[rows - 1] = x_data[rows - 1] + modulo * k;
229
230 if (x_data)
231 free(x_data);
232 x_data = NULL;
233
235 rows, output_column))
237 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
238 }
239 free(y_data);
240 y_data = NULL;
243 SDDS_VERBOSE_PrintErrors | SDDS_EXIT_PrintErrors);
244 }
247 exit(1);
248 }
249 if (column_name) {
251 free(column_name);
252 }
254 free(column);
255 if (column_match)
256 free(column_match);
258 return 0;
259}
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.