1 /* Parse printf format string. 2 Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2012 Free Software 3 Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3, or (at your option) 8 any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License along 16 with this program; if not, see <http://www.gnu.org/licenses/>. */ 17 18 #ifndef _PRINTF_PARSE_H 19 #define _PRINTF_PARSE_H 20 21 /* This file can be parametrized with the following macros: 22 ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. 23 STATIC Set to 'static' to declare the function static. */ 24 25 #if HAVE_FEATURES_H 26 # include <features.h> /* for __GLIBC__, __UCLIBC__ */ 27 #endif 28 29 #include "printf-args.h" 30 31 32 /* Flags */ 33 #define FLAG_GROUP 1 /* ' flag */ 34 #define FLAG_LEFT 2 /* - flag */ 35 #define FLAG_SHOWSIGN 4 /* + flag */ 36 #define FLAG_SPACE 8 /* space flag */ 37 #define FLAG_ALT 16 /* # flag */ 38 #define FLAG_ZERO 32 39 #if __GLIBC__ >= 2 && !defined __UCLIBC__ 40 # define FLAG_LOCALIZED 64 /* I flag, uses localized digits */ 41 #endif 42 43 /* arg_index value indicating that no argument is consumed. */ 44 #define ARG_NONE (~(size_t)0) 45 46 /* xxx_directive: A parsed directive. 47 xxx_directives: A parsed format string. */ 48 49 /* Number of directly allocated directives (no malloc() needed). */ 50 #define N_DIRECT_ALLOC_DIRECTIVES 7 51 52 /* A parsed directive. */ 53 typedef struct 54 { 55 const char* dir_start; 56 const char* dir_end; 57 int flags; 58 const char* width_start; 59 const char* width_end; 60 size_t width_arg_index; 61 const char* precision_start; 62 const char* precision_end; 63 size_t precision_arg_index; 64 char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ 65 size_t arg_index; 66 } 67 char_directive; 68 69 /* A parsed format string. */ 70 typedef struct 71 { 72 size_t count; 73 char_directive *dir; 74 size_t max_width_length; 75 size_t max_precision_length; 76 char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; 77 } 78 char_directives; 79 80 #if ENABLE_UNISTDIO 81 82 /* A parsed directive. */ 83 typedef struct 84 { 85 const uint8_t* dir_start; 86 const uint8_t* dir_end; 87 int flags; 88 const uint8_t* width_start; 89 const uint8_t* width_end; 90 size_t width_arg_index; 91 const uint8_t* precision_start; 92 const uint8_t* precision_end; 93 size_t precision_arg_index; 94 uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ 95 size_t arg_index; 96 } 97 u8_directive; 98 99 /* A parsed format string. */ 100 typedef struct 101 { 102 size_t count; 103 u8_directive *dir; 104 size_t max_width_length; 105 size_t max_precision_length; 106 u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; 107 } 108 u8_directives; 109 110 /* A parsed directive. */ 111 typedef struct 112 { 113 const uint16_t* dir_start; 114 const uint16_t* dir_end; 115 int flags; 116 const uint16_t* width_start; 117 const uint16_t* width_end; 118 size_t width_arg_index; 119 const uint16_t* precision_start; 120 const uint16_t* precision_end; 121 size_t precision_arg_index; 122 uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ 123 size_t arg_index; 124 } 125 u16_directive; 126 127 /* A parsed format string. */ 128 typedef struct 129 { 130 size_t count; 131 u16_directive *dir; 132 size_t max_width_length; 133 size_t max_precision_length; 134 u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; 135 } 136 u16_directives; 137 138 /* A parsed directive. */ 139 typedef struct 140 { 141 const uint32_t* dir_start; 142 const uint32_t* dir_end; 143 int flags; 144 const uint32_t* width_start; 145 const uint32_t* width_end; 146 size_t width_arg_index; 147 const uint32_t* precision_start; 148 const uint32_t* precision_end; 149 size_t precision_arg_index; 150 uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ 151 size_t arg_index; 152 } 153 u32_directive; 154 155 /* A parsed format string. */ 156 typedef struct 157 { 158 size_t count; 159 u32_directive *dir; 160 size_t max_width_length; 161 size_t max_precision_length; 162 u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES]; 163 } 164 u32_directives; 165 166 #endif 167 168 169 /* Parses the format string. Fills in the number N of directives, and fills 170 in directives[0], ..., directives[N-1], and sets directives[N].dir_start 171 to the end of the format string. Also fills in the arg_type fields of the 172 arguments and the needed count of arguments. */ 173 #if ENABLE_UNISTDIO 174 extern int 175 ulc_printf_parse (const char *format, char_directives *d, arguments *a); 176 extern int 177 u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); 178 extern int 179 u16_printf_parse (const uint16_t *format, u16_directives *d, 180 arguments *a); 181 extern int 182 u32_printf_parse (const uint32_t *format, u32_directives *d, 183 arguments *a); 184 #else 185 # ifdef STATIC 186 STATIC 187 # else 188 extern 189 # endif 190 int printf_parse (const char *format, char_directives *d, arguments *a); 191 #endif 192 193 #endif /* _PRINTF_PARSE_H */ 194