131 {
133 long i_arg, iconv;
134 SCANNED_ARG *s_arg;
135 char *input, *output;
137 long conversions;
138 unsigned long pipeFlags, majorOrderFlag;
139 short columnMajorOrder = -1;
140
142 argc =
scanargs(&s_arg, argc, argv);
143 if (argc < 3) {
144 fprintf(stderr, "%s", USAGE);
145 exit(EXIT_FAILURE);
146 }
147
148 input = output = NULL;
149 conversions = 0;
150 conversion = NULL;
151 pipeFlags = 0;
152
153 for (i_arg = 1; i_arg < argc; i_arg++) {
154 if (s_arg[i_arg].arg_type == OPTION) {
155 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
156 case SET_MAJOR_ORDER:
157 majorOrderFlag = 0;
158 s_arg[i_arg].n_items--;
159 if (s_arg[i_arg].n_items > 0 &&
160 (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
161 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
162 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
163 SDDS_Bomb(
"invalid -majorOrder syntax/values");
164 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
165 columnMajorOrder = 1;
166 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
167 columnMajorOrder = 0;
168 break;
169 case SET_EPOCH:
170 if (s_arg[i_arg].n_items < 4)
172 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
174 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
175 conversion[conversions].epochName = s_arg[i_arg].list[2];
176 s_arg[i_arg].list[2] = s_arg[i_arg].list[1];
177 s_arg[i_arg].n_items -= 2;
179 s_arg[i_arg].list + 2, &s_arg[i_arg].n_items, 0,
180 "column", -1, NULL, 0, IS_COLUMN,
181 "parameter", -1, NULL, 0, IS_PARAMETER,
182 "year",
SDDS_STRING, &conversion[conversions].yearName, 1, YEAR_GIVEN,
183 "julianday",
SDDS_STRING, &conversion[conversions].jDayName, 1, JDAY_GIVEN,
184 "month",
SDDS_STRING, &conversion[conversions].monthName, 1, MONTH_GIVEN,
185 "day",
SDDS_STRING, &conversion[conversions].dayName, 1, DAY_GIVEN,
186 "hour",
SDDS_STRING, &conversion[conversions].hourName, 1, HOUR_GIVEN, NULL))
188 conversion[conversions].flags |= EPOCH_GIVEN | DO_EPOCH;
189 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
190 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -epoch");
191 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
192 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -epoch");
193 if (!(conversion[conversions].flags & YEAR_GIVEN))
194 SDDS_Bomb(
"Specify year name with -epoch");
195 if (!(conversion[conversions].flags & JDAY_GIVEN) &&
196 (conversion[conversions].flags & (MONTH_GIVEN | DAY_GIVEN)) != (MONTH_GIVEN | DAY_GIVEN))
197 SDDS_Bomb(
"Specify either julianDay name, or both month and day names with -epoch");
198 if (conversion[conversions].flags & JDAY_GIVEN && conversion[conversions].flags & (MONTH_GIVEN | DAY_GIVEN))
199 SDDS_Bomb(
"Invalid combination of julianDay name with month or day name for -epoch");
200 conversions++;
201 break;
202 case SET_BREAKDOWN:
203 if (s_arg[i_arg].n_items < 4)
205 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
207 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
208 conversion[conversions].epochName = s_arg[i_arg].list[2];
209 s_arg[i_arg].list[2] = s_arg[i_arg].list[1];
210 s_arg[i_arg].n_items -= 2;
212 s_arg[i_arg].list + 2, &s_arg[i_arg].n_items, 0,
213 "column", -1, NULL, 0, IS_COLUMN,
214 "parameter", -1, NULL, 0, IS_PARAMETER,
215 "year",
SDDS_STRING, &conversion[conversions].yearName, 1, YEAR_GIVEN,
216 "julianday",
SDDS_STRING, &conversion[conversions].jDayName, 1, JDAY_GIVEN,
217 "month",
SDDS_STRING, &conversion[conversions].monthName, 1, MONTH_GIVEN,
218 "day",
SDDS_STRING, &conversion[conversions].dayName, 1, DAY_GIVEN,
219 "hour",
SDDS_STRING, &conversion[conversions].hourName, 1, HOUR_GIVEN,
220 "text",
SDDS_STRING, &conversion[conversions].textName, 1, TEXT_GIVEN, NULL))
222 conversion[conversions].flags |= EPOCH_GIVEN | DO_BREAKDOWN;
223 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
224 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -breakdown");
225 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
226 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -breakdown");
227 if (!(conversion[conversions].flags & (YEAR_GIVEN | JDAY_GIVEN | MONTH_GIVEN | DAY_GIVEN | HOUR_GIVEN | TEXT_GIVEN)))
228 SDDS_Bomb(
"Specify at least one of year, julianDay, month, day, hour, or text qualifiers with -breakdown");
229 conversions++;
230 break;
231 case SET_DATE:
232 if (s_arg[i_arg].n_items < 4)
234 if (!(conversion =
SDDS_Realloc(conversion,
sizeof(*conversion) * (conversions + 1))))
236 memset((char *)(conversion + conversions), 0, sizeof(*conversion));
237 conversion[conversions].textName = s_arg[i_arg].list[3];
238 conversion[conversions].epochName = s_arg[i_arg].list[2];
239 s_arg[i_arg].list[3] = s_arg[i_arg].list[1];
240 s_arg[i_arg].n_items -= 3;
242 s_arg[i_arg].list + 3, &s_arg[i_arg].n_items, 0,
243 "column", -1, NULL, 0, IS_COLUMN,
244 "parameter", -1, NULL, 0, IS_PARAMETER,
245 "format",
SDDS_STRING, &conversion[conversions].format, 1, FORMAT_GIVEN, NULL))
247 conversion[conversions].flags |= DO_DATECONVERSION;
248 if (!(conversion[conversions].flags & (IS_COLUMN | IS_PARAMETER)))
249 SDDS_Bomb(
"Specify 'column' or 'parameter' qualifier with -dateToTime");
250 if (conversion[conversions].flags & IS_COLUMN && conversion[conversions].flags & IS_PARAMETER)
251 SDDS_Bomb(
"Specify only one of 'column' or 'parameter' qualifier with -dateToTime");
252 if (!(conversion[conversions].flags & FORMAT_GIVEN))
253 SDDS_Bomb(
"Format string not provided for date to time conversion");
254 conversions++;
255 break;
256 case SET_PIPE:
257 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
259 break;
260 default:
261 fprintf(stderr, "Error: Unknown option: %s\n", s_arg[i_arg].list[0]);
263 break;
264 }
265 } else {
266 if (!input)
267 input = s_arg[i_arg].list[0];
268 else if (!output)
269 output = s_arg[i_arg].list[0];
270 else {
271 fprintf(stderr, "Error: Argument '%s' is invalid: too many filenames (sddstimeconvert)\n", s_arg[i_arg].list[0]);
272 exit(EXIT_FAILURE);
273 }
274 }
275 }
276
278
281 exit(EXIT_FAILURE);
282 }
283
284 CheckEpochConversionElements(&SDDSin, conversion, conversions);
285 CheckBreakdownConversionElements(&SDDSin, conversion, conversions);
286 CheckDateConversionElements(&SDDSin, conversion, conversions);
287
288 InitializeOutput(&SDDSout, output, conversion, conversions, &SDDSin, columnMajorOrder);
289
293 exit(EXIT_FAILURE);
294 }
295 for (iconv = 0; iconv < conversions; iconv++) {
296 if (conversion[iconv].flags & DO_EPOCH) {
297 if (conversion[iconv].flags & IS_PARAMETER)
298 DoParameterEpochConversion(&SDDSout, &SDDSin, conversion + iconv);
299 else
300 DoColumnEpochConversion(&SDDSout, &SDDSin, conversion + iconv);
301 } else if (conversion[iconv].flags & DO_BREAKDOWN) {
302 if (conversion[iconv].flags & IS_PARAMETER)
303 DoParameterBreakdownConversion(&SDDSout, &SDDSin, conversion + iconv);
304 else
305 DoColumnBreakdownConversion(&SDDSout, &SDDSin, conversion + iconv);
306 } else {
307
308 if (conversion[iconv].flags & IS_PARAMETER)
309 DoParameterDateToTimeConversion(&SDDSout, &SDDSin, conversion + iconv);
310 else
311 DoColumnDateToTimeConversion(&SDDSout, &SDDSin, conversion + iconv);
312 }
313 }
316 exit(EXIT_FAILURE);
317 }
318 }
321 exit(EXIT_FAILURE);
322 }
323
324 return EXIT_SUCCESS;
325}
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.