fgetwc.c (bddc6280f25a0e47aacf5abec9f5094861dad18b) | fgetwc.c (0b7bc80226a5e70af58cce04b29957d71786e835) |
---|---|
1/*- 2 * Copyright (c) 2002 Tim J. Robbins. 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 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31#include <errno.h> 32#include <stdio.h> 33#include <stdlib.h> 34#include <wchar.h> 35#include "un-namespace.h" 36#include "libc_private.h" 37#include "local.h" 38 | 1/*- 2 * Copyright (c) 2002 Tim J. Robbins. 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 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31#include <errno.h> 32#include <stdio.h> 33#include <stdlib.h> 34#include <wchar.h> 35#include "un-namespace.h" 36#include "libc_private.h" 37#include "local.h" 38 |
39static __inline wint_t __fgetwc_nbf(FILE *); 40 |
|
39wint_t 40fgetwc(FILE *fp) 41{ | 41wint_t 42fgetwc(FILE *fp) 43{ |
44 wint_t wc; 45 46 FLOCKFILE(fp); 47 ORIENT(fp, 1); 48 if (MB_CUR_MAX == 1) { 49 /* 50 * Assume we're using a single-byte locale. A safer test 51 * might be to check _CurrentRuneLocale->encoding. 52 */ 53 wc = (wint_t)__sgetc(fp); 54 } else 55 wc = __fgetwc_nbf(fp); 56 FUNLOCKFILE(fp); 57 58 return (wc); 59} 60 61static __inline wint_t 62__fgetwc_nbf(FILE *fp) 63{ |
|
42 char buf[MB_LEN_MAX]; 43 mbstate_t mbs; 44 size_t n, nconv; 45 int c; 46 wchar_t wc; 47 | 64 char buf[MB_LEN_MAX]; 65 mbstate_t mbs; 66 size_t n, nconv; 67 int c; 68 wchar_t wc; 69 |
48 ORIENTLOCK(fp, 1); 49 | |
50 n = 0; 51 while (n < MB_CUR_MAX) { | 70 n = 0; 71 while (n < MB_CUR_MAX) { |
52 if ((c = fgetc(fp)) == EOF) { | 72 if ((c = __sgetc(fp)) == EOF) { |
53 if (n == 0) 54 return (WEOF); 55 break; 56 } 57 buf[n++] = (char)c; 58 memset(&mbs, 0, sizeof(mbs)); 59 nconv = mbrtowc(&wc, buf, n, &mbs); 60 if (nconv == n) 61 return (wc); 62 else if (nconv == 0) 63 return (L'\0'); 64 else if (nconv == (size_t)-1) 65 break; 66 } 67 | 73 if (n == 0) 74 return (WEOF); 75 break; 76 } 77 buf[n++] = (char)c; 78 memset(&mbs, 0, sizeof(mbs)); 79 nconv = mbrtowc(&wc, buf, n, &mbs); 80 if (nconv == n) 81 return (wc); 82 else if (nconv == 0) 83 return (L'\0'); 84 else if (nconv == (size_t)-1) 85 break; 86 } 87 |
88 FUNLOCKFILE(fp); |
|
68 while (n-- != 0) 69 ungetc((unsigned char)buf[n], fp); | 89 while (n-- != 0) 90 ungetc((unsigned char)buf[n], fp); |
91 FLOCKFILE(fp); |
|
70 errno = EILSEQ; 71 return (WEOF); 72} | 92 errno = EILSEQ; 93 return (WEOF); 94} |