Mercurial > repo
diff interps/egobch/src/egobch.c @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/egobch/src/egobch.c Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2005 Gregor Richards + * + * This file is part of EgoBCh. + * + * EgoBCh is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * EgoBCh is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EgoBCh; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "bchi.h" +#include "egobch.h" +#include "optimize.h" + +char *iprog; +int ipptr; + +struct bchi *prog; +int pptr; + +unsigned char *mem; +unsigned char *mptr; +unsigned char membit; + +int lazy_io = 0; +int debug = 0; + +int main(int argc, char **argv) +{ + int i; + FILE *bchin; + char *bchins = NULL; + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + if (!strcmp(argv[i], "-lazy-io")) { + i++; + if (!strcmp(argv[i], "on")) + lazy_io = 1; + } else if (!strcmp(argv[i], "-debug")) { + debug = 1; + } else if (!strcmp(argv[i], "--help") || + !strcmp(argv[i], "-help") || + !strcmp(argv[i], "-h")) { + fprintf(stderr, + "Use: egobchi <options> <input file>\n" + "Options:\n" + " -lazy-io <on|off>\n" + " allow the use of . and , for IO (not standard BitChanger) [default off]\n" + " -debug\n" + " allow # debugging\n"); + exit(0); + } else { + fprintf(stderr, "Unrecognized option: %s\n", argv[i]); + exit(1); + } + } else { + bchins = argv[i]; + } + } + + /* now allocate memory */ + iprog = (char *) malloc(30000); + ipptr = 0; + prog = (struct bchi *) malloc(30000 * sizeof(struct bchi)); + pptr = 0; + mem = (unsigned char *) malloc(30000); + memset(mem, 0, 30000); + mptr = mem + 2; + membit = 0x80; + + /* read the file */ + if (bchins) { + bchin = fopen(bchins, "r"); + if (bchin == NULL) { + perror(bchins); + exit(1); + } + } else { + bchin = stdin; + } + + while (!feof(bchin) && !ferror(bchin)) { + iprog[ipptr] = fgetc(bchin); + if ISBCH(iprog[ipptr]) { + ipptr++; + } + } + iprog[ipptr] = '\0'; + + /* "optimize" (which really just matches loops) */ + ipptr = 0; + optimize(); + if (pptr != 0 && prog[0].cmd != FIN) { + fprintf(stderr, "Unmatched loop!\n"); + exit(1); + } + + /* interpret */ + pptr = 0; + bch_interpret(); + + return 0; +}