message: Introduce underlining for error message regions.
[pspp] / src / language / data-io / print.c
index 3b34dfcd8767ab09214d8edf9f9ed36f738d1639..c0fc3d84f115bfbeebcb761ad880ab2ab16b1f33 100644 (file)
 #include "libpspp/misc.h"
 #include "libpspp/pool.h"
 #include "libpspp/u8-line.h"
+#include "output/driver.h"
 #include "output/pivot-table.h"
 #include "output/table.h"
-#include "output/text-item.h"
+#include "output/output-item.h"
 
 #include "gl/xalloc.h"
 
@@ -174,7 +175,7 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds,
        {
          lex_match (lexer, T_EQUALS);
          lex_match (lexer, T_LPAREN);
-         if (!lex_force_int (lexer))
+         if (!lex_force_int_range (lexer, "RECORDS", 0, INT_MAX))
            goto error;
          trns->record_cnt = lex_integer (lexer);
          lex_get (lexer);
@@ -504,7 +505,7 @@ print_text_trns_proc (void *trns_, struct ccase **c,
               char *s;
 
               s = data_out (input, var_get_encoding (spec->var),
-                            &spec->format);
+                            &spec->format, settings_get_fmt_settings ());
               len = strlen (s);
               width = u8_width (CHAR_CAST (const uint8_t *, s), len, UTF8);
               x1 = x0 + width;
@@ -555,14 +556,14 @@ print_text_flush_records (struct print_trns *trns, struct u8_line *line,
         {
           *eject = false;
           if (trns->writer == NULL)
-            text_item_submit (text_item_create (TEXT_ITEM_EJECT_PAGE, ""));
+            output_item_submit (page_break_item_create ());
           else
             leader = '1';
         }
       *u8_line_reserve (line, 0, 1, 1) = leader;
 
       if (trns->writer == NULL)
-        table_output_text (TAB_FIX, ds_cstr (&line->s) + 1);
+        output_log ("%s", ds_cstr (&line->s) + 1);
       else
         {
           size_t len = ds_length (&line->s);
@@ -574,14 +575,7 @@ print_text_flush_records (struct print_trns *trns, struct u8_line *line,
               len--;
             }
 
-          if (is_encoding_utf8 (trns->encoding))
-            dfm_put_record (trns->writer, s, len);
-          else
-            {
-              char *recoded = recode_string (trns->encoding, UTF8, s, len);
-              dfm_put_record (trns->writer, recoded, strlen (recoded));
-              free (recoded);
-            }
+          dfm_put_record_utf8 (trns->writer, s, len);
         }
     }
 }
@@ -616,7 +610,8 @@ print_binary_trns_proc (void *trns_, struct ccase **c,
           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, &line, trns->encoding);
+                             &spec->format, settings_get_fmt_settings (),
+                             &line, trns->encoding);
           else
             ds_put_byte_multiple (&line, encoded_space, spec->format.w);
           if (spec->add_space)