diff interps/egobf/src/c2m.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/c2m.c	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,164 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "c2m.h"
+#include "egobfi.h"
+
+#include "c2m/i386/i386.h"
+
+#undef CHKPSZ
+#define CHKPSZ(a) \
+if ((a) >= plen) { \
+    void (*nprog)() = malloc(plen); \
+    if (nprog == NULL) { perror("malloc"); exit(1); } \
+    C2MJUMP(nprog) \
+    C2MTAIL() \
+    prog = nprog; \
+    pptr = 0; \
+}
+
+void mygetchar()
+{
+    int input = getchar();
+    if (input == EOF) {
+        switch (eof) {
+            case 0:
+                *mptr = 0;
+                break;
+
+            case -1:
+                *mptr = -1;
+                break;
+        }
+    } else {
+        *mptr = (USEINT) input;
+    }
+}
+
+void myputchar()
+{
+    putchar(*mptr);
+    fflush(stdout);
+}
+
+void mydebug()
+{
+    int cur;
+    cur = mptr - mem - 10;
+    if (cur < 0) cur = 0;
+    printf("%d:", cur);
+    for (; cur < mptr - mem + 40; cur++) {
+        if (cur == mptr - mem) putchar('*');
+        CHKMSZ(mem + cur)
+        printf("%d|", (int) mem[cur]);
+    }
+    putchar('\n');
+}
+
+void mychkmem()
+{
+    CHKMSZ(mptr)
+}
+
+void c2m()
+{
+    /* optimize optimizes a chunk of code at ipptr */
+    int cnt, a;
+    int mptri = (int) &mptr;
+
+    if (pptr == 0) C2MHEAD()
+    
+    while (iprog[ipptr]) {
+        CHKPSZ(pptr + 100)
+        /*printf("%d\n", pptr); */
+        switch(iprog[ipptr]) {
+            case '+':
+            case '-':
+                cnt = 0;
+                while (iprog[ipptr] == '+' ||
+                       iprog[ipptr] == '-') {
+                    if (iprog[ipptr] == '+') cnt++;
+                    else cnt--;
+                    ipptr++;
+                }
+                
+		C2MADD(cnt)
+                break;
+            
+            case '>':
+            case '<':
+                cnt = 0;
+                while (iprog[ipptr] == '>' ||
+                       iprog[ipptr] == '<') {
+                    if (iprog[ipptr] == '>') cnt++;
+                    else cnt--;
+                    ipptr++;
+                }
+                
+		C2MRHT(cnt)
+                /*if (cnt > 0) C2MCALL(mychkmem)*/
+                break;
+                
+            case '[':
+                /* special case 1: zero */
+                if (iprog[ipptr + 2] == ']' &&
+                    (iprog[ipptr + 1] == '-' ||
+                     (iprog[ipptr + 1] == '+' && wrapping))
+                    ) {
+                    C2MZERO()
+                    ipptr += 3;
+                    break;
+                }
+                    
+                /* start a suboptimize */
+                a = (int) (prog + pptr);
+                pptr += C2MLOS;
+                ipptr++;
+                c2m();
+                
+                /* check for addto * /
+                if (pptr == a + 5 && optaddto(a)) {
+                ipptr++;
+                break;
+                }*/
+                
+                /* make the jump */
+		C2MLO(a)
+		C2MLC(a)
+                ipptr++;
+                break;
+                
+            case ']':
+                /* this optimization session is over */
+                return;
+                
+            case '.':
+                /* not much we can optimize here ... */
+		C2MCALL(myputchar)
+                ipptr++;
+                break;
+                
+            case ',':
+                /* here neither ... */
+		C2MCALL(mygetchar)
+                ipptr++;
+                break;
+                
+            case '#':
+                /* still no optimizations! */
+                if (debug) C2MCALL(mydebug)
+                ipptr++;
+                break;
+                
+            default:
+                ipptr++;
+                break;
+        }
+    }
+    
+    /* if we finished making the optimized program, this is the end */
+    C2MTAIL()
+    
+    tprog();
+}