const char * iso9660_get_xa_attr_str (uint16_t xa_attr) { char *result = _getbuf(); xa_attr = uint16_from_be (xa_attr); result[ 0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-'; result[ 1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-'; result[ 2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-'; result[ 3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-'; result[ 4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-'; result[ 5] = (xa_attr & XA_PERM_XUSR) ? 'x' : '-'; result[ 6] = (xa_attr & XA_PERM_RUSR) ? 'r' : '-'; result[ 7] = (xa_attr & XA_PERM_XGRP) ? 'x' : '-'; result[ 8] = (xa_attr & XA_PERM_RGRP) ? 'r' : '-'; /* Hack alert: wonder if this should be ROTH and XOTH? */ result[ 9] = (xa_attr & XA_PERM_XSYS) ? 'x' : '-'; result[10] = (xa_attr & XA_PERM_RSYS) ? 'r' : '-'; result[11] = '\0'; return result; }
int __cdecl _filwbuf ( FILE *str ) { REG1 FILE *stream; _ASSERTE(str != NULL); /* Init pointer to _iob2 entry. */ stream = str; if (!inuse(stream) || stream->_flag & _IOSTRG) return(WEOF); if (stream->_flag & _IOWRT) { stream->_flag |= _IOERR; return(WEOF); } stream->_flag |= _IOREAD; /* Get a buffer, if necessary. */ if (!anybuf(stream)) _getbuf(stream); else stream->_ptr = stream->_base; stream->_cnt = _read(_fileno(stream), stream->_base, stream->_bufsiz); if ((stream->_cnt == 0) || (stream->_cnt == 1) || stream->_cnt == -1) { stream->_flag |= stream->_cnt ? _IOERR : _IOEOF; stream->_cnt = 0; return(WEOF); } if ( !(stream->_flag & (_IOWRT|_IORW)) && ((_osfile_safe(_fileno(stream)) & (FTEXT|FEOFLAG)) == (FTEXT|FEOFLAG)) ) stream->_flag |= _IOCTRLZ; /* Check for small _bufsiz (_SMALL_BUFSIZ). If it is small and if it is our buffer, then this must be the first _filbuf after an fseek on a read-access-only stream. Restore _bufsiz to its larger value (_INTERNAL_BUFSIZ) so that the next _filbuf call, if one is made, will fill the whole buffer. */ if ( (stream->_bufsiz == _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) && !(stream->_flag & _IOSETVBUF) ) { stream->_bufsiz = _INTERNAL_BUFSIZ; } stream->_cnt -= sizeof(wchar_t); return (0xffff & *((wchar_t *)(stream->_ptr))++); }
int __cdecl _filwbuf ( FILE *str ) #endif /* _UNICODE */ { REG1 FILE *stream=NULL; /* In safecrt, we assume we always have a buffer */ _VALIDATE_RETURN(str != NULL, EINVAL, _TEOF); /* Init pointer to _iob2 entry. */ stream = str; if (!inuse(stream) || stream->_flag & _IOSTRG) return(_TEOF); if (stream->_flag & _IOWRT) { stream->_flag |= _IOERR; return(_TEOF); } stream->_flag |= _IOREAD; /* Get a buffer, if necessary. */ if (!anybuf(stream)) { #ifndef _SAFECRT_IMPL _getbuf(stream); #else /* _SAFECRT_IMPL */ /* In safecrt, we assume we always have a buffer */ _VALIDATE_RETURN(FALSE, EINVAL, _TEOF); #endif /* _SAFECRT_IMPL */ } else { stream->_ptr = stream->_base; } stream->_cnt = _read(_fileno(stream), stream->_base, stream->_bufsiz); #ifndef _UNICODE if ((stream->_cnt == 0) || (stream->_cnt == -1)) { #else /* _UNICODE */ if ((stream->_cnt == 0) || (stream->_cnt == 1) || stream->_cnt == -1) { #endif /* _UNICODE */ stream->_flag |= stream->_cnt ? _IOERR : _IOEOF; stream->_cnt = 0; return(_TEOF); } if ( !(stream->_flag & (_IOWRT|_IORW)) && ((_osfile_safe(_fileno(stream)) & (FTEXT|FEOFLAG)) == (FTEXT|FEOFLAG)) ) stream->_flag |= _IOCTRLZ; /* Check for small _bufsiz (_SMALL_BUFSIZ). If it is small and if it is our buffer, then this must be the first _filbuf after an fseek on a read-access-only stream. Restore _bufsiz to its larger value (_INTERNAL_BUFSIZ) so that the next _filbuf call, if one is made, will fill the whole buffer. */ if ( (stream->_bufsiz == _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) && !(stream->_flag & _IOSETVBUF) ) { stream->_bufsiz = _INTERNAL_BUFSIZ; } #ifndef _UNICODE stream->_cnt--; return(0xff & *stream->_ptr++); #else /* _UNICODE */ stream->_cnt -= sizeof(wchar_t); return (0xffff & *((wchar_t *)(stream->_ptr))++); #endif /* _UNICODE */ }
int __cdecl _flswbuf ( int ch, FILE *str ) #endif /* _UNICODE */ { REG1 FILE *stream; REG2 int charcount; REG3 int written; int fh; _ASSERTE(str != NULL); /* Init file handle and pointers */ stream = str; fh = _fileno(stream); if (!(stream->_flag & (_IOWRT|_IORW))) { errno = EBADF; stream->_flag |= _IOERR; return(_TEOF); } else if ((stream->_flag & _IOSTRG)) { errno = ERANGE; stream->_flag |= _IOERR; return(_TEOF); } /* Check that _IOREAD is not set or, if it is, then so is _IOEOF. Note that _IOREAD and IOEOF both being set implies switching from read to write at end-of-file, which is allowed by ANSI. Note that resetting the _cnt and _ptr fields amounts to doing an fflush() on the stream in this case. Note also that the _cnt field has to be reset to 0 for the error path as well (i.e., _IOREAD set but _IOEOF not set) as well as the non-error path. */ if (stream->_flag & _IOREAD) { stream->_cnt = 0; if (stream->_flag & _IOEOF) { stream->_ptr = stream->_base; stream->_flag &= ~_IOREAD; } else { stream->_flag |= _IOERR; return(_TEOF); } } stream->_flag |= _IOWRT; stream->_flag &= ~_IOEOF; written = charcount = stream->_cnt = 0; /* Get a buffer for this stream, if necessary. */ if (!anybuf(stream)) { /* Do NOT get a buffer if (1) stream is stdout/stderr, and (2) stream is NOT a tty. [If stdout/stderr is a tty, we do NOT set up single char buffering. This is so that later temporary buffering will not be thwarted by the _IONBF bit being set (see _stbuf/_ftbuf usage).] */ if (!( ((stream==stdout) || (stream==stderr)) && (_isatty(fh)) )) _getbuf(stream); } /* end !anybuf() */ /* If big buffer is assigned to stream... */ if (bigbuf(stream)) { _ASSERTE(("inconsistent IOB fields", stream->_ptr - stream->_base >= 0)); charcount = (int)(stream->_ptr - stream->_base); stream->_ptr = stream->_base + sizeof(TCHAR); stream->_cnt = stream->_bufsiz - (int)sizeof(TCHAR); if (charcount > 0) written = _write(fh, stream->_base, charcount); else if (_osfile_safe(fh) & FAPPEND) { if( _lseeki64(fh,0L,SEEK_END)==-1) { stream->_flag |= _IOERR; return(_TEOF); } } #ifndef _UNICODE *stream->_base = (char)ch; #else /* _UNICODE */ *(wchar_t *)(stream->_base) = (wchar_t)(ch & 0xffff); #endif /* _UNICODE */ } /* Perform single character output (either _IONBF or no buffering) */ else { charcount = sizeof(TCHAR); #ifndef _UNICODE written = _write(fh, &ch, charcount); #else /* _UNICODE */ { char mbc[4]; *(wchar_t *)mbc = (wchar_t)(ch & 0xffff); written = _write(fh, mbc, charcount); } #endif /* _UNICODE */ } /* See if the _write() was successful. */ if (written != charcount) { stream->_flag |= _IOERR; return(_TEOF); } #ifndef _UNICODE return(ch & 0xff); #else /* _UNICODE */ return(ch & 0xffff); #endif /* _UNICODE */ }
wint_t __cdecl ungetwc ( wint_t ch, FILE *str ) { #endif /* _MT */ _ASSERTE(str != NULL); /* * Requirements for success: * * 1. Character to be pushed back on the stream must not be WEOF. * * 2. The stream must currently be in read mode, or must be open for * update (i.e., read/write) and must NOT currently be in write * mode. */ if ( (ch != WEOF) && ( (str->_flag & _IOREAD) || ((str->_flag & _IORW) && !(str->_flag & _IOWRT)) ) ) { /* If stream is unbuffered, get one. */ if (str->_base == NULL) _getbuf(str); if (!(str->_flag & _IOSTRG) && (_osfile_safe(_fileno(str)) & FTEXT)) { /* * Text mode, sigh... Convert the wc to a mbc. */ int size; char mbc[4]; if ((size = wctomb(mbc, ch)) == -1) { /* * Conversion failed! Set errno and return * failure. */ errno = EILSEQ; return WEOF; } /* we know _base != NULL; since file is buffered */ if (str->_ptr == str->_base) { if (str->_cnt) /* my back is against the wall; i've already done * ungetwc, and there's no room for this one */ return WEOF; str->_ptr += size; } if ( size == 1 ) { *--str->_ptr = mbc[0]; } else /* size == 2 */ { *--str->_ptr = mbc[1]; *--str->_ptr = mbc[0]; } str->_cnt += size; str->_flag &= ~_IOEOF; str->_flag |= _IOREAD; /* may already be set */ return (wint_t) (0x0ffff & ch); } /* * Binary mode - push back the wide char. */ /* we know _base != NULL; since file is buffered */ if (str->_ptr == str->_base) { if (str->_cnt) /* my back is against the wall; i've already done * ungetc, and there's no room for this one */ return WEOF; str->_ptr += sizeof(wchar_t); } str->_cnt += sizeof(wchar_t); str->_flag &= ~_IOEOF; str->_flag |= _IOREAD; /* may already be set */ return (wint_t) (*--((wchar_t *)(str->_ptr)) = (wchar_t)(ch & 0xffff)); } return WEOF; }
int __cdecl _filwbuf ( FILE *str ) #endif /* _UNICODE */ { #ifdef _NTSUBSET_ return(_TEOF); #else /* ndef _NTSUBSET_ */ REG1 FILE *stream; _ASSERTE(str != NULL); /* Init pointer to _iob2 entry. */ stream = str; if (!inuse(stream) || stream->_flag & _IOSTRG) return(_TEOF); if (stream->_flag & _IOWRT) { #ifdef _POSIX_ errno = EBADF; #endif stream->_flag |= _IOERR; return(_TEOF); } stream->_flag |= _IOREAD; /* Get a buffer, if necessary. */ if (!anybuf(stream)) _getbuf(stream); else stream->_ptr = stream->_base; #ifdef _POSIX_ stream->_cnt = read(fileno(stream), stream->_base, stream->_bufsiz); #else stream->_cnt = _read(_fileno(stream), stream->_base, stream->_bufsiz); #endif #ifndef _UNICODE if ((stream->_cnt == 0) || (stream->_cnt == -1)) { #else /* _UNICODE */ if ((stream->_cnt == 0) || (stream->_cnt == 1) || stream->_cnt == -1) { #endif /* _UNICODE */ stream->_flag |= stream->_cnt ? _IOERR : _IOEOF; stream->_cnt = 0; return(_TEOF); } #ifndef _POSIX_ if ( !(stream->_flag & (_IOWRT|_IORW)) && ((_osfile_safe(_fileno(stream)) & (FTEXT|FEOFLAG)) == (FTEXT|FEOFLAG)) ) stream->_flag |= _IOCTRLZ; #endif /* Check for small _bufsiz (_SMALL_BUFSIZ). If it is small and if it is our buffer, then this must be the first _filbuf after an fseek on a read-access-only stream. Restore _bufsiz to its larger value (_INTERNAL_BUFSIZ) so that the next _filbuf call, if one is made, will fill the whole buffer. */ if ( (stream->_bufsiz == _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) && !(stream->_flag & _IOSETVBUF) ) { stream->_bufsiz = _INTERNAL_BUFSIZ; } #ifndef _UNICODE stream->_cnt--; return(0xff & *stream->_ptr++); #else /* _UNICODE */ stream->_cnt -= sizeof(wchar_t); return (0xffff & *((wchar_t *)(stream->_ptr))++); #endif /* _UNICODE */ #endif /* _NTSUBSET_ */ } #else /* ndef _WIN32 */ #if defined(_M_MPPC) || defined(_M_M68K) #include <cruntime.h> #include <stdio.h> #include <file2.h> #include <io.h> #include <dbgint.h> #include <malloc.h> #include <internal.h> #include <msdos.h> /*** *int _filbuf(stream) - fill buffer and get first character * *Purpose: * get a buffer if the file doesn't have one, read into it, return first * char. try to get a buffer, if a user buffer is not assigned. called * only from getc; intended for use only within library. assume no input * stream is to remain unbuffered when memory is available unless it is * marked _IONBF. at worst, give it a single char buffer. the need for a * buffer, no matter how small, becomes evident when we consider the * ungetc's necessary in scanf * *Entry: * FILE *stream - stream to read from * *Exit: * returns first character from buffer (next character to be read) * returns EOF if the FILE is actually a string, or not open for reading, * or if open for writing or if no more chars to read. * all fields in FILE structure may be changed except _file. * *Exceptions: * *******************************************************************************/ int __cdecl _filbuf ( FILE *str ) { REG1 FILE *stream; _ASSERTE(str != NULL); /* Init pointer to _iob2 entry. */ stream = str; if (!inuse(stream) || stream->_flag & _IOSTRG) return(EOF); if (stream->_flag & _IOWRT) { stream->_flag |= _IOERR; return(EOF); } stream->_flag |= _IOREAD; /* Get a buffer, if necessary. */ if (!anybuf(stream)) _getbuf(stream); else stream->_ptr = stream->_base; stream->_cnt = _read(_fileno(stream), stream->_base, stream->_bufsiz); if ((stream->_cnt == 0) || (stream->_cnt == -1)) { stream->_flag |= stream->_cnt ? _IOERR : _IOEOF; stream->_cnt = 0; return(EOF); } if ( !(stream->_flag & (_IOWRT|_IORW)) && ((_osfile[_fileno(stream)] & (FTEXT|FEOFLAG)) == (FTEXT|FEOFLAG)) ) stream->_flag |= _IOCTRLZ; stream->_cnt--; return(0xff & *stream->_ptr++); }