-static void parse_integer_suffix(bool is_oct_hex)
-{
- bool is_unsigned = false;
- bool min_long = false;
- bool min_longlong = false;
- bool not_traditional = false;
- int pos = 0;
- char suffix[4];
-
- if (c == 'U' || c == 'u') {
- not_traditional = true;
- suffix[pos++] = toupper(c);
- is_unsigned = true;
- next_char();
- if (c == 'L' || c == 'l') {
- suffix[pos++] = toupper(c);
- min_long = true;
- next_char();
- if (c == 'L' || c == 'l') {
- suffix[pos++] = toupper(c);
- min_longlong = true;
- next_char();
- }
- }
- } else if (c == 'l' || c == 'L') {
- suffix[pos++] = toupper(c);
- min_long = true;
- next_char();
- if (c == 'l' || c == 'L') {
- not_traditional = true;
- suffix[pos++] = toupper(c);
- min_longlong = true;
- next_char();
- if (c == 'u' || c == 'U') {
- suffix[pos++] = toupper(c);
- is_unsigned = true;
- next_char();
- }
- } else if (c == 'u' || c == 'U') {
- not_traditional = true;
- suffix[pos++] = toupper(c);
- is_unsigned = true;
- next_char();
- lexer_token.datatype = type_unsigned_long;
- }
- }
-
- if (warning.traditional && not_traditional) {
- suffix[pos] = '\0';
- warningf(&lexer_token.source_position,
- "traditional C rejects the '%s' suffix", suffix);
- }
- if (!is_unsigned) {
- long long v = lexer_token.v.intvalue;
- if (!min_long) {
- if (v >= TARGET_INT_MIN && v <= TARGET_INT_MAX) {
- lexer_token.datatype = type_int;
- return;
- } else if (is_oct_hex && v >= 0 && v <= TARGET_UINT_MAX) {
- lexer_token.datatype = type_unsigned_int;
- return;
- }
- }
- if (!min_longlong) {
- if (v >= TARGET_LONG_MIN && v <= TARGET_LONG_MAX) {
- lexer_token.datatype = type_long;
- return;
- } else if (is_oct_hex && v >= 0 && (unsigned long long)v <= (unsigned long long)TARGET_ULONG_MAX) {
- lexer_token.datatype = type_unsigned_long;
- return;
- }
- }
- unsigned long long uv = (unsigned long long) v;
- if (is_oct_hex && uv > (unsigned long long) TARGET_LONGLONG_MAX) {
- lexer_token.datatype = type_unsigned_long_long;
- return;
- }
-
- lexer_token.datatype = type_long_long;
- } else {
- unsigned long long v = (unsigned long long) lexer_token.v.intvalue;
- if (!min_long && v <= TARGET_UINT_MAX) {
- lexer_token.datatype = type_unsigned_int;
- return;
- }
- if (!min_longlong && v <= TARGET_ULONG_MAX) {
- lexer_token.datatype = type_unsigned_long;
- return;
- }
- lexer_token.datatype = type_unsigned_long_long;
- }
-}
-
-static void parse_floating_suffix(void)