int check_printf_argument(const char *label, const char*& tail, arg_type_e& arg_type) { const char* p = match_plain_chars(label); if (!p) return 0; if (*p) { const char c = *p; if (c == '0' || c == '-' || c == '+' || c == ' ' || c == '#' || c == '\'') { p ++; if (*p == 0) goto error_exit; } } else goto error_exit; p = match_integer(p); if (*p == 0) goto error_exit; if (*p == '.') { p++; if (*p == 0) goto error_exit; p = match_integer(p); if (*p == 0) goto error_exit; } if (*p == 'l') { p++; if (*p == 0) goto error_exit; } if (*p) { const char s = *p; if (s == 'd' || s == 'i' || s == 'd' || s == 'u' || s == 'x' || s == 'X' || s == 'o') { tail = p + 1; arg_type = argument_int; return 1; } else if (s == 'f' || s == 'g' || s == 'e' || s == 'E' || s == 'G') { tail = p + 1; arg_type = argument_double; return 1; } } error_exit: return (-1); }
static int next_token (void) { int result; lastpos = p; switch (*p) { case '\0': result = END; break; case ':': case ',': case '-': case ';': result = *p; p++; break; case 'b': case 'B': result = match_word ("big_endian", BIG); break; case 'l': case 'L': result = match_word ("little_endian", LITTLE); break; case 'n': case 'N': result = match_word ("native", NATIVE); break; case 's': case 'S': result = match_word ("swap", SWAP); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result = match_integer (); break; default: result = ILLEGAL; break; } return result; }