/* * ungetc — вернуть один байт в поток: следующий fgetc/fread/fgets * отдаст его первым. Гарантирован 1 байт putback (поле hold); * повторный ungetc без чтения — EOF. Работает и на консольном stdin. * Снимает _F_EOF (по стандарту); fseek/rewind отбрасывают hold. * В режиме накопленной записи (_F_DIROUT) — EOF. */ #include "_file.h" int ungetc(int c, FILE *fp) { #ifndef LIBC_NOCHECK if (!fp) return EOF; #endif if (c == EOF) return EOF; /* семантика стандарта */ if (fp->hold != EOF) return EOF; /* место занято */ if (fp->flags & _F_CONOUT) return EOF; if (!(fp->flags & (_F_READ | _F_CONIN))) return EOF; if (fp->flags & _F_DIROUT) return EOF; fp->hold = (int)(uint8_t)c; fp->flags &= (uint8_t)~_F_EOF; return (int)(uint8_t)c; }