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;
+}