From efbbb37d3623cb2ba92c79dd9a5d9f55938e2344 Mon Sep 17 00:00:00 2001 From: Veit Heller Date: Wed, 8 Oct 2014 12:01:57 +0200 Subject: [PATCH] Added entry point statement --- README.md | 4 +--- vvm/src/vm.c | 27 ++++++++++++++++----------- vvm/src/vm.h | 1 + 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6f748c2..ecd7856 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,4 @@ Virtual Machines [![Build Status](https://travis-ci.org/hellerve/Virtual-Machines.png?branch=master)](https://travis-ci.org/hellerve/Virtual-Machines) Just a bunch of immature interpreters. One interprets brainfuck code(nbfi - -naive brainfuck interpreter), the other uses an assembly-based dsl(but has -no parser until now, so you will have to write code within the original -programs' code). +naive brainfuck interpreter), the other uses an assembly-based dsl. diff --git a/vvm/src/vm.c b/vvm/src/vm.c index 322e2af..ee2617b 100644 --- a/vvm/src/vm.c +++ b/vvm/src/vm.c @@ -178,6 +178,7 @@ program vm_parse(char *filename){ instruction* ins = setup_instructions(); unsigned int len = IDEC; size_t linelength = 0; + int entry = 0; if(!file) die(127, "Could not open file."); @@ -194,17 +195,21 @@ program vm_parse(char *filename){ die(127, "Program too big, could not allocate enough storage."); } - for(i = 1; i < len; i++) - if(strcmp(ins[i].name, command[0]) == 0){ - code[codep++] = i; - found = TRUE; - break; - } + if(strcmp(command[0], "ENTRY") == 0){ + entry = (int) strtol(command[1], (char **) NULL, 10); + }else{ + for(i = 1; i < len; i++) + if(strcmp(ins[i].name, command[0]) == 0){ + code[codep++] = i; + found = TRUE; + break; + } - if(found && ins[i].operands > 0){ - int nargs = ins[i].operands; - for(i = 1; i <= nargs; i++){ - code[codep++] = (int) strtol(command[i], (char **) NULL, 10); + if(found && ins[i].operands > 0){ + int nargs = ins[i].operands; + for(i = 1; i <= nargs; i++){ + code[codep++] = (int) strtol(command[i], (char **) NULL, 10); + } } } } @@ -216,7 +221,7 @@ program vm_parse(char *filename){ code = (int *) realloc(code, codep * sizeof(int)); - program prog = {codep, code}; + program prog = {codep, entry, code}; return prog; } diff --git a/vvm/src/vm.h b/vvm/src/vm.h index 97d5a2e..cb2ebae 100644 --- a/vvm/src/vm.h +++ b/vvm/src/vm.h @@ -10,6 +10,7 @@ typedef struct{ unsigned long length; + int entrypoint; int* code; } program;