mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Add some utilitites for dealing with unsigned integers in janet.h
This commit is contained in:
		| @@ -273,6 +273,14 @@ int32_t janet_getinteger(const Janet *argv, int32_t n) { | |||||||
|     return janet_unwrap_integer(x); |     return janet_unwrap_integer(x); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | uint32_t janet_getuinteger(const Janet *argv, int32_t n) { | ||||||
|  |     Janet x = argv[n]; | ||||||
|  |     if (!janet_checkuint(x)) { | ||||||
|  |         janet_panicf("bad slot #%d, expected 32 bit signed integer, got %v", n, x); | ||||||
|  |     } | ||||||
|  |     return janet_unwrap_integer(x); | ||||||
|  | } | ||||||
|  |  | ||||||
| int64_t janet_getinteger64(const Janet *argv, int32_t n) { | int64_t janet_getinteger64(const Janet *argv, int32_t n) { | ||||||
| #ifdef JANET_INT_TYPES | #ifdef JANET_INT_TYPES | ||||||
|     return janet_unwrap_s64(argv[n]); |     return janet_unwrap_s64(argv[n]); | ||||||
| @@ -290,7 +298,7 @@ uint64_t janet_getuinteger64(const Janet *argv, int32_t n) { | |||||||
|     return janet_unwrap_u64(argv[n]); |     return janet_unwrap_u64(argv[n]); | ||||||
| #else | #else | ||||||
|     Janet x = argv[n]; |     Janet x = argv[n]; | ||||||
|     if (!janet_checkint64(x)) { |     if (!janet_checkuint64(x)) { | ||||||
|         janet_panicf("bad slot #%d, expected 64 bit unsigned integer, got %v", n, x); |         janet_panicf("bad slot #%d, expected 64 bit unsigned integer, got %v", n, x); | ||||||
|     } |     } | ||||||
|     return (uint64_t) janet_unwrap_number(x); |     return (uint64_t) janet_unwrap_number(x); | ||||||
|   | |||||||
| @@ -805,6 +805,13 @@ int janet_checkint(Janet x) { | |||||||
|     return janet_checkintrange(dval); |     return janet_checkintrange(dval); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int janet_checkuint(Janet x) { | ||||||
|  |     if (!janet_checktype(x, JANET_NUMBER)) | ||||||
|  |         return 0; | ||||||
|  |     double dval = janet_unwrap_number(x); | ||||||
|  |     return janet_checkuintrange(dval); | ||||||
|  | } | ||||||
|  |  | ||||||
| int janet_checkint64(Janet x) { | int janet_checkint64(Janet x) { | ||||||
|     if (!janet_checktype(x, JANET_NUMBER)) |     if (!janet_checktype(x, JANET_NUMBER)) | ||||||
|         return 0; |         return 0; | ||||||
| @@ -816,7 +823,7 @@ int janet_checkuint64(Janet x) { | |||||||
|     if (!janet_checktype(x, JANET_NUMBER)) |     if (!janet_checktype(x, JANET_NUMBER)) | ||||||
|         return 0; |         return 0; | ||||||
|     double dval = janet_unwrap_number(x); |     double dval = janet_unwrap_number(x); | ||||||
|     return dval >= 0 && dval <= JANET_INTMAX_DOUBLE && dval == (uint64_t) dval; |     return janet_checkuint64range(dval); | ||||||
| } | } | ||||||
|  |  | ||||||
| int janet_checksize(Janet x) { | int janet_checksize(Janet x) { | ||||||
|   | |||||||
| @@ -147,8 +147,8 @@ | |||||||
|             stack[A] = janet_mcall(#op, 2, _argv);\ |             stack[A] = janet_mcall(#op, 2, _argv);\ | ||||||
|             vm_checkgc_pcnext();\ |             vm_checkgc_pcnext();\ | ||||||
|         } else {\ |         } else {\ | ||||||
|             type1 x1 = (type1) janet_unwrap_integer(op1);\ |             type1 x1 = (type1) janet_unwrap_number(op1);\ | ||||||
|             stack[A] = janet_wrap_integer(x1 op CS);\ |             stack[A] = janet_wrap_number((type1) (x1 op CS));\ | ||||||
|             vm_pcnext();\ |             vm_pcnext();\ | ||||||
|         }\ |         }\ | ||||||
|     } |     } | ||||||
| @@ -175,9 +175,9 @@ | |||||||
|         Janet op1 = stack[B];\ |         Janet op1 = stack[B];\ | ||||||
|         Janet op2 = stack[C];\ |         Janet op2 = stack[C];\ | ||||||
|         if (janet_checktype(op1, JANET_NUMBER) && janet_checktype(op2, JANET_NUMBER)) {\ |         if (janet_checktype(op1, JANET_NUMBER) && janet_checktype(op2, JANET_NUMBER)) {\ | ||||||
|             type1 x1 = (type1) janet_unwrap_integer(op1);\ |             type1 x1 = (type1) janet_unwrap_number(op1);\ | ||||||
|             int32_t x2 = janet_unwrap_integer(op2);\ |             int32_t x2 = janet_unwrap_integer(op2);\ | ||||||
|             stack[A] = janet_wrap_integer(x1 op x2);\ |             stack[A] = janet_wrap_number((type1) (x1 op x2));\ | ||||||
|             vm_pcnext();\ |             vm_pcnext();\ | ||||||
|         } else {\ |         } else {\ | ||||||
|             vm_commit();\ |             vm_commit();\ | ||||||
|   | |||||||
| @@ -868,12 +868,15 @@ JANET_API Janet janet_nanbox32_from_tagp(uint32_t tag, void *pointer); | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| JANET_API int janet_checkint(Janet x); | JANET_API int janet_checkint(Janet x); | ||||||
|  | JANET_API int janet_checkuint(Janet x); | ||||||
| JANET_API int janet_checkint64(Janet x); | JANET_API int janet_checkint64(Janet x); | ||||||
| JANET_API int janet_checkuint64(Janet x); | JANET_API int janet_checkuint64(Janet x); | ||||||
| JANET_API int janet_checksize(Janet x); | JANET_API int janet_checksize(Janet x); | ||||||
| JANET_API JanetAbstract janet_checkabstract(Janet x, const JanetAbstractType *at); | JANET_API JanetAbstract janet_checkabstract(Janet x, const JanetAbstractType *at); | ||||||
| #define janet_checkintrange(x) ((x) >= INT32_MIN && (x) <= INT32_MAX && (x) == (int32_t)(x)) | #define janet_checkintrange(x) ((x) >= INT32_MIN && (x) <= INT32_MAX && (x) == (int32_t)(x)) | ||||||
|  | #define janet_checkuintrange(x) ((x) >= 0 && (x) <= UINT32_MAX && (x) == (uint32_t)(x)) | ||||||
| #define janet_checkint64range(x) ((x) >= JANET_INTMIN_DOUBLE && (x) <= JANET_INTMAX_DOUBLE && (x) == (int64_t)(x)) | #define janet_checkint64range(x) ((x) >= JANET_INTMIN_DOUBLE && (x) <= JANET_INTMAX_DOUBLE && (x) == (int64_t)(x)) | ||||||
|  | #define janet_checkuint64range(x) ((x) >= 0 && (x) <= JANET_INTMAX_DOUBLE && (x) == (uint64_t)(x)) | ||||||
| #define janet_unwrap_integer(x) ((int32_t) janet_unwrap_number(x)) | #define janet_unwrap_integer(x) ((int32_t) janet_unwrap_number(x)) | ||||||
| #define janet_wrap_integer(x) janet_wrap_number((int32_t)(x)) | #define janet_wrap_integer(x) janet_wrap_number((int32_t)(x)) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose