X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcommand.c;h=dc53eba8b0d911bbc1c3e36ca13e1ab9bf16a7ca;hb=b7e33825d30a18360f24a18faf4b7d2e9efb8142;hp=5ff4f0de2c0e746cfac3c81b28cb05e9f6380cb6;hpb=92bfefccd465052e492f669ce561aa25b0110283;p=pspp diff --git a/src/command.c b/src/command.c index 5ff4f0de2c..dc53eba8b0 100644 --- a/src/command.c +++ b/src/command.c @@ -25,7 +25,9 @@ #include #include #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) /* Command parser. */ @@ -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;