X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcsv.c;h=1c6662793fc3fafd5c40f83d3a668f700e32bc8d;hb=5805214e9bb9e2a4705ada8cdf5f5d0f1814db0e;hp=0067c61202e306c41fd36e0d991ae94f919536cd;hpb=6fd821e557390a8f86f37c192fd1a4c4e057c9c3;p=pspp diff --git a/src/output/csv.c b/src/output/csv.c index 0067c61202..1c6662793f 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -128,26 +128,49 @@ csv_flush (struct output_driver *driver) } static void -csv_output_field (struct csv_driver *csv, const char *field) +csv_output_field__ (struct csv_driver *csv, struct substring field) { - while (*field == ' ') - field++; + ss_ltrim (&field, ss_cstr (" ")); - if (csv->quote && field[strcspn (field, csv->quote_set)]) + if (csv->quote && ss_cspan (field, ss_cstr (csv->quote_set)) < field.length) { - const char *p; - putc (csv->quote, csv->file); - for (p = field; *p != '\0'; p++) + for (size_t i = 0; i < field.length; i++) { - if (*p == csv->quote) + if (field.string[i] == csv->quote) putc (csv->quote, csv->file); - putc (*p, csv->file); + putc (field.string[i], csv->file); } putc (csv->quote, csv->file); } else - fputs (field, csv->file); + fwrite (field.string, field.length, 1, csv->file); +} + +static void +csv_output_field (struct csv_driver *csv, const char *field) +{ + csv_output_field__ (csv, ss_cstr (field)); +} + +static void +csv_put_separator (struct csv_driver *csv) +{ + if (csv->n_items++ > 0) + putc ('\n', csv->file); +} + +static void +csv_output_lines (struct csv_driver *csv, const char *text_) +{ + struct substring text = ss_cstr (text_); + struct substring line; + size_t save_idx = 0; + while (ss_separate (text, ss_cstr ("\n"), &save_idx, &line)) + { + csv_output_field__ (csv, line); + putc ('\n', csv->file); + } } static void @@ -173,13 +196,6 @@ csv_output_table_item_text (struct csv_driver *csv, putc ('\n', csv->file); } -static void -csv_put_separator (struct csv_driver *csv) -{ - if (csv->n_items++ > 0) - putc ('\n', csv->file); -} - static void csv_submit (struct output_driver *driver, const struct output_item *output_item) @@ -211,7 +227,8 @@ csv_submit (struct output_driver *driver, if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0]) csv_output_field (csv, ""); - else if (!(cell.options & TAB_MARKUP) && !cell.n_footnotes) + else if (!(cell.options & TAB_MARKUP) && !cell.n_footnotes + && !cell.n_subscripts && !cell.superscript) csv_output_field (csv, cell.text); else { @@ -226,12 +243,16 @@ csv_submit (struct output_driver *driver, else ds_put_cstr (&s, cell.text); + if (cell.n_subscripts) + for (size_t i = 0; i < cell.n_subscripts; i++) + ds_put_format (&s, "%c%s", + i ? ',' : '_', cell.subscripts[i]); + if (cell.superscript) + ds_put_format (&s, "^%s", cell.superscript); csv_format_footnotes (cell.footnotes, cell.n_footnotes, &s); csv_output_field (csv, ds_cstr (&s)); ds_destroy (&s); } - - table_cell_free (&cell); } putc ('\n', csv->file); } @@ -247,13 +268,12 @@ csv_submit (struct output_driver *driver, fputs ("\nFootnotes:\n", csv->file); for (size_t i = 0; i < n_footnotes; i++) - if (f[i]) - { - csv_output_field (csv, f[i]->marker); - fputs (csv->separator, csv->file); - csv_output_field (csv, f[i]->content); - putc ('\n', csv->file); - } + { + csv_output_field (csv, f[i]->marker); + fputs (csv->separator, csv->file); + csv_output_field (csv, f[i]->content); + putc ('\n', csv->file); + } free (f); } @@ -268,15 +288,15 @@ csv_submit (struct output_driver *driver, return; csv_put_separator (csv); + if (text_item->markup) { char *plain_text = output_get_text_from_markup (text); - csv_output_field (csv, plain_text); + csv_output_lines (csv, plain_text); free (plain_text); } else - csv_output_field (csv, text); - putc ('\n', csv->file); + csv_output_lines (csv, text); } else if (is_message_item (output_item)) {