int __sungetc(int c, FILE *fp) { if (c == EOF) return (EOF); if (!__sdidinit) __sinit(); /*FLOCKFILE(fp);*/ _SET_ORIENTATION(fp, -1); if ((fp->_flags & __SRD) == 0) { /* * Not already reading: no good unless reading-and-writing. * Otherwise, flush any current write stuff. */ if ((fp->_flags & __SRW) == 0) { error: /*FUNLOCKFILE(fp);*/ return (EOF); } if (fp->_flags & __SWR) { if (__sflush(fp)) goto error; fp->_flags &= ~__SWR; fp->_w = 0; fp->_lbfsize = 0; } fp->_flags |= __SRD; } c = (unsigned char)c; /* * If we are in the middle of ungetc'ing, just continue. * This may require expanding the current ungetc buffer. */ if (HASUB(fp)) { if (fp->_r >= _UB(fp)._size && __submore(fp)) goto error; *--fp->_p = c; inc_ret: fp->_r++; /*FUNLOCKFILE(fp);*/ return (c); } fp->_flags &= ~__SEOF; /* * If we can handle this by simply backing up, do so, * but never replace the original character. * (This makes sscanf() work when scanning `const' data.) */ if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) { fp->_p--; goto inc_ret; } /* * Create an ungetc buffer. * Initially, we will use the `reserve' buffer. */ fp->_ur = fp->_r; fp->_up = fp->_p; _UB(fp)._base = fp->_ubuf; _UB(fp)._size = sizeof(fp->_ubuf); fp->_ubuf[sizeof(fp->_ubuf) - 1] = c; fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1]; fp->_r = 1; /*FUNLOCKFILE(fp);*/ return (c); }
/* * Non-MT-safe version */ int __ungetc(int c, FILE *fp) { if (c == EOF) return (EOF); if ((fp->_flags & __SRD) == 0) { /* * Not already reading: no good unless reading-and-writing. * Otherwise, flush any current write stuff. */ if ((fp->_flags & __SRW) == 0) return (EOF); if (fp->_flags & __SWR) { if (__sflush(fp)) return (EOF); fp->_flags &= ~__SWR; fp->_w = 0; fp->_lbfsize = 0; } fp->_flags |= __SRD; } c = (unsigned char)c; /* * If we are in the middle of ungetc'ing, just continue. * This may require expanding the current ungetc buffer. */ #ifndef __ANDROID__ if (HASUB(fp)) { if (fp->_r >= fp->_ub._size && __submore(fp)) return (EOF); *--fp->_p = c; fp->_r++; return (c); } #endif fp->_flags &= ~__SEOF; /* * If we can handle this by simply backing up, do so, * but never replace the original character. * (This makes sscanf() work when scanning `const' data.) */ if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) { fp->_p--; fp->_r++; return (c); } /* * Create an ungetc buffer. * Initially, we will use the `reserve' buffer. */ fp->_ur = fp->_r; fp->_up = fp->_p; #ifndef __ANDROID__ fp->_ub._base = fp->_ubuf; fp->_ub._size = sizeof(fp->_ubuf); #endif fp->_ubuf[sizeof(fp->_ubuf) - 1] = c; fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1]; fp->_r = 1; return (c); }