X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fprint.c;fp=src%2Flanguage%2Fdata-io%2Fprint.c;h=71791ba59541573b8b2f192f2627ea4182962bca;hp=cffa3bd49fdd29f480798c311ba796ae791ff1da;hb=e3f69c13478f07af6a956a9e4f1ea6eddb0d2986;hpb=5135a2c6c97e5dccab6010d19473003bcdb0cc9f diff --git a/src/language/data-io/print.c b/src/language/data-io/print.c index cffa3bd49f..71791ba595 100644 --- a/src/language/data-io/print.c +++ b/src/language/data-io/print.c @@ -88,7 +88,11 @@ struct print_trns struct dfm_writer *writer; /* Output file, NULL=listing file. */ struct ll_list specs; /* List of struct prt_out_specs. */ size_t record_cnt; /* Number of records to write. */ - struct string line; /* Output buffer. */ + struct u8_line line; /* Output buffer. */ + + int unit; /* Unit width, in bytes. */ + char one[MAX_UNIT]; /* '1' in encoding, 'unit' bytes long. */ + char space[MAX_UNIT]; /* \n in encoding, 'unit' bytes long. */ }; enum which_formats @@ -145,8 +149,8 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, trns->writer = NULL; trns->record_cnt = 0; ll_init (&trns->specs); - ds_init_empty (&trns->line); - ds_register_pool (&trns->line, trns->pool); + u8_line_init (&trns->line); + u8_line_register_pool (&trns->line, trns->pool); tmp_pool = pool_create_subpool (trns->pool); @@ -470,20 +474,33 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) int record = 1; struct prt_out_spec *spec; - ds_clear (&trns->line); - ds_put_byte (&trns->line, ' '); + u8_line_clear (&trns->line); + + ds_put_byte (&trns->line.s, ' '); + trns->line.width = 0; + ll_for_each (spec, struct prt_out_spec, ll, &trns->specs) { flush_records (trns, spec->record, &eject, &record); - ds_set_length (&trns->line, spec->first_column, encoded_space); if (spec->type == PRT_VAR) { const union value *input = case_data (*c, spec->var); if (!spec->sysmis_as_spaces || input->f != SYSMIS) - data_out_recode (input, var_get_encoding (spec->var), - &spec->format, &trns->line, trns->encoding); + { + char *s = data_out (input, var_get_encoding (spec->var), + &spec->format); + int width = u8_strwidth (s); + size_t n = strlen (s); + u8_line_put (&trns->line, spec->first_column, + spec->first_column + width, s, n); + free (s); + } else + { + memset (u8_line-record + + } ds_put_byte_multiple (&trns->line, encoded_space, spec->format.w); if (spec->add_space) ds_put_byte (&trns->line, encoded_space); @@ -491,11 +508,11 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) else { ds_put_substring (&trns->line, ds_ss (&spec->string)); - if (0 != strcmp (trns->encoding, C_ENCODING)) + if (0 != strcmp (trns->encoding, UTF8)) { size_t length = ds_length (&spec->string); char *data = ss_data (ds_tail (&trns->line, length)); - char *s = recode_string (trns->encoding, C_ENCODING, data, length); + char *s = recode_string (trns->encoding, UTF8, data, length); memcpy (data, s, length); free (s); }