Allow programs to override binit() (so they can register their own modules).
authorDavid Given <dg@cowlark.com>
Sat, 31 Dec 2016 17:39:51 +0000 (17:39 +0000)
committerDavid Given <dg@cowlark.com>
Sat, 31 Dec 2016 17:39:51 +0000 (17:39 +0000)
lang/b/lib/b.h
lang/b/lib/init.c [new file with mode: 0644]
lang/b/lib/main.c

index 571c179..1125452 100644 (file)
@@ -19,4 +19,10 @@ extern FILE* output_unit;
 
 #define END 4
 
+extern uintptr_t* bmodule_main[];
+
+extern void patch_addresses(uintptr_t** p);
+
+extern void binit(void);
+
 #endif
diff --git a/lang/b/lib/init.c b/lang/b/lib/init.c
new file mode 100644 (file)
index 0000000..b7ad01f
--- /dev/null
@@ -0,0 +1,10 @@
+#include "b.h"
+#include <stdarg.h>
+#include <string.h>
+#include <limits.h>
+
+void binit(void)
+{
+    patch_addresses(bmodule_main);
+}
+
index 404e1fd..b583a43 100644 (file)
@@ -3,7 +3,6 @@
 #include <string.h>
 #include <limits.h>
 
-extern uintptr_t* b_module_main[];
 extern intptr_t i_main(intptr_t argc, const char* argv[]);
 
 FILE* input_unit;
@@ -155,7 +154,7 @@ uintptr_t b_getstr = (uintptr_t)i_getstr;
 uintptr_t b_flush = (uintptr_t)i_flush;
 uintptr_t b_printf = (uintptr_t)i_printf;
 
-static uintptr_t* b_module_stdlib[] =
+static uintptr_t* bmodule_stdlib[] =
 {
     &b_char,
     &b_lchar,
@@ -168,7 +167,7 @@ static uintptr_t* b_module_stdlib[] =
     0
 };
 
-static void patch_addresses(uintptr_t** p)
+void patch_addresses(uintptr_t** p)
 {
     while (*p)
     {
@@ -179,8 +178,8 @@ static void patch_addresses(uintptr_t** p)
 
 int main(int argc, const char* argv[])
 {
-    patch_addresses(b_module_main);
-    patch_addresses(b_module_stdlib);
+    patch_addresses(bmodule_stdlib);
+       binit();
     input_unit = stdin;
     output_unit = stdout;
     return i_main(argc, NULL);