Implemented the SET=TNUMBERS subcommand
[pspp] / src / language / utilities / set.q
index 5fa7406164bcbe921312a34ce372ff629956c7d8..bb52fe341480c0106d03af8ebd6ae855dcff9f21 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include <stdlib.h>
 #include <time.h>
 
-#include <data/data-in.h>
-#include <data/data-out.h>
-#include <data/dictionary.h>
-#include <data/format.h>
-#include <data/procedure.h>
-#include <data/settings.h>
-#include <data/value.h>
-#include <data/variable.h>
-#include <language/command.h>
-#include <language/lexer/format-parser.h>
-#include <language/lexer/lexer.h>
-#include <libpspp/compiler.h>
-#include <libpspp/copyleft.h>
-#include <libpspp/float-format.h>
-#include <libpspp/integer-format.h>
-#include <libpspp/message.h>
-#include <libpspp/i18n.h>
-#include <math/random.h>
-#include <output/driver.h>
-#include <output/journal.h>
+#include "data/data-in.h"
+#include "data/data-out.h"
+#include "data/dataset.h"
+#include "data/dictionary.h"
+#include "data/format.h"
+#include "data/settings.h"
+#include "data/value.h"
+#include "data/variable.h"
+#include "language/command.h"
+#include "language/lexer/format-parser.h"
+#include "language/lexer/lexer.h"
+#include "libpspp/compiler.h"
+#include "libpspp/copyleft.h"
+#include "libpspp/float-format.h"
+#include "libpspp/i18n.h"
+#include "libpspp/integer-format.h"
+#include "libpspp/message.h"
+#include "math/random.h"
+#include "output/driver.h"
+#include "output/journal.h"
 
 #if HAVE_LIBTERMCAP
 #if HAVE_TERMCAP_H
@@ -101,6 +101,7 @@ int tgetnum (const char *);
      scompression=scompress:on/off;
      scripttab=string "x==1" "one character long";
      seed=custom;
+     tnumbers=custom;
      tb1=string "x==3 || x==11" "3 or 11 characters long";
      tbfonts=string;
      undefined=undef:warn/nowarn;
@@ -298,6 +299,35 @@ stc_custom_blanks (struct lexer *lexer,
   return 1;
 }
 
+static int
+stc_custom_tnumbers (struct lexer *lexer,
+                  struct dataset *ds UNUSED,
+                  struct cmd_set *cmd UNUSED, void *aux UNUSED)
+{
+  lex_match (lexer, T_EQUALS);
+
+  if (lex_match_id (lexer, "VALUES"))
+    {
+      settings_set_value_style (SETTINGS_VAL_STYLE_VALUES);
+    }
+  else if (lex_match_id (lexer, "LABELS"))
+    {
+      settings_set_value_style (SETTINGS_VAL_STYLE_LABELS);
+    }
+  else if (lex_match_id (lexer, "BOTH"))
+    {
+      settings_set_value_style (SETTINGS_VAL_STYLE_BOTH);
+    }
+  else
+    {
+      lex_error (lexer, _("expecting VALUES, LABELS or BOTH"));
+      return 0;
+    }
+
+  return 1;
+}
+
+
 /* Parses the EPOCH subcommand, which controls the epoch used for
    parsing 2-digit years. */
 static int
@@ -493,7 +523,10 @@ stc_custom_journal (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_s
     journal_disable ();
   else if (lex_is_string (lexer) || lex_token (lexer) == T_ID)
     {
-      journal_set_file_name (lex_tokcstr (lexer));
+      char *filename = utf8_to_filename (lex_tokcstr (lexer));
+      journal_set_file_name (filename);
+      free (filename);
+
       lex_get (lexer);
     }
   else
@@ -536,11 +569,11 @@ show_blanks (const struct dataset *ds UNUSED)
 }
 
 static void
-format_cc (struct string *out, struct substring in, char grouping)
+format_cc (struct string *out, const char *in, char grouping)
 {
-  while (!ss_is_empty (in))
+  while (*in != '\0')
     {
-      char c = ss_get_byte (&in);
+      char c = *in++;
       if (c == grouping || c == '\'')
         ds_put_byte (out, '\'');
       else if (c == '"')
@@ -556,13 +589,13 @@ show_cc (enum fmt_type type)
   struct string out;
 
   ds_init_empty (&out);
-  format_cc (&out, cc->neg_prefix, cc->grouping);
+  format_cc (&out, cc->neg_prefix.s, cc->grouping);
   ds_put_byte (&out, cc->grouping);
-  format_cc (&out, cc->prefix, cc->grouping);
+  format_cc (&out, cc->prefix.s, cc->grouping);
   ds_put_byte (&out, cc->grouping);
-  format_cc (&out, cc->suffix, cc->grouping);
+  format_cc (&out, cc->suffix.s, cc->grouping);
   ds_put_byte (&out, cc->grouping);
-  format_cc (&out, cc->neg_suffix, cc->grouping);
+  format_cc (&out, cc->neg_suffix.s, cc->grouping);
 
   return ds_cstr (&out);
 }
@@ -905,12 +938,12 @@ static struct settings *saved_settings[MAX_SAVED_SETTINGS];
 static int n_saved_settings;
 
 int
-cmd_preserve (struct lexer *lexer, struct dataset *ds UNUSED)
+cmd_preserve (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
 {
   if (n_saved_settings < MAX_SAVED_SETTINGS)
     {
       saved_settings[n_saved_settings++] = settings_get ();
-      return lex_end_of_command (lexer);
+      return CMD_SUCCESS;
     }
   else
     {
@@ -922,14 +955,14 @@ cmd_preserve (struct lexer *lexer, struct dataset *ds UNUSED)
 }
 
 int
-cmd_restore (struct lexer *lexer, struct dataset *ds UNUSED)
+cmd_restore (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
 {
   if (n_saved_settings > 0)
     {
       struct settings *s = saved_settings[--n_saved_settings];
       settings_set (s);
       settings_destroy (s);
-      return lex_end_of_command (lexer);
+      return CMD_SUCCESS;
     }
   else
     {