/*
 * strerror — текст ошибки по коду ESTEX (0..32); вне диапазона —
 * "Unknown error".  Таблица повторяет solid-c IO.ASM (английские
 * формулировки сохранены для grep-ability).  Таблица и функция
 * неразделимы — живут одним модулем.
 *
 * Примечание: `_errno` здесь сознательно НЕ определяется — его даёт
 * SDCC z80.lib/errno.rel (int в _DATA), наши обёртки просто пишут в
 * `errno`.  Это убирает варнинг "multiple definition of _errno".
 */

#include <errno.h>

/*
 * Хранится как есть — указатель в таблице стоит 2 байта плюс сами
 * байты сообщения.  Заглушки "RESERVED" затыкают дыры, чтобы
 * индексирование оставалось прямым.
 */
static const char *const messages[] = {
    /*  0 */ "No error",
    /*  1 */ "Invalid function",
    /*  2 */ "Invalid drive number",
    /*  3 */ "File not found",
    /*  4 */ "Path not found",
    /*  5 */ "Invalid handle",
    /*  6 */ "Too many open files",
    /*  7 */ "File already exists",
    /*  8 */ "File is read-only",
    /*  9 */ "Root directory overflow",
    /* 10 */ "No free space",
    /* 11 */ "Directory not empty",
    /* 12 */ "Can't delete current directory",
    /* 13 */ "Invalid media",
    /* 14 */ "Unknown operation",
    /* 15 */ "Directory exists",
    /* 16 */ "Invalid filename",
    /* 17 */ "Invalid EXE file",
    /* 18 */ "Not supported EXE file",
    /* 19 */ "Access denied",
    /* 20 */ "Device not ready",
    /* 21 */ "Seek error",
    /* 22 */ "Sector not found",
    /* 23 */ "CRC error",
    /* 24 */ "Write protect",
    /* 25 */ "Read error",
    /* 26 */ "Write error",
    /* 27 */ "Drive failure",
    /* 28 */ "RESERVED",
    /* 29 */ "RESERVED",
    /* 30 */ "Out of memory",
    /* 31 */ "Invalid memory block",
    /* 32 */ "Unknown error",
};

const int ESTEX_MAX_ERR = sizeof(messages) / sizeof(messages[0]) - 1;

const char *strerror(int err)
{
    if (err < 0 || err > ESTEX_MAX_ERR) {
        err = EUNKERR;
    }
    return messages[err];
}
