treewide: Replace <name>_cnt by n_<name>s and <name>_cap by allocated_<name>.
[pspp] / src / language / command.c
index f5db9731c1e6f6d30f8f77bf04d1a76f53c29bf7..924b221b22d2e3851dadc578bec58e64710fc284 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 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
@@ -26,6 +26,7 @@
 #include "data/casereader.h"
 #include "data/dataset.h"
 #include "data/dictionary.h"
+#include "data/session.h"
 #include "data/settings.h"
 #include "data/variable.h"
 #include "language/lexer/command-name.h"
@@ -35,9 +36,9 @@
 #include "libpspp/i18n.h"
 #include "libpspp/message.h"
 #include "libpspp/str.h"
-#include "output/text-item.h"
+#include "output/driver.h"
+#include "output/output-item.h"
 
-#include "xalloc.h"
 #include "xmalloca.h"
 
 #include "gettext.h"
 static inline bool
 cmd_result_is_valid (enum cmd_result result)
 {
-  return (result == CMD_SUCCESS || result == CMD_EOF || result == CMD_FINISH
-          || (result >= CMD_PRIVATE_FIRST && result <= CMD_PRIVATE_LAST)
-          || result == CMD_FAILURE || result == CMD_NOT_IMPLEMENTED
-          || result == CMD_CASCADING_FAILURE);
+  switch (result)
+    {
+    case CMD_SUCCESS:
+    case CMD_EOF:
+    case CMD_FINISH:
+    case CMD_DATA_LIST:
+    case CMD_END_CASE:
+    case CMD_END_FILE:
+    case CMD_FAILURE:
+    case CMD_NOT_IMPLEMENTED:
+    case CMD_CASCADING_FAILURE:
+      return true;
+
+    default:
+      return false;
+    }
 }
 
 /* Returns true if RESULT indicates success,
@@ -110,7 +123,7 @@ static const struct command commands[] =
 #undef DEF_CMD
 #undef UNIMPL_CMD
 
-static const size_t command_cnt = sizeof commands / sizeof *commands;
+static const size_t n_commands = sizeof commands / sizeof *commands;
 
 static bool in_correct_state (const struct command *, enum cmd_state);
 static bool report_state_mismatch (const struct command *, enum cmd_state);
@@ -129,13 +142,14 @@ enum cmd_result
 cmd_parse_in_state (struct lexer *lexer, struct dataset *ds,
                    enum cmd_state state)
 {
+  struct session *session = dataset_session (ds);
   int result;
 
   result = do_parse_command (lexer, ds, state);
 
+  ds = session_active_dataset (session);
   assert (!proc_is_open (ds));
   unset_cmd_algorithm ();
-  dict_clear_aux (dataset_dict (ds));
   if (!dataset_end_of_command (ds))
     result = CMD_CASCADING_FAILURE;
 
@@ -148,7 +162,7 @@ cmd_parse (struct lexer *lexer, struct dataset *ds)
   const struct dictionary *dict = dataset_dict (ds);
   return cmd_parse_in_state (lexer, ds,
                             dataset_has_source (ds) &&
-                            dict_get_var_cnt (dict) > 0 ?
+                            dict_get_n_vars (dict) > 0 ?
                             CMD_STATE_DATA : CMD_STATE_INITIAL);
 }
 
@@ -160,8 +174,8 @@ do_parse_command (struct lexer *lexer,
                  struct dataset *ds, enum cmd_state state)
 {
   const struct command *command = NULL;
+  size_t nesting_level = SIZE_MAX;
   enum cmd_result result;
-  bool opened = false;
   int n_tokens;
 
   /* Read the command's first token. */
@@ -185,8 +199,10 @@ do_parse_command (struct lexer *lexer,
       result = CMD_FAILURE;
       goto finish;
     }
-  text_item_submit (text_item_create (TEXT_ITEM_COMMAND_OPEN, command->name));
-  opened = true;
+
+  nesting_level = output_open_group (group_item_create_nocopy (
+                                       utf8_to_title (command->name),
+                                       utf8_to_title (command->name)));
 
   if (command->function == NULL)
     {
@@ -228,12 +244,12 @@ finish:
     result = lex_end_of_command (lexer);
 
   lex_discard_rest_of_command (lexer);
-  while (lex_token (lexer) == T_ENDCMD)
-    lex_get (lexer);
+  if (result != CMD_EOF && result != CMD_FINISH)
+    while (lex_token (lexer) == T_ENDCMD)
+      lex_get (lexer);
 
-  if (opened)
-    text_item_submit (text_item_create (TEXT_ITEM_COMMAND_CLOSE,
-                                        command->name));
+  if (nesting_level != SIZE_MAX)
+    output_close_groups (nesting_level);
 
   return result;
 }
@@ -246,7 +262,7 @@ find_best_match (struct substring s, const struct command **matchp)
   int missing_words;
 
   command_matcher_init (&cm, s);
-  for (cmd = commands; cmd < &commands[command_cnt]; cmd++)
+  for (cmd = commands; cmd < &commands[n_commands]; cmd++)
     command_matcher_add (&cm, ss_cstr (cmd->name), CONST_CAST (void *, cmd));
 
   *matchp = command_matcher_get_match (&cm);
@@ -359,7 +375,7 @@ report_state_mismatch (const struct command *command, enum cmd_state state)
   assert (!in_correct_state (command, state));
   if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA)
     {
-      switch (command->states)
+      switch ((int) command->states)
         {
           /* One allowed state. */
         case S_INITIAL:
@@ -371,35 +387,35 @@ report_state_mismatch (const struct command *command, enum cmd_state state)
                      "been defined."), command->name);
           break;
         case S_INPUT_PROGRAM:
-          msg (SE, _("%s is allowed only inside INPUT PROGRAM."),
-               command->name);
+          msg (SE, _("%s is allowed only inside %s."),
+               command->name, "INPUT PROGRAM");
           break;
         case S_FILE_TYPE:
-          msg (SE, _("%s is allowed only inside FILE TYPE."), command->name);
+          msg (SE, _("%s is allowed only inside %s."), command->name, "FILE TYPE");
           break;
 
           /* Two allowed states. */
         case S_INITIAL | S_DATA:
           NOT_REACHED ();
         case S_INITIAL | S_INPUT_PROGRAM:
-          msg (SE, _("%s is allowed only before the active dataset has "
-                     "been defined or inside INPUT PROGRAM."), command->name);
+          msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."),
+              command->name, "INPUT PROGRAM");
           break;
         case S_INITIAL | S_FILE_TYPE:
-          msg (SE, _("%s is allowed only before the active dataset has "
-                     "been defined or inside FILE TYPE."), command->name);
+          msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."),
+              command->name, "FILE TYPE");
           break;
         case S_DATA | S_INPUT_PROGRAM:
-          msg (SE, _("%s is allowed only after the active dataset has "
-                     "been defined or inside INPUT PROGRAM."), command->name);
+          msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."),
+              command->name, "INPUT PROGRAM");
           break;
         case S_DATA | S_FILE_TYPE:
-          msg (SE, _("%s is allowed only after the active dataset has "
-                     "been defined or inside FILE TYPE."), command->name);
+          msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."),
+              command->name, "FILE TYPE");
           break;
         case S_INPUT_PROGRAM | S_FILE_TYPE:
-          msg (SE, _("%s is allowed only inside INPUT PROGRAM "
-                     "or inside FILE TYPE."), command->name);
+          msg (SE, _("%s is allowed only inside %s or inside %s."), command->name,
+              "INPUT PROGRAM", "FILE TYPE");
           break;
 
           /* Three allowed states. */
@@ -428,7 +444,7 @@ report_state_mismatch (const struct command *command, enum cmd_state state)
     }
   else if (state == CMD_STATE_INPUT_PROGRAM)
     msg (SE, _("%s is not allowed inside %s."),
-         command->name, "INPUT PROGRAM" );
+        command->name, "INPUT PROGRAM");
   else if (state == CMD_STATE_FILE_TYPE)
     msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE");
 
@@ -455,7 +471,7 @@ cmd_complete (const char *prefix, const struct command **cmd)
   if (*cmd == NULL)
     *cmd = commands;
 
-  for (; *cmd < commands + command_cnt; (*cmd)++)
+  for (; *cmd < commands + n_commands; (*cmd)++)
     if (!memcasecmp ((*cmd)->name, prefix, strlen (prefix))
         && (!((*cmd)->flags & F_TESTING) || settings_get_testing_mode ())
         && (!((*cmd)->flags & F_ENHANCED) || settings_get_syntax () == ENHANCED)
@@ -480,15 +496,12 @@ cmd_finish (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
 int
 cmd_n_of_cases (struct lexer *lexer, struct dataset *ds)
 {
-  /* Value for N. */
-  int x;
-
-  if (!lex_force_int (lexer))
+  if (!lex_force_int_range (lexer, "N OF CASES", 1, LONG_MAX))
     return CMD_FAILURE;
-  x = lex_integer (lexer);
+  long n = lex_integer (lexer);
   lex_get (lexer);
   if (!lex_match_id (lexer, "ESTIMATED"))
-    dict_set_case_limit (dataset_dict (ds), x);
+    dict_set_case_limit (dataset_dict (ds), n);
 
   return CMD_SUCCESS;
 }
@@ -512,7 +525,7 @@ cmd_erase (struct lexer *lexer, struct dataset *ds UNUSED)
 
   if (settings_get_safer_mode ())
     {
-      msg (SE, _("This command not allowed when the SAFER option is set."));
+      msg (SE, _("This command not allowed when the %s option is set."), "SAFER");
       return CMD_FAILURE;
     }