diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/crt32/stdio/fgetwc.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/crt32/stdio/fgetwc.c')
-rw-r--r-- | private/crt32/stdio/fgetwc.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/private/crt32/stdio/fgetwc.c b/private/crt32/stdio/fgetwc.c new file mode 100644 index 000000000..de7a37af4 --- /dev/null +++ b/private/crt32/stdio/fgetwc.c @@ -0,0 +1,154 @@ +/*** +*fgetwc.c - get a wide character from a stream +* +* Copyright (c) 1993, Microsoft Corporation. All rights reserved. +* +*Purpose: +* defines fgetwc() - read a wide character from a stream +* +*Revision History: +* 04-26-93 CFW Module created. +* 04-30-93 CFW Bring wide char support from fgetc.c. +* 05-03-93 CFW Add getwc function. +* 05-10-93 CFW Optimize, fix error handling. +* 06-02-93 CFW Wide get/put use wint_t. +* 09-14-93 CFW Fix EOF cast bug. +* 10-22-93 CFW Test for invalid MB chars using global preset flag. +* 10-28-93 CFW Test for both IOSTRG and TEXT. +* +*******************************************************************************/ + +#include <cruntime.h> +#include <stdio.h> +#include <assert.h> +#include <file2.h> +#include <internal.h> +#include <os2dll.h> +#include <msdos.h> +#include <errno.h> +#include <wchar.h> +#include <tchar.h> +#include <setlocal.h> + +#ifdef MTHREAD /* multi-thread; define both fgetwc and _getwc_lk */ + +/*** +*wint_t fgetwc(stream) - read a wide character from a stream +* +*Purpose: +* reads a wide character from the given stream +* +*Entry: +* FILE *stream - stream to read wide character from +* +*Exit: +* returns the wide character read +* returns WEOF if at end of file or error occurred +* +*Exceptions: +* +*******************************************************************************/ + +wint_t _CRTAPI1 fgetwc ( + REG1 FILE *stream + ) +{ + wint_t retval; + int index; + + assert(stream != NULL); + + index = _iob_index(stream); + _lock_str(index); + retval = _getwc_lk(stream); + _unlock_str(index); + + return(retval); +} + +/*** +*_getwc_lk() - getwc() core routine (locked version) +* +*Purpose: +* Core getwc() routine; assumes stream is already locked. +* +* [See getwc() above for more info.] +* +*Entry: [See getwc()] +* +*Exit: [See getwc()] +* +*Exceptions: +* +*******************************************************************************/ + +wint_t _CRTAPI1 _getwc_lk ( + REG1 FILE *stream + ) +{ + +#else /* non multi-thread; just define fgetwc */ + +wint_t _CRTAPI1 fgetwc ( + REG1 FILE *stream + ) +{ + +#endif /* rejoin common code */ + +#ifndef _NTSUBSET_ + if (!(stream->_flag & _IOSTRG) && (_osfile[_fileno(stream)] & FTEXT)) + { + int size = 1; + int ch; + char mbc[4]; + wchar_t wch; + + /* text (multi-byte) mode */ + if ((ch = _getc_lk(stream)) == EOF) + return WEOF; + + mbc[0] = (char)ch; + + if (isleadbyte((unsigned char)mbc[0])) + { + if ((ch = _getc_lk(stream)) == EOF) + { + ungetc(mbc[0], stream); + return WEOF; + } + mbc[1] = (char)ch; + size = 2; + } + if (MultiByteToWideChar(_lc_codepage, + MB_PRECOMPOSED|__invalid_mb_chars, + mbc, + size, + &wch, + 1) == 0) + { + /* + * Conversion failed! Set errno and return + * failure. + */ + errno = EILSEQ; + return WEOF; + } + return wch; + } +#endif + /* binary (Unicode) mode */ + if ((stream->_cnt -= sizeof(wchar_t)) >= 0) + return *((wchar_t *)(stream->_ptr))++; + else + return _filwbuf(stream); +} + +#undef getwc + +wint_t _CRTAPI1 getwc ( + FILE *stream + ) +{ + return fgetwc(stream); +} |