You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
-#include <assert.h>
+#include "error.h"
#include "command.h"
#include <stdio.h>
#include <stdlib.h>
#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"
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. */
bw = find_word (b, &bw_len);
assert (aw != NULL && bw != NULL);
+ /* Words that are the same don't conflict. */
+ if (aw_len == bw_len && !memcmp (aw, bw, aw_len))
+ return 0;
+
+ /* Words that are otherwise the same in the first three letters
+ do conflict. */
return ((aw_len > 3 && bw_len > 3)
|| (aw_len == 3 && bw_len > 3)
|| (bw_len == 3 && aw_len > 3)) && !memcmp (aw, bw, 3);
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 ("-");
{
if (command->skip_entire_name)
lex_get ();
+ if ( command->debug & !test_mode )
+ goto error;
free_words (words, word_cnt);
return command;
}
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;
return CMD_SUCCESS;
}
-/* Extracts a null-terminated 8-or-fewer-character PREFIX from STRING.
- PREFIX is converted to lowercase. Removes trailing spaces from
- STRING as a side effect. */
-static void
-extract_prefix (char *string, char *prefix)
-{
- /* Length of STRING. */
- int len;
-
- /* Points to the null terminator in STRING (`end pointer'). */
- char *ep;
-
- /* Strip spaces from end of STRING. */
- len = strlen (string);
- while (len && isspace ((unsigned char) string[len - 1]))
- string[--len] = 0;
-
- /* Find null terminator. */
- ep = memchr (string, '\0', 8);
- if (!ep)
- ep = &string[8];
-
- /* Copy prefix, converting to lowercase. */
- while (string < ep)
- *prefix++ = tolower ((unsigned char) (*string++));
- *prefix = 0;
-}
-
-/* Prints STRING on the console and to the listing file, replacing \n
- by newline. */
-static void
-output_line (char *string)
-{
- /* Location of \n in line read in. */
- char *cp;
-
- cp = strstr (string, "\\n");
- while (cp)
- {
- *cp = 0;
- tab_output_text (TAB_LEFT | TAT_NOWRAP, string);
- string = &cp[2];
- cp = strstr (string, "\\n");
- }
- tab_output_text (TAB_LEFT | TAT_NOWRAP, string);
-}
-
-/* Parse and execute REMARK command. */
-int
-cmd_remark ()
-{
- /* Points to the line read in. */
- char *s;
-
- /* Index into s. */
- char *cp;
-
- /* 8-character sentinel used to terminate remark. */
- char sentinel[9];
-
- /* Beginning of line used to compare with SENTINEL. */
- char prefix[9];
-
- som_blank_line ();
-
- s = lex_rest_of_line (NULL);
- if (*s == '-')
- {
- output_line (&s[1]);
- return CMD_SUCCESS;
- }
-
- /* Read in SENTINEL from end of current line. */
- cp = s;
- while (isspace ((unsigned char) *cp))
- cp++;
- extract_prefix (cp, sentinel);
- if (sentinel[0] == 0)
- {
- msg (SE, _("The sentinel may not be the empty string."));
- return CMD_FAILURE;
- }
-
- /* Read in other lines until we encounter the sentinel. */
- while (getl_read_line ())
- {
- extract_prefix (ds_value (&getl_buf), prefix);
- if (!strcmp (sentinel, prefix))
- break;
-
- /* Output the line. */
- output_line (ds_value (&getl_buf));
- }
-
- /* Calling lex_entire_line() forces the sentinel line to be
- discarded. */
- getl_prompt = GETL_PRPT_STANDARD;
- lex_entire_line ();
-
- return CMD_SUCCESS;
-}
-
/* Parses the N command. */
int
cmd_n_of_cases (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;
}
static int
run_command (void)
{
- char *cmd;
+ const char *cmd;
int string;
/* Handle either a string argument or a full-line argument. */
lex_get ();
if (!lex_force_string ())
return CMD_FAILURE;
- cmd = ds_value (&tokstr);
+ cmd = ds_c_str (&tokstr);
string = 1;
}
else
{
cmd = lex_rest_of_line (NULL);
+ lex_discard_line ();
string = 0;
}
}
/* 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 */