mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Add native-write, which will write structs to buffers.
Useful for testing as well as useful in its own right. Begs for an inverse, native-read which would convert byte data to native structs.
This commit is contained in:
		| @@ -641,11 +641,28 @@ JANET_CORE_FN(cfun_ffi_call, | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | JANET_CORE_FN(cfun_ffi_buffer_write, | ||||||
|  |               "(native-write ffi-type data &opt buffer)", | ||||||
|  |               "Append a native tyep to a buffer such as it would appear in memory. This can be used " | ||||||
|  |               "to pass pointers to structs in the ffi, or send C/C++/native structs over the network " | ||||||
|  |               "or to files. Returns a modifed buffer or a new buffer if one is not supplied.") { | ||||||
|  |     janet_arity(argc, 2, 3); | ||||||
|  |     JanetFFIType type = decode_ffi_type(argv[0]); | ||||||
|  |     size_t el_size = type_size(type); | ||||||
|  |     JanetBuffer *buffer = janet_optbuffer(argv, argc, 2, el_size); | ||||||
|  |     janet_buffer_extra(buffer, el_size); | ||||||
|  |     memset(buffer->data, 0, el_size); | ||||||
|  |     janet_ffi_write_one(buffer->data, argv, 1, type); | ||||||
|  |     buffer->count += el_size; | ||||||
|  |     return janet_wrap_buffer(buffer); | ||||||
|  | } | ||||||
|  |  | ||||||
| void janet_lib_ffi(JanetTable *env) { | void janet_lib_ffi(JanetTable *env) { | ||||||
|     JanetRegExt ffi_cfuns[] = { |     JanetRegExt ffi_cfuns[] = { | ||||||
|         JANET_CORE_REG("native-signature", cfun_ffi_signature), |         JANET_CORE_REG("native-signature", cfun_ffi_signature), | ||||||
|         JANET_CORE_REG("native-call", cfun_ffi_call), |         JANET_CORE_REG("native-call", cfun_ffi_call), | ||||||
|         JANET_CORE_REG("native-struct", cfun_ffi_struct), |         JANET_CORE_REG("native-struct", cfun_ffi_struct), | ||||||
|  |         JANET_CORE_REG("native-write", cfun_ffi_buffer_write), | ||||||
|         JANET_REG_END |         JANET_REG_END | ||||||
|     }; |     }; | ||||||
|     janet_core_cfuns_ext(env, NULL, ffi_cfuns); |     janet_core_cfuns_ext(env, NULL, ffi_cfuns); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose