vfscanf.c (38f1b189cd839bd8aa122ae06cc084810ca1e395) | vfscanf.c (d7af8cf14be778fbf7f6ebc84346ae88fbd6978f) |
---|---|
1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Copyright (c) 2011 The FreeBSD Foundation 6 * All rights reserved. 7 * Portions of this software were developed by David Chisnall 8 * under sponsorship from the FreeBSD Foundation. --- 113 unchanged lines hidden (view full) --- 122 * The following conversion functions return the number of characters consumed, 123 * or -1 on input failure. Character class conversion returns 0 on match 124 * failure. 125 */ 126 127static __inline int 128convert_char(FILE *fp, char * __restrict p, int width) 129{ | 1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Copyright (c) 2011 The FreeBSD Foundation 6 * All rights reserved. 7 * Portions of this software were developed by David Chisnall 8 * under sponsorship from the FreeBSD Foundation. --- 113 unchanged lines hidden (view full) --- 122 * The following conversion functions return the number of characters consumed, 123 * or -1 on input failure. Character class conversion returns 0 on match 124 * failure. 125 */ 126 127static __inline int 128convert_char(FILE *fp, char * __restrict p, int width) 129{ |
130 int n, nread; | 130 int n; |
131 | 131 |
132 nread = 0; | |
133 if (p == SUPPRESS_PTR) { 134 size_t sum = 0; 135 for (;;) { 136 if ((n = fp->_r) < width) { 137 sum += n; 138 width -= n; 139 fp->_p += n; 140 if (__srefill(fp)) { 141 if (sum == 0) 142 return (-1); 143 break; 144 } 145 } else { 146 sum += width; 147 fp->_r -= width; 148 fp->_p += width; 149 break; 150 } 151 } | 132 if (p == SUPPRESS_PTR) { 133 size_t sum = 0; 134 for (;;) { 135 if ((n = fp->_r) < width) { 136 sum += n; 137 width -= n; 138 fp->_p += n; 139 if (__srefill(fp)) { 140 if (sum == 0) 141 return (-1); 142 break; 143 } 144 } else { 145 sum += width; 146 fp->_r -= width; 147 fp->_p += width; 148 break; 149 } 150 } |
152 nread += sum; | 151 return (sum); |
153 } else { 154 size_t r = __fread(p, 1, width, fp); 155 156 if (r == 0) 157 return (-1); | 152 } else { 153 size_t r = __fread(p, 1, width, fp); 154 155 if (r == 0) 156 return (-1); |
158 nread += r; | 157 return (r); |
159 } | 158 } |
160 return (nread); | |
161} 162 163static __inline int | 159} 160 161static __inline int |
164convert_wchar(FILE *fp, wchar_t *wcp, int width) | 162convert_wchar(FILE *fp, wchar_t *wcp, int width, locale_t locale) |
165{ 166 mbstate_t mbs; | 163{ 164 mbstate_t mbs; |
167 size_t nconv; | |
168 int n, nread; | 165 int n, nread; |
169 char buf[MB_CUR_MAX]; | 166 wint_t wi; |
170 | 167 |
171 nread = 0; | 168 mbs = initial_mbs; |
172 n = 0; | 169 n = 0; |
173 while (width != 0) { 174 if (n == MB_CUR_MAX) { 175 fp->_flags |= __SERR; 176 return (-1); 177 } 178 buf[n++] = *fp->_p; 179 fp->_p++; 180 fp->_r--; 181 mbs = initial_mbs; 182 nconv = mbrtowc(wcp, buf, n, &mbs); 183 if (nconv == (size_t)-1) { 184 fp->_flags |= __SERR; 185 return (-1); 186 } 187 if (nconv == 0 && wcp != SUPPRESS_PTR) 188 *wcp = L'\0'; 189 if (nconv != (size_t)-2) { 190 nread += n; 191 width--; 192 if (wcp != SUPPRESS_PTR) 193 wcp++; 194 n = 0; 195 } 196 if (fp->_r <= 0 && __srefill(fp)) { 197 if (n != 0) { 198 fp->_flags |= __SERR; 199 return (-1); 200 } 201 break; 202 } | 170 while (width-- != 0 && 171 (wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF) { 172 if (wcp != SUPPRESS_PTR) 173 *wcp++ = (wchar_t)wi; 174 n += nread; |
203 } | 175 } |
204 return (nread); | 176 if (n == 0) 177 return (-1); 178 return (n); |
205} 206 207static __inline int 208convert_ccl(FILE *fp, char * __restrict p, int width, const char *ccltab) 209{ 210 char *p0; 211 int n; 212 --- 26 unchanged lines hidden (view full) --- 239 if (n == 0) 240 return (0); 241 *p = 0; 242 } 243 return (n); 244} 245 246static __inline int | 179} 180 181static __inline int 182convert_ccl(FILE *fp, char * __restrict p, int width, const char *ccltab) 183{ 184 char *p0; 185 int n; 186 --- 26 unchanged lines hidden (view full) --- 213 if (n == 0) 214 return (0); 215 *p = 0; 216 } 217 return (n); 218} 219 220static __inline int |
247convert_wccl(FILE *fp, wchar_t *wcp, int width, const char *ccltab) | 221convert_wccl(FILE *fp, wchar_t *wcp, int width, const char *ccltab, 222 locale_t locale) |
248{ 249 mbstate_t mbs; | 223{ 224 mbstate_t mbs; |
250 wchar_t twc; 251 int n, nchars, nconv; 252 char buf[MB_CUR_MAX]; | 225 wint_t wi; 226 int n, nread; |
253 | 227 |
254 if (wcp == SUPPRESS_PTR) 255 wcp = &twc; | 228 mbs = initial_mbs; |
256 n = 0; | 229 n = 0; |
257 nchars = 0; 258 while (width != 0) { 259 if (n == MB_CUR_MAX) { 260 fp->_flags |= __SERR; 261 return (-1); | 230 if (wcp == SUPPRESS_PTR) { 231 while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && 232 width-- != 0 && ccltab[wctob(wi)]) 233 n += nread; 234 if (wi != WEOF) 235 __ungetwc(wi, fp, __get_locale()); 236 } else { 237 while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && 238 width-- != 0 && ccltab[wctob(wi)]) { 239 *wcp++ = (wchar_t)wi; 240 n += nread; |
262 } | 241 } |
263 buf[n++] = *fp->_p; 264 fp->_p++; 265 fp->_r--; 266 mbs = initial_mbs; 267 nconv = mbrtowc(wcp, buf, n, &mbs); 268 if (nconv == (size_t)-1) { 269 fp->_flags |= __SERR; 270 return (-1); 271 } 272 if (nconv == 0) 273 *wcp = L'\0'; 274 if (nconv != (size_t)-2) { 275 if (wctob(*wcp) != EOF && !ccltab[wctob(*wcp)]) { 276 while (n != 0) { 277 n--; 278 __ungetc(buf[n], fp); 279 } 280 break; 281 } 282 width--; 283 if (wcp != &twc) 284 wcp++; 285 nchars++; 286 n = 0; 287 } 288 if (fp->_r <= 0 && __srefill(fp)) { 289 if (n != 0) { 290 fp->_flags |= __SERR; 291 return (-1); 292 } 293 break; 294 } | 242 if (wi != WEOF) 243 __ungetwc(wi, fp, __get_locale()); 244 if (n == 0) 245 return (0); 246 *wcp = 0; |
295 } | 247 } |
296 if (n != 0) { 297 fp->_flags |= __SERR; 298 return (-1); 299 } 300 if (nchars == 0) 301 return (0); 302 *wcp = L'\0'; 303 return (nchars); | 248 return (n); |
304} 305 306static __inline int 307convert_string(FILE *fp, char * __restrict p, int width) 308{ 309 char *p0; 310 int n; 311 --- 18 unchanged lines hidden (view full) --- 330 } 331 *p = 0; 332 n = p - p0; 333 } 334 return (n); 335} 336 337static __inline int | 249} 250 251static __inline int 252convert_string(FILE *fp, char * __restrict p, int width) 253{ 254 char *p0; 255 int n; 256 --- 18 unchanged lines hidden (view full) --- 275 } 276 *p = 0; 277 n = p - p0; 278 } 279 return (n); 280} 281 282static __inline int |
338convert_wstring(FILE *fp, wchar_t *wcp, int width) | 283convert_wstring(FILE *fp, wchar_t *wcp, int width, locale_t locale) |
339{ 340 mbstate_t mbs; | 284{ 285 mbstate_t mbs; |
341 wchar_t twc; 342 int n, nconv, nread; 343 char buf[MB_CUR_MAX]; | 286 wint_t wi; 287 int n, nread; |
344 | 288 |
345 if (wcp == SUPPRESS_PTR) 346 wcp = &twc; 347 n = nread = 0; 348 while (!isspace(*fp->_p) && width != 0) { 349 if (n == MB_CUR_MAX) { 350 fp->_flags |= __SERR; 351 return (-1); | 289 mbs = initial_mbs; 290 n = 0; 291 if (wcp == SUPPRESS_PTR) { 292 while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && 293 width-- != 0 && !iswspace(wi)) 294 n += nread; 295 if (wi != WEOF) 296 __ungetwc(wi, fp, __get_locale()); 297 } else { 298 while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && 299 width-- != 0 && !iswspace(wi)) { 300 *wcp++ = (wchar_t)wi; 301 n += nread; |
352 } | 302 } |
353 buf[n++] = *fp->_p; 354 fp->_p++; 355 fp->_r--; 356 mbs = initial_mbs; 357 nconv = mbrtowc(wcp, buf, n, &mbs); 358 if (nconv == (size_t)-1) { 359 fp->_flags |= __SERR; 360 return (-1); 361 } 362 if (nconv == 0) 363 *wcp = L'\0'; 364 if (nconv != (size_t)-2) { 365 if (iswspace(*wcp)) { 366 while (n != 0) { 367 n--; 368 __ungetc(buf[n], fp); 369 } 370 break; 371 } 372 nread += n; 373 width--; 374 if (wcp != &twc) 375 wcp++; 376 n = 0; 377 } 378 if (fp->_r <= 0 && __srefill(fp)) { 379 if (n != 0) { 380 fp->_flags |= __SERR; 381 return (-1); 382 } 383 break; 384 } | 303 if (wi != WEOF) 304 __ungetwc(wi, fp, __get_locale()); 305 *wcp = '\0'; |
385 } | 306 } |
386 *wcp = L'\0'; 387 return (nread); | 307 return (n); |
388} 389 390/* 391 * Read an integer, storing it in buf. The only relevant bit in the 392 * flags argument is PFXOK. 393 * 394 * Return 0 on a match failure, and the number of characters read 395 * otherwise. --- 365 unchanged lines hidden (view full) --- 761 switch (c) { 762 763 case CT_CHAR: 764 /* scan arbitrary characters (sets NOSKIP) */ 765 if (width == 0) 766 width = 1; 767 if (flags & LONG) { 768 nr = convert_wchar(fp, GETARG(wchar_t *), | 308} 309 310/* 311 * Read an integer, storing it in buf. The only relevant bit in the 312 * flags argument is PFXOK. 313 * 314 * Return 0 on a match failure, and the number of characters read 315 * otherwise. --- 365 unchanged lines hidden (view full) --- 681 switch (c) { 682 683 case CT_CHAR: 684 /* scan arbitrary characters (sets NOSKIP) */ 685 if (width == 0) 686 width = 1; 687 if (flags & LONG) { 688 nr = convert_wchar(fp, GETARG(wchar_t *), |
769 width); | 689 width, locale); |
770 } else { 771 nr = convert_char(fp, GETARG(char *), width); 772 } 773 if (nr < 0) 774 goto input_failure; 775 break; 776 777 case CT_CCL: 778 /* scan a (nonempty) character class (sets NOSKIP) */ 779 if (width == 0) 780 width = (size_t)~0; /* `infinity' */ 781 if (flags & LONG) { 782 nr = convert_wccl(fp, GETARG(wchar_t *), width, | 690 } else { 691 nr = convert_char(fp, GETARG(char *), width); 692 } 693 if (nr < 0) 694 goto input_failure; 695 break; 696 697 case CT_CCL: 698 /* scan a (nonempty) character class (sets NOSKIP) */ 699 if (width == 0) 700 width = (size_t)~0; /* `infinity' */ 701 if (flags & LONG) { 702 nr = convert_wccl(fp, GETARG(wchar_t *), width, |
783 ccltab); | 703 ccltab, locale); |
784 } else { 785 nr = convert_ccl(fp, GETARG(char *), width, 786 ccltab); 787 } 788 if (nr <= 0) { 789 if (nr < 0) 790 goto input_failure; 791 else /* nr == 0 */ 792 goto match_failure; 793 } 794 break; 795 796 case CT_STRING: 797 /* like CCL, but zero-length string OK, & no NOSKIP */ 798 if (width == 0) 799 width = (size_t)~0; 800 if (flags & LONG) { 801 nr = convert_wstring(fp, GETARG(wchar_t *), | 704 } else { 705 nr = convert_ccl(fp, GETARG(char *), width, 706 ccltab); 707 } 708 if (nr <= 0) { 709 if (nr < 0) 710 goto input_failure; 711 else /* nr == 0 */ 712 goto match_failure; 713 } 714 break; 715 716 case CT_STRING: 717 /* like CCL, but zero-length string OK, & no NOSKIP */ 718 if (width == 0) 719 width = (size_t)~0; 720 if (flags & LONG) { 721 nr = convert_wstring(fp, GETARG(wchar_t *), |
802 width); | 722 width, locale); |
803 } else { 804 nr = convert_string(fp, GETARG(char *), width); 805 } 806 if (nr < 0) 807 goto input_failure; 808 break; 809 810 case CT_INT: --- 364 unchanged lines hidden --- | 723 } else { 724 nr = convert_string(fp, GETARG(char *), width); 725 } 726 if (nr < 0) 727 goto input_failure; 728 break; 729 730 case CT_INT: --- 364 unchanged lines hidden --- |