lexer: Factor some token inspectors out into new token functions.
[pspp] / src / language / command.c
index 8f955b3e4987022ab1bd66950bf0a956668cd206..068ae0ea631a7f19da70898336a2414052205c55 100644 (file)
@@ -36,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"
@@ -174,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. */
@@ -199,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)
     {
@@ -246,9 +248,8 @@ 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;
 }
@@ -443,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");
 
@@ -495,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;
 }