/*
 * fopen — открыть файл как буферизованный поток FILE* (вариант B+).
 *
 * FILE берётся из статической таблицы (_file_slot_take, он же взводит
 * atexit(_fclosall)); сам буфер выделится лениво при первой операции.
 * NULL при: плохом режиме (EINVAL), занятой таблице (EMFILE), ошибке
 * open (errno от него).
 */

#include <fcntl.h>
#include "_file.h"

FILE *fopen(const char *path, const char *mode)
{
    uint8_t ff;
    int oflags = _file_mode_flags(mode, &ff);
    if (oflags < 0) return 0;

    FILE *fp = _file_slot_take();      /* слот — ДО open, чтобы не открывать зря */
    if (!fp) return 0;

    int fd = open(path, oflags);
    if (fd < 0) return 0;

    fp->fd    = fd;
    fp->buf   = 0;
    fp->curp  = 0;
    fp->level = 0;
    fp->hold  = EOF;
    fp->flags = ff;              /* последним — занимает слот */
    return fp;
}
