#pragma zilog_syntax

byte strzlen(pointer str) {
    pointer end
    end = str
    while end[0] != nullchar {
        end += 1
    }
    return lo(end - str)
}

sbyte strzcmp(pointer str1, pointer str2) {
    while true {
        if str1[0] == nullchar {
            if str2[0] == nullchar {
                return 0
            } else {
                return -1
            }
        } else if str1[0] != str2[0] {
            if str1[0] < str2[0] { return -1 }
            return 1
        }
        str1 += 1
        str2 += 1
    }
}

#if CPUFEATURE_Z80 || CPUFEATURE_8080
void strzcopy(pointer dest, pointer src) {
    asm {
        ? LD HL,(src)
        ? LD DE,(dest)
    ___strzcopy_loop:
        LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        ? CP nullchar
        ? JP NZ, ___strzcopy_loop
    }
}
void strzpaste(pointer dest, pointer src) {
    asm {
        ? LD HL,(src)
        ? LD DE,(dest)
    ___strzpaste_loop:
        LD A,(HL)
        ? CP nullchar
        ? RET Z
        LD (DE),A
        INC HL
        INC DE
        ? JP ___strzpaste_loop
    }
}
#else
void strzcopy(pointer dest, pointer src) {
    byte c
    do {
        c = src[0]
        dest[0] = c
        src += 1
        dest += 1
    } while c != nullchar
}
void strzpaste(pointer dest, pointer src) {
    byte c
    while true {
        c = src[0]
        if c == nullchar { return }
        dest[0] = c
        src += 1
        dest += 1
    }
}
#endif
