placement-parser: New public function parse_column().
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 25 Dec 2012 00:34:30 +0000 (16:34 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 25 Dec 2012 01:13:39 +0000 (17:13 -0800)
This will acquire a new user in an upcoming commit.

src/language/data-io/placement-parser.c
src/language/data-io/placement-parser.h

index a40e4226a1a18e9d3ddbde602f4976dba0c292e5..549ac7501e73d3f804d82f97de5c4797d3de612e 100644 (file)
@@ -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);
 
index 962b97b4bcbfad0232a20a87819e69f710bf9ce2..8f8d68c4ce4f013b61ede2c3ce4e3174f153c895 100644 (file)
@@ -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);