#include "libpspp/pool.h"
#include "libpspp/str.h"
+#include "gl/c-strcase.h"
#include "gl/xalloc.h"
#include "gl/xsize.h"
int fc, lc;
size_t i;
- if ( !parse_column_range (lexer, 1, &fc, &lc, NULL) )
+ if (!parse_column_range (lexer, 1, &fc, &lc, NULL))
return false;
/* Divide columns evenly. */
*formats = pool_nalloc (pool, var_cnt + 1, sizeof **formats);
*format_cnt = var_cnt + 1;
- (*formats)[0].type = PRS_TYPE_T;
+ (*formats)[0].type = (enum fmt_type) PRS_TYPE_T;
(*formats)[0].w = fc;
for (i = 1; i <= var_cnt; i++)
(*formats)[i] = format;
new_formats = &f;
new_format_cnt = 1;
if (use == FMT_FOR_INPUT && lex_match (lexer, T_SLASH))
- f.type = PRS_TYPE_NEW_REC;
+ f.type = (enum fmt_type) PRS_TYPE_NEW_REC;
else
{
char type[FMT_TYPE_LEN_MAX + 1];
if (!parse_abstract_format_specifier (lexer, type, &f.w, &f.d))
return false;
- if (!strcasecmp (type, "T"))
- f.type = PRS_TYPE_T;
- else if (!strcasecmp (type, "X"))
+ if (!c_strcasecmp (type, "T"))
+ f.type = (enum fmt_type) PRS_TYPE_T;
+ else if (!c_strcasecmp (type, "X"))
{
- f.type = PRS_TYPE_X;
+ f.type = (enum fmt_type) PRS_TYPE_X;
f.w = count;
count = 1;
}
}
}
-bool
+static bool
parse_column__ (int value, int base, int *column)
{
assert (base == 0 || base == 1);
{
while (lex_match (lexer, T_SLASH))
{
- if (lex_is_integer (lexer))
+ if (lex_is_number (lexer))
{
- if (lex_integer (lexer) <= *record)
+ double orignum = lex_number (lexer);
+ long n = (lex_is_integer (lexer)?lex_integer (lexer):*record);
+ bool out_of_range = orignum > INT_MAX || orignum < INT_MIN;
+ if (n <= *record || out_of_range)
{
- msg (SE, _("The record number specified, %ld, is at or "
+ msg (SE, _("The record number specified, %.0f, is at or "
"before the previous record, %d. Data "
"fields must be listed in order of "
"increasing record number."),
- lex_integer (lexer), *record);
+ orignum, *record);
return false;
}
- *record = lex_integer (lexer);
+ *record = n;
lex_get (lexer);
}
else