diff options
author | Joseph Myers <jsm28@cam.ac.uk> | 2000-09-25 18:04:45 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2000-09-25 18:04:45 +0100 |
commit | 0e00b68b77f4cc89684ed1b2364c71d175676acf (patch) | |
tree | ae21d417c58e6d47adcec7ee9db25e70b0d222b0 | |
parent | 047c1c922bc04add0a50710f9c2a816f61ccf8b2 (diff) | |
download | gcc-0e00b68b77f4cc89684ed1b2364c71d175676acf.zip gcc-0e00b68b77f4cc89684ed1b2364c71d175676acf.tar.gz gcc-0e00b68b77f4cc89684ed1b2364c71d175676acf.tar.bz2 |
c-common.c (format_char_info): Add flags2; update comments.
* c-common.c (format_char_info): Add flags2; update comments.
(print_char_table, scan_char_table, time_char_table): Split some
flags out into flags2.
(check_format_info): Use flags2 for those flags, for identifying
the initial character of a scanf scanset, and for identifying
printf formats where the '0' flag is ignored with precision.
From-SVN: r36623
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-common.c | 131 |
2 files changed, 76 insertions, 64 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8b4464..0c08c8e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2000-09-25 Joseph S. Myers <jsm28@cam.ac.uk> + + * c-common.c (format_char_info): Add flags2; update comments. + (print_char_table, scan_char_table, time_char_table): Split some + flags out into flags2. + (check_format_info): Use flags2 for those flags, for identifying + the initial character of a scanf scanset, and for identifying + printf formats where the '0' flag is ignored with precision. + 2000-09-25 Hans-Peter Nilsson <hp@axis.com> Changes below marked "here" add TABs on either or both sides, diff --git a/gcc/c-common.c b/gcc/c-common.c index 79fef42..4e63025 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -1293,16 +1293,21 @@ typedef struct enum format_std_version std; /* Types accepted for each length modifier. */ format_type_detail types[FMT_LEN_MAX]; - /* List of other modifier characters allowed with these options. + /* List of other modifier characters allowed with these specifiers. This lists flags, and additionally "w" for width, "p" for precision, - "c" for generic character pointers being allowed, "a" for scanf - "a" allocation extension (not applicable in C99 mode), "*" for - scanf suppression, "2" for strftime two digit year formats, "3" - for strftime formats giving two digit years in some locales, "E" - and "O" for those strftime modifiers, "o" if use of strftime "O" - is a GNU extension beyond C99, and "W" if the argument is a - pointer which is dereferenced and written into. */ + "a" for scanf "a" allocation extension (not applicable in C99 mode), + "*" for scanf suppression, and "E" and "O" for those strftime + modifiers. */ const char *flag_chars; + /* List of additional flags describing these conversion specifiers. + "c" for generic character pointers being allowed, "2" for strftime + two digit year formats, "3" for strftime formats giving two digit + years in some locales, "o" if use of strftime "O" + is a GNU extension beyond C99, "W" if the argument is a pointer + which is dereferenced and written into, "i" for printf integer + formats where the '0' flag is ignored with precision, and "[" + for the starting character of a scanf scanset. */ + const char *flags2; } format_char_info; @@ -1437,70 +1442,70 @@ static const format_length_info scanf_length_specs[] = static const format_char_info print_char_table[] = { /* C89 conversion specifiers. */ - { "di", 0, STD_C89, { T89_I, T99_I, T89_I, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "-wp0 +'I" }, - { "oxX", 0, STD_C89, { T89_UI, T99_UI, T89_UI, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0#" }, - { "u", 0, STD_C89, { T89_UI, T99_UI, T89_UI, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0'I" }, - { "fgG", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'" }, - { "eE", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#" }, - { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, T94_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w" }, - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wpc" }, - { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wc" }, - { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "W" }, + { "di", 0, STD_C89, { T89_I, T99_I, T89_I, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "-wp0 +'I", "i" }, + { "oxX", 0, STD_C89, { T89_UI, T99_UI, T89_UI, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0#", "i" }, + { "u", 0, STD_C89, { T89_UI, T99_UI, T89_UI, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0'I", "i" }, + { "fgG", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" }, + { "eE", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" }, + { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, T94_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" }, + { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "c" }, + { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "c" }, + { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" }, /* C99 conversion specifiers. */ - { "F", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'" }, - { "aA", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#" }, + { "F", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" }, + { "aA", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" }, /* X/Open conversion specifiers. */ - { "C", 0, STD_EXT, { TEX_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w" }, - { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp" }, + { "C", 0, STD_EXT, { TEX_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" }, + { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" }, /* GNU conversion specifiers. */ - { "m", 0, STD_EXT, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp" }, - { NULL, 0, 0, NOLENGTHS, NULL } + { "m", 0, STD_EXT, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" }, + { NULL, 0, 0, NOLENGTHS, NULL, NULL } }; static const format_char_info scan_char_table[] = { /* C89 conversion specifiers. */ - { "di", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "*wW" }, - { "ouxX", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*wW" }, - { "efgEG", 1, STD_C89, { T89_F, BADLEN, BADLEN, T89_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "*wW" }, - { "c", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*cwW" }, - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*acwW" }, - { "[", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*acwW" }, - { "p", 2, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*wW" }, - { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "W" }, + { "di", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "*w", "W" }, + { "ouxX", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*w", "W" }, + { "efgEG", 1, STD_C89, { T89_F, BADLEN, BADLEN, T89_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "*w", "W" }, + { "c", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "cW" }, + { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW" }, + { "[", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW[" }, + { "p", 2, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" }, + { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" }, /* C99 conversion specifiers. */ - { "FaA", 1, STD_C99, { T99_F, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "*wW" }, + { "FaA", 1, STD_C99, { T99_F, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "*w", "W" }, /* X/Open conversion specifiers. */ - { "C", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*wW" }, - { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*awW" }, - { NULL, 0, 0, NOLENGTHS, NULL } + { "C", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" }, + { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "W" }, + { NULL, 0, 0, NOLENGTHS, NULL, NULL } }; static format_char_info time_char_table[] = { /* C89 conversion specifiers. */ - { "ABZab", 0, STD_C89, NOLENGTHS, "^#" }, - { "cx", 0, STD_C89, NOLENGTHS, "3E" }, - { "HIMSUWdmw", 0, STD_C89, NOLENGTHS, "-_0Ow" }, - { "j", 0, STD_C89, NOLENGTHS, "-_0Oow" }, - { "p", 0, STD_C89, NOLENGTHS, "#" }, - { "X", 0, STD_C89, NOLENGTHS, "E" }, - { "y", 0, STD_C89, NOLENGTHS, "2EO-_0w" }, - { "Y", 0, STD_C89, NOLENGTHS, "-_0EOow" }, - { "%", 0, STD_C89, NOLENGTHS, "" }, + { "ABZab", 0, STD_C89, NOLENGTHS, "^#", "" }, + { "cx", 0, STD_C89, NOLENGTHS, "E", "3" }, + { "HIMSUWdmw", 0, STD_C89, NOLENGTHS, "-_0Ow", "" }, + { "j", 0, STD_C89, NOLENGTHS, "-_0Ow", "o" }, + { "p", 0, STD_C89, NOLENGTHS, "#", "" }, + { "X", 0, STD_C89, NOLENGTHS, "E", "" }, + { "y", 0, STD_C89, NOLENGTHS, "EO-_0w", "2" }, + { "Y", 0, STD_C89, NOLENGTHS, "-_0EOw", "o" }, + { "%", 0, STD_C89, NOLENGTHS, "", "" }, /* C99 conversion specifiers. */ - { "C", 0, STD_C99, NOLENGTHS, "-_0EOow" }, - { "D", 0, STD_C99, NOLENGTHS, "2" }, - { "eVu", 0, STD_C99, NOLENGTHS, "-_0Ow" }, - { "FRTnrt", 0, STD_C99, NOLENGTHS, "" }, - { "g", 0, STD_C99, NOLENGTHS, "2Oo-_0w" }, - { "G", 0, STD_C99, NOLENGTHS, "-_0Oow" }, - { "h", 0, STD_C99, NOLENGTHS, "^#" }, - { "z", 0, STD_C99, NOLENGTHS, "Oo" }, + { "C", 0, STD_C99, NOLENGTHS, "-_0EOw", "o" }, + { "D", 0, STD_C99, NOLENGTHS, "", "2" }, + { "eVu", 0, STD_C99, NOLENGTHS, "-_0Ow", "" }, + { "FRTnrt", 0, STD_C99, NOLENGTHS, "", "" }, + { "g", 0, STD_C99, NOLENGTHS, "O-_0w", "2o" }, + { "G", 0, STD_C99, NOLENGTHS, "-_0Ow", "o" }, + { "h", 0, STD_C99, NOLENGTHS, "^#", "" }, + { "z", 0, STD_C99, NOLENGTHS, "O", "o" }, /* GNU conversion specifiers. */ - { "kls", 0, STD_EXT, NOLENGTHS, "-_0Ow" }, - { "P", 0, STD_EXT, NOLENGTHS, "" }, - { NULL, 0, 0, NOLENGTHS, NULL } + { "kls", 0, STD_EXT, NOLENGTHS, "-_0Ow", "" }, + { "P", 0, STD_EXT, NOLENGTHS, "", "" }, + { NULL, 0, 0, NOLENGTHS, NULL, NULL } }; @@ -2424,7 +2429,7 @@ check_format_info (status, info, params) format_char, fki->name); if (index (flag_chars, 'O') != 0) { - if (index (fci->flag_chars, 'o') != 0) + if (index (fci->flags2, 'o') != 0) status_warning (status, "ISO C does not support `%%O%c'", format_char); else if (!flag_isoc99 && index (fci->flag_chars, 'O') != 0) status_warning (status, "ISO C89 does not support `%%O%c'", format_char); @@ -2434,11 +2439,11 @@ check_format_info (status, info, params) } if (wide && index (fci->flag_chars, 'w') == 0) status_warning (status, "width used with `%c' format", format_char); - if (index (fci->flag_chars, '3') != 0 + if (index (fci->flags2, '3') != 0 || (format_char == 'y' && index (flag_chars, 'E'))) status_warning (status, "`%%%c' yields only last 2 digits of year in some locales", format_char); - else if (index (fci->flag_chars, '2') != 0) + else if (index (fci->flags2, '2') != 0) status_warning (status, "`%%%c' yields only last 2 digits of year", format_char); if (precise && index (fci->flag_chars, 'p') == 0) status_warning (status, "precision used with `%c' format", format_char); @@ -2451,7 +2456,7 @@ check_format_info (status, info, params) /* The a flag is a GNU extension. */ else if (pedantic && aflag) status_warning (status, "ISO C does not support the `a' flag"); - if (info->format_type == scanf_format_type && format_char == '[') + if (index (fci->flags2, '[') != 0) { /* Skip over scan set, in case it happens to have '%' in it. */ if (*format_chars == '^') @@ -2481,9 +2486,7 @@ check_format_info (status, info, params) if (info->format_type == strftime_format_type) continue; if (precise && index (flag_chars, '0') != 0 - && (format_char == 'd' || format_char == 'i' - || format_char == 'o' || format_char == 'u' - || format_char == 'x' || format_char == 'X')) + && (index (fci->flags2, 'i') != 0)) status_warning (status, "`0' flag ignored with precision specifier and `%c' format", format_char); wanted_type = (fci->types[length_chars_val].type @@ -2558,10 +2561,10 @@ check_format_info (status, info, params) main_wanted_type.wanted_type_name = wanted_type_name; main_wanted_type.pointer_count = fci->pointer_count + aflag; main_wanted_type.char_lenient_flag = 0; - if (index (fci->flag_chars, 'c') != 0) + if (index (fci->flags2, 'c') != 0) main_wanted_type.char_lenient_flag = 1; main_wanted_type.writing_in_flag = 0; - if (index (fci->flag_chars, 'W') != 0) + if (index (fci->flags2, 'W') != 0) main_wanted_type.writing_in_flag = 1; main_wanted_type.name = NULL; main_wanted_type.param = cur_param; |