Mercurial > repo
diff interps/egobf/src/egobfi.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/egobf/src/egobfi.c Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2005 Gregor Richards + * + * This file is part of egobfi. + * + * egobfi 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. + * + * egobfi 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 egobfi; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef HAVE_WCHAR_H +#include <wchar.h> +#endif + +#ifndef EGOBFC +#include "bfi.h" +#else +#include "bfc.h" +#endif +#include "egobfi.h" +#ifndef EGOBFC2M +#include "optimize.h" +#else +#include "c2m.h" +#endif +/*#include "optim2.h"*/ + +int wrapping = 1; +int debug = 0; +int eof = 0; +int compile = 0; +int unicode = 0; + +#ifdef EGOBFC +int bytewidth = 1; +#else +USEINT bwmax; +USEINT *mem; +int mlen; +USEINT *mend; +USEINT *mptr; +#endif + +char *iprog; +int iplen; +int ipptr; + +#ifndef EGOBFC2M +struct bfi *prog; +int plen; +int pptr; +#else +void (*prog)(); +void (*tprog)(); +int plen; +int pptr; +#endif + +int main(int argc, char **argv) +{ + int i; + FILE *bfin = stdin; + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + if (!strcmp(argv[i], "-wrap")) { + /* set wrapping on or off */ + i++; + if (!strcmp(argv[i], "off")) + wrapping = 0; + } else if (!strcmp(argv[i], "-debug")) { + debug = 1; + } else if (!strcmp(argv[i], "-eof")) { + /* choose eof mode */ + i++; + switch (argv[i][0]) { + case '-': + eof = -1; + break; + + case 'n': + case 'N': + eof = 1; /* 1 means no change */ + break; + } +#ifdef HAVE_WCHAR_H + } else if (!strcmp(argv[i], "-unicode")) { + i++; + if (!strcmp(argv[i], "on")) { + /* make sure it's supported at this level */ + int chk; +#ifndef EGOBFC + chk = sizeof(USEINT); +#else + chk = bytewidth; +#endif + if(sizeof(wint_t) > chk) { + fprintf(stderr, "Sorry, I can't support unicode with this bitwidth!\n"); + exit(1); + } + unicode = 1; + } +#endif +#ifdef EGOBFC + } else if (!strcmp(argv[i], "-width")) { + i++; + bytewidth = atoi(argv[i]) >> 3; +#endif + } else if(!strcmp(argv[i], "-h") || + !strcmp(argv[i], "-help") || + !strcmp(argv[i], "--help")) { + /* display help */ + fprintf(stderr, "Use: %s [options] [file]\n" + "Options:\n" + " -eof {0|-|n}\n" + " set EOF mode: 0, -1 or no-change (respectively)\n" + " [default: 0]\n" + " -debug\n" + " activate the # command [default off]\n" +#ifndef EGOBFC2M + " -unicode {on|off}\n" + " set unicode mode on or off [default off]\n" +#ifndef EGOBFC + " -wrap {on|off}\n" + " set wrappong on or off [default on]\n" +#endif +#endif + +#ifdef EGOBFC + " -width {8|16|32}\n" + " set the bitwidth [default 8]\n" +#endif + , +#ifndef EGOBFC +#ifndef EGOBFC2M + /* egobfi */ "egobfi{width}" +#else + /* egobfc2m */ "egobfc2m" +#endif +#else + /* egobfc */ "egobfc" +#endif + ); + exit(0); + } else { + fprintf(stderr, "Argument not recognized: %s\n", argv[i]); + exit(1); + } + } else { + /* this is our input file */ + bfin = fopen(argv[i], "r"); + if (bfin == NULL) { + perror(argv[i]); + exit(1); + } + } + } + + /* get our max */ +#ifndef EGOBFC + bwmax = (USEINT) -1; +#endif + + /* initialize our memory */ +#ifndef EGOBFC + mem = (USEINT *) malloc(30000 * sizeof(USEINT)); + mlen = 30000; + mend = mem + mlen; + mptr = mem; +#endif + iprog = (char *) malloc(30000); + iplen = 30000; + ipptr = 0; +#ifndef EGOBFC2M + prog = (struct bfi *) malloc(30000 * sizeof(struct bfi)); + plen = 30000; + pptr = 0; +#else + prog = (void *) malloc(250000); + tprog = prog; + plen = 250000; + pptr = 0; +#endif + + /* 0 it all */ +#ifndef EGOBFC + memset(mem, 0, mlen * sizeof(USEINT)); +#endif + memset(iprog, 0, iplen); +#ifndef EGOBFC2M + memset(prog, 0, plen * sizeof(struct bfi)); +#endif + + /* read in our BF */ + while (!feof(bfin) && !ferror(bfin)) { + iprog[ipptr] = getc(bfin); + if (ISBF(iprog[ipptr])) { + ipptr++; + CHKIPSZ(ipptr) + } + } + ipptr = 0; + +#ifndef EGOBFC2M + /* optimize */ + optimize(); + /*optim2(); This seems to slow it down more than anything ...*/ + +#ifndef EGOBFC + /* and interpret */ + bf_interpret(); +#else + /* and compile */ + bf_compile(); +#endif +#else + /* compile to memory and run */ + c2m(); +#endif + + return 0; +}