/*
 * getenv — значение переменной окружения через ESTEX ENVIRON ($46, subfn 1):
 *   in:  HL = имя (ASCIIZ), DE = выходной буфер
 *   out: CF=0 + A != 0 → найдена, значение записано в [DE..end-1]
 *        CF=0 + A == 0 → переменной нет  (примечание: это ПРОТИВОПОЛОЖНО
 *                        тому, что пишет DiskSyscalls.txt v1.6 — проверено
 *                        эмпирически и по solid-c IO.ASM:763-766)
 *        CF=1          → ошибка, A = код
 *
 * Возвращает указатель в приватный 128-байтный буфер — скопируй до
 * следующего вызова getenv(), если значение должно пережить его.
 * NULL — нет переменной или ошибка (errno).
 */

#include <stdint.h>
#include <sprinter.h>

static char env_buf[128];

char *getenv(const char *name) __naked
{
    (void)name;
    __asm
        push  ix
        ;; HL = имя на входе; дополнительно DE = env_buf.
        ld    de, #_env_buf
        ld    bc, #0x0146               ; ESTEX ENVIRON; subfn: getenv
        rst   #0x10
        pop   ix
        jr    c, _getenv_err
        or    a, a
        jr    Z, _getenv_miss
        ld    de, #_env_buf
        ret
    _getenv_err:
        call  __errno_set
    _getenv_miss:
        ld    de, #0
        ret
    __endasm;
}
