diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index b7e4594..45f0c73 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -47,7 +47,7 @@
 
 class Compiler {
     class CodeBuf {
-        char* ind;
+        char* ind; // Output code pointer
         char* pProgramBase;
 
         void release() {
@@ -1027,20 +1027,21 @@
         size_t mPosition;
     };
 
-    /* vars: value of variables
-     loc : local variable index
-     glo : global variable index
-     ind : output code ptr
-     rsym: return symbol
-     prog: output code
-     dstk: define stack
-     dptr, dch: macro state
-     */
-    intptr_t tok, tokc, tokl, ch, vars, rsym, loc, glo, sym_stk, dstk,
-            dptr, dch, last_id;
+    int ch; // Current input character, or EOF
+    intptr_t tok;     // token
+    intptr_t tokc;    // token extra info
+    int tokl;         // token operator level
+    intptr_t rsym; // return symbol
+    intptr_t loc; // local variable index
+    char* glo;  // global variable index
+    char* sym_stk;
+    char* dstk; // Define stack
+    char* dptr; // Macro state: Points to macro text during macro playback.
+    int dch;    // Macro state: Saves old value of ch during a macro playback.
+    char* last_id;
     void* pSymbolBase;
     void* pGlobalBase;
-    void* pVarsBase;
+    char* pVarsBase; // Value of variables
 
     InputStream* file;
 
@@ -1106,12 +1107,12 @@
     static const char operatorLevel[];
 
     void pdef(int t) {
-        *(char *) dstk++ = t;
+        *dstk++ = t;
     }
 
     void inp() {
         if (dptr) {
-            ch = *(char *) dptr++;
+            ch = *dptr++;
             if (ch == TAG_MACRO) {
                 dptr = 0;
                 ch = dch;
@@ -1145,7 +1146,7 @@
                     next();
                     pdef(TAG_TOK); /* fill last ident tag */
                     *(int *) tok = SYM_DEFINE;
-                    *(int *) (tok + 4) = dstk; /* define stack */
+                    *(char* *) (tok + 4) = dstk; /* define stack */
                 }
                 /* well we always save the values ! */
                 while (ch != '\n') {
@@ -1168,21 +1169,21 @@
                 inp();
             }
             if (isdigit(tok)) {
-                tokc = strtol((char*) last_id, 0, 0);
+                tokc = strtol(last_id, 0, 0);
                 tok = TOK_NUM;
             } else {
-                *(char *) dstk = TAG_TOK; /* no need to mark end of string (we
+                * dstk = TAG_TOK; /* no need to mark end of string (we
                  suppose data is initialized to zero by calloc) */
-                tok = (intptr_t) (strstr((char*) sym_stk, (char*) (last_id - 1))
+                tok = (intptr_t) (strstr(sym_stk, (last_id - 1))
                         - sym_stk);
-                *(char *) dstk = 0; /* mark real end of ident for dlsym() */
+                * dstk = 0; /* mark real end of ident for dlsym() */
                 tok = tok * 8 + TOK_IDENT;
                 if (tok > TOK_DEFINE) {
-                    tok = vars + tok;
+                    tok = (intptr_t) (pVarsBase + tok);
                     /*        printf("tok=%s %x\n", last_id, tok); */
                     /* define handling */
                     if (*(int *) tok == SYM_DEFINE) {
-                        dptr = *(int *) (tok + 4);
+                        dptr = *(char* *) (tok + 4);
                         dch = ch;
                         inp();
                         next();
@@ -1243,17 +1244,17 @@
         }
 #if 0
         {
-            int p;
+            char* p;
 
             printf("tok=0x%x ", tok);
             if (tok >= TOK_IDENT) {
                 printf("'");
                 if (tok> TOK_DEFINE)
-                p = sym_stk + 1 + (tok - vars - TOK_IDENT) / 8;
+                p = sym_stk + 1 + ((char*) tok - pVarsBase - TOK_IDENT) / 8;
                 else
                 p = sym_stk + 1 + (tok - TOK_IDENT) / 8;
-                while (*(char *)p != TAG_TOK && *(char *)p)
-                printf("%c", *(char *)p++);
+                while (*p != TAG_TOK && *p)
+                printf("%c", *p++);
                 printf("'\n");
             } else if (tok == TOK_NUM) {
                 printf("%d\n", tokc);
@@ -1284,19 +1285,20 @@
 
     /* l is one if '=' parsing wanted (quick hack) */
     void unary(intptr_t l) {
-        intptr_t n, t, a, c;
+        intptr_t n, t, a;
+        int c;
         t = 0;
         n = 1; /* type of expression 0 = forward, 1 = value, other =
          lvalue */
         if (tok == '\"') {
-            pGen->li(glo);
+            pGen->li((int) glo);
             while (ch != '\"') {
                 getq();
-                *(char *) glo++ = ch;
+                *glo++ = ch;
                 inp();
             }
-            *(char *) glo = 0;
-            glo = (glo + 4) & -4; /* align heap */
+            *glo = 0;
+            glo = (char*) (((intptr_t) glo + 4) & -4); /* align heap */
             inp();
             next();
         } else {
@@ -1349,7 +1351,7 @@
                 n = *(int *) t;
                 /* forward reference: try dlsym */
                 if (!n) {
-                    n = (intptr_t) dlsym(RTLD_DEFAULT, (char*) last_id);
+                    n = (intptr_t) dlsym(RTLD_DEFAULT, last_id);
                 }
                 if ((tok == '=') & l) {
                     /* assignment */
@@ -1398,7 +1400,7 @@
         }
     }
 
-    void sum(intptr_t l) {
+    void sum(int l) {
         intptr_t t, n, a;
         t = 0;
         if (l-- == 1)
@@ -1518,7 +1520,7 @@
     void decl(bool l) {
         intptr_t a;
 
-        while ((tok == TOK_INT) | ((tok != -1) & (!l))) {
+        while ((tok == TOK_INT) | ((tok != EOF) & (!l))) {
             if (tok == TOK_INT) {
                 next();
                 while (tok != ';') {
@@ -1526,7 +1528,7 @@
                         loc = loc + 4;
                         *(int *) tok = -loc;
                     } else {
-                        *(int *) tok = glo;
+                        *(int* *) tok = (int*) glo;
                         glo = glo + 4;
                     }
                     next();
@@ -1565,7 +1567,7 @@
 
     void cleanup() {
         if (sym_stk != 0) {
-            free((void*) sym_stk);
+            free(sym_stk);
             sym_stk = 0;
         }
         if (pGlobalBase != 0) {
@@ -1591,7 +1593,7 @@
         tokc = 0;
         tokl = 0;
         ch = 0;
-        vars = 0;
+        pVarsBase = 0;
         rsym = 0;
         loc = 0;
         glo = 0;
@@ -1664,14 +1666,13 @@
         }
         pGen->init(&codeBuf);
         file = new TextInputStream(text, textLength);
-        sym_stk = (intptr_t) calloc(1, ALLOC_SIZE);
-        dstk = (intptr_t) strcpy((char*) sym_stk,
+        sym_stk = (char*) calloc(1, ALLOC_SIZE);
+        dstk = strcpy(sym_stk,
                 " int if else while break return for define main ")
                 + TOK_STR_SIZE;
         pGlobalBase = calloc(1, ALLOC_SIZE);
-        glo = (intptr_t) pGlobalBase;
-        pVarsBase = calloc(1, ALLOC_SIZE);
-        vars = (intptr_t) pVarsBase;
+        glo = (char*) pGlobalBase;
+        pVarsBase = (char*) calloc(1, ALLOC_SIZE);
         inp();
         next();
         decl(0);
@@ -1681,7 +1682,7 @@
 
     int run(int argc, char** argv) {
         typedef int (*mainPtr)(int argc, char** argv);
-        mainPtr aMain = (mainPtr) *(int*) (vars + TOK_MAIN);
+        mainPtr aMain = (mainPtr) *(int*) (pVarsBase + TOK_MAIN);
         if (!aMain) {
             fprintf(stderr, "Could not find function \"main\".\n");
             return -1;
@@ -1706,7 +1707,7 @@
             return NULL;
         }
         size_t nameLen = strlen(name);
-        char* pSym = (char*) sym_stk;
+        char* pSym = sym_stk;
         char c;
         for(;;) {
             c = *pSym++;
@@ -1716,12 +1717,12 @@
             if (c == TAG_TOK) {
                 if (memcmp(pSym, name, nameLen) == 0
                         && pSym[nameLen] == TAG_TOK) {
-                    int tok = pSym - 1 - (char*) sym_stk;
+                    int tok = pSym - 1 - sym_stk;
                     tok = tok * 8 + TOK_IDENT;
                     if (tok <= TOK_DEFINE) {
                         return 0;
                     } else {
-                        tok = vars + tok;
+                        tok = (intptr_t) (pVarsBase + tok);
                         return * (void**) tok;
                     }
                 }
