diff options
Diffstat (limited to 'csv.c')
| -rw-r--r-- | csv.c | 91 |
1 files changed, 0 insertions, 91 deletions
| @@ -474,94 +474,3 @@ csv_err_str(csv_err_t csv_err) | |||
| 474 | } | 474 | } |
| 475 | // NOT REACHED | 475 | // NOT REACHED |
| 476 | } | 476 | } |
| 477 | |||
| 478 | static void | ||
| 479 | csv_write_field(FILE *out, const char *field, const csv_options_t *const csv_options) | ||
| 480 | { | ||
| 481 | assert(csv_options != NULL); | ||
| 482 | assert(field != NULL); | ||
| 483 | assert(out != NULL); | ||
| 484 | |||
| 485 | register const int DELIM = csv_options->field_delimiter; | ||
| 486 | |||
| 487 | if ( *field != '\0' ) { | ||
| 488 | putc(DELIM, out); | ||
| 489 | |||
| 490 | for ( ; *field != '\0'; ++field ) { | ||
| 491 | if ( *field == DELIM ) { | ||
| 492 | putc(DELIM, out); | ||
| 493 | putc(DELIM, out); | ||
| 494 | } | ||
| 495 | else { | ||
| 496 | putc(*field, out); | ||
| 497 | } | ||
| 498 | } | ||
| 499 | |||
| 500 | putc(DELIM, out); | ||
| 501 | } | ||
| 502 | |||
| 503 | if ( ferror(out) ) { | ||
| 504 | csv_fatal_error(CSV_ERR_IO_WRITE, csv_options); | ||
| 505 | } | ||
| 506 | } | ||
| 507 | |||
| 508 | void | ||
| 509 | csv_write(FILE *out, const csv_t *const csv) | ||
| 510 | { | ||
| 511 | assert(out != NULL); | ||
| 512 | assert(csv != NULL); | ||
| 513 | assert(csv->csv_options != NULL); | ||
| 514 | assert(csv->csv_string.str != NULL); | ||
| 515 | assert(csv->csv_field.fields != NULL); | ||
| 516 | |||
| 517 | register const int SEP = csv->csv_options->field_separator; | ||
| 518 | |||
| 519 | if ( 0 < csv->csv_field.pos ) { | ||
| 520 | const char *str = csv->csv_string.str; | ||
| 521 | const int * field = csv->csv_field.fields; | ||
| 522 | |||
| 523 | csv_write_field(out, &str[*field++], csv->csv_options); | ||
| 524 | |||
| 525 | for ( int i = 1; i < csv->csv_field.pos; ++i ) { | ||
| 526 | putc(SEP, out); | ||
| 527 | csv_write_field(out, &str[*field++], csv->csv_options); | ||
| 528 | } | ||
| 529 | } | ||
| 530 | putc('\r', out); | ||
| 531 | putc('\n', out); | ||
| 532 | |||
| 533 | if ( ferror(out) ) { | ||
| 534 | csv_fatal_error(CSV_ERR_IO_WRITE, csv->csv_options); | ||
| 535 | } | ||
| 536 | } | ||
| 537 | |||
| 538 | void | ||
| 539 | csv_write_ex(FILE *out, int n, const char *fields[], const csv_options_t *csv_options) | ||
| 540 | { | ||
| 541 | assert(out != NULL); | ||
| 542 | assert(fields != NULL); | ||
| 543 | |||
| 544 | if ( csv_options == NULL ) { | ||
| 545 | csv_options = &csv_default_options; | ||
| 546 | } | ||
| 547 | |||
| 548 | register const int SEP = csv_options->field_separator; | ||
| 549 | |||
| 550 | // process first field | ||
| 551 | if ( 0 != n && *fields != NULL ) { | ||
| 552 | --n; | ||
| 553 | csv_write_field(out, *fields++, csv_options); | ||
| 554 | |||
| 555 | // process next fields | ||
| 556 | for ( ; n && *fields != NULL; --n, ++fields ) { | ||
| 557 | putc(SEP, out); | ||
| 558 | csv_write_field(out, *fields, csv_options); | ||
| 559 | } | ||
| 560 | } | ||
| 561 | putc('\r', out); | ||
| 562 | putc('\n', out); | ||
| 563 | |||
| 564 | if ( ferror(out) ) { | ||
| 565 | csv_fatal_error(CSV_ERR_IO_WRITE, csv_options); | ||
| 566 | } | ||
| 567 | } | ||
