aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--README.md2
-rw-r--r--api/int.c2
-rw-r--r--api/ref.c2
-rw-r--r--api/util.c2
-rw-r--r--api/vm.c2
-rw-r--r--api/vm.h23
-rw-r--r--common/err.h (renamed from src/err.h)0
-rw-r--r--common/str.h (renamed from src/util.h)0
-rw-r--r--example/print_args.uwu5
-rw-r--r--src/collect.h8
-rw-r--r--src/expression.h14
-rw-r--r--src/load.c (renamed from src/collect.c)52
-rw-r--r--src/load.h19
-rw-r--r--src/main.c51
-rw-r--r--src/parse.c2
-rw-r--r--src/parse.h4
-rw-r--r--src/run.c74
-rw-r--r--src/run.h8
-rw-r--r--src/vm.c52
-rw-r--r--src/vm.h6
-rw-r--r--std/bool.c9
-rw-r--r--std/int.c10
-rw-r--r--std/nil.c6
-rw-r--r--std/ref.c6
-rw-r--r--std/str.c6
26 files changed, 172 insertions, 199 deletions
diff --git a/Makefile b/Makefile
index 17c6922..da9c509 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
all: uwu std api
uwu: src/*.c src/*.h
- gcc -g src/*.c -o uwu -ldl -D_GNU_SOURCE
+ gcc -g -I. src/*.c -o uwu -D_GNU_SOURCE -ldl
.PHONY: std api
@@ -9,10 +9,10 @@ std: std/bool.so std/int.so std/str.so std/nil.so std/ref.so
api: api/api.so
std/%.so: std/%.c
- gcc -g -shared -fpic $< -o $@ -D_GNU_SOURCE
+ gcc -g -I. -shared -fpic $< -o $@ -D_GNU_SOURCE
api/api.so: api/*.c api/*.h
- gcc -g -shared -fpic api/*.c -o api/api.so -D_GNU_SOURCE
+ gcc -g -I. -shared -fpic api/*.c -o api/api.so -D_GNU_SOURCE
.PHONY: clean
diff --git a/README.md b/README.md
index 211c407..c762b4a 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ make
To run:
```
-./uwu <module>
+./uwu <module> <args>
```
`<module>` is a path relative to the current directory.
diff --git a/api/int.c b/api/int.c
index 8446d1d..b1e0c69 100644
--- a/api/int.c
+++ b/api/int.c
@@ -1,5 +1,5 @@
#include <stdlib.h>
-#include "../src/util.h"
+#include "common/str.h"
#include "int.h"
UwUVMValue uwuint_create(int value)
diff --git a/api/ref.c b/api/ref.c
index 43eb68e..517869e 100644
--- a/api/ref.c
+++ b/api/ref.c
@@ -1,4 +1,4 @@
-#include "../src/util.h"
+#include "common/str.h"
#include "ref.h"
UwUVMValue uwuref_create(UwUVMFunction *value)
diff --git a/api/util.c b/api/util.c
index c3e8a38..e6f0650 100644
--- a/api/util.c
+++ b/api/util.c
@@ -1,4 +1,4 @@
-#include "../src/err.h"
+#include "common/err.h"
#include "util.h"
#include "bool.h"
diff --git a/api/vm.c b/api/vm.c
index 5cab6c0..8374050 100644
--- a/api/vm.c
+++ b/api/vm.c
@@ -1,6 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include "../src/err.h"
+#include "common/err.h"
#include "vm.h"
#include "str.h"
#include "ref.h"
diff --git a/api/vm.h b/api/vm.h
index 81465f8..fc761d3 100644
--- a/api/vm.h
+++ b/api/vm.h
@@ -3,7 +3,6 @@
#include <stddef.h>
#include <stdbool.h>
-#include "../src/expression.h"
typedef enum
{
@@ -11,6 +10,16 @@ typedef enum
MODULE_NATIVE,
} UwUVMModuleType;
+typedef enum
+{
+ EX_UNINIT,
+ EX_INTLIT,
+ EX_STRLIT,
+ EX_ARGNUM,
+ EX_FNNAME,
+ EX_FNCALL,
+} UwUVMExpressionType;
+
typedef struct
{
void *(*clone)(void *data);
@@ -46,7 +55,7 @@ typedef struct
typedef struct UwUVMExpression
{
- ExpressionType type;
+ UwUVMExpressionType type;
union
{
struct
@@ -61,16 +70,6 @@ typedef struct UwUVMExpression
} value;
} UwUVMExpression;
-typedef struct
-{
- void *api_library;
- UwUVMFunction *main_function;
- UwUVMFunction **functions;
- size_t num_functions;
- void **libraries;
- size_t num_libraries;
-} UwUVMProgram;
-
UwUVMValue uwuvm_clone_value(UwUVMValue value);
void uwuvm_delet_value(UwUVMValue value);
char *uwuvm_print_value(UwUVMValue value);
diff --git a/src/err.h b/common/err.h
index 1dccbf9..1dccbf9 100644
--- a/src/err.h
+++ b/common/err.h
diff --git a/src/util.h b/common/str.h
index b0baa37..b0baa37 100644
--- a/src/util.h
+++ b/common/str.h
diff --git a/example/print_args.uwu b/example/print_args.uwu
new file mode 100644
index 0000000..2256a88
--- /dev/null
+++ b/example/print_args.uwu
@@ -0,0 +1,5 @@
+main :str:cat(
+ $0,
+ $1,
+ $2
+)
diff --git a/src/collect.h b/src/collect.h
deleted file mode 100644
index da118a5..0000000
--- a/src/collect.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _COLLECT_H_
-#define _COLLECT_H_
-
-#include "../api/vm.h"
-
-UwUVMProgram create_program(const char *progname, const char *modname);
-
-#endif
diff --git a/src/expression.h b/src/expression.h
deleted file mode 100644
index 55d10f7..0000000
--- a/src/expression.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _EXPRESSION_H_
-#define _EXPRESSION_H_
-
-typedef enum
-{
- EX_UNINIT,
- EX_INTLIT,
- EX_STRLIT,
- EX_ARGNUM,
- EX_FNNAME,
- EX_FNCALL,
-} ExpressionType;
-
-#endif
diff --git a/src/collect.c b/src/load.c
index ae15513..edeba97 100644
--- a/src/collect.c
+++ b/src/load.c
@@ -4,9 +4,9 @@
#include <stdarg.h>
#include <libgen.h>
#include <dlfcn.h>
-#include "err.h"
-#include "util.h"
-#include "collect.h"
+#include "common/err.h"
+#include "common/str.h"
+#include "load.h"
#include "parse.h"
#define DEBUG 0
@@ -79,8 +79,8 @@ typedef struct
char *std_path; // path to standard library
- UwUVMProgram program; // the result program
-} CollectorState;
+ Program program; // the result program
+} LoadState;
// functions
@@ -108,7 +108,7 @@ static inline char *get_filename(const char *module_path)
}
// module_path is a mallocated string
-static Module *require_module(CollectorState *state, char *module_path)
+static Module *require_module(LoadState *state, char *module_path)
{
for (size_t i = 0; i < state->num_modules; i++) {
Module *module = state->modules[i];
@@ -150,13 +150,13 @@ static Module *require_module(CollectorState *state, char *module_path)
char *err = dlerror();
if (err)
- error("%s\n", err);
+ error("library error: %s\n", err);
}
return module;
}
-static UwUVMFunction *require_function(CollectorState *state, Module *module, const char *name)
+static UwUVMFunction *require_function(LoadState *state, Module *module, const char *name)
{
for (size_t i = 0; i < module->num_functions; i++) {
FunctionLink *link = &module->functions[i];
@@ -180,7 +180,7 @@ static UwUVMFunction *require_function(CollectorState *state, Module *module, co
return ref;
}
-static UwUVMFunction *resolve_function(CollectorState *state, Module *caller_module, const char *full_name)
+static UwUVMFunction *resolve_function(LoadState *state, Module *caller_module, const char *full_name)
{
size_t len = strlen(full_name);
@@ -221,7 +221,7 @@ static UwUVMFunction *resolve_function(CollectorState *state, Module *caller_mod
return require_function(state, callee_module, fnname);
}
-static void translate_expression(CollectorState *state, Module *module, UwUVMExpression *vm_expr, ParseExpression *parse_expr)
+static void translate_expression(LoadState *state, Module *module, UwUVMExpression *vm_expr, ParseExpression *parse_expr)
{
UwUVMFunction *vm_function;
@@ -263,13 +263,10 @@ static void translate_expression(CollectorState *state, Module *module, UwUVMExp
free(parse_expr);
}
-static void load_functions(CollectorState *state, Module *module)
+static void load_functions(LoadState *state, Module *module)
{
for (; module->loaded_functions < module->num_functions; module->loaded_functions++) {
- FunctionLink *linkptr = &module->functions[module->loaded_functions];
- FunctionLink link = *linkptr;
-
- bool found = false;
+ FunctionLink *link = &module->functions[module->loaded_functions];
if (module->type == MODULE_PLAIN) {
ParseFunction **function = NULL;
@@ -277,34 +274,31 @@ static void load_functions(CollectorState *state, Module *module)
for (size_t i = 0; i < module->handle.ast.num_functions; i++) {
ParseFunction **fn = &module->handle.ast.functions[i];
- if (*fn && strcmp((*fn)->name, link.name) == 0) {
+ if (*fn && strcmp((*fn)->name, link->name) == 0) {
function = fn;
break;
}
}
if (function) {
- found = true;
- linkptr = NULL;
-
- translate_expression(state, module, link.ref->value.plain = malloc(sizeof(UwUVMExpression)), (*function)->expression);
+ translate_expression(state, module, link->ref->value.plain = malloc(sizeof(UwUVMExpression)), (*function)->expression);
free((*function)->name);
free(*function);
*function = NULL;
+ } else {
+ error("error: no function %s in module %s\n", link->name, module->filename);
}
} else {
- char *symbol = asprintf_wrapper("uwu_%s", link.name);
- linkptr->ref->value.native = dlsym(module->handle.lib, symbol);
+ char *symbol = asprintf_wrapper("uwu_%s", link->name);
+ link->ref->value.native = dlsym(module->handle.lib, symbol);
- if (! dlerror())
- found = true;
+ char *err = dlerror();
+ if (err)
+ error("library error: %s\n", err);
free(symbol);
}
-
- if (! found)
- error("error: no function %s in module %s\n", link.name, module->filename);
}
}
@@ -324,12 +318,12 @@ static void free_expression(ParseExpression *expr)
free(expr);
}
-UwUVMProgram create_program(const char *progname, const char *modname)
+Program load_program(const char *progname, const char *modname)
{
char *prog_dirname = dirname_wrapper(progname);
char *api_path = asprintf_wrapper("%s/api/api.so", prog_dirname);
- CollectorState state = {
+ LoadState state = {
.modules = NULL,
.num_modules = 0,
.std_path = asprintf_wrapper("%s/std", prog_dirname),
diff --git a/src/load.h b/src/load.h
new file mode 100644
index 0000000..5d6b00e
--- /dev/null
+++ b/src/load.h
@@ -0,0 +1,19 @@
+#ifndef _LOAD_H_
+#define _LOAD_H_
+
+#include <stddef.h>
+#include "api/vm.h"
+
+typedef struct
+{
+ void *api_library;
+ UwUVMFunction *main_function;
+ UwUVMFunction **functions;
+ size_t num_functions;
+ void **libraries;
+ size_t num_libraries;
+} Program;
+
+Program load_program(const char *progname, const char *modname);
+
+#endif
diff --git a/src/main.c b/src/main.c
index 60c22ba..2a29d80 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,56 +1,11 @@
-#include "err.h"
-#include "vm.h"
+#include "common/err.h"
+#include "run.h"
int main(int argc, char *argv[])
{
if (argc < 2)
error("usage: %s <module>\n", argv[0]);
- vm_run_file(argv[0], argv[1]);
+ run_module(argv[0], argv[1], argc > 2 ? (size_t) argc - 2 : 0, &argv[2]);
return 0;
}
-
-/*
-
-0123
-"asd"
-$arg
-&fnname
-func(asd)
-
-:int:add
-:str:cat
-:boo:and
-:arr:arr
-:set:set
-
-integer::add()
-integer::sub()
-integer::mul()
-integer::div()
-integer::mod()
-integer::pow()
-
-string::concat()
-string::split()
-string::find()
-
-array::array()
-array::select()
-array::insert()
-array::length()
-array::reduce()
-array::map()
-
-set::set()
-set::pair()
-set::select()
-set::insert()
-set::remove()
-set::contains()
-
-boolean::and()
-boolean::or()
-boolean::xor()
-
-*/
diff --git a/src/parse.c b/src/parse.c
index c8b430d..ed09de9 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
-#include "err.h"
+#include "common/err.h"
#include "parse.h"
#define DEBUG 0
diff --git a/src/parse.h b/src/parse.h
index 7aca6af..46f4542 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -3,11 +3,11 @@
#include <stddef.h>
#include <stdbool.h>
-#include "expression.h"
+#include "api/vm.h"
typedef struct ParseExpression
{
- ExpressionType type;
+ UwUVMExpressionType type;
union
{
int int_value;
diff --git a/src/run.c b/src/run.c
new file mode 100644
index 0000000..7733c8d
--- /dev/null
+++ b/src/run.c
@@ -0,0 +1,74 @@
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "common/err.h"
+#include "load.h"
+#include "run.h"
+
+static void free_expression(UwUVMExpression *expr)
+{
+ if (expr->type == EX_FNCALL) {
+ for (size_t i = 0; i < expr->value.cll_value.num_args; i++)
+ free_expression(&expr->value.cll_value.args[i]);
+
+ free(expr->value.cll_value.args);
+ }
+
+ if (expr->type == EX_STRLIT)
+ free(expr->value.str_value);
+}
+
+void run_module(const char *progname, const char *modname, size_t num_args, char *args[])
+{
+ (void) num_args;
+ (void) args;
+
+ Program program = load_program(progname, modname);
+
+ UwUVMValue (*uwuvm_call_function)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *) = dlsym(program.api_library, "uwuvm_call_function");
+ char *(*uwuvm_print_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_print_value" );
+ void (*uwuvm_delet_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_delet_value" );
+
+ char *err = dlerror();
+ if (err)
+ error("library error: %s\n", err);
+
+ UwUVMExpression arg_expressions[num_args];
+
+ for (size_t i = 0; i < num_args; i++)
+ arg_expressions[i] = (UwUVMExpression) {
+ .type = EX_STRLIT,
+ .value = {
+ .str_value = args[i],
+ },
+ };
+
+ UwUVMValue result = uwuvm_call_function(program.main_function, num_args, arg_expressions, NULL);
+
+ char *str = uwuvm_print_value(result);
+ printf("%s\n", str);
+ free(str);
+
+ uwuvm_delet_value(result);
+
+ for (size_t i = 0; i < program.num_functions; i++) {
+ UwUVMFunction *function = program.functions[i];
+
+ if (function->type == MODULE_PLAIN) {
+ free_expression(function->value.plain);
+ free(function->value.plain);
+ }
+
+ free(function);
+ }
+
+ free(program.functions);
+
+ for (size_t i = 0; i < program.num_libraries; i++)
+ dlclose(program.libraries[i]);
+
+ if (program.libraries)
+ free(program.libraries);
+
+ dlclose(program.api_library);
+}
diff --git a/src/run.h b/src/run.h
new file mode 100644
index 0000000..010dec0
--- /dev/null
+++ b/src/run.h
@@ -0,0 +1,8 @@
+#ifndef _RUN_H_
+#define _RUN_H_
+
+#include <stddef.h>
+
+void run_module(const char *progname, const char *modname, size_t num_args, char *args[]);
+
+#endif
diff --git a/src/vm.c b/src/vm.c
deleted file mode 100644
index 8b1b13a..0000000
--- a/src/vm.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "collect.h"
-#include "vm.h"
-
-static void free_expression(UwUVMExpression *expr)
-{
- if (expr->type == EX_FNCALL) {
- for (size_t i = 0; i < expr->value.cll_value.num_args; i++)
- free_expression(&expr->value.cll_value.args[i]);
-
- free(expr->value.cll_value.args);
- }
-
- if (expr->type == EX_STRLIT)
- free(expr->value.str_value);
-}
-
-void vm_run_file(const char *progname, const char *modname)
-{
- UwUVMProgram program = create_program(progname, modname);
- UwUVMValue result = ((UwUVMValue (*)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *)) dlsym(program.api_library, "uwuvm_call_function"))(program.main_function, 0, NULL, NULL);
-
- char *str = ((char *(*)(UwUVMValue)) dlsym(program.api_library, "uwuvm_print_value"))(result);
-
- printf("%s\n", str);
- free(str);
-
- ((void (*)(UwUVMValue)) dlsym(program.api_library, "uwuvm_delet_value"))(result);
-
- for (size_t i = 0; i < program.num_functions; i++) {
- UwUVMFunction *function = program.functions[i];
-
- if (function->type == MODULE_PLAIN) {
- free_expression(function->value.plain);
- free(function->value.plain);
- }
-
- free(function);
- }
-
- free(program.functions);
-
- for (size_t i = 0; i < program.num_libraries; i++)
- dlclose(program.libraries[i]);
-
- if (program.libraries)
- free(program.libraries);
-
- dlclose(program.api_library);
-}
diff --git a/src/vm.h b/src/vm.h
deleted file mode 100644
index 5e23c8b..0000000
--- a/src/vm.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _VM_H_
-#define _VM_H_
-
-void vm_run_file(const char *progname, const char *modname);
-
-#endif
diff --git a/std/bool.c b/std/bool.c
index 4386dc3..349e1c9 100644
--- a/std/bool.c
+++ b/std/bool.c
@@ -1,10 +1,9 @@
#include <stdio.h>
#include <stdlib.h>
-#include "../src/err.h"
-#include "../api/vm.h"
-#include "../api/util.h"
-#include "../api/bool.h"
-
+#include "common/err.h"
+#include "api/vm.h"
+#include "api/util.h"
+#include "api/bool.h"
static inline bool get_bool_arg(UwUVMArgs *args, size_t i)
{
diff --git a/std/int.c b/std/int.c
index 6857f26..22af320 100644
--- a/std/int.c
+++ b/std/int.c
@@ -1,10 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
-#include "../src/err.h"
-#include "../api/vm.h"
-#include "../api/int.h"
-#include "../api/bool.h"
-#include "../api/util.h"
+#include "common/err.h"
+#include "api/vm.h"
+#include "api/int.h"
+#include "api/bool.h"
+#include "api/util.h"
typedef enum
{
diff --git a/std/nil.c b/std/nil.c
index 599e3d4..93172eb 100644
--- a/std/nil.c
+++ b/std/nil.c
@@ -1,6 +1,6 @@
-#include "../src/err.h"
-#include "../api/nil.h"
-#include "../api/util.h"
+#include "common/err.h"
+#include "api/nil.h"
+#include "api/util.h"
UwUVMValue uwu_nil(UwUVMArgs *args)
{
diff --git a/std/ref.c b/std/ref.c
index f82bb50..62c0a52 100644
--- a/std/ref.c
+++ b/std/ref.c
@@ -1,6 +1,6 @@
-#include "../src/err.h"
-#include "../api/ref.h"
-#include "../api/util.h"
+#include "common/err.h"
+#include "api/ref.h"
+#include "api/util.h"
UwUVMValue uwu_call(UwUVMArgs *args)
{
diff --git a/std/str.c b/std/str.c
index 953e8c0..a0e4edd 100644
--- a/std/str.c
+++ b/std/str.c
@@ -1,8 +1,8 @@
#include <string.h>
#include <stdlib.h>
-#include "../api/vm.h"
-#include "../api/str.h"
-#include "../api/util.h"
+#include "api/vm.h"
+#include "api/str.h"
+#include "api/util.h"
UwUVMValue uwu_cat(UwUVMArgs *args)
{