Oops. Added Changelog headings.
[pspp] / src / command.c
index cd2b2038163b41f85d67394d35ed01fa54cefd1e..dc53eba8b0d911bbc1c3e36ca13e1ab9bf16a7ca 100644 (file)
@@ -25,7 +25,9 @@
 #include <ctype.h>
 #include <errno.h>
 #include "alloc.h"
+#include "dictionary.h"
 #include "error.h"
+#include "glob.h"
 #include "getline.h"
 #include "lexer.h"
 #include "main.h"
@@ -62,22 +64,67 @@ struct command
     int (*func) (void);                /* Function to call. */
     int skip_entire_name;       /* If zero, we don't skip the
                                    final token in the command name. */
+    short debug;                /* Set if this cmd available only in test mode*/
   };
 
 /* Define the command array. */
 #define DEFCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 1},
+       {NAME, {T1, T2, T3, T4}, FUNC, 1, 0},
+#define DBGCMD(NAME, T1, T2, T3, T4, FUNC)             \
+       {NAME, {T1, T2, T3, T4}, FUNC, 1, 1},
 #define SPCCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 0},
+       {NAME, {T1, T2, T3, T4}, FUNC, 0, 0},
 #define UNIMPL(NAME, T1, T2, T3, T4)                   \
-       {NAME, {T1, T2, T3, T4}, NULL, 1},
+       {NAME, {T1, T2, T3, T4}, NULL, 1, 0},
 static const struct command commands[] = 
   {
 #include "command.def"
   };
 #undef DEFCMD
+#undef DBGCMD
 #undef UNIMPL
 
+
+/* Complete the line using the name of a command, 
+ * based upon the current prg_state
+ */
+char * 
+pspp_completion_function (const char *text,   int state)
+{
+  static int skip=0;
+  const struct command *cmd = 0;
+  
+  for(;;)
+    {
+      if ( state + skip >= sizeof(commands)/ sizeof(struct command))
+       {
+         skip = 0;
+         return 0;
+       }
+
+      cmd = &commands[state + skip];
+  
+      if ( cmd->transition[pgm_state] == STATE_ERROR || ( cmd->debug  &&  ! test_mode ) ) 
+       {
+         skip++; 
+         continue;
+       }
+      
+      if ( text == 0 || 0 == strncasecmp (cmd->name, text, strlen(text)))
+       {
+         break;
+       }
+
+      skip++;
+    }
+  
+
+  return xstrdup(cmd->name);
+
+}
+
+
+
 #define COMMAND_CNT (sizeof commands / sizeof *commands)
 \f
 /* Command parser. */
@@ -486,7 +533,7 @@ parse_command_name (void)
       
       assert (word_cnt < sizeof words / sizeof *words);
       if (token == T_ID)
-        words[word_cnt++] = xstrdup (ds_value (&tokstr));
+        words[word_cnt++] = xstrdup (ds_c_str (&tokstr));
       else
         words[word_cnt++] = xstrdup ("-");
 
@@ -501,6 +548,8 @@ parse_command_name (void)
             {
               if (command->skip_entire_name)
                 lex_get ();
+             if ( command->debug & !test_mode ) 
+               goto error;
               free_words (words, word_cnt);
               return command;
             }
@@ -544,10 +593,14 @@ parse_command_name (void)
           free (words[word_cnt]);
         }
 
+      if ( command->debug && !test_mode ) 
+       goto error;
+
       free_words (words, word_cnt);
       return command;
     }
 
+error:
   unknown_command_error (words, word_cnt);
   free_words (words, word_cnt);
   return NULL;
@@ -632,10 +685,10 @@ cmd_erase (void)
   if (!lex_force_string ())
     return CMD_FAILURE;
 
-  if (remove (ds_value (&tokstr)) == -1)
+  if (remove (ds_c_str (&tokstr)) == -1)
     {
       msg (SW, _("Error removing `%s': %s."),
-          ds_value (&tokstr), strerror (errno));
+          ds_c_str (&tokstr), strerror (errno));
       return CMD_FAILURE;
     }
 
@@ -713,7 +766,7 @@ run_command (void)
        lex_get ();
        if (!lex_force_string ())
          return CMD_FAILURE;
-       cmd = ds_value (&tokstr);
+       cmd = ds_c_str (&tokstr);
        string = 1;
       }
     else