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