1 /* Copyright (c) 2002,2004,2005 Joerg Wunsch 2 Copyright (c) 2008 Dmitry Xmelkov 3 All rights reserved. 4 5 Redistribution and use in source and binary forms, with or without 6 modification, are permitted provided that the following conditions are met: 7 8 * Redistributions of source code must retain the above copyright 9 notice, this list of conditions and the following disclaimer. 10 11 * Redistributions in binary form must reproduce the above copyright 12 notice, this list of conditions and the following disclaimer in 13 the documentation and/or other materials provided with the 14 distribution. 15 16 * Neither the name of the copyright holders nor the names of 17 contributors may be used to endorse or promote products derived 18 from this software without specific prior written permission. 19 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef _SCANF_PRIVATE_H_ 34 #define _SCANF_PRIVATE_H_ 35 36 #if !defined (SCANF_LEVEL) 37 # define SCANF_LEVEL SCANF_DBL 38 # ifndef _FORMAT_DEFAULT_DOUBLE 39 # define vfscanf __d_vfscanf 40 # endif 41 #endif 42 43 #if defined(STRTOF) 44 # define _NEED_IO_FLOAT 45 #elif defined(STRTOD) 46 # define _NEED_IO_DOUBLE 47 #elif defined(STRTOLD) 48 # define _NEED_IO_DOUBLE 49 # define _NEED_IO_LONG_DOUBLE 50 #elif SCANF_LEVEL == SCANF_MIN 51 # define _NEED_IO_SHRINK 52 # if defined(_WANT_MINIMAL_IO_LONG_LONG) && __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 53 # define _NEED_IO_LONG_LONG 54 # endif 55 # ifdef _WANT_IO_C99_FORMATS 56 # define _NEED_IO_C99_FORMATS 57 # endif 58 #elif SCANF_LEVEL == SCANF_STD 59 # define _NEED_IO_BRACKET 60 # ifdef _WANT_IO_POS_ARGS 61 # define _NEED_IO_POS_ARGS 62 # endif 63 # if defined(_WANT_IO_LONG_LONG) && __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 64 # define _NEED_IO_LONG_LONG 65 # endif 66 # ifdef _WANT_IO_C99_FORMATS 67 # define _NEED_IO_C99_FORMATS 68 # endif 69 # ifdef _WANT_IO_PERCENT_B 70 # define _NEED_IO_PERCENT_B 71 # endif 72 int vfscanf (FILE * stream, const char *fmt, va_list ap) __attribute__((weak)); 73 #elif SCANF_LEVEL == SCANF_LLONG 74 # define _NEED_IO_BRACKET 75 # ifdef _WANT_IO_POS_ARGS 76 # define _NEED_IO_POS_ARGS 77 # endif 78 # if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 79 # define _NEED_IO_LONG_LONG 80 # endif 81 # ifdef _WANT_IO_C99_FORMATS 82 # define _NEED_IO_C99_FORMATS 83 # endif 84 # ifdef _WANT_IO_PERCENT_B 85 # define _NEED_IO_PERCENT_B 86 # endif 87 #elif SCANF_LEVEL == SCANF_FLT 88 # define _NEED_IO_BRACKET 89 # if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 90 # define _NEED_IO_LONG_LONG 91 # endif 92 # define _NEED_IO_POS_ARGS 93 # define _NEED_IO_C99_FORMATS 94 # ifdef _WANT_IO_PERCENT_B 95 # define _NEED_IO_PERCENT_B 96 # endif 97 # define _NEED_IO_FLOAT 98 #elif SCANF_LEVEL == SCANF_DBL 99 # define _NEED_IO_BRACKET 100 # if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 101 # define _NEED_IO_LONG_LONG 102 # endif 103 # define _NEED_IO_POS_ARGS 104 # define _NEED_IO_C99_FORMATS 105 # ifdef _WANT_IO_PERCENT_B 106 # define _NEED_IO_PERCENT_B 107 # endif 108 # define _NEED_IO_DOUBLE 109 # if defined(_WANT_IO_LONG_DOUBLE) && __SIZEOF_LONG_DOUBLE__ > __SIZEOF_DOUBLE__ 110 # define _NEED_IO_LONG_DOUBLE 111 # endif 112 #else 113 # error "Not a known scanf level." 114 #endif 115 116 typedef unsigned int width_t; 117 118 #define FL_STAR 0x01 /* '*': skip assignment */ 119 #define FL_WIDTH 0x02 /* width is present */ 120 #define FL_LONG 0x04 /* 'long' type modifier */ 121 #if defined(_NEED_IO_LONG_LONG) || defined(_NEED_IO_LONG_DOUBLE) 122 #define FL_LONGLONG 0x08 /* 'long long' type modifier */ 123 #else 124 #define FL_LONGLONG 0x00 /* 'long long' type modifier */ 125 #endif 126 #define FL_CHAR 0x10 /* 'char' type modifier */ 127 #define FL_SHORT 0x20 /* 'short' type modifier */ 128 #define FL_MINUS 0x40 /* minus flag (field or value) */ 129 #define FL_ANY 0x80 /* any digit was read */ 130 #define FL_OVFL 0x100 /* significand overflowed */ 131 #define FL_DOT 0x200 /* decimal '.' was */ 132 #define FL_MEXP 0x400 /* exponent 'e' is neg. */ 133 #define FL_FHEX 0x800 /* hex significand */ 134 135 #endif /* _SCANF_PRIVATE_H_ */ 136