summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/fspec/dump.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/bin/fspec/dump.c b/src/bin/fspec/dump.c
index 07a6757..8ca53b2 100644
--- a/src/bin/fspec/dump.c
+++ b/src/bin/fspec/dump.c
@@ -14,6 +14,7 @@
#include <fspec/bcode.h>
#include <fspec/lexer.h>
#include <fspec/validator.h>
+#include "fspec/ragel/lexer-expr.h"
#include "util/membuf.h"
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
@@ -756,6 +757,29 @@ fopen_or_die(const char *path, const char *mode)
#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
+struct expr {
+ struct fspec_expr expr;
+ struct membuf output;
+ FILE *file;
+};
+
+static size_t
+fspec_expr_write(struct fspec_expr *expr, const void *output, const size_t size, const size_t nmemb)
+{
+ assert(expr && output);
+ // struct expr *l = container_of(expr, struct expr, expr);
+ (void)expr, (void)size, (void)nmemb;
+ return nmemb;
+}
+
+static size_t
+fspec_expr_read(struct fspec_expr *expr, void *input, const size_t size, const size_t nmemb)
+{
+ assert(expr && input);
+ struct expr *l = container_of(expr, struct expr, expr);
+ return fread(input, size, nmemb, l->file);
+}
+
struct lexer {
struct fspec_lexer lexer;
struct membuf output;
@@ -803,6 +827,25 @@ main(int argc, const char *argv[])
{
char input[4096];
+ struct expr l = {
+ .expr = {
+ .ops.read = fspec_expr_read,
+ .ops.write = fspec_expr_write,
+ .mem.input = { .data = input, .len = sizeof(input) },
+ },
+ .file = fopen_or_die(argv[1], "rb"),
+ .output.mem = { .data = output, .len = sizeof(output) },
+ };
+
+ if (!fspec_expr_parse(&l.expr, argv[1]))
+ exit(EXIT_FAILURE);
+
+ fclose(l.file);
+ // bcode = l.expr.mem.output;
+ }
+
+ {
+ char input[4096];
struct lexer l = {
.lexer = {
.ops.read = fspec_lexer_read,