From 8d9133ece0a6989d282e853a5a73db0c85bdb3a3 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 24 Dec 2012 16:34:30 -0800 Subject: [PATCH] placement-parser: New public function parse_column(). This will acquire a new user in an upcoming commit. --- src/language/data-io/placement-parser.c | 32 +++++++++++++++++++------ src/language/data-io/placement-parser.h | 1 + 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/language/data-io/placement-parser.c b/src/language/data-io/placement-parser.c index a40e4226a1..549ac7501e 100644 --- a/src/language/data-io/placement-parser.c +++ b/src/language/data-io/placement-parser.c @@ -298,11 +298,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) +bool +parse_column__ (int value, int base, int *column) { assert (base == 0 || base == 1); *column = value - base + 1; @@ -317,6 +314,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 +355,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); diff --git a/src/language/data-io/placement-parser.h b/src/language/data-io/placement-parser.h index 962b97b4bc..8f8d68c4ce 100644 --- a/src/language/data-io/placement-parser.h +++ b/src/language/data-io/placement-parser.h @@ -30,6 +30,7 @@ bool parse_var_placements (struct lexer *, struct pool *, size_t var_cnt, struct fmt_spec **, size_t *format_cnt); bool execute_placement_format (const struct fmt_spec *, int *record, int *column); +bool parse_column (struct lexer *lexer, int base, int *column); bool parse_column_range (struct lexer *, int base, int *first_column, int *last_column, bool *range_specified); -- 2.30.2