mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Allow buffer/blit to take explicit nils for default args.
Also small changes for range checking code.
This commit is contained in:
		| @@ -462,13 +462,15 @@ JANET_CORE_FN(cfun_buffer_blit, | |||||||
|     int same_buf = src.bytes == dest->data; |     int same_buf = src.bytes == dest->data; | ||||||
|     int32_t offset_dest = 0; |     int32_t offset_dest = 0; | ||||||
|     int32_t offset_src = 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"); |         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"); |         offset_src = janet_gethalfrange(argv, 3, src.len, "src-start"); | ||||||
|     int32_t length_src; |     int32_t length_src; | ||||||
|     if (argc > 4) { |     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; |         length_src = src_end - offset_src; | ||||||
|         if (length_src < 0) length_src = 0; |         if (length_src < 0) length_src = 0; | ||||||
|     } else { |     } else { | ||||||
|   | |||||||
| @@ -342,6 +342,20 @@ int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const c | |||||||
|     return not_raw; |     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 janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which) { | ||||||
|     int32_t raw = janet_getinteger(argv, n); |     int32_t raw = janet_getinteger(argv, n); | ||||||
|     int32_t not_raw = raw; |     int32_t not_raw = raw; | ||||||
| @@ -394,24 +408,10 @@ JanetRange janet_getslice(int32_t argc, const Janet *argv) { | |||||||
|     janet_arity(argc, 1, 3); |     janet_arity(argc, 1, 3); | ||||||
|     JanetRange range; |     JanetRange range; | ||||||
|     int32_t length = janet_length(argv[0]); |     int32_t length = janet_length(argv[0]); | ||||||
|     if (argc == 1) { |     range.start = janet_getstartrange(argv, argc, 1, length); | ||||||
|         range.start = 0; |     range.end = janet_getendrange(argv, argc, 2, length); | ||||||
|         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) |     if (range.end < range.start) | ||||||
|         range.end = range.start; |         range.end = range.start; | ||||||
|     } |  | ||||||
|     return range; |     return range; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 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 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_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 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); | JANET_API uint64_t janet_getflags(const Janet *argv, int32_t n, const char *flags); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -103,6 +103,7 @@ | |||||||
| (assert (deep= @"bcde" (buffer/blit @"" a -1 1 5)) "buffer/blit 3") | (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= @"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 -1 3 5)) "buffer/blit 5") | ||||||
|  | (assert (deep= @"de" (buffer/blit @"" a nil 3 5)) "buffer/blit 6") | ||||||
|  |  | ||||||
| # buffer/push-at | # buffer/push-at | ||||||
| # c55d93512 | # c55d93512 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose