#include "gettext.h"
#define _(msgid) gettext (msgid)
-/* Set variables' alignment
- This is the alignment for GUI display only.
- It affects nothing but GUIs
-*/
int
cmd_variable_alignment (struct lexer *lexer, struct dataset *ds)
{
struct variable **v;
size_t nv;
- size_t i;
- enum alignment align;
-
if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE))
return CMD_FAILURE;
- if (lex_force_match (lexer, T_LPAREN))
- {
- if (lex_match_id (lexer, "LEFT"))
- align = ALIGN_LEFT;
- else if (lex_match_id (lexer, "RIGHT"))
- align = ALIGN_RIGHT;
- else if (lex_match_id (lexer, "CENTER"))
- align = ALIGN_CENTRE;
- else
- {
- free (v);
- return CMD_FAILURE;
- }
-
- if (!lex_force_match (lexer, T_RPAREN))
- return CMD_FAILURE;
- }
+ if (!lex_force_match (lexer, T_LPAREN))
+ goto error;
+
+ enum alignment align;
+ if (lex_match_id (lexer, "LEFT"))
+ align = ALIGN_LEFT;
+ else if (lex_match_id (lexer, "RIGHT"))
+ align = ALIGN_RIGHT;
+ else if (lex_match_id (lexer, "CENTER"))
+ align = ALIGN_CENTRE;
else
{
- free (v);
- return CMD_FAILURE;
+ lex_error_expecting (lexer, "LEFT", "RIGHT", "CENTER");
+ goto error;
}
- for(i = 0 ; i < nv ; ++i)
+ if (!lex_force_match (lexer, T_RPAREN))
+ goto error;
+
+ for (size_t i = 0; i < nv; ++i)
var_set_alignment (v[i], align);
while (lex_token (lexer) == T_SLASH)
lex_get (lexer);
free (v);
+ continue;
+ error:
+ free (v);
+ return CMD_FAILURE;
}
while (lex_token (lexer) != T_ENDCMD);
return CMD_SUCCESS;
}
-/* Set variables' display width.
- This is the width for GUI display only.
- It affects nothing but GUIs
-*/
int
cmd_variable_width (struct lexer *lexer, struct dataset *ds)
{
do
{
struct variable **v;
- long int width;
size_t nv;
- size_t i;
-
if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE))
return CMD_FAILURE;
if (!lex_force_match (lexer, T_LPAREN)
|| !lex_force_int_range (lexer, NULL, 1, INT_MAX))
- {
- free (v);
- return CMD_FAILURE;
- }
- width = lex_integer (lexer);
+ goto error;
+ long width = lex_integer (lexer);
lex_get (lexer);
if (!lex_force_match (lexer, T_RPAREN))
- {
- free (v);
- return CMD_FAILURE;
- }
+ goto error;
width = MIN (width, 2 * MAX_STRING);
- for(i = 0 ; i < nv ; ++i)
+ for (size_t i = 0; i < nv; ++i)
var_set_display_width (v[i], width);
while (lex_token (lexer) == T_SLASH)
lex_get (lexer);
free (v);
+ continue;
+ error:
+ free (v);
+ return CMD_FAILURE;
}
while (lex_token (lexer) != T_ENDCMD);
return CMD_SUCCESS;
{
struct variable **v;
size_t nv;
- enum measure level;
- size_t i;
if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE))
return CMD_FAILURE;
- if (lex_force_match (lexer, T_LPAREN))
- {
- if (lex_match_id (lexer, "SCALE"))
- level = MEASURE_SCALE;
- else if (lex_match_id (lexer, "ORDINAL"))
- level = MEASURE_ORDINAL;
- else if (lex_match_id (lexer, "NOMINAL"))
- level = MEASURE_NOMINAL;
- else
- {
- free (v);
- return CMD_FAILURE;
- }
-
- if (!lex_force_match (lexer, T_RPAREN))
- return CMD_FAILURE;
- }
+ if (!lex_force_match (lexer, T_LPAREN))
+ goto error;
+
+ enum measure level;
+ if (lex_match_id (lexer, "SCALE"))
+ level = MEASURE_SCALE;
+ else if (lex_match_id (lexer, "ORDINAL"))
+ level = MEASURE_ORDINAL;
+ else if (lex_match_id (lexer, "NOMINAL"))
+ level = MEASURE_NOMINAL;
else
{
- free (v);
- return CMD_FAILURE;
+ lex_error_expecting (lexer, "SCALE", "ORDINAL", "NOMINAL");
+ goto error;
}
- for(i = 0 ; i < nv ; ++i)
- var_set_measure (v[i], level);
+ if (!lex_force_match (lexer, T_RPAREN))
+ goto error;
+ for (size_t i = 0; i < nv; ++i)
+ var_set_measure (v[i], level);
while (lex_token (lexer) == T_SLASH)
lex_get (lexer);
free (v);
+ continue;
+ error:
+ free (v);
+ return CMD_FAILURE;
}
while (lex_token (lexer) != T_ENDCMD);
return CMD_SUCCESS;
}
-/* Set variables' role */
int
cmd_variable_role (struct lexer *lexer, struct dataset *ds)
{
- while (lex_match (lexer, T_SLASH))
+ do
{
- struct variable **v;
- size_t nv;
- enum var_role role;
- size_t i;
+ if (!lex_force_match (lexer, T_SLASH))
+ return CMD_FAILURE;
+ enum var_role role;
if (lex_match_id (lexer, "INPUT"))
role = ROLE_INPUT;
else if (lex_match_id (lexer, "TARGET"))
role = ROLE_SPLIT;
else
{
- lex_error (lexer, NULL);
+ lex_error_expecting (lexer, "INPUT", "TARGET", "BOTH",
+ "NONE", "PARTITION", "SPLIT");
return CMD_FAILURE;
}
+ struct variable **v;
+ size_t nv;
if (!parse_variables (lexer, dataset_dict (ds), &v, &nv, PV_NONE))
return CMD_FAILURE;
- for (i = 0; i < nv; i++)
+ for (size_t i = 0; i < nv; i++)
var_set_role (v[i], role);
+
free (v);
}
+ while (lex_token (lexer) != T_ENDCMD);
return CMD_SUCCESS;
}
AT_BANNER([variable display attributes])
AT_SETUP([variable display attribute commands])
+AT_KEYWORDS([VARIABLE ALIGNMENT])
+AT_KEYWORDS([VARIABLE WIDTH])
+AT_KEYWORDS([VARIABLE LEVEL])
+AT_KEYWORDS([VARIABLE ROLE])
AT_DATA([var-display.sps], [dnl
DATA LIST FREE /x y z.
VARIABLE ALIGNMENT x (LEFT)/y (RIGHT)/z (CENTER).
])
AT_CLEANUP
+AT_SETUP([variable display attribute syntax errors])
+AT_KEYWORDS([VARIABLE ALIGNMENT])
+AT_KEYWORDS([VARIABLE WIDTH])
+AT_KEYWORDS([VARIABLE LEVEL])
+AT_KEYWORDS([VARIABLE ROLE])
+AT_DATA([var-display.sps], [dnl
+DATA LIST LIST NOTABLE /x y z.
+VARIABLE ALIGNMENT **.
+VARIABLE ALIGNMENT x **.
+VARIABLE ALIGNMENT x (**).
+VARIABLE ALIGNMENT x (LEFT **).
+VARIABLE WIDTH **.
+VARIABLE WIDTH x **.
+VARIABLE WIDTH x (**).
+VARIABLE WIDTH x (10 **).
+VARIABLE LEVEL **.
+VARIABLE LEVEL x **.
+VARIABLE LEVEL x (**).
+VARIABLE LEVEL x (SCALE **).
+VARIABLE ROLE **.
+VARIABLE ROLE / **.
+VARIABLE ROLE /INPUT **.
+VARIABLE ROLE /INPUT x **.
+])
+AT_CHECK([pspp -O format=csv var-display.sps], [1], [dnl
+"var-display.sps:2.20-2.21: error: VARIABLE ALIGNMENT: Syntax error expecting variable name.
+ 2 | VARIABLE ALIGNMENT **.
+ | ^~"
+
+"var-display.sps:3.22-3.23: error: VARIABLE ALIGNMENT: Syntax error expecting `('.
+ 3 | VARIABLE ALIGNMENT x **.
+ | ^~"
+
+"var-display.sps:4.23-4.24: error: VARIABLE ALIGNMENT: Syntax error expecting LEFT, RIGHT, or CENTER.
+ 4 | VARIABLE ALIGNMENT x (**).
+ | ^~"
+
+"var-display.sps:5.28-5.29: error: VARIABLE ALIGNMENT: Syntax error expecting `)'.
+ 5 | VARIABLE ALIGNMENT x (LEFT **).
+ | ^~"
+
+"var-display.sps:6.16-6.17: error: VARIABLE WIDTH: Syntax error expecting variable name.
+ 6 | VARIABLE WIDTH **.
+ | ^~"
+
+"var-display.sps:7.18-7.19: error: VARIABLE WIDTH: Syntax error expecting `('.
+ 7 | VARIABLE WIDTH x **.
+ | ^~"
+
+"var-display.sps:8.19-8.20: error: VARIABLE WIDTH: Syntax error expecting positive integer.
+ 8 | VARIABLE WIDTH x (**).
+ | ^~"
+
+"var-display.sps:9.22-9.23: error: VARIABLE WIDTH: Syntax error expecting `)'.
+ 9 | VARIABLE WIDTH x (10 **).
+ | ^~"
+
+"var-display.sps:10.16-10.17: error: VARIABLE LEVEL: Syntax error expecting variable name.
+ 10 | VARIABLE LEVEL **.
+ | ^~"
+
+"var-display.sps:11.18-11.19: error: VARIABLE LEVEL: Syntax error expecting `('.
+ 11 | VARIABLE LEVEL x **.
+ | ^~"
+
+"var-display.sps:12.19-12.20: error: VARIABLE LEVEL: Syntax error expecting SCALE, ORDINAL, or NOMINAL.
+ 12 | VARIABLE LEVEL x (**).
+ | ^~"
+
+"var-display.sps:13.25-13.26: error: VARIABLE LEVEL: Syntax error expecting `)'.
+ 13 | VARIABLE LEVEL x (SCALE **).
+ | ^~"
+
+"var-display.sps:14.15-14.16: error: VARIABLE ROLE: Syntax error expecting `/'.
+ 14 | VARIABLE ROLE **.
+ | ^~"
+
+"var-display.sps:15.17-15.18: error: VARIABLE ROLE: Syntax error expecting INPUT, TARGET, BOTH, NONE, PARTITION, or SPLIT.
+ 15 | VARIABLE ROLE / **.
+ | ^~"
+
+"var-display.sps:16.22-16.23: error: VARIABLE ROLE: Syntax error expecting variable name.
+ 16 | VARIABLE ROLE /INPUT **.
+ | ^~"
+
+"var-display.sps:17.24-17.25: error: VARIABLE ROLE: Syntax error expecting `/'.
+ 17 | VARIABLE ROLE /INPUT x **.
+ | ^~"
+])
+AT_CLEANUP
+
AT_SETUP([variable level inference and SCALEMIN])
AT_DATA([var-level.sps], [dnl
DATA LIST LIST NOTABLE /n1 to n3 s1 to s5.