; any() and all()  checks on arrays/memory buffers.
; These were builtin functions in older versions of the language.

%option no_symbol_prefixing, ignore_unused

anyall {
    sub any(uword arrayptr, uword num_elements) -> bool {
        ; -- returns true if any byte in the array is not zero.
        cx16.r1 = arrayptr
        if msb(num_elements)==0 {
            for cx16.r0L in 0 to lsb(num_elements)-1 {
                if cx16.r1[cx16.r0L]!=0
                    return true
            }
            return false
        }
        repeat num_elements {
            if @(cx16.r1)!=0
                return true
            cx16.r1++
        }
        return false
    }

    sub all(uword arrayptr, uword num_elements) -> bool {
        ; -- returns true if all bytes in the array are not zero.
        cx16.r1 = arrayptr
        if msb(num_elements)==0 {
            for cx16.r0L in 0 to lsb(num_elements)-1 {
                if cx16.r1[cx16.r0L]==0
                    return false
            }
            return true
        }
        repeat num_elements {
            if @(cx16.r1)==0
                return false
            cx16.r1++
        }
        return true
    }

    sub anyw(uword arrayptr, uword num_elements) -> bool {
        ; -- returns true if any word in the array is not zero.
        ;    doesn't work on @split arrays.
        cx16.r1 = arrayptr
        if msb(num_elements)==0 {
            repeat lsb(num_elements) {
                if peekw(cx16.r1)!=0
                    return true
                cx16.r1+=2
            }
            return false
        }
        repeat num_elements {
            if peekw(cx16.r1)!=0
                return true
            cx16.r1+=2
        }
        return false
    }

    sub allw(uword arrayptr, uword num_elements) -> bool {
        ; -- returns true if all words in the array are not zero.
        ;    doesn't work on @split arrays.
        cx16.r1 = arrayptr
        if msb(num_elements)==0 {
            repeat lsb(num_elements) {
                if peekw(cx16.r1)==0
                    return false
                cx16.r1+=2
            }
            return true
        }
        repeat num_elements {
            if peekw(cx16.r1)==0
                return false
            cx16.r1+=2
        }
        return true
    }
}
