projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Oops. Added Changelog headings.
[pspp]
/
src
/
command.c
diff --git
a/src/command.c
b/src/command.c
index 5ff4f0de2c0e746cfac3c81b28cb05e9f6380cb6..dc53eba8b0d911bbc1c3e36ca13e1ab9bf16a7ca 100644
(file)
--- a/
src/command.c
+++ b/
src/command.c
@@
-25,7
+25,9
@@
#include <ctype.h>
#include <errno.h>
#include "alloc.h"
#include <ctype.h>
#include <errno.h>
#include "alloc.h"
+#include "dictionary.h"
#include "error.h"
#include "error.h"
+#include "glob.h"
#include "getline.h"
#include "lexer.h"
#include "main.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. */
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) \
};
/* 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) \
#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) \
#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
static const struct command commands[] =
{
#include "command.def"
};
#undef DEFCMD
+#undef DBGCMD
#undef UNIMPL
#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. */
#define COMMAND_CNT (sizeof commands / sizeof *commands)
\f
/* Command parser. */
@@
-501,6
+548,8
@@
parse_command_name (void)
{
if (command->skip_entire_name)
lex_get ();
{
if (command->skip_entire_name)
lex_get ();
+ if ( command->debug & !test_mode )
+ goto error;
free_words (words, word_cnt);
return command;
}
free_words (words, word_cnt);
return command;
}
@@
-544,10
+593,14
@@
parse_command_name (void)
free (words[word_cnt]);
}
free (words[word_cnt]);
}
+ if ( command->debug && !test_mode )
+ goto error;
+
free_words (words, word_cnt);
return command;
}
free_words (words, word_cnt);
return command;
}
+error:
unknown_command_error (words, word_cnt);
free_words (words, word_cnt);
return NULL;
unknown_command_error (words, word_cnt);
free_words (words, word_cnt);
return NULL;