_WCRTLINK int __F_NAME(fputs,fputws)( const CHAR_TYPE *s, FILE *fp ) { const CHAR_TYPE *start; int c; int not_buffered; int rc; _ValidFile( fp, __F_NAME(EOF,WEOF) ); _AccessFile( fp ); if( _FP_BASE(fp) == NULL ) { __ioalloc( fp ); /* allocate buffer */ } not_buffered = 0; if( fp->_flag & _IONBF ) { not_buffered = 1; fp->_flag &= ~_IONBF; fp->_flag |= _IOLBF; } rc = 0; start = s; while( c = *s ) { s++; #ifndef __WIDECHAR__ if( (fputc)( c, fp ) == EOF ) { /* 23-oct-91 */ rc = EOF; break; } #else if( (fputwc)( c, fp ) == WEOF ) { /* 23-oct-91 */ rc = -1; break; } #endif } if( not_buffered ) { fp->_flag &= ~_IOLBF; fp->_flag |= _IONBF; if( rc == 0 ) { rc = __flush( fp ); /* 23-oct-91 */ } } if( rc == 0 ) { /* return the number of items written */ /* this is ok by ANSI which says that success is */ /* indicated by a non-negative return value */ rc = s - start; } _ReleaseFile( fp ); return( rc ); }
int __fill_buffer( FILE *fp ) { if( _FP_BASE( fp ) == NULL ) { __ioalloc( fp ); } if( fp->_flag & _ISTTY ) { /* 20-aug-90 */ if( fp->_flag & (_IONBF | _IOLBF) ) { __flushall( _ISTTY ); /* flush all TTY output */ } } fp->_flag &= ~_UNGET; /* 10-mar-90 */ fp->_ptr = _FP_BASE( fp ); #ifdef __UNIX__ fp->_cnt = __qread( fileno( fp ), fp->_ptr, (fp->_flag & _IONBF) ? 1 : fp->_bufsize ); #else if(( fp->_flag & (_IONBF | _ISTTY)) == (_IONBF | _ISTTY) && ( fileno( fp ) == STDIN_FILENO )) { int c; /* JBS 31-may-91 */ fp->_cnt = 0; c = getche(); if( c != EOF ) { *fp->_ptr = c; fp->_cnt = 1; } } else { fp->_cnt = __qread( fileno( fp ), fp->_ptr, (fp->_flag & _IONBF) ? 1 : fp->_bufsize ); } #endif if( fp->_cnt <= 0 ) { if( fp->_cnt == 0 ) { fp->_flag |= _EOF; } else { fp->_flag |= _SFERR; fp->_cnt = 0; } } return( fp->_cnt ); }
_WCRTLINK wint_t (ungetwc)( wint_t c, FILE *fp ) #endif { if( c == __F_NAME(EOF,WEOF) ) { /* cannot push EOF */ return( c ); } _ValidFile( fp, __F_NAME(EOF,WEOF) ); _AccessFile( fp ); /*** Deal with stream orientation ***/ #ifndef __NETWARE__ #ifdef __WIDECHAR__ if( _FP_ORIENTATION(fp) != _WIDE_ORIENTED ) { if( _FP_ORIENTATION(fp) == _NOT_ORIENTED ) { _FP_ORIENTATION(fp) = _WIDE_ORIENTED; } else { _ReleaseFile( fp ); return( WEOF ); } } #else if( _FP_ORIENTATION(fp) != _BYTE_ORIENTED ) { if( _FP_ORIENTATION(fp) == _NOT_ORIENTED ) { _FP_ORIENTATION(fp) = _BYTE_ORIENTED; } else { _ReleaseFile( fp ); return( EOF ); } } #endif #endif if( fp->_flag & _DIRTY ) { /* cannot unget after a put */ _ReleaseFile( fp ); return( __F_NAME(EOF,WEOF) ); } if(( fp->_flag & _READ ) == 0 ) { /* not open for input */ _ReleaseFile( fp ); return( __F_NAME(EOF,WEOF) ); } if( _FP_BASE(fp) == NULL ) { /* no buffer allocated */ __ioalloc( fp ); } #ifdef __WIDECHAR__ if( fp->_flag & _BINARY ) { /*** Leave the character in wide form ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = sizeof(wchar_t); fp->_ptr = _FP_BASE(fp) + fp->_bufsize - sizeof(wchar_t); fp->_flag |= _UNGET; /* 10-mar-90 */ memcpy( fp->_ptr, &c, sizeof(wchar_t) ); } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += sizeof(wchar_t); fp->_ptr -= sizeof(wchar_t); fp->_flag |= _UNGET; memcpy( fp->_ptr, &c, sizeof(wchar_t) ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } else { char mbc[MB_CUR_MAX]; int mbcLen; /*** Convert the character to multibyte form ***/ if( wctomb( mbc, c ) == -1 ) { __set_errno( EILSEQ ); return( WEOF ); } mbcLen = _mbclen( mbc ); /*** Store the converted character ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = mbcLen; fp->_ptr = _FP_BASE(fp) + fp->_bufsize - mbcLen; fp->_flag |= _UNGET; /* 10-mar-90 */ _mbccpy( fp->_ptr, mbc ); } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += mbcLen; fp->_ptr -= mbcLen; fp->_flag |= _UNGET; _mbccpy( fp->_ptr, mbc ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } #else if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = CHARSIZE; fp->_ptr = _FP_BASE(fp) + fp->_bufsize - CHARSIZE; fp->_flag |= _UNGET; /* 10-mar-90 */ *(CHAR_TYPE*)(fp->_ptr) = c; } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += CHARSIZE; fp->_ptr -= CHARSIZE; if( *(CHAR_TYPE*)(fp->_ptr) != c ) fp->_flag |= _UNGET; /* 10-mar-90 */ *(CHAR_TYPE*)(fp->_ptr) = c; } else { /* read buffer is full */ _ReleaseFile( fp ); return( EOF ); } #endif fp->_flag &= ~ _EOF; _ReleaseFile( fp ); return( (UCHAR_TYPE) c ); }
_WCRTLINK INTCHAR_TYPE __F_NAME(ungetc,ungetwc)( INTCHAR_TYPE c, FILE *fp ) { if( c == INTCHAR_EOF ) { /* cannot push EOF */ return( c ); } _ValidFile( fp, INTCHAR_EOF ); _AccessFile( fp ); /*** Deal with stream orientation ***/ ORIENT_STREAM( fp, INTCHAR_EOF ); if( fp->_flag & _DIRTY ) { /* cannot unget after a put */ _ReleaseFile( fp ); return( INTCHAR_EOF ); } if(( fp->_flag & _READ ) == 0 ) { /* not open for input */ _ReleaseFile( fp ); return( INTCHAR_EOF ); } if( _FP_BASE( fp ) == NULL ) { /* no buffer allocated */ __ioalloc( fp ); } #ifdef __WIDECHAR__ if( fp->_flag & _BINARY ) { /*** Leave the character in wide form ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = sizeof( wchar_t ); fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - sizeof( wchar_t ); fp->_flag |= _UNGET; /* 10-mar-90 */ memcpy( fp->_ptr, &c, sizeof( wchar_t ) ); } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt += sizeof( wchar_t ); fp->_ptr -= sizeof( wchar_t ); fp->_flag |= _UNGET; memcpy( fp->_ptr, &c, sizeof( wchar_t ) ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } else { unsigned char mbc[MB_CUR_MAX]; int mbcLen; /*** Convert the character to multibyte form ***/ if( wctomb( (char *)mbc, c ) == -1 ) { _RWD_errno = EILSEQ; return( WEOF ); } mbcLen = _mbclen( mbc ); /*** Store the converted character ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = mbcLen; fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - mbcLen; fp->_flag |= _UNGET; /* 10-mar-90 */ _mbccpy( fp->_ptr, mbc ); } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt += mbcLen; fp->_ptr -= mbcLen; fp->_flag |= _UNGET; _mbccpy( fp->_ptr, mbc ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } #else if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = 1; fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - 1; fp->_flag |= _UNGET; /* 10-mar-90 */ *fp->_ptr = c; } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt++; fp->_ptr--; if( *fp->_ptr != c ) { fp->_flag |= _UNGET; /* 10-mar-90 */ } *fp->_ptr = c; } else { /* read buffer is full */ _ReleaseFile( fp ); return( EOF ); } #endif fp->_flag &= ~ _EOF; _ReleaseFile( fp ); return( (UCHAR_TYPE)c ); }