1 /* Parse a printf-style format string. 2 3 Copyright (C) 1986-2024 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifndef COMMON_FORMAT_H 21 #define COMMON_FORMAT_H 22 23 #include <string_view> 24 25 #if defined(__MINGW32__) && !defined(PRINTF_HAS_LONG_LONG) 26 # define USE_PRINTF_I64 1 27 # define PRINTF_HAS_LONG_LONG 28 #else 29 # define USE_PRINTF_I64 0 30 #endif 31 32 /* The argclass represents the general type of data that goes with a 33 format directive; int_arg for %d, long_arg for %l, and so forth. 34 Note that these primarily distinguish types by size and need for 35 special handling, so for instance %u and %x are (at present) also 36 classed as int_arg. */ 37 38 enum argclass 39 { 40 literal_piece, 41 int_arg, long_arg, long_long_arg, size_t_arg, ptr_arg, 42 string_arg, wide_string_arg, wide_char_arg, 43 double_arg, long_double_arg, 44 dec32float_arg, dec64float_arg, dec128float_arg, 45 value_arg 46 }; 47 48 /* A format piece is a section of the format string that may include a 49 single print directive somewhere in it, and the associated class 50 for the argument. */ 51 52 struct format_piece 53 { 54 format_piece (const char *str, enum argclass argc, int n) 55 : string (str), 56 argclass (argc), 57 n_int_args (n) 58 { 59 gdb_assert (str != nullptr); 60 } 61 62 bool operator== (const format_piece &other) const 63 { 64 return (this->argclass == other.argclass 65 && std::string_view (this->string) == other.string); 66 } 67 68 const char *string; 69 enum argclass argclass; 70 /* Count the number of preceding 'int' arguments that must be passed 71 along. This is used for a width or precision of '*'. Note that 72 this feature is only available in "gdb_extensions" mode. */ 73 int n_int_args; 74 }; 75 76 class format_pieces 77 { 78 public: 79 80 format_pieces (const char **arg, bool gdb_extensions = false, 81 bool value_extension = false); 82 ~format_pieces () = default; 83 84 DISABLE_COPY_AND_ASSIGN (format_pieces); 85 86 typedef std::vector<format_piece>::iterator iterator; 87 88 iterator begin () 89 { 90 return m_pieces.begin (); 91 } 92 93 iterator end () 94 { 95 return m_pieces.end (); 96 } 97 98 private: 99 100 std::vector<format_piece> m_pieces; 101 gdb::unique_xmalloc_ptr<char> m_storage; 102 }; 103 104 #endif /* COMMON_FORMAT_H */ 105