/*
 * _file_slot_take — найти свободный слот таблицы потоков и при первом
 * обращении взвести atexit(_fclosall), чтобы exit() сбрасывал
 * несброшенную запись всех потоков (требование стандарта).
 * Слот НЕ помечается занятым — вызывающий (fopen/fdopen) заполняет
 * поля и последним выставляет flags.
 */

#include <sprinter_exit.h>     /* atexit */
#include <errno.h>
#include "_file.h"

FILE *_file_slot_take(void)
{
    static uint8_t atexit_armed;

    FILE *fp = _file_slots;
    for (uint8_t i = 0; ; i++, fp++) {
        if (i >= OPEN_MAX) {
            errno = EMFILE;
            return 0;
        }
        if (fp->flags == 0) break;
    }
    if (!atexit_armed) {
        atexit_armed = 1;
        atexit(_fclosall);
    }
    return fp;
}
