nooc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit b3e53ef4ecd862840f30829d1fc5b1387a015659
parent 8f09fd143fdab8b36157816c13f9f7ec658758c0
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Sun,  7 Nov 2021 00:34:05 -0500

support multiple statements

Diffstat:
Mmain.c | 100+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mprog.nc | 5+++--
2 files changed, 63 insertions(+), 42 deletions(-)

diff --git a/main.c b/main.c @@ -75,9 +75,9 @@ elf(char *text, size_t len, char*data, size_t dlen, FILE *f) } enum tokentype { + TOK_NONE = 0, TOK_SYSCALL = 1, TOK_PRINT, - TOK_EXIT, TOK_LPAREN, TOK_RPAREN, @@ -112,10 +112,6 @@ lex(struct slice start) start.ptr += 1; start.len -= 1; continue; - } else if (strncmp(start.ptr, "exit", sizeof("exit") - 1) == 0) { - cur->type = TOK_EXIT; - start.ptr += sizeof("exit") - 1; - start.len -= sizeof("exit") - 1; } else if (strncmp(start.ptr, "syscall", sizeof("syscall") - 1) == 0) { cur->type = TOK_SYSCALL; start.ptr += sizeof("syscall") - 1; @@ -157,6 +153,10 @@ lex(struct slice start) start.ptr++; start.len--; + } else if (*start.ptr == '\n') { + start.ptr++; + start.len--; + continue; } cur->next = calloc(1, sizeof(struct token)); @@ -173,7 +173,7 @@ lex(struct slice start) enum func { FUNC_NONE, - FUNC_EXIT + FUNC_SYSCALL }; struct fparams { @@ -219,40 +219,53 @@ data_push(char *ptr, size_t len) return 0x2000 + data_seg.len - len; } -struct fcall +struct calls { + size_t cap; + size_t len; + struct fcall *data; +}; + +struct calls parse(struct token *tok) { - struct fcall fcall = { 0 }; - expect(tok, TOK_SYSCALL); - tok = tok->next; - expect(tok, TOK_LPAREN); - tok = tok->next; - - int val; - while (1) { - switch (tok->type) { - case TOK_NUM: - val = strtol(tok->slice.ptr, NULL, 10); - array_add((&fcall.params), val); - tok = tok->next; - break; - case TOK_STRING: - val = data_push(tok->slice.ptr, tok->slice.len); - array_add((&fcall.params), val); + struct calls calls = { 0 }; + struct fcall fcall; + + while (tok->type != TOK_NONE) { + fcall = (struct fcall){ 0 }; + expect(tok, TOK_SYSCALL); + tok = tok->next; + expect(tok, TOK_LPAREN); + tok = tok->next; + + int val; + while (1) { + switch (tok->type) { + case TOK_NUM: + val = strtol(tok->slice.ptr, NULL, 10); + array_add((&fcall.params), val); + tok = tok->next; + break; + case TOK_STRING: + // FIXME: error check + val = data_push(tok->slice.ptr, tok->slice.len); + array_add((&fcall.params), val); + tok = tok->next; + break; + } + + if (tok->type == TOK_RPAREN) + break; + expect(tok, TOK_COMMA); tok = tok->next; - break; } - - if (tok->type == TOK_RPAREN) - break; - expect(tok, TOK_COMMA); + expect(tok, TOK_RPAREN); tok = tok->next; + + array_add((&calls), fcall); } - // FIXME: error check - expect(tok, TOK_RPAREN); - tok = tok->next; - return fcall; + return calls; } size_t @@ -312,7 +325,7 @@ main(int argc, char *argv[]) close(in); struct token *head = lex((struct slice){addr, statbuf.st_size}); - struct fcall fcall = parse(head); + struct calls calls = parse(head); munmap(addr, statbuf.st_size); @@ -323,14 +336,21 @@ main(int argc, char *argv[]) return 1; } - size_t len = gensyscall(NULL, &(fcall.params)); - char *fcode = malloc(len); - if (!fcode) - error("gensyscall malloc failed"); + struct data text = { 0 }; + + for (int i = 0; i < calls.len; i++) { + size_t len = gensyscall(NULL, &(calls.data[i].params)); + char *fcode = malloc(len); + if (!fcode) + error("gensyscall malloc failed"); - gensyscall(fcode, &(fcall.params)); + gensyscall(fcode, &(calls.data[i].params)); + array_push((&text), fcode, len); + + free(fcode); + } - elf(fcode, len, data_seg.data, data_seg.len, out); + elf(text.data, text.len, data_seg.data, data_seg.len, out); fclose(out); } diff --git a/prog.nc b/prog.nc @@ -1 +1,3 @@ -syscall(1, 0, "hello", 5)- \ No newline at end of file +syscall(1, 0, "hello", 5) +syscall(1, 0, " world", 6) +syscall(60, 0)