diff --git a/src/core/buffer.c b/src/core/buffer.c index 5e1f76f9..07770964 100644 --- a/src/core/buffer.c +++ b/src/core/buffer.c @@ -462,13 +462,15 @@ JANET_CORE_FN(cfun_buffer_blit, int same_buf = src.bytes == dest->data; int32_t offset_dest = 0; int32_t offset_src = 0; - if (argc > 2) + if (argc > 2 && !janet_checktype(argv[2], JANET_NIL)) offset_dest = janet_gethalfrange(argv, 2, dest->count, "dest-start"); - if (argc > 3) + if (argc > 3 && !janet_checktype(argv[3], JANET_NIL)) offset_src = janet_gethalfrange(argv, 3, src.len, "src-start"); int32_t length_src; if (argc > 4) { - int32_t src_end = janet_gethalfrange(argv, 4, src.len, "src-end"); + int32_t src_end = src.len; + if (!janet_checktype(argv[4], JANET_NIL)) + src_end = janet_gethalfrange(argv, 4, src.len, "src-end"); length_src = src_end - offset_src; if (length_src < 0) length_src = 0; } else { diff --git a/src/core/capi.c b/src/core/capi.c index a89b4685..d8ee2d39 100644 --- a/src/core/capi.c +++ b/src/core/capi.c @@ -342,6 +342,20 @@ int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const c return not_raw; } +int32_t janet_getstartrange(const Janet *argv, int32_t argc, int32_t n, int32_t length) { + if (n >= argc || janet_checktype(argv[n], JANET_NIL)) { + return 0; + } + return janet_gethalfrange(argv, n, length, "start"); +} + +int32_t janet_getendrange(const Janet *argv, int32_t argc, int32_t n, int32_t length) { + if (n >= argc || janet_checktype(argv[n], JANET_NIL)) { + return length; + } + return janet_gethalfrange(argv, n, length, "end"); +} + int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which) { int32_t raw = janet_getinteger(argv, n); int32_t not_raw = raw; @@ -394,24 +408,10 @@ JanetRange janet_getslice(int32_t argc, const Janet *argv) { janet_arity(argc, 1, 3); JanetRange range; int32_t length = janet_length(argv[0]); - if (argc == 1) { - range.start = 0; - range.end = length; - } else if (argc == 2) { - range.start = janet_checktype(argv[1], JANET_NIL) - ? 0 - : janet_gethalfrange(argv, 1, length, "start"); - range.end = length; - } else { - range.start = janet_checktype(argv[1], JANET_NIL) - ? 0 - : janet_gethalfrange(argv, 1, length, "start"); - range.end = janet_checktype(argv[2], JANET_NIL) - ? length - : janet_gethalfrange(argv, 2, length, "end"); - if (range.end < range.start) - range.end = range.start; - } + range.start = janet_getstartrange(argv, argc, 1, length); + range.end = janet_getendrange(argv, argc, 2, length); + if (range.end < range.start) + range.end = range.start; return range; } diff --git a/src/include/janet.h b/src/include/janet.h index e59318f1..34863070 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -1997,6 +1997,8 @@ JANET_API JanetDictView janet_getdictionary(const Janet *argv, int32_t n); JANET_API void *janet_getabstract(const Janet *argv, int32_t n, const JanetAbstractType *at); JANET_API JanetRange janet_getslice(int32_t argc, const Janet *argv); JANET_API int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const char *which); +JANET_API int32_t janet_getstartrange(const Janet *argv, int32_t argc, int32_t n, int32_t length); +JANET_API int32_t janet_getendrange(const Janet *argv, int32_t argc, int32_t n, int32_t length); JANET_API int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which); JANET_API uint64_t janet_getflags(const Janet *argv, int32_t n, const char *flags); diff --git a/test/suite-buffer.janet b/test/suite-buffer.janet index 8feb4c1c..681ad29e 100644 --- a/test/suite-buffer.janet +++ b/test/suite-buffer.janet @@ -103,6 +103,7 @@ (assert (deep= @"bcde" (buffer/blit @"" a -1 1 5)) "buffer/blit 3") (assert (deep= @"cde" (buffer/blit @"" a -1 2 5)) "buffer/blit 4") (assert (deep= @"de" (buffer/blit @"" a -1 3 5)) "buffer/blit 5") +(assert (deep= @"de" (buffer/blit @"" a nil 3 5)) "buffer/blit 6") # buffer/push-at # c55d93512