--- /dev/null 2006-11-30 19:00:00.000000000 -0500 +++ libc/stdio/fwide.c 2008-11-07 10:54:43.139808200 -0500 @@ -0,0 +1,95 @@ +/* +FUNCTION +<>---set and determine the orientation of a FILE stream + +INDEX + fwide +INDEX + _fwide_r + +ANSI_SYNOPSIS + #include + #include + int fwide(FILE *<[fp]>, int <[mode]>) + + int _fwide_r(struct _reent *<[ptr]>, FILE *<[fp]>, int <[mode]>) + +TRAD_SYNOPSIS + #include + #include + int fwide(<[fp]>, <[mode]>) + FILE *<[fp]>; + int <[mode]>; + + int fwide(<[ptr]>, <[fp]>, <[mode]>) + struct _reent *<[ptr]>; + FILE *<[fp]>; + int <[mode]>; + +DESCRIPTION +When <[mode]> is zero, the <> function determines the current +orientation of <[fp]>. It returns a value > 0 if <[fp]> is +wide-character oriented, i.e. if wide character I/O is permitted but +char I/O is disallowed. It returns a value < 0 if <[fp]> is byte +oriented, i.e. if char I/O is permitted but wide character I/O is +disallowed. It returns zero if <[fp]> has no orientation yet; in +this case the next I/O operation might change the orientation (to byte +oriented if it is a char I/O operation, or to wide-character oriented +if it is a wide character I/O operation). + +Once a stream has an orientation, it cannot be changed and persists +until the stream is closed, unless the stream is re-opened with freopen, +which removes the orientation of the stream. + +When <[mode]> is non-zero, the <> function first attempts to set +<[fp]>'s orientation (to wide-character oriented if <[mode]> > 0, or to +byte oriented if <[mode]> < 0). It then returns a value denoting the +current orientation, as above. + +RETURNS +The <> function returns <[fp]>'s orientation, after possibly +changing it. A return value > 0 means wide-character oriented. A return +value < 0 means byte oriented. A return value of zero means undecided. + +PORTABILITY +C99, POSIX.1-2001. + +*/ + +#include <_ansi.h> +#include "local.h" + +int +_DEFUN(_fwide_r, (ptr, fp, mode), + struct _reent *ptr _AND + FILE *fp _AND + int mode) +{ + int ret; + + CHECK_INIT(ptr, fp); + + _flockfile (fp); + if (mode && !(fp->_flags & __SORD)) + { + fp->_flags |= __SORD; + if (mode > 0) + fp->_flags2 |= __SWID; + else + fp->_flags2 &= ~__SWID; + } + if (!(fp->_flags & __SORD)) + ret = 0; + else + ret = (fp->_flags2 & __SWID) ? 1 : -1; + _funlockfile (fp); + return ret; +} + +int +_DEFUN(fwide, (fp, mode), + FILE *fp _AND + int mode) +{ + return _fwide_r (_REENT, fp, mode); +}