diff --git a/libacc/acc.c b/libacc/acc.c
index fcf4df0..46961ca 100644
--- a/libacc/acc.c
+++ b/libacc/acc.c
@@ -23,23 +23,24 @@
 #include <stdlib.h>
 #include <string.h>
 
-int d, z, C, h, K, q, G, L, W;
-char* P;
-char* ac;
-char* v;
-char* D;
-char* M;
-char* R;
-FILE* Q;
+static int d, z, C, h, K, q, G, W;
+static char* L;
+static char* P;
+static char* ac;
+static char* v;
+static char* D;
+static char* M;
+static char* R;
+static FILE* Q;
 
-void ab (int j);
-void w();
+static void ab (int j);
+static void w();
 
-void E(e) {
-    *(char*) D++=e;
+static void addToSymbolTable(char e) {
+    *D++ = e;
 }
 
-void o() {
+static void next() {
     if (L) {
         h = *(char*) L++;
         if (h == 2) {
@@ -50,47 +51,47 @@
         h = fgetc(Q);
 }
 
-int X() {
-    return isalnum(h) | h == 95;
+static int X() {
+    return isalnum(h) || h == '_';
 }
 
-void Y() {
+static void Y() {
     if (h == 92) {
-        o();
+        next();
         if (h == 110)
             h = 10;
     }
 }
 
-void ad() {
+static void ad() {
     int j, m;
     while (isspace(h) | h == 35) {
         if (h == 35) {
-            o();
+            next();
             ad();
             if (d == 536) {
                 ad();
-                E(32);
+                addToSymbolTable(32);
                 *(int*) d = 1;
                 *(int*) (d + 4) = (int) D;
             }
-            while (h != 10) {
-                E(h);
-                o();
+            while (h != '\n') {
+                addToSymbolTable(h);
+                next();
             }
-            E(h);
-            E(2);
+            addToSymbolTable(h);
+            addToSymbolTable(2);
         }
-        o();
+        next();
     }
     C = 0;
     d = h;
     if (X()) {
-        E(32);
+        addToSymbolTable(32);
         M = D;
         while (X()) {
-            E(h);
-            o();
+            addToSymbolTable(h);
+            next();
         }
         if (isdigit(d)) {
             z = strtol(M, 0, 0);
@@ -103,31 +104,31 @@
             if (d > 536) {
                 d = ((int) P) + d;
                 if (*(int*) d == 1) {
-                    L = *(int*) (d + 4);
+                    L = (char*) (*(int*) (d + 4));
                     W = h;
-                    o();
+                    next();
                     ad();
                 }
             }
         }
     } else {
-        o();
+        next();
         if (d == 39) {
             d = 2;
             Y();
             z = h;
-            o();
-            o();
+            next();
+            next();
         } else if (d == 47 & h == 42) {
-            o();
+            next();
             while (h) {
                 while (h != 42)
-                    o();
-                o();
+                    next();
+                next();
                 if (h == 47)
                     h = 0;
             }
-            o();
+            next();
             ad();
         } 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";
@@ -138,7 +139,7 @@
                     z = z * 64 + C + 64;
                 if (j == d & (m == h | m == 64)) {
                     if (m == h) {
-                        o();
+                        next();
                         d = 1;
                     }
                     break;
@@ -148,14 +149,14 @@
     }
 }
 
-void ae( g) {
+static void ae( g) {
     while( g&&g!=-1) {
         *(char*) q++=g;
         g=g>>8;
     }
 }
 
-void A(e) {
+static void A(e) {
     int g;
     while( e) {
         g=*(int*) e;
@@ -164,7 +165,7 @@
     }
 }
 
-int s( g, e) {
+static int s( g, e) {
     ae(g);
     *(int*) q = e;
     e = q;
@@ -172,20 +173,20 @@
     return e;
 }
 
-int H(e) {
+static int H(e) {
     s(184,e);
 }
 
-int B(e) {
+static int B(e) {
     return s(233,e);
 }
 
-S( j, e) {
+static int S( j, e) {
     ae(1032325);
     return s(132 + j, e);
 }
 
-void Z(e) {
+static void Z(e) {
     ae( 49465);
     H(0);
     ae( 15);
@@ -193,12 +194,12 @@
     ae( 192);
 }
 
-void N( j, e) {
+static void N( j, e) {
     ae(j + 131);
     s((e < 512) << 7 | 5, e);
 }
 
-void T (j) {
+static void T (j) {
     int g,e,m,aa;
     g=1;
     if( d == 34) {
@@ -206,11 +207,11 @@
         while( h!=34) {
             Y ();
             *(char*) v++=h;
-            o ();
+            next ();
         }
         *(char*) v=0;
         v= (char*) (((int)v) +4&-4);
-        o ();
+        next ();
         ad();
     }
     else {
@@ -308,7 +309,7 @@
     }
 }
 
-void O (j) {
+static void O (j) {
     int e,g,m;
     if( j--== 1)T(1);
     else {
@@ -345,16 +346,16 @@
     }
 }
 
-void w() {
+static void w() {
     O(11);
 }
 
-U() {
+static int U() {
     w();
     return S(0, 0);
 }
 
-void I (j) {
+static void I (j) {
     int m,g,e;
     if( d == 288) {
         ad();
@@ -422,7 +423,7 @@
     }
 }
 
-void ab (int j) {
+static void ab (int j) {
     int m;
     while( d == 256 | d != -1 & !j ) {
         if( d == 256) {
@@ -482,7 +483,7 @@
     ac = calloc(1, 99999);
     q = (int) ac;
     P = calloc(1, 99999);
-    o();
+    next();
     ad();
     ab(0);
 #if 1
