/*
 * 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;
}
