X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Fformat-parser.c;h=aa30852d11327b3ddcf2d3fc8488f04649fc73f7;hb=939955167948167d6fe2a15d1c4db7073ad638e0;hp=78af09da311e2d2af24f5c9a410e68311f6f769a;hpb=55740f362a5218c87e61858a672540f4909d5e06;p=pspp diff --git a/src/language/lexer/format-parser.c b/src/language/lexer/format-parser.c index 78af09da31..aa30852d11 100644 --- a/src/language/lexer/format-parser.c +++ b/src/language/lexer/format-parser.c @@ -16,13 +16,14 @@ #include +#include "language/lexer/format-parser.h" + #include #include #include #include "data/format.h" #include "data/variable.h" -#include "language/lexer/format-parser.h" #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/misc.h" @@ -31,16 +32,25 @@ #include "gettext.h" #define _(msgid) gettext (msgid) -static bool +/* Parses a token taking the form of a format specifier and + returns true only if successful. Emits an error message on + failure. Stores a null-terminated string representing the + format type in TYPE, and the width and number of decimal + places in *WIDTH and *DECIMALS. + + TYPE is not checked as to whether it is really the name of a + format. Both width and decimals are considered optional. If + missing, *WIDTH or *DECIMALS or both will be set to 0. */ +bool parse_abstract_format_specifier__ (struct lexer *lexer, char type[FMT_TYPE_LEN_MAX + 1], - int *width, int *decimals) + uint16_t *width, uint8_t *decimals) { struct substring s; struct substring type_ss, width_ss, decimals_ss; bool has_decimals; - if (lex_token (lexer) != T_ID) + if (lex_token (lexer) != T_ID && lex_token (lexer) != T_STRING) goto error; /* Extract pieces. */ @@ -78,19 +88,12 @@ error: return false; } -/* Parses a token taking the form of a format specifier and - returns true only if successful. Emits an error message on - failure. Stores a null-terminated string representing the - format type in TYPE, and the width and number of decimal - places in *WIDTH and *DECIMALS. - - TYPE is not checked as to whether it is really the name of a - format. Both width and decimals are considered optional. If - missing, *WIDTH or *DECIMALS or both will be set to 0. */ +/* Like parse_abstract_format_specifier__(), but additionally advanced past + the token if successful. */ bool parse_abstract_format_specifier (struct lexer *lexer, char type[FMT_TYPE_LEN_MAX + 1], - int *width, int *decimals) + uint16_t *width, uint8_t *decimals) { bool ok = parse_abstract_format_specifier__ (lexer, type, width, decimals); if (ok) @@ -98,10 +101,9 @@ parse_abstract_format_specifier (struct lexer *lexer, return ok; } -/* Parses a format specifier from the token stream and returns - true only if successful. Emits an error message on - failure. The caller should call check_input_specifier() or - check_output_specifier() on the parsed format as +/* Parses a format specifier from the token stream and returns true only if + successful. Emits an error message on failure. The caller should call + fmt_check_input() or fmt_check_output() on the parsed format as necessary. */ bool parse_format_specifier (struct lexer *lexer, struct fmt_spec *format)