117 {
118 int iArg, iColumn, verbose;
119 char *input, *output;
120 unsigned long pipeFlags;
121 SCANNED_ARG *scanned;
124 long nColumns;
125 double *data;
126 int64_t rows;
127 short makeParameters;
128 double min, max;
129 int64_t points;
130
132 argc =
scanargs(&scanned, argc, argv);
133 if (argc < 3)
135
136 nColumns = 0;
137 column = NULL;
138 input = output = NULL;
139 pipeFlags = 0;
140 verbose = 0;
141 makeParameters = 0;
142
143 for (iArg = 1; iArg < argc; iArg++) {
144 if (scanned[iArg].arg_type == OPTION) {
145
146 switch (
match_string(scanned[iArg].list[0], option, N_OPTIONS, 0)) {
147 case CLO_COLUMN:
148 column =
SDDS_Realloc(column,
sizeof(*column) * (nColumns + 1));
149 column[nColumns].name = scanned[iArg].list[1];
150 column[nColumns].maximumBins = -1;
151 column[nColumns].binFactor = 10;
152 column[nColumns].deltaGuess = -1;
153 column[nColumns].flags = COLUMN_BIN_FACTOR;
154 column[nColumns].adjustFactor = 0.9;
155 scanned[iArg].n_items -= 2;
156 if (scanned[iArg].n_items) {
157 if (!
scanItemList(&(column[nColumns].flags), scanned[iArg].list + 2, &scanned[iArg].n_items, 0,
158 "maximumbins",
SDDS_LONG, &(column[nColumns].maximumBins), 1, COLUMN_MAXIMUM_BINS,
159 "binfactor",
SDDS_LONG, &(column[nColumns].binFactor), 1, COLUMN_BIN_FACTOR,
160 "deltaguess",
SDDS_DOUBLE, &(column[nColumns].deltaGuess), 1, COLUMN_DELTA_GUESS,
161 "adjustfactor",
SDDS_DOUBLE, &(column[nColumns].adjustFactor), 1, COLUMN_ADJUST_FACTOR,
162 NULL)) {
164 }
165 if (column[nColumns].flags & COLUMN_ADJUST_FACTOR) {
166 if (column[nColumns].adjustFactor <= 0 || column[nColumns].adjustFactor >= 1)
167 SDDS_Bomb(
"invalid -column syntax. adjustFactor must be (0,1)");
168 }
169 if (column[nColumns].flags & COLUMN_DELTA_GUESS) {
170 if (column[nColumns].flags & ~(COLUMN_DELTA_GUESS | COLUMN_ADJUST_FACTOR))
171 SDDS_Bomb(
"invalid -column syntax. Can't combine deltaGuess with other options.");
172 if (column[nColumns].deltaGuess <= 0)
173 SDDS_Bomb(
"invalid -column syntax. deltaGuess<=0.");
174 } else {
175 if (column[nColumns].flags & COLUMN_BIN_FACTOR && column[nColumns].flags & COLUMN_MAXIMUM_BINS)
176 SDDS_Bomb(
"invalid -column syntax. Can't give minimumBins and maximumBins with binFactor");
177 if (!(column[nColumns].flags & COLUMN_BIN_FACTOR) && !(column[nColumns].flags & COLUMN_MAXIMUM_BINS))
178 SDDS_Bomb(
"invalid -column syntax. Give maximumBins or binFactor");
179 if (column[nColumns].flags & COLUMN_BIN_FACTOR && column[nColumns].binFactor < 1)
180 SDDS_Bomb(
"invalid -column syntax. binFactor<1");
181 }
182 }
183 nColumns++;
184 break;
185 case CLO_PIPE:
186 if (!
processPipeOption(scanned[iArg].list + 1, scanned[iArg].n_items - 1, &pipeFlags))
188 break;
189 case CLO_VERBOSE:
190 verbose = 1;
191 break;
192 case CLO_MAKE_PARAMETERS:
193 makeParameters = 1;
194 break;
195 default:
196 fprintf(stderr, "error: unknown/ambiguous option: %s\n", scanned[iArg].list[0]);
197 exit(EXIT_FAILURE);
198 break;
199 }
200 } else {
201 if (!input)
202 input = scanned[iArg].list[0];
203 else if (!output)
204 output = scanned[iArg].list[0];
205 else
207 }
208 }
209
211
214
217 if (makeParameters)
218 AddParameterDefinitions(&SDDSout, &SDDSin, column, nColumns);
221
226 for (iColumn = 0; iColumn < nColumns; iColumn++) {
229 SnapDataToGrid(data, rows, column + iColumn, verbose, &min, &max, &points);
232 if (makeParameters)
233 StoreGridParameters(&SDDSout, column[iColumn].name, min, max, points);
234 free(data);
235 }
238 }
239
242 exit(EXIT_FAILURE);
243 }
246 exit(EXIT_FAILURE);
247 }
248
249 return EXIT_SUCCESS;
250}
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_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.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
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.