projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
DEFINE: Properly support redefining a macro.
[pspp]
/
src
/
language
/
command.c
diff --git
a/src/language/command.c
b/src/language/command.c
index d9fc463315fac68b0b82e65fe148db107d696ae0..068ae0ea631a7f19da70898336a2414052205c55 100644
(file)
--- a/
src/language/command.c
+++ b/
src/language/command.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2009, 2010, 2011
, 2012, 2013, 2014
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-26,6
+26,7
@@
#include "data/casereader.h"
#include "data/dataset.h"
#include "data/dictionary.h"
#include "data/casereader.h"
#include "data/dataset.h"
#include "data/dictionary.h"
+#include "data/session.h"
#include "data/settings.h"
#include "data/variable.h"
#include "language/lexer/command-name.h"
#include "data/settings.h"
#include "data/variable.h"
#include "language/lexer/command-name.h"
@@
-35,9
+36,9
@@
#include "libpspp/i18n.h"
#include "libpspp/message.h"
#include "libpspp/str.h"
#include "libpspp/i18n.h"
#include "libpspp/message.h"
#include "libpspp/str.h"
-#include "output/text-item.h"
+#include "output/driver.h"
+#include "output/output-item.h"
-#include "xalloc.h"
#include "xmalloca.h"
#include "gettext.h"
#include "xmalloca.h"
#include "gettext.h"
@@
-49,10
+50,22
@@
static inline bool
cmd_result_is_valid (enum cmd_result result)
{
static inline bool
cmd_result_is_valid (enum cmd_result result)
{
- return (result == CMD_SUCCESS || result == CMD_EOF || result == CMD_FINISH
- || (result >= CMD_PRIVATE_FIRST && result <= CMD_PRIVATE_LAST)
- || result == CMD_FAILURE || result == CMD_NOT_IMPLEMENTED
- || result == CMD_CASCADING_FAILURE);
+ switch (result)
+ {
+ case CMD_SUCCESS:
+ case CMD_EOF:
+ case CMD_FINISH:
+ case CMD_DATA_LIST:
+ case CMD_END_CASE:
+ case CMD_END_FILE:
+ case CMD_FAILURE:
+ case CMD_NOT_IMPLEMENTED:
+ case CMD_CASCADING_FAILURE:
+ return true;
+
+ default:
+ return false;
+ }
}
/* Returns true if RESULT indicates success,
}
/* Returns true if RESULT indicates success,
@@
-76,8
+89,8
@@
cmd_result_is_failure (enum cmd_result result)
/* Command processing states. */
enum states
{
/* Command processing states. */
enum states
{
- S_INITIAL = 0x01, /* Allowed before active
file
defined. */
- S_DATA = 0x02, /* Allowed after active
file
defined. */
+ S_INITIAL = 0x01, /* Allowed before active
dataset
defined. */
+ S_DATA = 0x02, /* Allowed after active
dataset
defined. */
S_INPUT_PROGRAM = 0x04, /* Allowed in INPUT PROGRAM. */
S_FILE_TYPE = 0x08, /* Allowed in FILE TYPE. */
S_ANY = 0x0f /* Allowed anywhere. */
S_INPUT_PROGRAM = 0x04, /* Allowed in INPUT PROGRAM. */
S_FILE_TYPE = 0x08, /* Allowed in FILE TYPE. */
S_ANY = 0x0f /* Allowed anywhere. */
@@
-129,13
+142,14
@@
enum cmd_result
cmd_parse_in_state (struct lexer *lexer, struct dataset *ds,
enum cmd_state state)
{
cmd_parse_in_state (struct lexer *lexer, struct dataset *ds,
enum cmd_state state)
{
+ struct session *session = dataset_session (ds);
int result;
result = do_parse_command (lexer, ds, state);
int result;
result = do_parse_command (lexer, ds, state);
+ ds = session_active_dataset (session);
assert (!proc_is_open (ds));
unset_cmd_algorithm ();
assert (!proc_is_open (ds));
unset_cmd_algorithm ();
- dict_clear_aux (dataset_dict (ds));
if (!dataset_end_of_command (ds))
result = CMD_CASCADING_FAILURE;
if (!dataset_end_of_command (ds))
result = CMD_CASCADING_FAILURE;
@@
-160,8
+174,8
@@
do_parse_command (struct lexer *lexer,
struct dataset *ds, enum cmd_state state)
{
const struct command *command = NULL;
struct dataset *ds, enum cmd_state state)
{
const struct command *command = NULL;
+ size_t nesting_level = SIZE_MAX;
enum cmd_result result;
enum cmd_result result;
- bool opened = false;
int n_tokens;
/* Read the command's first token. */
int n_tokens;
/* Read the command's first token. */
@@
-185,8
+199,10
@@
do_parse_command (struct lexer *lexer,
result = CMD_FAILURE;
goto finish;
}
result = CMD_FAILURE;
goto finish;
}
- text_item_submit (text_item_create (TEXT_ITEM_COMMAND_OPEN, command->name));
- opened = true;
+
+ nesting_level = output_open_group (group_item_create_nocopy (
+ utf8_to_title (command->name),
+ utf8_to_title (command->name)));
if (command->function == NULL)
{
if (command->function == NULL)
{
@@
-228,12
+244,12
@@
finish:
result = lex_end_of_command (lexer);
lex_discard_rest_of_command (lexer);
result = lex_end_of_command (lexer);
lex_discard_rest_of_command (lexer);
- while (lex_token (lexer) == T_ENDCMD)
- lex_get (lexer);
+ if (result != CMD_EOF && result != CMD_FINISH)
+ while (lex_token (lexer) == T_ENDCMD)
+ lex_get (lexer);
- if (opened)
- text_item_submit (text_item_create (TEXT_ITEM_COMMAND_CLOSE,
- command->name));
+ if (nesting_level != SIZE_MAX)
+ output_close_groups (nesting_level);
return result;
}
return result;
}
@@
-359,57
+375,57
@@
report_state_mismatch (const struct command *command, enum cmd_state state)
assert (!in_correct_state (command, state));
if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA)
{
assert (!in_correct_state (command, state));
if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA)
{
- switch (command->states)
+ switch (
(int)
command->states)
{
/* One allowed state. */
case S_INITIAL:
{
/* One allowed state. */
case S_INITIAL:
- msg (SE, _("%s is allowed only before the active
file
has "
+ msg (SE, _("%s is allowed only before the active
dataset
has "
"been defined."), command->name);
break;
case S_DATA:
"been defined."), command->name);
break;
case S_DATA:
- msg (SE, _("%s is allowed only after the active
file
has "
+ msg (SE, _("%s is allowed only after the active
dataset
has "
"been defined."), command->name);
break;
case S_INPUT_PROGRAM:
"been defined."), command->name);
break;
case S_INPUT_PROGRAM:
- msg (SE, _("%s is allowed only inside
INPUT PROGRAM
."),
- command->name);
+ msg (SE, _("%s is allowed only inside
%s
."),
+ command->name
, "INPUT PROGRAM"
);
break;
case S_FILE_TYPE:
break;
case S_FILE_TYPE:
- msg (SE, _("%s is allowed only inside
FILE TYPE."), command->name
);
+ msg (SE, _("%s is allowed only inside
%s."), command->name, "FILE TYPE"
);
break;
/* Two allowed states. */
case S_INITIAL | S_DATA:
NOT_REACHED ();
case S_INITIAL | S_INPUT_PROGRAM:
break;
/* Two allowed states. */
case S_INITIAL | S_DATA:
NOT_REACHED ();
case S_INITIAL | S_INPUT_PROGRAM:
- msg (SE, _("%s is allowed only before the active
file has "
-
"been defined or inside INPUT PROGRAM."), command->name
);
+ msg (SE, _("%s is allowed only before the active
dataset has been defined or inside %s."),
+
command->name, "INPUT PROGRAM"
);
break;
case S_INITIAL | S_FILE_TYPE:
break;
case S_INITIAL | S_FILE_TYPE:
- msg (SE, _("%s is allowed only before the active
file has "
-
"been defined or inside FILE TYPE."), command->name
);
+ msg (SE, _("%s is allowed only before the active
dataset has been defined or inside %s."),
+
command->name, "FILE TYPE"
);
break;
case S_DATA | S_INPUT_PROGRAM:
break;
case S_DATA | S_INPUT_PROGRAM:
- msg (SE, _("%s is allowed only after the active
file has "
-
"been defined or inside INPUT PROGRAM."), command->name
);
+ msg (SE, _("%s is allowed only after the active
dataset has been defined or inside %s."),
+
command->name, "INPUT PROGRAM"
);
break;
case S_DATA | S_FILE_TYPE:
break;
case S_DATA | S_FILE_TYPE:
- msg (SE, _("%s is allowed only after the active
file has "
-
"been defined or inside FILE TYPE."), command->name
);
+ msg (SE, _("%s is allowed only after the active
dataset has been defined or inside %s."),
+
command->name, "FILE TYPE"
);
break;
case S_INPUT_PROGRAM | S_FILE_TYPE:
break;
case S_INPUT_PROGRAM | S_FILE_TYPE:
- msg (SE, _("%s is allowed only inside
INPUT PROGRAM "
-
"or inside FILE TYPE."), command->name
);
+ msg (SE, _("%s is allowed only inside
%s or inside %s."), command->name,
+
"INPUT PROGRAM", "FILE TYPE"
);
break;
/* Three allowed states. */
case S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE:
break;
/* Three allowed states. */
case S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE:
- msg (SE, _("%s is allowed only after the active
file
has "
+ msg (SE, _("%s is allowed only after the active
dataset
has "
"been defined, inside INPUT PROGRAM, or inside "
"FILE TYPE."), command->name);
break;
case S_INITIAL | S_INPUT_PROGRAM | S_FILE_TYPE:
"been defined, inside INPUT PROGRAM, or inside "
"FILE TYPE."), command->name);
break;
case S_INITIAL | S_INPUT_PROGRAM | S_FILE_TYPE:
- msg (SE, _("%s is allowed only before the active
file
has "
+ msg (SE, _("%s is allowed only before the active
dataset
has "
"been defined, inside INPUT PROGRAM, or inside "
"FILE TYPE."), command->name);
break;
"been defined, inside INPUT PROGRAM, or inside "
"FILE TYPE."), command->name);
break;
@@
-428,7
+444,7
@@
report_state_mismatch (const struct command *command, enum cmd_state state)
}
else if (state == CMD_STATE_INPUT_PROGRAM)
msg (SE, _("%s is not allowed inside %s."),
}
else if (state == CMD_STATE_INPUT_PROGRAM)
msg (SE, _("%s is not allowed inside %s."),
-
command->name, "INPUT PROGRAM"
);
+
command->name, "INPUT PROGRAM"
);
else if (state == CMD_STATE_FILE_TYPE)
msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE");
else if (state == CMD_STATE_FILE_TYPE)
msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE");
@@
-480,15
+496,12
@@
cmd_finish (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
int
cmd_n_of_cases (struct lexer *lexer, struct dataset *ds)
{
int
cmd_n_of_cases (struct lexer *lexer, struct dataset *ds)
{
- /* Value for N. */
- int x;
-
- if (!lex_force_int (lexer))
+ if (!lex_force_int_range (lexer, "N OF CASES", 1, LONG_MAX))
return CMD_FAILURE;
return CMD_FAILURE;
-
x
= lex_integer (lexer);
+
long n
= lex_integer (lexer);
lex_get (lexer);
if (!lex_match_id (lexer, "ESTIMATED"))
lex_get (lexer);
if (!lex_match_id (lexer, "ESTIMATED"))
- dict_set_case_limit (dataset_dict (ds),
x
);
+ dict_set_case_limit (dataset_dict (ds),
n
);
return CMD_SUCCESS;
}
return CMD_SUCCESS;
}
@@
-512,7
+525,7
@@
cmd_erase (struct lexer *lexer, struct dataset *ds UNUSED)
if (settings_get_safer_mode ())
{
if (settings_get_safer_mode ())
{
- msg (SE, _("This command not allowed when the
SAFER option is set.")
);
+ msg (SE, _("This command not allowed when the
%s option is set."), "SAFER"
);
return CMD_FAILURE;
}
return CMD_FAILURE;
}