11#if defined(WIN32 ) || defined(_WIN32 ) || defined(__WIN32__ ) || defined(__NT__ )
2+ #define _CRT_RAND_S
23#include <windows.h>
34#else
45#include <termios.h>
78#include "waforth_core.h"
89#include "wasm.h"
910#include <stdio.h>
11+ #include <stdlib.h>
1012
1113#ifndef VERSION
1214#define VERSION "dev"
@@ -61,8 +63,10 @@ wasm_trap_t *read_cb(const wasm_val_vec_t *args, wasm_val_vec_t *results) {
6163 char * addr = & wasm_memory_data (memory )[args -> data [0 ].of .i32 ];
6264 size_t len = args -> data [1 ].of .i32 ;
6365 * addr = 0 ;
64- fgets (addr , len , input );
65- int n = strlen (addr );
66+ int n = 0 ;
67+ if (fgets (addr , len , input )) {
68+ n = strlen (addr );
69+ };
6670 results -> data [0 ].kind = WASM_I32 ;
6771 results -> data [0 ].of .i32 = n ;
6872 return NULL ;
@@ -96,6 +100,22 @@ wasm_trap_t *key_cb(const wasm_val_vec_t *args, wasm_val_vec_t *results) {
96100 return NULL ;
97101}
98102
103+ wasm_trap_t * random_cb (const wasm_val_vec_t * args , wasm_val_vec_t * results ) {
104+ #if defined(WIN32 ) || defined(_WIN32 ) || defined(__WIN32__ ) || defined(__NT__ )
105+ unsigned int ur ;
106+ if (rand_s (& ur ) != 0 ) {
107+ return trap_from_string ("error generating random number" );
108+ }
109+ int r = ur & 0x7fffffff ;
110+ #else
111+ int r = random ();
112+ #endif
113+ results -> data [0 ].kind = WASM_I32 ;
114+ results -> data [0 ].of .i32 = r ;
115+ return NULL ;
116+ }
117+
118+
99119wasm_trap_t * load_cb (const wasm_val_vec_t * args , wasm_val_vec_t * results ) {
100120 wasm_byte_t * addr = & wasm_memory_data (memory )[args -> data [0 ].of .i32 ];
101121 size_t len = args -> data [1 ].of .i32 ;
@@ -155,6 +175,10 @@ int main(int argc, char *argv[]) {
155175 wasm_func_t * key_fn = wasm_func_new (store , key_ft , key_cb );
156176 wasm_functype_delete (key_ft );
157177
178+ wasm_functype_t * random_ft = wasm_functype_new_0_1 (wasm_valtype_new_i32 ());
179+ wasm_func_t * random_fn = wasm_func_new (store , random_ft , random_cb );
180+ wasm_functype_delete (random_ft );
181+
158182 wasm_functype_t * load_ft = wasm_functype_new_2_0 (wasm_valtype_new_i32 (), wasm_valtype_new_i32 ());
159183 wasm_func_t * load_fn = wasm_func_new (store , load_ft , load_cb );
160184 wasm_functype_delete (load_ft );
@@ -163,7 +187,7 @@ int main(int argc, char *argv[]) {
163187 wasm_func_t * call_fn = wasm_func_new_with_env (store , call_ft , call_cb , store , NULL );
164188 wasm_functype_delete (call_ft );
165189
166- wasm_extern_t * externs [] = {wasm_func_as_extern (emit_fn ), wasm_func_as_extern (read_fn ), wasm_func_as_extern (key_fn ), wasm_func_as_extern (load_fn ),
190+ wasm_extern_t * externs [] = {wasm_func_as_extern (emit_fn ), wasm_func_as_extern (read_fn ), wasm_func_as_extern (key_fn ), wasm_func_as_extern (random_fn ), wasm_func_as_extern ( load_fn ),
167191 wasm_func_as_extern (call_fn )};
168192 wasm_extern_vec_t imports = WASM_ARRAY_VEC (externs );
169193 wasm_trap_t * trap = NULL ;
@@ -255,6 +279,7 @@ int main(int argc, char *argv[]) {
255279 wasm_instance_delete (instance );
256280 wasm_func_delete (call_fn );
257281 wasm_func_delete (load_fn );
282+ wasm_func_delete (random_fn );
258283 wasm_func_delete (key_fn );
259284 wasm_func_delete (read_fn );
260285 wasm_func_delete (emit_fn );
0 commit comments