X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Flanguage%2Fdata-io%2Fplacement-parser.c;h=ca6f491ee0b7727002523ddf451a18625481c5e2;hb=4b46b5fd562333c1fb7566c66050bd2e92740170;hp=a40e4226a1a18e9d3ddbde602f4976dba0c292e5;hpb=5c567ded508b12a43f70c5df4733f6fbf4cc6804;p=pspp diff --git a/src/language/data-io/placement-parser.c b/src/language/data-io/placement-parser.c index a40e4226a1..ca6f491ee0 100644 --- a/src/language/data-io/placement-parser.c +++ b/src/language/data-io/placement-parser.c @@ -27,6 +27,7 @@ #include "libpspp/pool.h" #include "libpspp/str.h" +#include "gl/c-strcase.h" #include "gl/xalloc.h" #include "gl/xsize.h" @@ -220,9 +221,9 @@ fixed_parse_fortran (struct lexer *lexer, struct pool *pool, enum fmt_use use, if (!parse_abstract_format_specifier (lexer, type, &f.w, &f.d)) return false; - if (!strcasecmp (type, "T")) + if (!c_strcasecmp (type, "T")) f.type = PRS_TYPE_T; - else if (!strcasecmp (type, "X")) + else if (!c_strcasecmp (type, "X")) { f.type = PRS_TYPE_X; f.w = count; @@ -298,11 +299,8 @@ execute_placement_format (const struct fmt_spec *format, } } -/* Parses a BASE-based column using LEXER. Returns true and - stores a 1-based column number into *COLUMN if successful, - otherwise emits an error message and returns false. */ static bool -parse_column (int value, int base, int *column) +parse_column__ (int value, int base, int *column) { assert (base == 0 || base == 1); *column = value - base + 1; @@ -317,6 +315,27 @@ parse_column (int value, int base, int *column) return true; } +/* Parses a BASE-based column using LEXER. Returns true and + stores a 1-based column number into *COLUMN if successful, + otherwise emits an error message and returns false. + + If BASE is 0, zero-based column numbers are parsed; if BASE is + 1, 1-based column numbers are parsed. Regardless of BASE, the + values stored in *FIRST_COLUMN and *LAST_COLUMN are + 1-based. */ +bool +parse_column (struct lexer *lexer, int base, int *column) +{ + assert (base == 0 || base == 1); + + if (!lex_force_int (lexer) + || !parse_column__ (lex_integer (lexer), base, column)) + return false; + + lex_get (lexer); + return true; +} + /* Parse a column or a range of columns, specified as a single integer or two integers delimited by a dash. Stores the range in *FIRST_COLUMN and *LAST_COLUMN. (If only a single integer @@ -337,14 +356,14 @@ parse_column_range (struct lexer *lexer, int base, { /* First column. */ if (!lex_force_int (lexer) - || !parse_column (lex_integer (lexer), base, first_column)) + || !parse_column__ (lex_integer (lexer), base, first_column)) return false; lex_get (lexer); /* Last column. */ if (lex_is_integer (lexer) && lex_integer (lexer) < 0) { - if (!parse_column (-lex_integer (lexer), base, last_column)) + if (!parse_column__ (-lex_integer (lexer), base, last_column)) return false; lex_get (lexer);