diff --git a/libacc/acc.c b/libacc/acc.c
index 46961ca..9d4a237 100644
--- a/libacc/acc.c
+++ b/libacc/acc.c
@@ -23,124 +23,135 @@
 #include <stdlib.h>
 #include <string.h>
 
-static int d, z, C, h, K, q, G, W;
-static char* L;
+#define TOKEN_OPERATOR 1
+#define TOKEN_NUMBER 2
+#define TOKEN_DEFINE 536
+
+static int currentToken;
+static int currentTokenData;
+static int C;
+static int currentChar;
+static int K;
+static int q;
+static int G;
+static int savedChar;
+static char* pInProgressMacro;
 static char* P;
 static char* ac;
 static char* v;
-static char* D;
+static char* pSymbolTable;
 static char* M;
 static char* R;
-static FILE* Q;
+static FILE* pInput;
 
 static void ab (int j);
 static void w();
 
 static void addToSymbolTable(char e) {
-    *D++ = e;
+    *pSymbolTable++ = e;
 }
 
-static void next() {
-    if (L) {
-        h = *(char*) L++;
-        if (h == 2) {
-            L = 0;
-            h = W;
+static void nextChar() {
+    if (pInProgressMacro) {
+        currentChar = *(char*) pInProgressMacro++;
+        if (currentChar == 2) {
+            pInProgressMacro = NULL;
+            currentChar = savedChar;
         }
     } else
-        h = fgetc(Q);
+        currentChar = fgetc(pInput);
 }
 
-static int X() {
-    return isalnum(h) || h == '_';
+static int isSymbolChar() {
+    return isalnum(currentChar) || currentChar == '_';
 }
 
-static void Y() {
-    if (h == 92) {
-        next();
-        if (h == 110)
-            h = 10;
+static void unescapeCurrentChar() {
+    if (currentChar == '\\') {
+        nextChar();
+        if (currentChar == 'n')
+            currentChar = '\n';
     }
 }
 
-static void ad() {
+static void nextToken() {
     int j, m;
-    while (isspace(h) | h == 35) {
-        if (h == 35) {
-            next();
-            ad();
-            if (d == 536) {
-                ad();
-                addToSymbolTable(32);
-                *(int*) d = 1;
-                *(int*) (d + 4) = (int) D;
+    while (isspace(currentChar) || currentChar == '#') {
+        if (currentChar == '#') {
+            nextChar();
+            nextToken();
+            if (currentToken == TOKEN_DEFINE) {
+                nextToken();
+                addToSymbolTable(' ');
+                *(int*) currentToken = 1;
+                *(int*) (currentToken + 4) = (int) pSymbolTable;
             }
-            while (h != '\n') {
-                addToSymbolTable(h);
-                next();
+            while (currentChar != '\n') {
+                addToSymbolTable(currentChar);
+                nextChar();
             }
-            addToSymbolTable(h);
+            addToSymbolTable(currentChar);
             addToSymbolTable(2);
         }
-        next();
+        nextChar();
     }
     C = 0;
-    d = h;
-    if (X()) {
-        addToSymbolTable(32);
-        M = D;
-        while (X()) {
-            addToSymbolTable(h);
-            next();
+    currentToken = currentChar;
+    if (isSymbolChar()) {
+        addToSymbolTable(' ');
+        M = pSymbolTable;
+        while (isSymbolChar()) {
+            addToSymbolTable(currentChar);
+            nextChar();
         }
-        if (isdigit(d)) {
-            z = strtol(M, 0, 0);
-            d = 2;
+        if (isdigit(currentToken)) {
+            currentTokenData = strtol(M, 0, 0);
+            currentToken = TOKEN_NUMBER;
         } else {
-            *(char*) D = 32;
-            d = strstr(R, M - 1) - R;
-            *(char*) D = 0;
-            d = d * 8 + 256;
-            if (d > 536) {
-                d = ((int) P) + d;
-                if (*(int*) d == 1) {
-                    L = (char*) (*(int*) (d + 4));
-                    W = h;
-                    next();
-                    ad();
+            *(char*) pSymbolTable = ' ';
+            currentToken = strstr(R, M - 1) - R;
+            *(char*) pSymbolTable = 0;
+            currentToken = currentToken * 8 + 256;
+            if (currentToken > TOKEN_DEFINE) {
+                currentToken = ((int) P) + currentToken;
+                if (*(int*) currentToken == 1) {
+                    pInProgressMacro = (char*) (*(int*) (currentToken + 4));
+                    savedChar = currentChar;
+                    nextChar();
+                    nextToken();
                 }
             }
         }
     } else {
-        next();
-        if (d == 39) {
-            d = 2;
-            Y();
-            z = h;
-            next();
-            next();
-        } else if (d == 47 & h == 42) {
-            next();
-            while (h) {
-                while (h != 42)
-                    next();
-                next();
-                if (h == 47)
-                    h = 0;
+        nextChar();
+        if (currentToken == '\'') {
+            currentToken = TOKEN_NUMBER;
+            unescapeCurrentChar();
+            currentTokenData = currentChar;
+            nextChar();
+            nextChar();
+        } else if (currentToken == '/' & currentChar == '*') {
+            nextChar();
+            while (currentChar) {
+                while (currentChar != '*')
+                    nextChar();
+                nextChar();
+                if (currentChar == '/')
+                    currentChar = 0;
             }
-            next();
-            ad();
+            nextChar();
+            nextToken();
         } else {
             char* e = "++#m--%am*@R<^1c/@%[_[H3c%@%[_[H3c+@.B#d-@%:_^BKd<<Z/03e>>`/03e<=0f>=/f<@.f>@1f==&g!='g&&k||#l&@.BCh^@.BSi|@.B+j~@/%Yd!@&d*@b";
             while (j = *(char*) e++) {
                 m = *(char*) e++;
-                z = 0;
+                currentTokenData = 0;
                 while ((C = *(char*) e++ - 98) < 0)
-                    z = z * 64 + C + 64;
-                if (j == d & (m == h | m == 64)) {
-                    if (m == h) {
-                        next();
-                        d = 1;
+                    currentTokenData = currentTokenData * 64 + C + 64;
+                if (j == currentToken && (m == currentChar || m == 64)) {
+                    if (m == currentChar) {
+                        nextChar();
+                        currentToken = TOKEN_OPERATOR;
                     }
                     break;
                 }
@@ -150,7 +161,7 @@
 }
 
 static void ae( g) {
-    while( g&&g!=-1) {
+    while( g && g != -1) {
         *(char*) q++=g;
         g=g>>8;
     }
@@ -202,23 +213,23 @@
 static void T (j) {
     int g,e,m,aa;
     g=1;
-    if( d == 34) {
+    if( currentToken == 34) {
         H(v);
-        while( h!=34) {
-            Y ();
-            *(char*) v++=h;
-            next ();
+        while( currentChar!=34) {
+            unescapeCurrentChar ();
+            *(char*) v++=currentChar;
+            nextChar ();
         }
         *(char*) v=0;
         v= (char*) (((int)v) +4&-4);
-        next ();
-        ad();
+        nextChar ();
+        nextToken();
     }
     else {
         aa=C;
-        m= z;
-        e=d;
-        ad();
+        m= currentTokenData;
+        e=currentToken;
+        nextToken();
         if( e == 2) {
             H(m);
         }
@@ -230,24 +241,24 @@
         }
         else if( e == 40) {
             w ();
-            ad();
+            nextToken();
         }
         else if( e == 42) {
-            ad();
-            e=d;
-            ad();
-            ad();
-            if( d == 42) {
-                ad();
-                ad();
-                ad();
-                ad();
+            nextToken();
+            e=currentToken;
+            nextToken();
+            nextToken();
+            if( currentToken == 42) {
+                nextToken();
+                nextToken();
+                nextToken();
+                nextToken();
                 e=0;
             }
-            ad();
+            nextToken();
             T(0);
-            if( d == 61) {
-                ad();
+            if( currentToken == 61) {
+                nextToken();
                 ae( 80);
                 w ();
                 ae( 89);
@@ -260,40 +271,40 @@
             }
         }
         else if( e == 38) {
-            N(10,*(int*) d);
-            ad();
+            N(10,*(int*) currentToken);
+            nextToken();
         }
         else {
             g=*(int*) e;
             if(!g)g=dlsym(0,M);
-            if( d == 61&j) {
-                ad();
+            if( currentToken == 61&j) {
+                nextToken();
                 w ();
                 N(6,g);
             }
-            else if( d!= 40) {
+            else if( currentToken!= 40) {
                 N(8,g);
                 if( C == 11) {
                     N(0,g);
-                    ae( z);
-                    ad();
+                    ae( currentTokenData);
+                    nextToken();
                 }
             }
         }
     }
-    if( d == 40) {
+    if( currentToken == 40) {
         if( g == 1)ae( 80);
         m= s(60545,0);
-        ad();
+        nextToken();
         j=0;
-        while( d!= 41) {
+        while( currentToken!= 41) {
             w ();
             s(2393225,j);
-            if( d == 44)ad();
+            if( currentToken == 44)nextToken();
             j=j +4;
         }
         *(int*) m= j;
-        ad();
+        nextToken();
         if(!g) {
             e=e +4;
             *(int*) e=s(232,*(int*) e);
@@ -316,9 +327,9 @@
         O (j);
         m= 0;
         while( j == C) {
-            g=d;
-            e=z;
-            ad();
+            g=currentToken;
+            e=currentTokenData;
+            nextToken();
             if( j>8) {
                 m= S(e,m);
                 O (j);
@@ -357,14 +368,14 @@
 
 static void I (j) {
     int m,g,e;
-    if( d == 288) {
-        ad();
-        ad();
+    if( currentToken == 288) {
+        nextToken();
+        nextToken();
         m= U ();
-        ad();
+        nextToken();
         I (j);
-        if( d == 312) {
-            ad();
+        if( currentToken == 312) {
+            nextToken();
             g=B(0);
             A(m);
             I (j);
@@ -374,22 +385,22 @@
             A(m);
         }
     }
-    else if( d == 352|d == 504) {
-        e=d;
-        ad();
-        ad();
+    else if( currentToken == 352|currentToken == 504) {
+        e=currentToken;
+        nextToken();
+        nextToken();
         if( e == 352) {
             g=q;
             m= U ();
         }
         else {
-            if( d!= 59)w ();
-            ad();
+            if( currentToken!= 59)w ();
+            nextToken();
             g=q;
             m= 0;
-            if( d!= 59)m= U ();
-            ad();
-            if( d!= 41) {
+            if( currentToken!= 59)m= U ();
+            nextToken();
+            if( currentToken!= 41) {
                 e=B(0);
                 w ();
                 B(g-q-5);
@@ -397,64 +408,64 @@
                 g=e +4;
             }
         }
-        ad();
+        nextToken();
         I(&m);
         B(g-q-5);
         A(m);
     }
-    else if( d == 123) {
-        ad();
+    else if( currentToken == 123) {
+        nextToken();
         ab(1);
-        while( d!= 125)I (j);
-        ad();
+        while( currentToken!= 125)I (j);
+        nextToken();
     }
     else {
-        if( d == 448) {
-            ad();
-            if( d!= 59)w ();
+        if( currentToken == 448) {
+            nextToken();
+            if( currentToken!= 59)w ();
             K=B(K);
         }
-        else if( d == 400) {
-            ad();
+        else if( currentToken == 400) {
+            nextToken();
             *(int*) j=B(*(int*) j);
         }
-        else if( d!= 59)w ();
-        ad();
+        else if( currentToken!= 59)w ();
+        nextToken();
     }
 }
 
 static void ab (int j) {
     int m;
-    while( d == 256 | d != -1 & !j ) {
-        if( d == 256) {
-            ad();
-            while( d!= 59) {
+    while( currentToken == 256 | currentToken != -1 & !j ) {
+        if( currentToken == 256) {
+            nextToken();
+            while( currentToken!= 59) {
                 if( j ) {
                     G=G +4;
-                    *(int*) d=-G;
+                    *(int*) currentToken=-G;
                 }
                 else {
-                    *(char**) d = v;
+                    *(char**) currentToken = v;
                     v=v +4;
                 }
-                ad();
-                if( d == 44)ad();
+                nextToken();
+                if( currentToken == 44)nextToken();
             }
-            ad();
+            nextToken();
         }
         else {
-            A(*(int*)(d +4));
-            *(int*) d=q;
-            ad();
-            ad();
+            A(*(int*)(currentToken +4));
+            *(int*) currentToken=q;
+            nextToken();
+            nextToken();
             m= 8;
-            while( d!= 41) {
-                *(int*) d=m;
+            while( currentToken!= 41) {
+                *(int*) currentToken=m;
                 m= m +4;
-                ad();
-                if( d == 44)ad();
+                nextToken();
+                if( currentToken == 44)nextToken();
             }
-            ad();
+            nextToken();
             K=G=0;
             ae( 15042901);
             m= s(60545,0);
@@ -467,24 +478,24 @@
 }
 
 int main( int argc, char** argv) {
-    Q = stdin;
+    pInput = stdin;
     if (argc-- > 1) {
         char* file = argv[1];
         argv += 1;
-        Q = fopen(file, "r");
-        if (Q == NULL) {
+        pInput = fopen(file, "r");
+        if (pInput == NULL) {
             fprintf(stderr, "Could not open file \"%s\"\n", file);
             return -1;
         }
     }
-    D = strcpy(R = calloc(1, 99999),
+    pSymbolTable = strcpy(R = calloc(1, 99999),
             " int if else while break return for define main ") + 48;
     v = calloc(1, 99999);
     ac = calloc(1, 99999);
     q = (int) ac;
     P = calloc(1, 99999);
-    next();
-    ad();
+    nextChar();
+    nextToken();
     ab(0);
 #if 1
     fwrite(R, 1, 99999, stdout);
