X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcommand.c;h=dc53eba8b0d911bbc1c3e36ca13e1ab9bf16a7ca;hb=304c185799902df1dd96a8ff2d13d279005a82e5;hp=dff2ff4732d7a2e5792856188a0f162225907a63;hpb=b9e28aa5614a079548c616bcf97aa804024ad647;p=pspp diff --git a/src/command.c b/src/command.c index dff2ff4732..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. */ @@ -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 @@ -771,11 +824,11 @@ cmd_host (void) /* Make sure that the system has a command interpreter, then run a command. */ if (system (NULL) != 0) - success = run_command (); + code = run_command (); else { msg (SE, _("No operating system support for this command.")); - success = CMD_FAILURE; + code = CMD_FAILURE; } #endif /* !unix */