struct variable ***vars, size_t **indexes,
size_t *n_vars)
{
+ int start_ofs = lex_ofs (lexer);
if (!parse_variables (lexer, dict, vars, n_vars, 0))
return false;
+ int end_ofs = lex_ofs (lexer) - 1;
*indexes = xnmalloc (*n_vars, sizeof **indexes);
for (size_t i = 0; i < *n_vars; i++)
struct variable *v = (*vars)[i];
if (!strcasecmp (var_get_name (v), "ROWTYPE_"))
{
- msg (SE, _("ROWTYPE_ is not allowed on SPLIT or FACTORS."));
+ lex_ofs_error (lexer, start_ofs, end_ofs,
+ _("ROWTYPE_ is not allowed on SPLIT or FACTORS."));
goto error;
}
(*indexes)[i] = var_get_dict_index (v);
else if (lex_match_id (lexer, "CELLS"))
{
if (mf.input_rowtype)
- msg (SW, _("CELLS is ignored when VARIABLES includes ROWTYPE_"));
+ lex_next_msg (lexer, SW,
+ -1, -1, _("CELLS is ignored when VARIABLES "
+ "includes ROWTYPE_"));
lex_match (lexer, T_EQUALS);
if (open || in_parens || (lex_token (lexer) != T_ENDCMD
&& lex_token (lexer) != T_SLASH))
{
- lex_error (lexer, _("Row type keyword expected."));
+ const char *rowtypes[] = {
+#define RT(NAME, DIMS) #NAME,
+ ROWTYPES
+#undef RT
+ "N_VECTOR", "SD",
+ };
+ lex_error_expecting_array (
+ lexer, rowtypes, sizeof rowtypes / sizeof *rowtypes);
goto error;
}
break;