1 /* 2 * general implementation of scanf used by scanf, sscanf, fscanf, 3 * _cscanf, wscanf, swscanf and fwscanf 4 * 5 * Copyright 1996,1998 Marcus Meissner 6 * Copyright 1996 Jukka Iivonen 7 * Copyright 1997,2000 Uwe Bonnes 8 * Copyright 2000 Jon Griffiths 9 * Copyright 2002 Daniel Gudbjartsson 10 * 11 * This library is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2.1 of the License, or (at your option) any later version. 15 * 16 * This library is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with this library; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 24 */ 25 26 #include <stdarg.h> 27 #include <limits.h> 28 29 #include <wine/winternl.h> 30 #include <wine/debug.h> 31 32 #include "winesup.h" 33 34 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); 35 36 //extern FILE _iob[]; 37 38 /* helper function for *scanf. Returns the value of character c in the 39 * given base, or -1 if the given character is not a digit of the base. 40 */ 41 static int char2digit(char c, int base) { 42 if ((c>='0') && (c<='9') && (c<='0'+base-1)) return (c-'0'); 43 if (base<=10) return -1; 44 if ((c>='A') && (c<='Z') && (c<='A'+base-11)) return (c-'A'+10); 45 if ((c>='a') && (c<='z') && (c<='a'+base-11)) return (c-'a'+10); 46 return -1; 47 } 48 49 /* helper function for *wscanf. Returns the value of character c in the 50 * given base, or -1 if the given character is not a digit of the base. 51 */ 52 static int wchar2digit(wchar_t c, int base) { 53 if ((c>='0') && (c<='9') && (c<='0'+base-1)) return (c-'0'); 54 if (base<=10) return -1; 55 if ((c>='A') && (c<='Z') && (c<='A'+base-11)) return (c-'A'+10); 56 if ((c>='a') && (c<='z') && (c<='a'+base-11)) return (c-'a'+10); 57 return -1; 58 } 59 60 #ifndef _LIBCNT_ 61 /* vfscanf_l */ 62 #undef WIDE_SCANF 63 #undef CONSOLE 64 #undef STRING 65 #undef SECURE 66 #include "scanf.h" 67 68 /* vfwscanf_l */ 69 #define WIDE_SCANF 1 70 #undef CONSOLE 71 #undef STRING 72 #undef SECURE 73 #include "scanf.h" 74 #endif /* !_LIBCNT_ */ 75 76 /* vsscanf_l */ 77 #undef WIDE_SCANF 78 #undef CONSOLE 79 #define STRING 1 80 #undef SECURE 81 #include "scanf.h" 82 83 /* vswscanf_l */ 84 #define WIDE_SCANF 1 85 #undef CONSOLE 86 #define STRING 1 87 #undef SECURE 88 #include "scanf.h" 89 90 /* vsnscanf_l */ 91 #undef WIDE_SCANF 92 #undef CONSOLE 93 #define STRING 1 94 #define STRING_LEN 1 95 #undef SECURE 96 #include "scanf.h" 97 98 #ifndef _LIBCNT_ 99 /* vcscanf_l */ 100 #undef WIDE_SCANF 101 #define CONSOLE 1 102 #undef STRING 103 #undef SECURE 104 #include "scanf.h" 105 106 107 /********************************************************************* 108 * fscanf (MSVCRT.@) 109 */ 110 int CDECL fscanf(FILE *file, const char *format, ...) 111 { 112 __ms_va_list valist; 113 int res; 114 115 __ms_va_start(valist, format); 116 res = vfscanf_l(file, format, NULL, valist); 117 __ms_va_end(valist); 118 return res; 119 } 120 121 /********************************************************************* 122 * scanf (MSVCRT.@) 123 */ 124 int CDECL scanf(const char *format, ...) 125 { 126 __ms_va_list valist; 127 int res; 128 129 __ms_va_start(valist, format); 130 res = vfscanf_l(stdin, format, NULL, valist); 131 __ms_va_end(valist); 132 return res; 133 } 134 135 /********************************************************************* 136 * fwscanf (MSVCRT.@) 137 */ 138 int CDECL fwscanf(FILE *file, const wchar_t *format, ...) 139 { 140 __ms_va_list valist; 141 int res; 142 143 __ms_va_start(valist, format); 144 res = vfwscanf_l(file, format, NULL, valist); 145 __ms_va_end(valist); 146 return res; 147 } 148 149 150 /********************************************************************* 151 * wscanf (MSVCRT.@) 152 */ 153 int CDECL wscanf(const wchar_t *format, ...) 154 { 155 __ms_va_list valist; 156 int res; 157 158 __ms_va_start(valist, format); 159 res = vfwscanf_l(stdin, format, NULL, valist); 160 __ms_va_end(valist); 161 return res; 162 } 163 #endif /* !_LIBCNT_ */ 164 165 166 /********************************************************************* 167 * sscanf (MSVCRT.@) 168 */ 169 int CDECL sscanf(const char *str, const char *format, ...) 170 { 171 __ms_va_list valist; 172 int res; 173 174 __ms_va_start(valist, format); 175 res = vsscanf_l(str, format, NULL, valist); 176 __ms_va_end(valist); 177 return res; 178 } 179 180 181 /********************************************************************* 182 * swscanf (MSVCRT.@) 183 */ 184 int CDECL swscanf(const wchar_t *str, const wchar_t *format, ...) 185 { 186 __ms_va_list valist; 187 int res; 188 189 __ms_va_start(valist, format); 190 res = vswscanf_l(str, format, NULL, valist); 191 __ms_va_end(valist); 192 return res; 193 } 194 195 #ifndef _LIBCNT_ 196 /********************************************************************* 197 * _cscanf (MSVCRT.@) 198 */ 199 int CDECL _cscanf(const char *format, ...) 200 { 201 __ms_va_list valist; 202 int res; 203 204 __ms_va_start(valist, format); 205 res = vcscanf_l(format, NULL, valist); 206 __ms_va_end(valist); 207 return res; 208 } 209 #endif 210 211 /********************************************************************* 212 * _snscanf (MSVCRT.@) 213 */ 214 int CDECL _snscanf(const char *input, size_t length, const char *format, ...) 215 { 216 __ms_va_list valist; 217 int res; 218 219 __ms_va_start(valist, format); 220 res = vsnscanf_l(input, length, format, NULL, valist); 221 __ms_va_end(valist); 222 return res; 223 } 224