static void DoSave(System *sys) { VMFILE *fp; /* check for a program name on the command line */ if (!SetProgramName(sys)) { VM_printf("expecting a file name\n"); return; } /* save the program */ if (!(fp = VM_fopen(programName, "w"))) VM_printf("error saving '%s'\n", programName); else { VMVALUE lineNumber; VM_printf("Saving '%s'\n", programName); BufSeekN(0); while (BufGetLine(&lineNumber, sys->lineBuf)) { char buf[32]; sprintf(buf, "%d ", lineNumber); VM_fputs(buf, fp); VM_fputs(sys->lineBuf, fp); } VM_fclose(fp); } }
static void DoList(System *sys) { VMVALUE lineNumber; BufSeekN(0); while (BufGetLine(&lineNumber, sys->lineBuf)) VM_printf("%d %s", lineNumber, sys->lineBuf); }
static void DoRun(HandlerData *data) { System *sys = data->sys; ImageHdr *image = data->image; GetLineHandler *getLine; void *getLineCookie; VMVALUE code; getLine = sys->getLine; getLineCookie = sys->getLineCookie; sys->getLine = EditGetLine; BufSeekN(0); sys->freeNext = sys->freeMark; InitImage(image); if ((code = Compile(sys, image, VMFALSE)) != 0) { sys->freeNext = sys->freeMark; Execute(sys, image, code); } sys->getLine = getLine; sys->getLineCookie = getLineCookie; }
static void DoRun(System *sys) { ParseContext *c; sys->freeNext = sys->freeSpace; if (!(c = InitCompiler(sys, MAXOBJECTS))) VM_printf("insufficient memory\n"); else { ImageHdr *image; BufSeekN(0); c->getLine = EditGetLine; if ((image = Compile(c)) != NULL) { Interpreter *i = (Interpreter *)sys->freeNext; size_t stackSize = (sys->freeTop - sys->freeNext - sizeof(Interpreter)) / sizeof(VMVALUE); if (stackSize <= 0) VM_printf("insufficient memory\n"); else { InitInterpreter(i, stackSize); Execute(i, image); } } } }