}
}
-/* 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;
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
{
/* 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);
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);