shithub: MicroHs

Download patch

ref: af8dcc9a336971600f8fb1527a31586d39975c2b
parent: 8bb3ce454218bb68450c504c815783ba2b4ba9ca
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Sat Nov 25 10:59:40 EST 2023

Add fwrite & fread

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -891,8 +891,8 @@
   const char *ffi_name;
   const funptr_t ffi_fun;
   enum { FFI_V, FFI_I, FFI_IV, FFI_II, FFI_IIV, FFI_III, FFI_DD, FFI_PI,
-    FFI_i, FFI_Pi, FFI_iPi,
-    FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP, FFI_PPV,
+         FFI_i, FFI_Pi, FFI_iPi, FFI_PIIPI,
+         FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP, FFI_PPV,
   } ffi_how;
 } ffi_table[] = {
   { "llabs",    (funptr_t)llabs,   FFI_II },
@@ -919,6 +919,8 @@
   { "fclose",   (funptr_t)fclose,  FFI_Pi },
   { "fflush",   (funptr_t)fflush,  FFI_Pi },
   { "fopen",    (funptr_t)fopen,   FFI_PPP },
+  { "fread",    (funptr_t)fread,   FFI_PIIPI },
+  { "fwrite",   (funptr_t)fwrite,  FFI_PIIPI },
   { "tmpname",  (funptr_t)TMPNAME, FFI_PPP },
   { "unlink",   (funptr_t)unlink,  FFI_Pi },
   { "system",   (funptr_t)system,  FFI_Pi },
@@ -2169,9 +2171,9 @@
       {
         int a = (int)GETVALUE(n);
         funptr_t f = ffi_table[a].ffi_fun;
-        value_t ri, xi, yi;
+        value_t ri, xi, yi, zi;
         double rd, xd;
-        void *xp, *yp, *rp;
+        void *xp, *yp, *wp, *rp;
 #define INTARG(n) evalint(ARG(TOP(n)))
 #define PTRARG(n) evalptr(ARG(TOP(n)))
 #define DBLARG(n) evaldbl(ARG(TOP(n)))
@@ -2197,6 +2199,8 @@
         case FFI_PPP: FFI (2); xp = PTRARG(1);yp = PTRARG(2);  rp = (*(void*   (*)(void*, void*    ))f)(xp,yp); n = mkPtr(rp); RETIO(n);
         case FFI_IPI: FFI (2); xi = INTARG(1);yp = PTRARG(2);  ri = (*(value_t (*)(value_t, void*  ))f)(xi,yp); n = mkInt(ri); RETIO(n);
         case FFI_iPi: FFI (2); xi = INTARG(1);yp = PTRARG(2);  ri = (*(int     (*)(int,   void*    ))f)(xi,yp); n = mkInt(ri); RETIO(n);
+        case FFI_PIIPI:FFI (4);xp = PTRARG(1);yi = INTARG(2); zi = INTARG(3); wp = PTRARG(4);
+          ri = (*(int     (*)(void*, int, int, void*    ))f)(xp,yi,zi,wp); n = mkInt(ri); RETIO(n);
         default: ERR("T_IO_CCALL");
         }
       }
--