207 {
209 long i, i_arg;
210 SCANNED_ARG *s_arg;
211 char *description_text, *description_contents;
212 long tmpfile_used, noWarnings;
213 char *input, *output, *ptr, *buffer;
214 long ascii_output, binary_output, recover, recovered;
215 unsigned long pipeFlags, majorOrderFlag;
216
217 char **retain_column, **delete_column;
218 long retain_columns, delete_columns, rename_columns, edit_column_requests;
220 STRING_PAIR *rename_column;
221 char **orig_column_name, **new_column_name;
222 long *orig_column_flag = NULL;
223 int32_t orig_column_names;
224
225 char **retain_parameter, **delete_parameter;
226 long retain_parameters, delete_parameters, rename_parameters, edit_parameter_requests;
228 STRING_PAIR *rename_parameter;
229 char **orig_parameter_name, **new_parameter_name;
230 long *orig_parameter_flag = NULL;
231 int32_t orig_parameter_names;
232
233 char **retain_array, **delete_array;
234 long retain_arrays, delete_arrays, rename_arrays, edit_array_requests;
236 STRING_PAIR *rename_array;
237 char **orig_array_name, **new_array_name;
238 long *orig_array_flag = NULL;
239 int32_t orig_array_names;
240
241 long lines_per_row, pageNumber = 0, fromPage, toPage;
242 int64_t rows;
243 long max_size;
244
245 long *removePage, *keepPage;
246 long removePages, keepPages, keep;
247 int64_t rowLimit;
248 short column_major = -1;
249
250 long convert_units_arrays = 0, convert_units_columns = 0, convert_units_parameters = 0;
251 CONVERT_UNITS *convert_units_array = NULL, *convert_units_column = NULL, *convert_units_parameter = NULL;
252
253 new_column_name = new_parameter_name = new_array_name = NULL;
254
256 argc =
scanargs(&s_arg, argc, argv);
257 if (argc < 3) {
258 fprintf(stderr, "%s\n", USAGE);
259 return 1;
260 }
261 input = output = NULL;
262 ascii_output = binary_output = noWarnings = 0;
263
264 retain_column = delete_column = NULL;
265 retain_columns = delete_columns = rename_columns = edit_column_requests = 0;
266 rename_column = NULL;
267 edit_column_request = NULL;
268
269 retain_parameter = delete_parameter = NULL;
270 retain_parameters = delete_parameters = rename_parameters = edit_parameter_requests = 0;
271 rename_parameter = NULL;
272 edit_parameter_request = NULL;
273
274 retain_array = delete_array = NULL;
275 retain_arrays = delete_arrays = rename_arrays = edit_array_requests = 0;
276 rename_array = NULL;
277 edit_array_request = NULL;
278
279 tmpfile_used = 0;
280 description_text = description_contents = NULL;
281 fromPage = toPage = recover = 0;
282 removePage = keepPage = NULL;
283 removePages = keepPages = 0;
284 lines_per_row = 1;
285 pipeFlags = 0;
286
287 for (i_arg = 1; i_arg < argc; i_arg++) {
288 if (s_arg[i_arg].arg_type == OPTION) {
290 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
291 case SET_MAJOR_ORDER:
292 majorOrderFlag = 0;
293 s_arg[i_arg].n_items -= 1;
294 if (s_arg[i_arg].n_items > 0 &&
296 &s_arg[i_arg].n_items, 0,
297 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
298 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER,
299 NULL)))
300 SDDS_Bomb(
"invalid -majorOrder syntax/values");
301 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
302 column_major = 1;
303 if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
304 column_major = 0;
305 break;
306 case SET_BINARY:
307 binary_output = 1;
308 ascii_output = 0;
309 break;
310 case SET_ASCII:
311 ascii_output = 1;
312 binary_output = 0;
313 break;
314 case SET_CONVERT_UNITS:
315 if ((s_arg[i_arg].n_items != 4) && (s_arg[i_arg].n_items != 5) &&
316 (s_arg[i_arg].n_items != 6)) {
317 fprintf(stderr, "Error (%s): invalid -convertUnits syntax\n", argv[0]);
318 return 1;
319 }
320 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
321 case ARRAY_MODE:
322 convert_units_array =
trealloc(convert_units_array,
323 sizeof(*convert_units_array) * (convert_units_arrays + 1));
324 convert_units_array[convert_units_arrays].name = s_arg[i_arg].list[2];
325 convert_units_array[convert_units_arrays].new_units = s_arg[i_arg].list[3];
326 if (s_arg[i_arg].n_items >= 5)
327 convert_units_array[convert_units_arrays].old_units = s_arg[i_arg].list[4];
328 else
329 convert_units_array[convert_units_arrays].old_units = NULL;
330 if (s_arg[i_arg].n_items == 6) {
331 if (sscanf(s_arg[i_arg].list[5], "%lf",
332 &(convert_units_array[convert_units_arrays].factor)) != 1) {
333 fprintf(stderr, "Error (%s): invalid -convertUnits syntax or value\n", argv[0]);
334 return 1;
335 }
336 } else
337 convert_units_array[convert_units_arrays].factor = 1.0;
338 convert_units_arrays++;
339 break;
340 case COLUMN_MODE:
341 convert_units_column =
trealloc(convert_units_column,
342 sizeof(*convert_units_column) * (convert_units_columns + 1));
343 convert_units_column[convert_units_columns].name = s_arg[i_arg].list[2];
344 convert_units_column[convert_units_columns].new_units = s_arg[i_arg].list[3];
345 if (s_arg[i_arg].n_items >= 5)
346 convert_units_column[convert_units_columns].old_units = s_arg[i_arg].list[4];
347 else
348 convert_units_column[convert_units_columns].old_units = NULL;
349 if (s_arg[i_arg].n_items == 6) {
350 if (sscanf(s_arg[i_arg].list[5], "%lf",
351 &(convert_units_column[convert_units_columns].factor)) != 1) {
352 fprintf(stderr, "Error (%s): invalid -convertUnits syntax or value\n", argv[0]);
353 return 1;
354 }
355 } else
356 convert_units_column[convert_units_columns].factor = 1.0;
357 convert_units_columns++;
358 break;
359 case PARAMETER_MODE:
360 convert_units_parameter =
trealloc(convert_units_parameter,
361 sizeof(*convert_units_parameter) * (convert_units_parameters + 1));
362 convert_units_parameter[convert_units_parameters].name = s_arg[i_arg].list[2];
363 convert_units_parameter[convert_units_parameters].new_units = s_arg[i_arg].list[3];
364 if (s_arg[i_arg].n_items >= 5)
365 convert_units_parameter[convert_units_parameters].old_units = s_arg[i_arg].list[4];
366 else
367 convert_units_parameter[convert_units_parameters].old_units = NULL;
368 if (s_arg[i_arg].n_items == 6) {
369 if (sscanf(s_arg[i_arg].list[5], "%lf",
370 &(convert_units_parameter[convert_units_parameters].factor)) != 1) {
371 fprintf(stderr, "Error (%s): invalid -convertUnits syntax or value\n", argv[0]);
372 return 1;
373 }
374 } else
375 convert_units_parameter[convert_units_parameters].factor = 1.0;
376 convert_units_parameters++;
377 break;
378 default:
379 fprintf(stderr, "Error (%s): invalid -convertUnits syntax: specify column, parameter or array\n", argv[0]);
380 return 1;
381 }
382 break;
383 case SET_DELETE:
384 if (s_arg[i_arg].n_items < 3) {
385 fprintf(stderr, "Error (%s): invalid -delete syntax\n", argv[0]);
386 return 1;
387 }
388 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
389 case COLUMN_MODE:
390 delete_column =
trealloc(delete_column,
391 sizeof(*delete_column) * (delete_columns + s_arg[i_arg].n_items - 2));
392 for (i = 2; i < s_arg[i_arg].n_items; i++)
393 delete_column[i - 2 + delete_columns] = s_arg[i_arg].list[i];
394 delete_columns += s_arg[i_arg].n_items - 2;
395 break;
396 case PARAMETER_MODE:
397 delete_parameter =
trealloc(delete_parameter,
398 sizeof(*delete_parameter) * (delete_parameters + s_arg[i_arg].n_items - 2));
399 for (i = 2; i < s_arg[i_arg].n_items; i++)
400 delete_parameter[i - 2 + delete_parameters] = s_arg[i_arg].list[i];
401 delete_parameters += s_arg[i_arg].n_items - 2;
402 break;
403 case ARRAY_MODE:
404 delete_array =
trealloc(delete_array,
405 sizeof(*delete_array) * (delete_arrays + s_arg[i_arg].n_items - 2));
406 for (i = 2; i < s_arg[i_arg].n_items; i++)
407 delete_array[i - 2 + delete_arrays] = s_arg[i_arg].list[i];
408 delete_arrays += s_arg[i_arg].n_items - 2;
409 break;
410 default:
411 fprintf(stderr, "Error (%s): invalid -delete syntax: specify column, parameter or array\n", argv[0]);
412 return 1;
413 }
414 break;
415 case SET_RETAIN:
416 if (s_arg[i_arg].n_items < 3) {
417 fprintf(stderr, "Error (%s): invalid -retain syntax\n", argv[0]);
418 return 1;
419 }
420 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
421 case COLUMN_MODE:
422 retain_column =
trealloc(retain_column,
423 sizeof(*retain_column) * (retain_columns + s_arg[i_arg].n_items - 2));
424 for (i = 2; i < s_arg[i_arg].n_items; i++)
425 retain_column[i - 2 + retain_columns] = s_arg[i_arg].list[i];
426 retain_columns += s_arg[i_arg].n_items - 2;
427 break;
428 case PARAMETER_MODE:
429 retain_parameter =
trealloc(retain_parameter,
430 sizeof(*retain_parameter) * (retain_parameters + s_arg[i_arg].n_items - 2));
431 for (i = 2; i < s_arg[i_arg].n_items; i++)
432 retain_parameter[i - 2 + retain_parameters] = s_arg[i_arg].list[i];
433 retain_parameters += s_arg[i_arg].n_items - 2;
434 break;
435 case ARRAY_MODE:
436 retain_array =
trealloc(retain_array,
437 sizeof(*retain_array) * (retain_arrays + s_arg[i_arg].n_items - 2));
438 for (i = 2; i < s_arg[i_arg].n_items; i++)
439 retain_array[i - 2 + retain_arrays] = s_arg[i_arg].list[i];
440 retain_arrays += s_arg[i_arg].n_items - 2;
441 break;
442 default:
443 fprintf(stderr, "Error (%s): invalid -retain syntax: specify column, parameter or array\n", argv[0]);
444 return 1;
445 }
446 break;
447 case SET_RENAME:
448 if (s_arg[i_arg].n_items < 3) {
449 fprintf(stderr, "Error (%s): invalid -rename syntax\n", argv[0]);
450 return 1;
451 }
452 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
453 case COLUMN_MODE:
454 rename_column =
trealloc(rename_column,
455 sizeof(*rename_column) * (rename_columns + s_arg[i_arg].n_items - 2));
456 for (i = 2; i < s_arg[i_arg].n_items; i++) {
457 if (!(ptr = strchr(s_arg[i_arg].list[i], '='))) {
458 fprintf(stderr, "Error (%s): invalid -rename syntax\n", argv[0]);
459 return 1;
460 }
461 *ptr++ = 0;
462 rename_column[i - 2 + rename_columns][0] = s_arg[i_arg].list[i];
463 rename_column[i - 2 + rename_columns][1] = ptr;
464 }
465 rename_columns += s_arg[i_arg].n_items - 2;
466 break;
467 case PARAMETER_MODE:
468 rename_parameter =
trealloc(rename_parameter,
469 sizeof(*rename_parameter) * (rename_parameters + s_arg[i_arg].n_items - 2));
470 for (i = 2; i < s_arg[i_arg].n_items; i++) {
471 if (!(ptr = strchr(s_arg[i_arg].list[i], '='))) {
472 fprintf(stderr, "Error (%s): invalid -rename syntax\n", argv[0]);
473 return 1;
474 }
475 *ptr++ = 0;
476 rename_parameter[i - 2 + rename_parameters][0] = s_arg[i_arg].list[i];
477 rename_parameter[i - 2 + rename_parameters][1] = ptr;
478 }
479 rename_parameters += s_arg[i_arg].n_items - 2;
480 break;
481 case ARRAY_MODE:
482 rename_array =
trealloc(rename_array,
483 sizeof(*rename_array) * (rename_arrays + s_arg[i_arg].n_items - 2));
484 for (i = 2; i < s_arg[i_arg].n_items; i++) {
485 if (!(ptr = strchr(s_arg[i_arg].list[i], '='))) {
486 fprintf(stderr, "Error (%s): invalid -rename syntax\n", argv[0]);
487 return 1;
488 }
489 *ptr++ = 0;
490 rename_array[i - 2 + rename_arrays][0] = s_arg[i_arg].list[i];
491 rename_array[i - 2 + rename_arrays][1] = ptr;
492 }
493 rename_arrays += s_arg[i_arg].n_items - 2;
494 break;
495 default:
496 fprintf(stderr, "Error (%s): invalid -rename syntax: specify column, parameter or array\n", argv[0]);
497 return 1;
498 }
499 break;
500 case SET_DESCRIPTION:
501 if (s_arg[i_arg].n_items != 3) {
502 fprintf(stderr, "Error (%s): invalid -description syntax\n", argv[0]);
503 return 1;
504 }
505 description_text = s_arg[i_arg].list[1];
506 description_contents = s_arg[i_arg].list[2];
507 break;
508 case SET_TABLE:
509 if (s_arg[i_arg].n_items < 2) {
510 fprintf(stderr, "Error (%s): invalid -table syntax\n", argv[0]);
511 return 1;
512 }
513 if (pageNumber != 0) {
514 fprintf(stderr, "Error (%s): specify -table once only\n", argv[0]);
515 return 1;
516 }
517 if (sscanf(s_arg[i_arg].list[1], "%ld", &pageNumber) != 1 || pageNumber <= 0) {
518 fprintf(stderr, "Error (%s): invalid -table value\n", argv[0]);
519 return 1;
520 }
521 fromPage = toPage = pageNumber;
522 break;
523 case SET_FROMPAGE:
524 if (s_arg[i_arg].n_items < 2) {
525 fprintf(stderr, "Error (%s): invalid -fromPage syntax\n", argv[0]);
526 return 1;
527 }
528 if (fromPage != 0) {
529 fprintf(stderr, "Error (%s): specify -fromPage once only\n", argv[0]);
530 return 1;
531 }
532 if (sscanf(s_arg[i_arg].list[1], "%ld", &fromPage) != 1 || fromPage <= 0) {
533 fprintf(stderr, "Error (%s): invalid -fromPage value\n", argv[0]);
534 return 1;
535 }
536 break;
537 case SET_TOPAGE:
538 if (s_arg[i_arg].n_items < 2) {
539 fprintf(stderr, "Error (%s): invalid -toPage syntax\n", argv[0]);
540 return 1;
541 }
542 if (toPage != 0) {
543 fprintf(stderr, "Error (%s): specify -toPage once only\n", argv[0]);
544 return 1;
545 }
546 if (sscanf(s_arg[i_arg].list[1], "%ld", &toPage) != 1 || toPage <= 0) {
547 fprintf(stderr, "Error (%s): invalid -toPage value\n", argv[0]);
548 return 1;
549 }
550 break;
551 case SET_REMOVEPAGES:
552 if (s_arg[i_arg].n_items < 2) {
553 fprintf(stderr, "Error (%s): invalid -removePages syntax\n", argv[0]);
554 return 1;
555 }
556 if (removePage != NULL) {
557 fprintf(stderr, "Error (%s): specify -removePages once only\n", argv[0]);
558 return 1;
559 }
560 removePages = s_arg[i_arg].n_items - 1;
561 removePage =
trealloc(removePage,
sizeof(*removePage) * (removePages));
562 for (i = 0; i < removePages; i++) {
563 if (sscanf(s_arg[i_arg].list[i + 1], "%ld", &removePage[i]) != 1 || removePage[i] <= 0) {
564 fprintf(stderr, "Error (%s): invalid -removePages value\n", argv[0]);
565 return 1;
566 }
567 }
568 break;
569 case SET_KEEPPAGES:
570 if (s_arg[i_arg].n_items < 2) {
571 fprintf(stderr, "Error (%s): invalid -keepPages syntax\n", argv[0]);
572 return 1;
573 }
574 if (keepPage != NULL) {
575 fprintf(stderr, "Error (%s): specify -keepPages once only\n", argv[0]);
576 return 1;
577 }
578 keepPages = s_arg[i_arg].n_items - 1;
579 keepPage =
trealloc(keepPage,
sizeof(*keepPage) * (keepPages));
580 for (i = 0; i < keepPages; i++) {
581 if (sscanf(s_arg[i_arg].list[i + 1], "%ld", &keepPage[i]) != 1 || keepPage[i] <= 0) {
582 fprintf(stderr, "Error (%s): invalid -keepPages value\n", argv[0]);
583 return 1;
584 }
585 }
586 break;
587 case SET_EDIT_NAMES:
588 if (s_arg[i_arg].n_items < 4) {
589 fprintf(stderr, "Error (%s): invalid -editnames syntax\n", argv[0]);
590 return 1;
591 }
592 switch (
match_string(s_arg[i_arg].list[1], mode_name, MODES, 0)) {
593 case COLUMN_MODE:
594 edit_column_request =
trealloc(edit_column_request,
595 sizeof(*edit_column_request) * (edit_column_requests + 1));
596 edit_column_request[edit_column_requests].match_string = s_arg[i_arg].list[2];
597 edit_column_request[edit_column_requests].edit_string = s_arg[i_arg].list[3];
598 edit_column_requests++;
599 break;
600 case PARAMETER_MODE:
601 edit_parameter_request =
trealloc(edit_parameter_request,
602 sizeof(*edit_parameter_request) * (edit_parameter_requests + 1));
603 edit_parameter_request[edit_parameter_requests].match_string = s_arg[i_arg].list[2];
604 edit_parameter_request[edit_parameter_requests].edit_string = s_arg[i_arg].list[3];
605 edit_parameter_requests++;
606 break;
607 case ARRAY_MODE:
608 edit_array_request =
trealloc(edit_array_request,
609 sizeof(*edit_array_request) * (edit_array_requests + 1));
610 edit_array_request[edit_array_requests].match_string = s_arg[i_arg].list[2];
611 edit_array_request[edit_array_requests].edit_string = s_arg[i_arg].list[3];
612 edit_array_requests++;
613 break;
614 default:
615 fprintf(stderr, "Error (%s): invalid -editnames syntax\n", argv[0]);
616 return 1;
617 }
618 break;
619 case SET_LINES_PER_ROW:
620 if (s_arg[i_arg].n_items != 2 ||
621 sscanf(s_arg[i_arg].list[1], "%ld", &lines_per_row) != 1 ||
622 lines_per_row <= 0) {
623 fprintf(stderr, "Error (%s): invalid -linesperrow syntax\n", argv[0]);
624 return 1;
625 }
626 break;
627 case SET_NOWARNINGS:
628 if (s_arg[i_arg].n_items != 1) {
629 fprintf(stderr, "Error (%s): invalid -nowarnings syntax\n", argv[0]);
630 return 1;
631 }
632 noWarnings = 1;
633 break;
634 case SET_RECOVER:
635 recover = 1;
636 if (s_arg[i_arg].n_items != 1) {
637 recover = 2;
638 if (s_arg[i_arg].n_items > 2 ||
639 strncmp(s_arg[i_arg].list[1], "clip", strlen(s_arg[i_arg].list[1])) != 0) {
640 fprintf(stderr, "Error (%s): invalid -recover syntax\n", argv[0]);
641 return 1;
642 }
643 }
644 break;
645 case SET_PIPE:
646 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags)) {
647 fprintf(stderr, "Error (%s): invalid -pipe syntax\n", argv[0]);
648 return 1;
649 }
650 break;
651 case SET_ACCEPT_ALL_NAMES:
653 break;
654 case SET_ROWLIMIT:
655 if (s_arg[i_arg].n_items != 2 ||
656 sscanf(s_arg[i_arg].list[1], "%" SCNd64, &rowLimit) != 1 ||
657 rowLimit < 0) {
658 fprintf(stderr, "Error (%s): invalid -rowLimit syntax\n", argv[0]);
659 return 1;
660 }
662 break;
663 default:
664 fprintf(stderr, "Error (%s): unknown switch: %s\n", argv[0], s_arg[i_arg].list[0]);
665 return 1;
666 }
667 } else {
668 if (input == NULL)
669 input = s_arg[i_arg].list[0];
670 else if (output == NULL)
671 output = s_arg[i_arg].list[0];
672 else {
673 fprintf(stderr, "Error (%s): too many filenames\n", argv[0]);
674 return 1;
675 }
676 }
677 }
678
679 if (fromPage && toPage && fromPage > toPage) {
680 fprintf(stderr, "Error (%s): invalid -fromPage and -toPage\n", argv[0]);
681 return 1;
682 }
683
684 processFilenames(
"sddsconvert", &input, &output, pipeFlags, noWarnings, &tmpfile_used);
685
686#ifdef DEBUG
687 fprintf(stderr, "Initializing input and output files.\n");
688#endif
691 return 1;
692 }
693
694 if (!set_units_conversion(&SDDS_orig, convert_units_array, convert_units_arrays,
695 convert_units_column, convert_units_columns,
696 convert_units_parameter, convert_units_parameters)) {
698 return 1;
699 }
700
701 if (!description_text)
703
705 ascii_output ? SDDS_ASCII : (binary_output ? SDDS_BINARY : SDDS_orig.layout.data_mode.mode),
706 lines_per_row, description_text, description_contents, output)) {
708 return 1;
709 }
710
712
713 if (column_major != -1)
714 SDDS_dataset.layout.data_mode.column_major = column_major;
715 else
716 SDDS_dataset.layout.data_mode.column_major = SDDS_orig.layout.data_mode.column_major;
717
718#ifdef DEBUG
719 fprintf(stderr, "Getting column, parameter, and array names from input file.\n");
720#endif
723 return 1;
724 }
725 if (orig_column_names &&
726 !(new_column_name = process_name_options(orig_column_name, &orig_column_flag, orig_column_names,
727 delete_column, delete_columns,
728 retain_column, retain_columns,
729 rename_column, rename_columns,
730 edit_column_request, edit_column_requests)))
731 return 1;
732
735 return 1;
736 }
737
738#ifdef DEBUG
739 fprintf(stderr, "processing name options\n");
740#endif
741 if (orig_parameter_names &&
742 !(new_parameter_name = process_name_options(orig_parameter_name, &orig_parameter_flag, orig_parameter_names,
743 delete_parameter, delete_parameters,
744 retain_parameter, retain_parameters,
745 rename_parameter, rename_parameters,
746 edit_parameter_request, edit_parameter_requests)))
747 return 1;
748
751 return 1;
752 }
753 if (orig_array_names &&
754 !(new_array_name = process_name_options(orig_array_name, &orig_array_flag, orig_array_names,
755 delete_array, delete_arrays,
756 retain_array, retain_arrays,
757 rename_array, rename_arrays,
758 edit_array_request, edit_array_requests)))
759 return 1;
760
761#ifdef DEBUG
762 for (i = 0; i < orig_parameter_names; i++)
763 fprintf(stderr, "parameter %s goes to %s\n", orig_parameter_name[i],
764 orig_parameter_flag[i] ? new_parameter_name[i] : "<deleted>");
765 for (i = 0; i < orig_array_names; i++)
766 fprintf(stderr, "array %s goes to %s\n", orig_array_name[i],
767 orig_array_flag[i] ? new_array_name[i] : "<deleted>");
768 for (i = 0; i < orig_column_names; i++)
769 fprintf(stderr, "column %s goes to %s\n", orig_column_name[i],
770 orig_column_flag[i] ? new_column_name[i] : "<deleted>");
771#endif
772
773#ifdef DEBUG
774 fprintf(stderr, "Transferring definitions to new file\n");
775#endif
776 for (i = 0; i < orig_parameter_names; i++) {
777 if (orig_parameter_flag[i]) {
779 orig_parameter_name[i], new_parameter_name[i])) {
780 fprintf(stderr, "unable to transfer parameter %s to %s\n",
781 orig_parameter_name[i], new_parameter_name[i]);
783 return 1;
784 }
785 }
786 }
787 for (i = 0; i < orig_array_names; i++) {
788 if (orig_array_flag[i]) {
790 orig_array_name[i], new_array_name[i])) {
791 fprintf(stderr, "unable to transfer array %s to %s\n",
792 orig_array_name[i], new_array_name[i]);
794 return 1;
795 }
796 }
797 }
798
799 for (i = 0; i < orig_column_names; i++) {
800 if (orig_column_flag[i]) {
801
803 orig_column_name[i], new_column_name[i])) {
804 fprintf(stderr, "unable to transfer column %s to %s\n",
805 orig_column_name[i], new_column_name[i]);
807 return 1;
808 }
809 }
810 }
811
812#ifdef DEBUG
813 fprintf(stderr, "Writing layout.\n");
814#endif
817 return 1;
818 }
819
820 max_size = 0;
824 buffer =
tmalloc(max_size *
sizeof(
char));
825
826 recovered = 0;
827#ifdef DEBUG
828 fprintf(stderr, "Reading file\n");
829#endif
830 while (!recovered && (pageNumber =
SDDS_ReadPage(&SDDS_orig)) >= 0) {
831 if (pageNumber == 0) {
832 if (!recover) {
833 fprintf(stderr, "error: SDDS data garbled--consider using -recover option\n");
834 fprintf(stderr, "warning: one or more data pages may be missing\n");
835 break;
836 } else {
838 recovered = 1;
839 else {
840 if (recover != 2)
841 fprintf(stderr, "warning: unable to recover data--pages may be missing\n");
842 break;
843 }
844 }
845 }
846 if (fromPage && pageNumber < fromPage)
847 continue;
848 if (removePages) {
849 keep = 1;
850 for (i = 0; i < removePages; i++) {
851 if (removePage[i] == pageNumber) {
852 keep = 0;
853 break;
854 }
855 }
856 if (!keep)
857 continue;
858 }
859 if (keepPages) {
860 keep = 0;
861 for (i = 0; i < keepPages; i++) {
862 if (keepPage[i] == pageNumber) {
863 keep = 1;
864 break;
865 }
866 }
867 if (!keep)
868 continue;
869 }
870 if ((rows = SDDS_RowCount(&SDDS_orig)) < 0) {
871 fprintf(stderr, "error: problem counting rows in input page\n");
873 return 1;
874 }
876 fprintf(stderr, "error: problem starting output page\n");
878 return 1;
879 }
880
881 if (!set_units_conversion(&SDDS_orig, convert_units_array, convert_units_arrays,
882 convert_units_column, convert_units_columns,
883 convert_units_parameter, convert_units_parameters)) {
885 return 1;
886 }
887
888 for (i = 0; i < orig_parameter_names; i++) {
889 if (orig_parameter_flag[i]) {
891 fprintf(stderr, "error: problem getting parameter %s\n", orig_parameter_name[i]);
893 return 1;
894 }
896 new_parameter_name[i], buffer, NULL)) {
897 fprintf(stderr, "error: problem setting parameter %s\n", new_parameter_name[i]);
899 return 1;
900 }
901 }
902 }
903 for (i = 0; i < orig_array_names; i++) {
905 if (orig_array_flag[i]) {
906 if (!(array =
SDDS_GetArray(&SDDS_orig, orig_array_name[i], NULL))) {
907 fprintf(stderr, "error: problem getting array %s\n", orig_array_name[i]);
909 return 1;
910 }
911 if (!
SDDS_SetArray(&SDDS_dataset, new_array_name[i], SDDS_CONTIGUOUS_DATA,
912 array->data, array->dimension)) {
913 fprintf(stderr, "error: problem setting array %s\n", new_array_name[i]);
915 return 1;
916 }
918 }
919 }
920
922 for (i = 0; i < orig_column_names; i++) {
923 if (orig_column_flag[i]) {
925 fprintf(stderr, "error: problem getting column %s\n", orig_column_name[i]);
927 return 1;
928 }
929 if (!
SDDS_SetColumn(&SDDS_dataset, SDDS_SET_BY_NAME, ptr, rows, new_column_name[i])) {
930 fprintf(stderr, "error: problem setting column %s\n", new_column_name[i]);
932 return 1;
933 }
934 }
935 }
936 }
938 fprintf(stderr, "error: problem writing page to file %s\n", output);
940 return 1;
941 }
942 if (toPage && pageNumber >= toPage)
943 break;
944 }
945
948 return 1;
949 }
950
952 return 1;
953
954 for (i = 0; i < orig_parameter_names; i++) {
955 if (orig_parameter_name[i])
956 free(orig_parameter_name[i]);
957 if (new_parameter_name[i])
958 free(new_parameter_name[i]);
959 }
960 if (orig_parameter_name)
961 free(orig_parameter_name);
962 if (new_parameter_name)
963 free(new_parameter_name);
964 if (orig_parameter_flag)
965 free(orig_parameter_flag);
966
967 for (i = 0; i < orig_column_names; i++) {
968 if (orig_column_name[i])
969 free(orig_column_name[i]);
970 if (new_column_name[i])
971 free(new_column_name[i]);
972 }
973 if (orig_column_name)
974 free(orig_column_name);
975 if (new_column_name)
976 free(new_column_name);
977 if (orig_column_flag)
978 free(orig_column_flag);
979
980 for (i = 0; i < orig_array_names; i++) {
981 if (orig_array_name[i])
982 free(orig_array_name[i]);
983 if (new_array_name[i])
984 free(new_array_name[i]);
985 }
986 if (orig_array_name)
987 free(orig_array_name);
988 if (new_array_name)
989 free(new_array_name);
990 if (orig_array_flag)
991 free(orig_array_flag);
992
993 return 0;
994}
int32_t SDDS_ReadRecoveryPossible(SDDS_DATASET *SDDS_dataset)
Checks if any data in an SDDS page was recovered after an error was detected.
int32_t SDDS_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_SetColumn(SDDS_DATASET *SDDS_dataset, int32_t mode, void *data, int64_t rows,...)
Sets the values for one data column in the current data table of an SDDS dataset.
int32_t SDDS_SetArray(SDDS_DATASET *SDDS_dataset, char *array_name, int32_t mode, void *data_pointer, int32_t *dimension)
Sets the values of an array variable in the SDDS dataset using specified dimensions.
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_SetNameValidityFlags(uint32_t flags)
Sets the validity flags for parameter and column names in the SDDS dataset.
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_TransferArrayDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers an array definition from a source dataset to a target dataset.
int32_t SDDS_TransferParameterDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a parameter definition from a source dataset to a target dataset.
void SDDS_FreeArray(SDDS_ARRAY *array)
Frees memory allocated for an SDDS array structure.
char ** SDDS_GetParameterNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all parameters in the SDDS dataset.
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.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
char ** SDDS_GetArrayNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all arrays in the SDDS dataset.
#define SDDS_NUM_TYPES
Total number of defined SDDS data types.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
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.
long replaceFileAndBackUp(char *file, char *replacement)
Replaces a file with a replacement file and creates a backup of the original.
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.