Skip to content

Commit 2e91317

Browse files
committed
Add RANDOM
1 parent 8fb3d0f commit 2e91317

File tree

6 files changed

+163
-116
lines changed

6 files changed

+163
-116
lines changed

src/standalone/main.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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>
@@ -7,6 +8,7 @@
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+
99119
wasm_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

Comments
 (0)