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 /* vsnwscanf_l */ 99 #define WIDE_SCANF 1 100 #undef CONSOLE 101 #define STRING 1 102 #define STRING_LEN 1 103 #undef SECURE 104 #include "scanf.h" 105 106 #ifndef _LIBCNT_ 107 /* vcscanf_l */ 108 #undef WIDE_SCANF 109 #define CONSOLE 1 110 #undef STRING 111 #undef SECURE 112 #include "scanf.h" 113 114 115 /********************************************************************* 116 * fscanf (MSVCRT.@) 117 */ 118 int CDECL fscanf(FILE *file, const char *format, ...) 119 { 120 __ms_va_list valist; 121 int res; 122 123 __ms_va_start(valist, format); 124 res = vfscanf_l(file, format, NULL, valist); 125 __ms_va_end(valist); 126 return res; 127 } 128 129 /********************************************************************* 130 * scanf (MSVCRT.@) 131 */ 132 int CDECL scanf(const char *format, ...) 133 { 134 __ms_va_list valist; 135 int res; 136 137 __ms_va_start(valist, format); 138 res = vfscanf_l(stdin, format, NULL, valist); 139 __ms_va_end(valist); 140 return res; 141 } 142 143 /********************************************************************* 144 * fwscanf (MSVCRT.@) 145 */ 146 int CDECL fwscanf(FILE *file, const wchar_t *format, ...) 147 { 148 __ms_va_list valist; 149 int res; 150 151 __ms_va_start(valist, format); 152 res = vfwscanf_l(file, format, NULL, valist); 153 __ms_va_end(valist); 154 return res; 155 } 156 157 158 /********************************************************************* 159 * wscanf (MSVCRT.@) 160 */ 161 int CDECL wscanf(const wchar_t *format, ...) 162 { 163 __ms_va_list valist; 164 int res; 165 166 __ms_va_start(valist, format); 167 res = vfwscanf_l(stdin, format, NULL, valist); 168 __ms_va_end(valist); 169 return res; 170 } 171 #endif /* !_LIBCNT_ */ 172 173 174 /********************************************************************* 175 * sscanf (MSVCRT.@) 176 */ 177 int CDECL sscanf(const char *str, const char *format, ...) 178 { 179 __ms_va_list valist; 180 int res; 181 182 __ms_va_start(valist, format); 183 res = vsscanf_l(str, format, NULL, valist); 184 __ms_va_end(valist); 185 return res; 186 } 187 188 189 /********************************************************************* 190 * swscanf (MSVCRT.@) 191 */ 192 int CDECL swscanf(const wchar_t *str, const wchar_t *format, ...) 193 { 194 __ms_va_list valist; 195 int res; 196 197 __ms_va_start(valist, format); 198 res = vswscanf_l(str, format, NULL, valist); 199 __ms_va_end(valist); 200 return res; 201 } 202 203 #ifndef _LIBCNT_ 204 /********************************************************************* 205 * _cscanf (MSVCRT.@) 206 */ 207 int CDECL _cscanf(const char *format, ...) 208 { 209 __ms_va_list valist; 210 int res; 211 212 __ms_va_start(valist, format); 213 res = vcscanf_l(format, NULL, valist); 214 __ms_va_end(valist); 215 return res; 216 } 217 #endif 218 219 /********************************************************************* 220 * _snwscanf (MSVCRT.@) 221 */ 222 int WINAPIV _snwscanf(const wchar_t *input, size_t length, 223 const wchar_t *format, ...) 224 { 225 __ms_va_list valist; 226 int res; 227 228 __ms_va_start(valist, format); 229 res = vsnwscanf_l(input, length, format, NULL, valist); 230 __ms_va_end(valist); 231 return res; 232 } 233 234 /********************************************************************* 235 * _snscanf (MSVCRT.@) 236 */ 237 int CDECL _snscanf(const char *input, size_t length, const char *format, ...) 238 { 239 __ms_va_list valist; 240 int res; 241 242 __ms_va_start(valist, format); 243 res = vsnscanf_l(input, length, format, NULL, valist); 244 __ms_va_end(valist); 245 return res; 246 } 247