Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / cvenv / EiC / typesets.c
diff --git a/apps/cvenv/EiC/typesets.c b/apps/cvenv/EiC/typesets.c
deleted file mode 100644 (file)
index 07bb999..0000000
+++ /dev/null
@@ -1,2342 +0,0 @@
-/* typesets.c
- *
- *     (C) Copyright Apr 15 1995, Edmond J. Breen.
- *                ALL RIGHTS RESERVED.
- * This code may be copied for personal, non-profit use only.
- *
- * Documentation in:  ../doc/tech_doc/typesets.doc
- *
- */
-
-
-/* Modified by Intel OpenCV team. The bug fix has been applied to EiC_castvar function 
-   in order to prevent throwing of errors while parsing ISO C compatible input. */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "MachSet.h"
-#include "global.h"
-#include "lexer.h"
-#include "typemod.h"
-#include "xalloc.h"
-#include "typesets.h"
-#include "symbol.h"
-#include "parser.h"
-#include "error.h"
-
-static void binhint(), binhuint();
-static void binhlong(), binhulong(), binhdouble(), binhconst(), binhllong();
-extern void EiC_binhlval(); 
-
-void (*BINFUN[]) () = {
-    NULL, NULL,                /* t_error,   t_bool, */
-    binhint, binhint,  /* t_char,    t_uchar, */
-    binhint, binhint,  /* t_short,   t_ushort */
-    binhint, binhint,  /* t_int,     t_enum, */
-    binhuint,          /* t_uint, */
-    
-    binhlong, binhulong,  /* t_long,    t_ulong, */
-    binhllong,                 /* t_llong */
-    binhdouble, binhdouble, /* t_float,   t_double, */
-    EiC_binhlval, NULL,          /* t_pointer, t_void */
-    NULL,NULL,            /* t_struct, t_union */
-    NULL,EiC_binhlval,        /* t_lval,  t_array */       
-    
-};
-
-typedef unsigned long set_t;
-#define ismem(S,m) (((long)1 << (m)) & (S))
-#define I(x)       ((long)1 << (x))
-
-#define SETNUM   I(t_char)+I(t_short)+I(t_int)+I(t_enum)+I(t_long)+I(t_llong)
-#define SETUNUM  I(t_uchar)+I(t_ushort)+I(t_uint)+I(t_ulong)
-#define SETFLOAT I(t_float)+I(t_double)
-
-typedef struct {
-    set_t Lset;
-    set_t Rset;
-} LRset_t;
-
-LRset_t modLR[] =
-{
-{SETNUM + SETUNUM,
-     SETNUM + SETUNUM,}
-};
-
-/*
- * two pointers cannot be added together
- */
-LRset_t addLR[] =
-{
-{SETNUM + SETUNUM + SETFLOAT,
-     SETNUM + SETUNUM + SETFLOAT},
-{I(t_pointer) + I(t_array),
-     SETNUM + SETUNUM},
-{SETNUM + SETUNUM,
-     I(t_pointer) + I(t_array)},
-};
-
-/*
- * integrals can be subtracted from a pointer
- * but not visa a versa
- */
-LRset_t subLR[] =
-{
-{SETNUM + SETUNUM + SETFLOAT,
-     SETNUM + SETUNUM + SETFLOAT},
-{I(t_pointer) + I(t_array),
-     I(t_pointer) + I(t_array) + SETNUM + SETUNUM},
-};
-
-LRset_t multLR[] =
-{
-{SETNUM + SETUNUM + SETFLOAT ,
-     SETNUM + SETUNUM + SETFLOAT }};
-
-LRset_t divLR[] =
-{
-{SETNUM + SETUNUM + SETFLOAT ,
-     SETNUM + SETUNUM + SETFLOAT}};
-
-LRset_t LTLR[] =
-{
-{I(t_pointer) + I(t_array) + SETNUM + SETUNUM + SETFLOAT ,
-     I(t_pointer) + I(t_array) + SETNUM + SETUNUM + SETFLOAT}};
-
-val_t VAL;
-typedef struct {
-unsigned oper;
-LRset_t *LRset;
-unsigned N;
-} Binset;
-
-Binset BINSET[] =
-{
-    {'+', addLR, sizeof(addLR) / sizeof(LRset_t),},
-    {'-', subLR, sizeof(subLR) / sizeof(LRset_t),},
-    {'*', multLR, sizeof(multLR) / sizeof(LRset_t),},
-    {'/', divLR, sizeof(divLR) / sizeof(LRset_t),},
-    {'%', modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {LSHT, modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {RSHT, modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {BOR, modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {XOR, modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {AND, modLR, sizeof(modLR) / sizeof(LRset_t),},
-    {LT, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {LE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {EQ, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {NE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {GT, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {GE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {LOR, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-    {LAND, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
-};
-
-
-void EiC_castvar(token_t * e1,
-            token_t * e2, int explicit)
-{
-    /* cast e1 into e2 */
-    type_expr *t;
-    if (EiC_gettype(e2->Type) == t_func) {
-       token_t e3;
-       EiC_inittoken(&e3);
-       e3.Type = EiC_copytype(nextType(e2->Type));
-       EiC_castvar(e1, &e3, explicit);
-       EiC_freetype(e3.Type);
-       return;
-    }
-    if (EiC_gettype(e2->Type) == t_lval) {
-       t = e2->Type;
-       e2->Type = nextType(e2->Type);
-       EiC_castvar(e1, e2, explicit);
-       e2->Type = t;
-       return;
-    }
-    if(EiC_gettype(e2->Type) == t_void) {
-       e1->Type = EiC_addtype(t_void,EiC_freetype(e1->Type));
-       return;
-    }
-        
-    switch (EiC_gettype(e1->Type)) {
-      CASE_INT:
-       switch (EiC_gettype(e2->Type)) {
-         case t_uchar:
-           EiC_generate(&e1->Code,int2uchar,&e1->Val,0);
-           break;
-         case t_ushort:
-           EiC_generate(&e1->Code,int2ushort,&e1->Val,0);
-           break;
-         case t_char: case t_short: case t_int: case t_uint:
-           break;
-         CASE_LONG: CASE_ULONG:
-           if(sizeof(int) != sizeof(long))
-               EiC_generate(&e1->Code, int2long, &e1->Val, 0);
-           break;
-         case t_llong:
-           if(sizeof(int) != sizeof(eic_llong))
-               EiC_generate(&e1->Code, int2llong, &e1->Val, 0);
-           break;
-         CASE_FLOAT:
-           EiC_generate(&e1->Code, int2double, &e1->Val, 0);
-           break;
-         case t_pointer:
-           EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
-           e1->Type = EiC_addtype(t_pointer,e1->Type);
-           if (!explicit) 
-               EiC_warningerror("Suspicious pointer conversion");
-           return;
-           
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-      CASE_UINT:
-       switch (EiC_gettype(e2->Type)) {
-         CASE_INT: CASE_UINT:
-           break;
-         CASE_LONG: CASE_ULONG:
-           if(sizeof(int) != sizeof(long))
-               EiC_generate(&e1->Code, uint2long, &e1->Val, 0);
-           break;
-       case t_llong:
-           if(sizeof(int) != sizeof(eic_llong))
-               EiC_generate(&e1->Code, uint2llong, &e1->Val, 0);
-           break;
-         CASE_FLOAT:
-           EiC_generate(&e1->Code, uint2double, &e1->Val, 0);
-           break;
-         case t_pointer:
-           EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
-           e1->Type = EiC_addtype(t_pointer,e1->Type);
-           if (!explicit) 
-               EiC_warningerror("Suspicious pointer conversion");
-           return;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-      CASE_LONG:
-       switch (EiC_gettype(e2->Type)) {
-         CASE_INT: CASE_UINT:
-           if(sizeof(int) != sizeof(long))
-               EiC_generate(&e1->Code, long2int, &e1->Val, 0);
-           break;
-         CASE_LONG: CASE_ULONG:
-           break;
-         CASE_FLOAT:
-           EiC_generate(&e1->Code, long2double, &e1->Val, 0);
-           break;
-       case t_llong:     
-         EiC_generate(&e1->Code, long2llong, &e1->Val, 0); break;
-         case t_pointer:
-           EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
-           e1->Type = EiC_addtype(t_pointer,e1->Type);
-           if (!explicit) 
-               EiC_warningerror("Suspicious pointer conversion");
-           return;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-      CASE_ULONG:
-       switch (EiC_gettype(e2->Type)) {
-         CASE_INT: CASE_UINT:
-           if(sizeof(int) != sizeof(long))
-               EiC_generate(&e1->Code, ulong2int, &e1->Val, 0);
-           break;
-         CASE_LONG: CASE_ULONG:
-           break;
-         CASE_FLOAT:
-           EiC_generate(&e1->Code, ulong2double, &e1->Val, 0);
-           break;
-       case t_llong:     
-         EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0); break;
-         case t_pointer:
-           EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
-           e1->Type = EiC_addtype(t_pointer,e1->Type);
-           if (!explicit) 
-               EiC_warningerror("Suspicious pointer conversion");
-           return;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-
-      case t_llong:
-
-       switch (EiC_gettype(e2->Type)) {
-        
-           CASE_INT: 
-           CASE_UINT:
-             if(sizeof(int) != sizeof(eic_llong))
-                 EiC_generate(&e1->Code, llong2int, &e1->Val, 0);
-             break;
-           
-           CASE_LONG: CASE_ULONG:
-             if(sizeof(long) != sizeof(eic_llong))
-                 EiC_generate(&e1->Code, llong2long, &e1->Val, 0);
-             break;
-
-           case t_llong: break;
-           default:
-               EiC_error("Illegal cast operation");
-       }
-       break;
-      CASE_FLOAT:
-       switch (EiC_gettype(e2->Type)) {
-         CASE_INT: CASE_UINT:
-           EiC_generate(&e1->Code, double2int, &e1->Val, 0);
-           break;
-         CASE_LONG: CASE_ULONG:
-           EiC_generate(&e1->Code, double2long, &e1->Val, 0);
-           break;
-       case t_llong:
-           EiC_generate(&e1->Code, double2llong, &e1->Val, 0);
-           break;
-         CASE_FLOAT:
-           /*
-           if(EiC_gettype(e1->Type) == t_double
-              && EiC_gettype(e2->Type) == t_float)
-               EiC_generate(&e1->Code, double2float, &e1->Val, 0);
-           else
-               return;
-               break;
-               */
-           return;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-       
-      case t_pointer:
-       switch (EiC_gettype(e2->Type)) {
-         case t_uchar:
-         case t_char:
-           EiC_error("Illegal cast operation");
-           return;
-         case t_short:
-         case t_int:
-         case t_ushort:
-         case t_uint:
-           EiC_generate(&e1->Code, ptr2int, &e1->Val, 0);
-           break;
-         CASE_LONG:
-         case t_ulong:
-           EiC_generate(&e1->Code, ptr2long, &e1->Val, 0);
-           break;
-         CASE_FLOAT:EiC_error("Illegal cast operation");
-           return;
-         case t_pointer:
-           if (!EiC_sametypes(e1->Type, e2->Type)) {
-               if (EiC_gettype(e2->Type) != t_pointer)
-                   EiC_error("Illegal cast operation");
-               else if (!explicit) 
-                   EiC_warningerror("Suspicious pointer conversion");
-           } else if(!explicit) 
-               if(ConstIntegrity(nextType(e2->Type),nextType(e1->Type)))
-                   EiC_error("Cast loses const qualifier");
-           if(!EiC_compareSafe(nextType(e1->Type),nextType(e2->Type)))
-               EiC_error("Casting between safe and unsafe address");
-           break;
-         default:
-           EiC_error("Illegal cast operation");
-           return;
-       }
-       EiC_freetype(e1->Type);
-       e1->Type = EiC_copytype(e2->Type);
-       return;
-      case t_array:
-       if (EiC_gettype(e2->Type) == t_pointer) {
-           EiC_exchtype(t_pointer, e1->Type);
-           if (!EiC_sametypes(e1->Type, e2->Type) && !explicit)
-               EiC_warningerror("Suspicious pointer conversion");
-       } else if(EiC_gettype(e2->Type) == t_array) {
-           if (!EiC_sametypes(e1->Type, e2->Type))
-               EiC_error("Illegal cast operation");
-       } else
-           EiC_error("Illegal cast operation");
-       return;
-      case t_lval:
-       e1->Type = EiC_succType(e1->Type);
-       EiC_castvar(e1, e2, explicit);
-       setConst(e1->Type);
-       return;
-      case t_union:
-      case t_struct:
-       if (EiC_gettype(e2->Type) == t_lval) {
-           if (!EiC_sametypes(e1->Type, nextType(e2->Type)))
-               EiC_error("Illegal cast operation");
-       } else if (!EiC_sametypes(e1->Type, e2->Type))
-           EiC_error("Illegal cast operation");
-       return;
-      default:
-       EiC_error("Illegal cast operation");
-    }
-    EiC_set_bastype(EiC_bastype(e2->Type), e1->Type);
-}
-
-
-int TREFON=0;
-
-void EiC_castconst(token_t * e1, token_t * e2, int explicit)
-{
-    /*
-     *  cast e1 type into an e2 type and
-     *  where e1 is a constant
-     */
-    unsigned t;
-    if (EiC_gettype(e2->Type) == t_func) {
-       token_t e3;
-       e3.Type = EiC_copytype(nextType(e2->Type));
-       EiC_castconst(e1, &e3, explicit);
-       EiC_freetype(e3.Type);
-       return;
-    }
-    if (e1->Pflag) {
-       EiC_castvar(e1, e2, explicit);
-       return;
-    }
-    if(EiC_gettype(e2->Type) == t_void) {
-       e1->Type = EiC_addtype(t_void,EiC_freetype(e1->Type));
-       setConst(e1->Type);
-       return;
-    }
-       
-    switch ((t = EiC_gettype(e2->Type))) {
-      CASE_INT: CASE_UINT:
-       switch (EiC_gettype(e1->Type)) {
-         CASE_INT: CASE_UINT: break;
-         CASE_LONG:e1->Val.ival = (int) e1->Val.lval;   break;
-         CASE_ULONG:e1->Val.ival = (int) e1->Val.ulval; break;
-         CASE_FLOAT:e1->Val.ival = (int) e1->Val.dval;  break;
-         case t_llong: e1->Val.ival = (int)e1->Val.llval; break;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-      CASE_LONG:
-       switch (EiC_gettype(e1->Type)) {
-         CASE_INT:e1->Val.lval = (long) e1->Val.ival;
-           break;
-         CASE_UINT:e1->Val.lval = (long) e1->Val.uival;
-           break;
-         CASE_LONG:return;
-         case t_ulong:
-           break;
-       case t_llong:e1->Val.lval = (long)e1->Val.llval;
-         break;
-
-         CASE_FLOAT:e1->Val.lval = (long) e1->Val.dval;
-           break;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-      case t_ulong:
-       switch (EiC_gettype(e1->Type)) {
-         CASE_INT:e1->Val.ulval = (unsigned long) e1->Val.ival;
-           break;
-         CASE_UINT:e1->Val.ulval = (unsigned long) e1->Val.uival;
-           break;
-         CASE_LONG:break;
-         case t_ulong:
-           return;
-       case t_llong: e1->Val.ulval = (long)e1->Val.llval; break;
-
-         CASE_FLOAT:e1->Val.ulval = (unsigned long) e1->Val.dval;
-           break;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-
-      case t_llong:
-       switch (EiC_gettype(e1->Type)) {
-         CASE_INT:    e1->Val.llval =   (eic_llong) e1->Val.ival;   break;
-         CASE_UINT:   e1->Val.llval =  (eic_llong) e1->Val.uival; break;
-         CASE_LONG:   e1->Val.llval =  (eic_llong) e1->Val.lval;  break;
-         case t_ulong:e1->Val.llval =(eic_llong) e1->Val.ulval;  break;
-         case t_llong: break;
-
-         CASE_FLOAT:e1->Val.llval = (eic_llong)e1->Val.dval;
-           break;
-         default:
-           EiC_error("Illegal cast operation");
-       }
-       break;
-
-    CASE_FLOAT:
-       switch (EiC_gettype(e1->Type)) {
-       CASE_INT:e1->Val.dval = (double) e1->Val.ival;
-       break;
-       CASE_UINT:e1->Val.dval = (double) e1->Val.uival;
-       break;
-       CASE_LONG:e1->Val.dval = (double) e1->Val.lval;
-       break;
-       case t_ulong:
-           e1->Val.dval = (double) e1->Val.ulval;
-           break;
-       case t_llong: e1->Val.dval = (double)e1->Val.llval; break;
-       case t_pointer:
-           EiC_error("Illegal floating point operation");
-           break;
-       case t_float:
-           e1->Val.dval = (float)e1->Val.dval; break;      
-       case t_double:
-           return;
-       }
-       break;
-      case t_lval:
-       e2->Type = EiC_succType(e2->Type);
-       EiC_castconst(e1, e2, explicit);
-       e2->Type = EiC_addtype(t, e2->Type);
-       return;
-      case t_pointer:
-       if (EiC_gettype(e1->Type) != t_pointer && !explicit
-           && e1->Val.ival != 0 && !TREFON)
-           EiC_warningerror("Suspicious pointer conversion");
-       switch (EiC_gettype(e1->Type)) {
-       CASE_INT: e1->Val.p.sp = e1->Val.p.p =  (void *) e1->Val.ival;
-                 if(EiC_gettype(nextType(e2->Type)) != t_void)
-                    e1->Val.p.ep = (void *) (e1->Val.ival + EiC_get_sizeof(nextType(e2->Type)));
-                 else
-                   e1->Val.p.ep = (void *) (e1->Val.ival + sizeof(void *));
-           break;
-       CASE_UINT:  e1->Val.p.sp = e1->Val.p.p = (void *) e1->Val.uival;
-                   if(EiC_gettype(nextType(e2->Type)) != t_void)
-                      e1->Val.p.ep = (void *) (e1->Val.uival + EiC_get_sizeof(nextType(e2->Type)));
-                   else
-                     e1->Val.p.ep = (void *) (e1->Val.uival + sizeof(void *));
-               break;
-       CASE_LONG:
-       case t_ulong:
-             e1->Val.p.sp =  e1->Val.p.p = (void *) e1->Val.ulval;
-             if(EiC_gettype(nextType(e2->Type)) != t_void)
-               e1->Val.p.ep = (void *) (e1->Val.ulval + EiC_get_sizeof(nextType(e2->Type)));
-             else
-               e1->Val.p.ep = (void *) (e1->Val.ulval + sizeof(void *));
-             break;
-         case t_pointer:
-           if (!EiC_sametypes(e2->Type,e1->Type))
-               EiC_warningerror("Suspicious pointer conversion");
-           e1->Type = EiC_freetype(e1->Type);
-           e1->Type = EiC_copytype(e2->Type);
-           setConst(e1->Type);
-           return;
-         default:
-           EiC_error("Illegal cast operation");
-           break;
-       }
-       EiC_exchtype(t_pointer, e1->Type);
-       /*if(!explicit) */
-       if(!issafe(e2->Type))
-           setUnSafe(e1->Type);
-       setConst(e1->Type);
-       return;
-      case t_union:
-      case t_struct:
-       if (EiC_gettype(e2->Type) == t_lval) {
-           if (!EiC_sametypes(e1->Type, nextType(e2->Type)))
-               EiC_error("Illegal cast operation");
-       } else if (!EiC_sametypes(e1->Type, e2->Type))
-           EiC_error("Illegal cast operation");
-       return;
-      default:
-       EiC_error("Illegal cast operation");
-    }
-    EiC_set_bastype(EiC_bastype(e2->Type), e1->Type);
-}
-
-
-void EiC_do_lor(token_t *e1, int n)
-{
-    int inst;
-    val_t u1; 
-    EiC_output(e1);
-    switch(EiC_gettype(e1->Type)) {
-      CASE_INT:
-      CASE_UINT: inst = jmpTint;  break;
-      CASE_LONG:
-      CASE_ULONG: inst = jmpTlng; break;
-      CASE_FLOAT: inst = jmpTdbl; break;
-      case t_pointer: inst = jmpTptr;break;
-      default:
-       EiC_error("syntax error near '||'");
-       return;
-    }
-    EiC_exchtype(t_int,e1->Type);
-    u1.ival = n;
-    EiC_generate(&e1->Code, inst, &u1, 0);
-}
-void EiC_do_land(token_t *e1, int n)
-{
-    int inst;
-    val_t u1; 
-    EiC_output(e1);
-    switch(EiC_gettype(e1->Type)) {
-      CASE_INT:
-      CASE_UINT: inst = jmpFint;  break;
-      CASE_LONG:
-      CASE_ULONG: inst = jmpFlng; break;
-      CASE_FLOAT: inst = jmpFdbl; break;
-      case t_pointer: inst = jmpFptr;break;
-      default:
-       EiC_error("syntax error associated near '&&'");
-       return;
-    }
-    EiC_exchtype(t_int,e1->Type);
-    u1.ival = n;
-    EiC_generate(&e1->Code, inst, &u1, 0);
-}
-
-static void checkint(unsigned obj, token_t * e1, token_t * e2)
-{
-    if (EiC_gettype(e1->Type) != obj) {
-       if(!isconst(e1->Type))
-           EiC_exchtype(obj, e1->Type);
-       else
-           EiC_castconst(e1,e2,0);
-    }
-    if (EiC_gettype(e2->Type) != obj) {
-       if(!isconst(e1->Type))
-           EiC_exchtype(obj, e2->Type);
-       else
-           EiC_castconst(e2, e1, 0);
-    }
-    if (!e2->Pflag)
-       EiC_output(e2);
-}
-
-
-void binhint(unsigned oper, token_t * e1, token_t * e2)
-{
-    checkint(t_int, e1, e2);
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, addint, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, subint, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multint, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divint, &e2->Val, 0);
-       break;
-      case '%':
-       EiC_generate(&e2->Code, modint, &e2->Val, 0);
-       break;
-      case LSHT:
-       EiC_generate(&e2->Code, lshtint, &e2->Val, 0);
-       break;
-      case RSHT:
-       EiC_generate(&e2->Code, rshtint, &e2->Val, 0);
-       break;
-      case LT:
-       EiC_generate(&e2->Code, ltint, &e2->Val, 0);
-       break;
-      case LE:
-       EiC_generate(&e2->Code, leint, &e2->Val, 0);
-       break;
-      case EQ:
-       EiC_generate(&e2->Code, eqint, &e2->Val, 0);
-       break;
-      case NE:
-       EiC_generate(&e2->Code, neint, &e2->Val, 0);
-       break;
-      case GT:
-       EiC_generate(&e2->Code, gtint, &e2->Val, 0);
-       break;
-      case GE:
-       EiC_generate(&e2->Code, geint, &e2->Val, 0);
-       break;
-      case BOR:
-       EiC_generate(&e2->Code, borint, &e2->Val, 0);
-       break;
-      case XOR:
-       EiC_generate(&e2->Code, xorint, &e2->Val, 0);
-       break;
-      case AND:
-       EiC_generate(&e2->Code, andint, &e2->Val, 0);
-       break;
-    }
-}
-
-void binhuint(unsigned oper, token_t * e1, token_t * e2)
-{
-    checkint(t_uint, e1, e2);
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, adduint, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, subuint, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multuint, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divuint, &e2->Val, 0);
-       break;
-      case '%':
-       EiC_generate(&e2->Code, moduint, &e2->Val, 0);
-       break;
-      case LSHT:
-       EiC_generate(&e2->Code, lshtuint, &e2->Val, 0);
-       break;
-      case RSHT:
-       EiC_generate(&e2->Code, rshtuint, &e2->Val, 0);
-       break;
-      case BOR:
-       EiC_generate(&e2->Code, boruint, &e2->Val, 0);
-       break;
-      case XOR:
-       EiC_generate(&e2->Code, xoruint, &e2->Val, 0);
-       break;
-      case AND:
-       EiC_generate(&e2->Code, anduint, &e2->Val, 0);
-       break;
-      default:
-       EiC_output(e1);
-       EiC_exchtype(t_int, e1->Type);  /* should really be boolean */
-       switch (oper) {
-         case LT:
-           EiC_generate(&e2->Code, ltuint, &e2->Val, 0);
-           break;
-         case LE:
-           EiC_generate(&e2->Code, leuint, &e2->Val, 0);
-           break;
-         case EQ:
-           EiC_generate(&e2->Code, equint, &e2->Val, 0);
-           break;
-         case NE:
-           EiC_generate(&e2->Code, neuint, &e2->Val, 0);
-           break;
-         case GT:
-           EiC_generate(&e2->Code, gtuint, &e2->Val, 0);
-           break;
-         case GE:
-           EiC_generate(&e2->Code, geuint, &e2->Val, 0);
-           break;
-       }
-    }
-}
-
-static void checklong(unsigned obj, token_t * e1, token_t * e2)
-{
-    int t;
-    if ((t=EiC_gettype(e1->Type)) != obj) {
-       if (!isconst(e1->Type)) {
-           if (!e1->Pflag)
-               EiC_output(e1);
-           if(sizeof(int) != sizeof(long))
-               switch (t) {
-               CASE_INT:EiC_generate(&e1->Code, int2long, &e1->Val, 0);
-               break;
-               CASE_UINT:EiC_generate(&e1->Code, uint2long, &e1->Val, 0);
-               break;
-               }
-           EiC_exchtype(obj, e1->Type);
-       } else 
-           EiC_castconst(e1, e2, 0);
-    }
-    if ((t=EiC_gettype(e2->Type)) != obj) {
-       if (!isconst(e2->Type)) {
-           if (!e2->Pflag)
-               EiC_output(e2);
-           if(sizeof(int) != sizeof(long))
-               switch (t) {
-               CASE_INT:EiC_generate(&e2->Code, int2long, &e1->Val, 0);
-               break;
-               CASE_UINT:EiC_generate(&e2->Code, uint2long, &e1->Val, 0);
-               break;
-               }
-           EiC_exchtype(obj, e2->Type);
-       } else 
-           EiC_castconst(e2, e1, 0);
-    }
-    if (!e2->Pflag)
-       EiC_output(e2);
-}
-
-void binhlong(unsigned oper, token_t * e1, token_t * e2)
-{
-    checklong(t_long, e1, e2);
-    
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, addlong, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, sublong, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multlong, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divlong, &e2->Val, 0);
-       break;
-      case '%':
-       EiC_generate(&e2->Code, modlong, &e2->Val, 0);
-       break;
-      case LSHT:
-       EiC_generate(&e2->Code, lshtlong, &e2->Val, 0);
-       break;
-      case RSHT:
-       EiC_generate(&e2->Code, rshtlong, &e2->Val, 0);
-       break;
-      case BOR:
-       EiC_generate(&e2->Code, borlong, &e2->Val, 0);
-       break;
-      case XOR:
-       EiC_generate(&e2->Code, xorlong, &e2->Val, 0);
-       break;
-      case AND:
-       EiC_generate(&e2->Code, andlong, &e2->Val, 0);
-       break;
-      default:
-       EiC_output(e1);
-       EiC_exchtype(t_int, e1->Type);  /* should really be boolean */
-       switch (oper) {
-         case LT:
-           EiC_generate(&e2->Code, ltlong, &e2->Val, 0);
-           break;
-         case LE:
-           EiC_generate(&e2->Code, lelong, &e2->Val, 0);
-           break;
-         case EQ:
-           EiC_generate(&e2->Code, eqlong, &e2->Val, 0);
-           break;
-         case NE:
-           EiC_generate(&e2->Code, nelong, &e2->Val, 0);
-           break;
-         case GT:
-           EiC_generate(&e2->Code, gtlong, &e2->Val, 0);
-           break;
-         case GE:
-           EiC_generate(&e2->Code, gelong, &e2->Val, 0);
-           break;
-       }
-       break;
-    }
-}
-
-void binhulong(unsigned oper, token_t * e1, token_t * e2)
-{
-    checklong(t_ulong, e1, e2);
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, addulong, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, subulong, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multulong, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divulong, &e2->Val, 0);
-       break;
-      case '%':
-       EiC_generate(&e2->Code, modulong, &e2->Val, 0);
-       break;
-      case LSHT:
-       EiC_generate(&e2->Code, lshtulong, &e2->Val, 0);
-       break;
-      case RSHT:
-       EiC_generate(&e2->Code, rshtulong, &e2->Val, 0);
-       break;
-      case BOR:
-       EiC_generate(&e2->Code, borulong, &e2->Val, 0);
-       break;
-      case XOR:
-       EiC_generate(&e2->Code, xorulong, &e2->Val, 0);
-       break;
-      case AND:
-       EiC_generate(&e2->Code, andulong, &e2->Val, 0);
-       break;
-      default:
-       EiC_output(e1);
-       EiC_exchtype(t_int, e1->Type);  /* should really be boolean */
-       switch (oper) {
-         case LT:
-           EiC_generate(&e2->Code, ltulong, &e2->Val, 0);
-           break;
-         case LE:
-           EiC_generate(&e2->Code, leulong, &e2->Val, 0);
-           break;
-         case EQ:
-           EiC_generate(&e2->Code, equlong, &e2->Val, 0);
-           break;
-         case NE:
-           EiC_generate(&e2->Code, neulong, &e2->Val, 0);
-           break;
-         case GT:
-           EiC_generate(&e2->Code, gtulong, &e2->Val, 0);
-           break;
-         case GE:
-           EiC_generate(&e2->Code, geulong, &e2->Val, 0);
-           break;
-       }
-       break;
-    }
-}
-
-static void checkllong(unsigned obj, token_t * e1, token_t * e2)
-{
-  int t;
-  if ((t=EiC_gettype(e1->Type)) != obj) {
-    if (!isconst(e1->Type)) {
-      if (!e1->Pflag)
-       EiC_output(e1);
-      if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {
-       switch (t) {
-       CASE_INT:EiC_generate(&e1->Code, int2llong, &e1->Val, 0);
-       break;
-       CASE_UINT:EiC_generate(&e1->Code, uint2llong, &e1->Val, 0);
-       }
-      } else if(sizeof(long) != sizeof(eic_llong)) {
-       switch (t) {
-       case t_long:EiC_generate(&e1->Code, long2llong, &e1->Val, 0);
-         break;
-       case t_ulong:EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0);
-       }
-      }
-      EiC_exchtype(obj, e1->Type);
-    } else 
-      EiC_castconst(e1, e2, 0);
-  }
-  if ((t=EiC_gettype(e2->Type)) != obj) {
-    if (!isconst(e2->Type)) {
-      if (!e2->Pflag)
-       EiC_output(e2);
-      if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {
-       switch (t) {
-       CASE_INT:EiC_generate(&e2->Code, int2llong, &e1->Val, 0);
-       break;
-       CASE_UINT:EiC_generate(&e2->Code, uint2llong, &e1->Val, 0);
-       }
-      } else if(sizeof(long) != sizeof(eic_llong)) {
-       switch (t) {
-       case t_long:EiC_generate(&e2->Code, long2llong, &e1->Val, 0);
-         break;
-       case t_ulong:EiC_generate(&e2->Code, ulong2llong, &e1->Val, 0);
-       }
-      }
-      EiC_exchtype(obj, e2->Type);
-    } else 
-      EiC_castconst(e2, e1, 0);
-  }
-  if (!e2->Pflag)
-    EiC_output(e2);
-}
-
-
-void binhllong(unsigned oper, token_t * e1, token_t * e2)
-{
-    checkllong(t_llong, e1, e2);
-    
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, addllong, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, subllong, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multllong, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divllong, &e2->Val, 0);
-       break;
-      case '%':
-       EiC_generate(&e2->Code, modllong, &e2->Val, 0);
-       break;
-      case LSHT:
-       EiC_generate(&e2->Code, lshtllong, &e2->Val, 0);
-       break;
-      case RSHT:
-       EiC_generate(&e2->Code, rshtllong, &e2->Val, 0);
-       break;
-      case BOR:
-       EiC_generate(&e2->Code, borllong, &e2->Val, 0);
-       break;
-      case XOR:
-       EiC_generate(&e2->Code, xorllong, &e2->Val, 0);
-       break;
-      case AND:
-       EiC_generate(&e2->Code, andllong, &e2->Val, 0);
-       break;
-      default:
-       EiC_output(e1);
-       EiC_exchtype(t_int, e1->Type);  /* should really be boolean */
-       switch (oper) {
-         case LT:
-           EiC_generate(&e2->Code, ltllong, &e2->Val, 0);
-           break;
-         case LE:
-           EiC_generate(&e2->Code, lellong, &e2->Val, 0);
-           break;
-         case EQ:
-           EiC_generate(&e2->Code, eqllong, &e2->Val, 0);
-           break;
-         case NE:
-           EiC_generate(&e2->Code, nellong, &e2->Val, 0);
-           break;
-         case GT:
-           EiC_generate(&e2->Code, gtllong, &e2->Val, 0);
-           break;
-         case GE:
-           EiC_generate(&e2->Code, gellong, &e2->Val, 0);
-           break;
-       }
-       break;
-    }
-}
-
-
-
-void binhdouble(unsigned oper, token_t * e1, token_t * e2)
-{
-    int t;
-    if ((t=EiC_gettype(e1->Type)) != t_double) {
-       if (!isconst(e1->Type)) {
-           if (!e1->Pflag)
-               EiC_output(e1);
-           switch (t) {
-             CASE_INT:EiC_generate(&e1->Code, int2double, &e1->Val, 0);
-               break;
-             CASE_UINT:EiC_generate(&e1->Code, uint2double, &e1->Val, 0);
-               break;
-             CASE_LONG:EiC_generate(&e1->Code, long2double, &e1->Val, 0);
-               break;
-             CASE_ULONG:EiC_generate(&e1->Code, ulong2double, &e1->Val, 0);
-               break;
-           case t_llong: EiC_generate(&e1->Code, llong2double, &e1->Val, 0);
-               break;
-           }
-           EiC_exchtype(t_double, e1->Type);
-       } else 
-           EiC_castconst(e1, e2, 0);
-    }
-    if ((t=EiC_gettype(e2->Type)) != t_double) {
-       if (!isconst(e2->Type)) {
-           if (!e2->Pflag)
-               EiC_output(e2);
-           switch (t) {
-             CASE_INT:EiC_generate(&e2->Code, int2double, &e1->Val, 0);
-               break;
-             CASE_UINT:EiC_generate(&e2->Code, uint2double, &e1->Val, 0);
-               break;
-             CASE_LONG:EiC_generate(&e2->Code, long2double, &e1->Val, 0);
-               break;
-             CASE_ULONG:EiC_generate(&e2->Code, ulong2double, &e1->Val, 0);
-               break;
-             case t_llong:EiC_generate(&e2->Code, llong2double, &e1->Val, 0);
-               break;
-           }
-           EiC_exchtype(t_double, e2->Type);
-       } else
-           EiC_castconst(e2, e1, 0);
-    }
-    if (!e2->Pflag)
-       EiC_output(e2);
-    
-    switch (oper) {
-      case '+':
-       EiC_generate(&e2->Code, adddouble, &e2->Val, 0);
-       break;
-      case '-':
-       EiC_generate(&e2->Code, subdouble, &e2->Val, 0);
-       break;
-      case '*':
-       EiC_generate(&e2->Code, multdouble, &e2->Val, 0);
-       break;
-      case '/':
-       EiC_generate(&e2->Code, divdouble, &e2->Val, 0);
-       break;
-      default:
-       EiC_output(e1);
-       EiC_exchtype(t_int, e1->Type);  /* should really be boolean */
-       switch (oper) {
-         case LT:
-           EiC_generate(&e2->Code, ltdouble, &e2->Val, 0);
-           break;
-         case LE:
-           EiC_generate(&e2->Code, ledouble, &e2->Val, 0);
-           break;
-         case EQ:
-           EiC_generate(&e2->Code, eqdouble, &e2->Val, 0);
-           break;
-         case NE:
-           EiC_generate(&e2->Code, nedouble, &e2->Val, 0);
-           break;
-         case GT:
-           EiC_generate(&e2->Code, gtdouble, &e2->Val, 0);
-           break;
-         case GE:
-           EiC_generate(&e2->Code, gedouble, &e2->Val, 0);
-           break;
-         default:EiC_error("illegal binary operation to `%c'", oper);
-       }
-    }
-}
-
-#define arrayLimit(type)    /* replaced by runtime checks */
-
-/*if(limit && (e2->Val.type >= limit || \
-                                     e2->Val.type < 0))\
-                               EiC_error("Array bound violation");
-                              */
-#define ConstPval(y) { if(oper == '+')\
-                           e1->Val.p.p = (char*)e1->Val.p.p + e2->Val.y;\
-                       else\
-                           e1->Val.p.p = (char*)e1->Val.p.p - e2->Val.y;\
-                   }
-
-void EiC_binhlval(unsigned oper, token_t * e1, token_t * e2)
-{
-    unsigned limit = 0;
-    if (EiC_gettype(e1->Type) != t_pointer) {
-       if(EiC_gettype(e1->Type) != t_array) {
-           EiC_binhlval(oper,e2,e1);
-           EiC_swaptokens(e1,e2);
-           return;
-       } else { /* convert array to pointer */
-           limit = getNumElems(e1->Type);
-           EiC_output(e1);
-       }
-    }
-    if(EiC_gettype(e2->Type) == t_array)
-       EiC_output(e2);
-       
-    if (EiC_gettype(e2->Type) != t_pointer) {
-       if(oper == '+' || oper == '-') {
-           int c = 0;
-           VAL.ival = EiC_get_sizeof(nextType(e1->Type));
-           if(!VAL.ival)
-               EiC_error("Illegal pointer operation");
-           if(isconst(e1->Type) && isconst(e2->Type))
-               c = 1;
-           if(isconst(e2->Type)) {
-               switch (EiC_gettype(e2->Type)) {
-                 CASE_INT:
-                   arrayLimit(ival);
-                   e2->Val.ival *= VAL.ival;
-                   if(c)
-                       ConstPval(ival);
-                   break;
-                 CASE_UINT:
-                   arrayLimit(uival);
-                   e2->Val.uival *= VAL.ival;
-                   if(c)
-                       ConstPval(uival);
-                   break;
-                 CASE_LONG:
-                   arrayLimit(lval);
-                   e2->Val.lval *= VAL.ival;
-                   if(c)
-                       ConstPval(lval);
-                   break;
-                 CASE_ULONG:
-                   arrayLimit(ulval);
-                   e2->Val.ulval *= VAL.ival;
-                   if(c)
-                       ConstPval(ulval);
-                   break;
-                 default:
-                   EiC_error("Illegal pointer operation");
-               }
-               VAL.ival = 1; 
-           }
-           if(!c) {
-               if(oper == '-')
-                   VAL.ival = -VAL.ival;
-               EiC_output(e2);
-               if(EiC_gettype(e2->Type) > t_uint && sizeof(int) != sizeof(long)) {
-                   token_t e3;
-                   EiC_inittoken(&e3);
-                   e3.Type = EiC_addtype(t_int,NULL);
-                   EiC_castvar(e2,&e3,0);
-                   EiC_freetype(e3.Type);
-               }
-               if(VAL.ival > 1 || VAL.ival < 0)
-                   EiC_generate(&e2->Code, ixa, &VAL, limit);
-               else
-                   EiC_generate(&e2->Code, addptr2int, &e2->Val, 0);
-           }
-           return;
-       }
-       if (isconst(e2->Type))
-           EiC_castconst(e2, e1, 0);
-       else
-           EiC_castvar(e2, e1, 0);
-       EiC_output(e2);
-           
-    } else if (!EiC_compatibletypes(e1->Type, e2->Type))
-       EiC_error("Mixed pointer operation");
-
-    EiC_output(e2);
-    
-    switch (oper) {
-      case '-':
-       EiC_generate(&e2->Code, subptr, &e2->Val, 0);
-       VAL.ival = EiC_get_sizeof(nextType(e1->Type));
-       if (VAL.ival > 1) {
-           int size = VAL.ival;
-           VAL.ival = 1;
-           EiC_generate(&e2->Code, bump, &VAL, 0);
-           VAL.ival = size;
-           EiC_generate(&e2->Code, pushint, &VAL, 0);
-           EiC_generate(&e2->Code, divint, &VAL, 0);
-       }
-       break;
-      case LT:
-       EiC_generate(&e2->Code, ltptr, &e2->Val, 0);
-       break;
-      case LE:
-       EiC_generate(&e2->Code, leptr, &e2->Val, 0);
-       break;
-      case EQ:
-       EiC_generate(&e2->Code, eqptr, &e2->Val, 0);
-       break;
-      case NE:
-       EiC_generate(&e2->Code, neptr, &e2->Val, 0);
-       break;
-      case GT:
-       EiC_generate(&e2->Code, gtptr, &e2->Val, 0);
-       break;
-      case GE:
-       EiC_generate(&e2->Code, geptr, &e2->Val, 0);
-       break;
-    }
-    EiC_output(e1);
-    EiC_freetype(e1->Type);
-    e1->Type = EiC_addtype(t_int, NULL);
-} 
-#undef ConstPval
-
-void (*compatable(LRset_t S[],
-                 unsigned n, unsigned left,
-                 unsigned right)) ()
-{
-    static int i, m;
-
-    if(left > 32 || right > 32)
-       return NULL;
-    
-    for (i = 0; i < n; i++)
-       if (ismem(S[i].Lset, left) && ismem(S[i].Rset, right)) {
-           m = left > right ? left : right;
-           return  BINFUN[m];
-       }
-    return NULL;
-}
-
-int EiC_bin_validate(unsigned oper, token_t * e1, token_t * e2)
-{
-    int i, left, right;
-    void (*f) (int op, token_t * e1, token_t * e2);
-
-    if(sizeof(int) == sizeof(long)) {
-       if(EiC_gettype(e1->Type) == t_uint)
-           EiC_exchtype(t_ulong,e1->Type);
-       if(EiC_gettype(e2->Type) == t_uint)
-           EiC_exchtype(t_ulong,e2->Type);
-    }
-       
-    
-    if(isconst(e1->Type) || isconst(e2->Type)) {
-       binhconst(oper,e1,e2);
-       return 1;
-    }
-    
-    left = EiC_gettype(e1->Type);
-    right = EiC_gettype(e2->Type);
-    
-    for (i = 0; i < sizeof(BINSET) / sizeof(Binset); i++)
-       if (oper == BINSET[i].oper) {
-           f = compatable(BINSET[i].LRset,
-                          BINSET[i].N,
-                          left, right);
-           if (f != NULL) {
-               (*f) (oper, e1, e2);
-               return 1;
-           } else
-               EiC_error("Incompatible types");
-       }
-    return 0;
-}
-
-void EiC_cast2comm(token_t * e1, token_t * e2)
-{
-    /* cast e1 and e2 to a common type */
-    
-    unsigned t1, t2;
-    t1 = EiC_gettype(e1->Type);
-    t2 = EiC_gettype(e2->Type);
-
-
-    if(isconst(e1->Type)) {
-       if(t1 > t2) {
-           if(isconst(e2->Type))
-              EiC_castconst(e2, e1, 0);
-           else
-               EiC_castvar(e2, e1, 0);
-       } else
-           EiC_castconst(e1, e2, 0);
-       return;
-    }  
-    
-    switch (t1) {
-      CASE_NUM:
-       if(t2 == t_array || t2 == t_pointer ||
-          t2 == t_pointer)
-           EiC_error("Illegal cast operation");
-       else {
-           if(t1 > t2) {
-               if(isconst(e2->Type))
-                   EiC_castconst(e2,e1,0);
-               else 
-                   EiC_castvar(e2,e1,0);
-           } else
-               EiC_castvar(e1,e2,0);
-       }
-       break;
-      case t_pointer:
-       if (!EiC_sametypes(e1->Type, e2->Type)) {
-           if (isconst(e2->Type))
-               EiC_castconst(e2, e1, 0);
-       }
-       break;
-      case t_array:
-       if (EiC_gettype(e2->Type) == t_pointer) {
-           if (!EiC_sametypes(nextType(e1->Type), nextType(e2->Type)))
-               EiC_warningerror("Suspicious pointer conversion");
-           EiC_exchtype(t_pointer, e1->Type);
-       } else
-           EiC_error("Illegal cast operation");
-       break;
-      case t_union:
-      case t_struct:
-       if(EiC_sametypes(e1->Type,e2->Type))
-           break;
-      default:
-         if(!EiC_sametypes(e1->Type,e2->Type))
-             EiC_error("Illegal cast operation");
-    }
-}
-
-
-int EiC_unaryop(token_t * e1, int op)
-{
-    void derefConst(token_t * e1);
-    int t;
-    
-    if (!isconst(e1->Type) && op != INC && op != DEC)
-       EiC_output(e1);
-
-    if(!e1->Pflag && isconst(e1->Type)) {
-       switch(op) {
-         case '-':
-           switch (EiC_gettype(e1->Type)) {
-             CASE_INT:
-               e1->Val.ival = -e1->Val.ival;
-               break;
-             CASE_UINT:
-               e1->Val.uival = -e1->Val.uival;
-               break;
-             CASE_LONG:
-               e1->Val.lval = -e1->Val.lval;
-               break;
-             case t_ulong:
-               e1->Val.lval = -e1->Val.ulval;
-               break;
-             CASE_FLOAT:
-               e1->Val.dval = -e1->Val.dval;
-               break;
-             default:
-               EiC_error("Illegal operand");
-           }
-           break;
-         case '~':
-           switch (EiC_gettype(e1->Type)) {
-           CASE_INT:
-               e1->Val.ival = ~e1->Val.ival; break;
-           CASE_UINT:
-               e1->Val.uival = ~e1->Val.uival;
-               EiC_exchtype(t_uint,e1->Type);
-               setConst(e1->Type);
-               break;
-           CASE_LONG:
-               e1->Val.lval = ~e1->Val.lval; break;
-           case t_ulong:
-               e1->Val.ulval = ~e1->Val.ulval;
-               EiC_exchtype(t_ulong,e1->Type);
-               setConst(e1->Type);
-               break;
-             default:
-               EiC_error("Illegal operand");
-           }
-
-           break;
-         case NOT:
-           switch (EiC_gettype(e1->Type)) {
-             CASE_INT: CASE_UINT:
-               e1->Val.ival = !e1->Val.ival;
-               break;
-             CASE_LONG:
-             case t_ulong:
-               e1->Val.ival = !e1->Val.lval;
-               break;
-             CASE_FLOAT:e1->Val.ival = !e1->Val.dval;
-               break;
-             case t_pointer:
-               e1->Val.ival = !e1->Val.p.p;
-               break;
-             default:
-               EiC_error("Illegal operand");
-           }
-           e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
-           setConst(e1->Type);
-           return 1;
-         case '*':
-           derefConst(e1);
-           break;
-         case '+':
-           break;
-         default:
-           EiC_error("Illegal unary opertion");
-       }
-       return 1;
-    }
-
-    switch (op) {
-      case '+':
-       break;
-      case '-':
-       switch ((t =EiC_gettype(e1->Type))) {
-         case t_char:
-         case t_uchar:
-         case t_short:
-         case t_ushort:
-         case t_int:
-           if(t != t_int)
-               EiC_exchtype(t_int,e1->Type);
-           EiC_generate(&e1->Code, negint, &e1->Val, 0);
-           break;
-         case t_uint:
-           EiC_generate(&e1->Code, neguint, &e1->Val, 0);
-           break;
-         CASE_LONG:
-           EiC_generate(&e1->Code, neglong, &e1->Val, 0);
-           break;
-         case t_ulong:
-           EiC_generate(&e1->Code, negulong, &e1->Val, 0);
-           break;
-         CASE_FLOAT:
-           EiC_generate(&e1->Code, negdouble, &e1->Val, 0);
-           break;
-         default:
-           EiC_error("Illegal operand");
-           
-       }
-       break;
-      case '~':
-       switch ((t=EiC_gettype(e1->Type))) {
-         CASE_INT: CASE_UINT:
-           if(t < t_uint)
-               EiC_exchtype(t_uint,e1->Type);
-           EiC_generate(&e1->Code, compint, &e1->Val, 0);
-           break;
-         CASE_LONG:
-         case t_ulong:
-           EiC_generate(&e1->Code, compulong, &e1->Val, 0);
-           EiC_exchtype(t_ulong,e1->Type);
-           break;
-         default:
-           EiC_error("Illegal operand");
-       }
-       break;
-      case NOT:
-       switch (EiC_gettype(e1->Type)) {
-         CASE_INT: CASE_UINT:
-           EiC_generate(&e1->Code, notint, &e1->Val, 0);
-           break;
-         CASE_LONG:
-         case t_ulong:
-           EiC_generate(&e1->Code, notlong, &e1->Val, 0);
-           break;
-         CASE_FLOAT:EiC_generate(&e1->Code, notdouble, &e1->Val, 0);
-           break;
-         case t_lval:
-           t = EiC_gettype(e1->Type);
-           e1->Type = EiC_succType(e1->Type);
-           EiC_unaryop(e1, op);
-           e1->Type = EiC_addtype(t, e1->Type);
-           break;
-         case t_pointer:
-           EiC_generate(&e1->Code, notptr, &e1->Val, 0);
-           break;
-         default:
-           EiC_error("Illegal operand");
-       }
-       e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
-       break;
-      case INC:
-      case DEC:
-
-       if(isconstp(e1->Type) || isconst(e1->Type)) {
-         if(op == INC)
-           EiC_error("increment of read-only variable %s",e1->Sym->id);
-         else
-           EiC_error("decrement of read-only variable %s",e1->Sym->id);
-       }
-       
-       EiC_do_inc_dec(e1, op);
-       e1->Pflag = 0;
-       EiC_do_stooutput(e1);
-       break;
-      case '*':
-       if((t = EiC_gettype(e1->Type)) == t_pointer || t == t_array) {
-           e1->Pflag = 0;
-           EiC_exchtype(t_lval, e1->Type);
-           if(nextType(e1->Type) && (!isconstp(nextType(e1->Type)) ||
-                        !isconst(nextType(e1->Type))))
-               unsetConst(e1->Type);
-       } else if(t != t_lval)
-           EiC_error("Must have pointer");
-       return 1;
-      default:
-       EiC_error(" Invalid unary assignment");
-       break;
-    }
-    return 1;
-}
-
-int do_binaryop(token_t * e1, token_t * e2, int op)
-{
-    int t1 = EiC_gettype(e1->Type);
-    int t2 = EiC_gettype(e2->Type);
-    if(t1 == t_pointer || t2 == t_pointer) {
-       if(!(op >= LT && op <= GE)) {
-           EiC_binhlval(op,e1,e2);
-           return 1;
-       }
-    }
-
-    if (t1 > t2)
-       EiC_castconst(e2, e1, 0);
-    else 
-       EiC_castconst(e1, e2, 0);
-    
-    switch (EiC_gettype(e1->Type)) {
-      CASE_FLOAT:
-       switch (op) {
-         case '*':
-           e1->Val.dval *= e2->Val.dval;
-           break;
-         case '/':
-           e1->Val.dval /= e2->Val.dval;
-           break;
-         case '+':
-           e1->Val.dval += e2->Val.dval;
-           break;
-         case '-':
-           e1->Val.dval -= e2->Val.dval;
-           break;
-         default:
-           EiC_set_bastype(t_int, e1->Type);
-           switch (op) {
-             case LT:
-               e1->Val.ival = e1->Val.dval < e2->Val.dval;
-               break;
-             case LE:
-               e1->Val.ival = e1->Val.dval <= e2->Val.dval;
-               break;
-             case EQ:
-               e1->Val.ival = e1->Val.dval == e2->Val.dval;
-               break;
-             case NE:
-               e1->Val.ival = e1->Val.dval != e2->Val.dval;
-               break;
-             case GT:
-               e1->Val.ival = e1->Val.dval > e2->Val.dval;
-               break;
-             case GE:
-               e1->Val.ival = e1->Val.dval >= e2->Val.dval;
-               break;
-             default: EiC_error("illegal binary operation to `%c'", op);
-           }
-           break;
-       }
-       break;
-      CASE_INT:
-       switch (op) {
-         case '*':
-           e1->Val.ival *= e2->Val.ival;
-           break;
-         case '/':
-           e1->Val.ival /= e2->Val.ival;
-           break;
-         case '+':
-           e1->Val.ival += e2->Val.ival;
-           break;
-         case '-':
-           e1->Val.ival -= e2->Val.ival;
-           break;
-         case '%':
-           e1->Val.ival %= e2->Val.ival;
-           break;
-         case LSHT:
-           e1->Val.ival <<= e2->Val.ival;
-           break;
-         case RSHT:
-           e1->Val.ival >>= e2->Val.ival;
-           break;
-         case AND:
-           e1->Val.ival = e1->Val.ival & e2->Val.ival;
-           break;
-         case BOR:
-           e1->Val.ival = e1->Val.ival | e2->Val.ival;
-           break;
-         case XOR:
-           e1->Val.ival = e1->Val.ival ^ e2->Val.ival;
-           break;
-         case LT:
-           e1->Val.ival = e1->Val.ival < e2->Val.ival;
-           break;
-         case LE:
-           e1->Val.ival = e1->Val.ival <= e2->Val.ival;
-           break;
-         case EQ:
-           e1->Val.ival = e1->Val.ival == e2->Val.ival;
-           break;
-         case NE:
-           e1->Val.ival = e1->Val.ival != e2->Val.ival;
-           break;
-         case GT:
-           e1->Val.ival = e1->Val.ival > e2->Val.ival;
-           break;
-         case GE:
-           e1->Val.ival = e1->Val.ival >= e2->Val.ival;
-           break;
-       }
-       break;
-      CASE_UINT:
-       switch (op) {
-         case '*':
-           e1->Val.uival *= e2->Val.uival;
-           break;
-         case '/':
-           e1->Val.uival /= e2->Val.uival;
-           break;
-         case '+':
-           e1->Val.uival += e2->Val.uival;
-           break;
-         case '-':
-           e1->Val.uival -= e2->Val.uival;
-           break;
-         case '%':
-           e1->Val.uival %= e2->Val.uival;
-           break;
-         case LSHT:
-           e1->Val.uival <<= e2->Val.uival;
-           break;
-         case RSHT:
-           e1->Val.uival >>= e2->Val.uival;
-           break;
-         case AND:
-           e1->Val.uival = e1->Val.uival & e2->Val.uival;
-           break;
-         case BOR:
-           e1->Val.uival = e1->Val.uival | e2->Val.uival;
-           break;
-         case XOR:
-           e1->Val.uival = e1->Val.uival ^ e2->Val.uival;
-           break;
-         default:
-           EiC_set_bastype(t_int, e1->Type);
-           switch (op) {
-             case LT:
-               e1->Val.ival = e1->Val.uival < e2->Val.uival;
-               break;
-             case LE:
-               e1->Val.ival = e1->Val.uival <= e2->Val.uival;
-               break;
-             case EQ:
-               e1->Val.ival = e1->Val.uival == e2->Val.uival;
-               break;
-             case NE:
-               e1->Val.ival = e1->Val.uival != e2->Val.uival;
-               break;
-             case GT:
-               e1->Val.ival = e1->Val.uival > e2->Val.uival;
-               break;
-             case GE:
-               e1->Val.ival = e1->Val.uival >= e2->Val.uival;
-               break;
-           }
-           break;
-       }
-       break;
-      CASE_LONG:
-       switch (op) {
-         case '*':
-           e1->Val.lval *= e2->Val.lval;
-           break;
-         case '/':
-           e1->Val.lval /= e2->Val.lval;
-           break;
-         case '+':
-           e1->Val.lval += e2->Val.lval;
-           break;
-         case '-':
-           e1->Val.lval -= e2->Val.lval;
-           break;
-         case '%':
-           e1->Val.lval %= e2->Val.lval;
-           break;
-         case LSHT:
-           e1->Val.lval <<= e2->Val.lval;
-           break;
-         case RSHT:
-           e1->Val.lval >>= e2->Val.lval;
-           break;
-         case AND:
-           e1->Val.lval = e1->Val.lval & e2->Val.lval;
-           break;
-         case BOR:
-           e1->Val.lval = e1->Val.lval | e2->Val.lval;
-           break;
-         case XOR:
-           e1->Val.lval = e1->Val.lval ^ e2->Val.lval;
-           break;
-         default:
-           EiC_set_bastype(t_int, e1->Type);
-           switch (op) {
-             case LT:
-               e1->Val.ival = e1->Val.lval < e2->Val.lval;
-               break;
-             case LE:
-               e1->Val.ival = e1->Val.lval <= e2->Val.lval;
-               break;
-             case EQ:
-               e1->Val.ival = e1->Val.lval == e2->Val.lval;
-               break;
-             case NE:
-               e1->Val.ival = e1->Val.lval != e2->Val.lval;
-               break;
-             case GT:
-               e1->Val.ival = e1->Val.lval > e2->Val.lval;
-               break;
-             case GE:
-               e1->Val.ival = e1->Val.lval >= e2->Val.lval;
-               break;
-           }
-           break;
-       }
-       break;
-      case t_ulong:
-       switch (op) {
-         case '*':
-           e1->Val.ulval *= e2->Val.ulval;
-           break;
-         case '/':
-           e1->Val.ulval /= e2->Val.ulval;
-           break;
-         case '+':
-           e1->Val.ulval += e2->Val.ulval;
-           break;
-         case '-':
-           e1->Val.ulval -= e2->Val.ulval;
-           break;
-         case '%':
-           e1->Val.ulval %= e2->Val.ulval;
-           break;
-         case LSHT:
-           e1->Val.ulval <<= e2->Val.ulval;
-           break;
-         case RSHT:
-           e1->Val.ulval >>= e2->Val.ulval;
-           break;
-         case AND:
-           e1->Val.ulval = e1->Val.ulval & e2->Val.ulval;
-           break;
-         case BOR:
-           e1->Val.ulval = e1->Val.ulval | e2->Val.ulval;
-           break;
-         case XOR:
-           e1->Val.ulval = e1->Val.ulval ^ e2->Val.ulval;
-           break;
-         default:
-           EiC_set_bastype(t_int, e1->Type);
-           switch (op) {
-             case LT:
-               e1->Val.ival = e1->Val.ulval < e2->Val.ulval;
-               break;
-             case LE:
-               e1->Val.ival = e1->Val.ulval <= e2->Val.ulval;
-               break;
-             case EQ:
-               e1->Val.ival = e1->Val.ulval == e2->Val.ulval;
-               break;
-             case NE:
-               e1->Val.ival = e1->Val.ulval != e2->Val.ulval;
-               break;
-             case GT:
-               e1->Val.ival = e1->Val.ulval > e2->Val.ulval;
-               break;
-             case GE:
-               e1->Val.ival = e1->Val.ulval >= e2->Val.ulval;
-               break;
-           }
-           break;
-       }
-       break;
-      case t_pointer:
-       switch (op) {
-         case LT:
-           e1->Val.ival = e1->Val.p.p < e2->Val.p.p;
-           break;
-         case LE:
-           e1->Val.ival = e1->Val.p.p <= e2->Val.p.p;
-           break;
-         case EQ:
-           e1->Val.ival = e1->Val.p.p == e2->Val.p.p;
-           break;
-         case NE:
-           e1->Val.ival = e1->Val.p.p != e2->Val.p.p;
-           break;
-         case GT:
-           e1->Val.ival = e1->Val.p.p > e2->Val.p.p;
-           break;
-         case GE:
-           e1->Val.ival = e1->Val.p.p >= e2->Val.p.p;
-           break;
-         default:
-           EiC_error("Illegal constant pointer operation");
-       }
-       e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
-       setConst(e1->Type);
-       break;  
-      default:
-       EiC_error("Illegal constants");
-    }
-    return 1;
-}
-
-void * EiC_getaddress(token_t * e1)
-{
-    void *p = NULL;
-    int t = EiC_gettype(e1->Type);
-    switch (t) {
-       case t_builtin:
-           if (e1->Sym->val.vfunc != 0)
-               p = (void*)e1->Sym->val.vfunc;
-           else
-               EiC_error("No link to builtin function");
-           e1->Type = EiC_addtype(t_pointer, e1->Type);
-           break;
-       case t_funcdec:
-       case t_func:
-           p = e1->Sym;
-           e1->Type = EiC_addtype(t_pointer, e1->Type);
-           break;
-       case t_union:
-       case t_struct:
-           EiC_error("Illegal use of structure or uion: need an lvalue");
-       case t_array:
-           if (t == t_array)
-               EiC_exchtype(t_pointer, e1->Type);
-       case t_pointer:
-           
-           if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref) 
-               p = EiC_ENV->AR[e1->Sym->val.ival].v.p.p;
-           else
-               p = &EiC_ENV->AR[e1->Sym->val.ival].v;
-           break;
-
-       default:
-           /* watch out 4 reference variables */
-           if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref) {
-               e1->Type = EiC_succType(e1->Type);
-               if(EiC_gettype(e1->Type) != t_pointer)
-                   EiC_error("Illegal use of reference variable: %s", e1->Sym->id);
-               p = *(void**)EiC_ENV->AR[e1->Sym->val.ival].v.p.p;
-           } else
-               EiC_error("Unknown type: need an lvalue");
-    }
-    return p;
-}
-
-void derefConst(token_t * e1)
-{
-    /* assumes incoming type is a ptr or array */
-    
-    e1->Type = EiC_succType(e1->Type);
-    
-    switch(EiC_gettype(e1->Type)) {
-      case t_char:  case t_uchar:
-      case t_short: case t_ushort:
-      case t_int:   case t_uint:
-      case t_long:  case t_ulong:
-    case t_llong:
-      case t_float: case t_double:
-      case t_pointer:
-      case t_union:
-      case t_struct:
-       EiC_generate(&e1->Code,pushptr,&e1->Val, 0);
-       e1->Type = EiC_addtype(t_lval,e1->Type);
-        break;
-      case t_void:
-       return;
-      case t_array:
-        EiC_exchtype(t_pointer,e1->Type);
-       setConst(e1->Type);
-        
-        break;
-      default:
-       EiC_error("Unknown const in derefConst");
-    }
-
-}
-
-#if 0
-void EiC_addRval(code_t * code, int type, val_t *v, int st)
-{
-    /* optomise away rvals  */
-    int i;
-    if((i=nextinst(code))) 
-       if(IsSto_op(opcode(code,i-1)) && ivalcode(code,i) == ivalcode(code,i-1))
-           return;
-
-    EiC_generate(code,type,v,st);
-}
-#endif
-
-void EiC_output(token_t * e1)
-{
-    static val_t v;
-    if (e1->Pflag == 0) {
-       int t = EiC_gettype(e1->Type);
-
-       if(isconst(e1->Type)) {
-           switch (t) {
-           CASE_INT:
-               EiC_generate(&e1->Code, pushint, &e1->Val, 0); break;
-           CASE_UINT:
-               EiC_generate(&e1->Code, pushuint, &e1->Val, 0); break;
-           CASE_LONG:
-               EiC_generate(&e1->Code, pushlong, &e1->Val, 0); break;
-           CASE_ULONG:
-               EiC_generate(&e1->Code, pushulong, &e1->Val, 0); break;
-               case t_llong: EiC_generate(&e1->Code, pushllong, &e1->Val, 0);
-                   break;
-           CASE_FLOAT:EiC_generate(&e1->Code, pushdouble, &e1->Val, 0);
-           break;
-               case t_union:
-               case t_struct:
-               case t_array:
-                   if (t == t_array)
-                       EiC_exchtype(t_pointer, e1->Type);
-               case t_pointer:
-                   EiC_generate(&e1->Code, pushptr, &e1->Val, 0);
-                   break;
-               case t_void:
-                   return;
-               default:
-                   EiC_error("Unknown const type through output");
-           }
-           e1->Pflag =1;
-           unsetConst(e1->Type);
-           return;
-       } 
-       
-       switch (t) {
-           case t_char:
-               EiC_generate(&e1->Code, rvalchar, &e1->Val, EiC_GI(e1));
-               EiC_exchtype(t_int,e1->Type);
-               break;
-           case t_uchar:
-               EiC_generate(&e1->Code, rvaluchar, &e1->Val, EiC_GI(e1));
-               EiC_exchtype(t_int,e1->Type);
-               break;
-           case t_short:
-               EiC_generate(&e1->Code, rvalshort, &e1->Val, EiC_GI(e1));
-               EiC_exchtype(t_int,e1->Type);
-               break; 
-           case t_ushort:
-               EiC_generate(&e1->Code, rvalushort, &e1->Val, EiC_GI(e1));
-               EiC_exchtype(t_int,e1->Type);
-               break;
-           case t_int:
-           case t_uint:
-               /*EiC_addRval(&e1->Code, rvalint, &e1->Val, EiC_GI(e1));*/
-               EiC_generate(&e1->Code, rvalint, &e1->Val, EiC_GI(e1));
-               break;
-       CASE_LONG:
-       CASE_ULONG:EiC_generate(&e1->Code, rvallong, &e1->Val, EiC_GI(e1));
-       break;
-           
-           case t_llong:
-               EiC_generate(&e1->Code, rvalllong, &e1->Val, EiC_GI(e1)); break;
-
-           case t_float:
-               EiC_generate(&e1->Code, rvalfloat, &e1->Val,EiC_GI(e1));
-               EiC_exchtype(t_double,e1->Type);
-               break;
-           
-           case t_double:
-               EiC_generate(&e1->Code, rvaldouble, &e1->Val,EiC_GI(e1));
-               break;
-
-           case t_builtin:
-               if (e1->Sym->val.vfunc != 0) {
-                   v.vfunc = e1->Sym->val.vfunc;
-                   EiC_generate(&e1->Code, pushptr, &v, 0);
-                   e1->Type = EiC_addtype(t_pointer, e1->Type);
-               } else
-                   EiC_error("No link to builtin function");
-               break;
-           case t_funcdec:
-               EiC_exchtype(t_func, e1->Type);
-           case t_func:
-               v.p.p = e1->Sym;
-               EiC_generate(&e1->Code, pushptr, &v, 0);
-               e1->Type = EiC_addtype(t_pointer, e1->Type);
-               break;
-           case t_union:
-           case t_struct:
-           case t_array:
-               if (t == t_array)
-                   EiC_exchtype(t_pointer, e1->Type);
-           case t_pointer:
-               if(issafe(e1->Type))
-                   EiC_generate(&e1->Code, rvalptr, &e1->Val, EiC_GI(e1));
-               else
-                   EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1));
-               break;
-
-           case t_ref:
-           
-               EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1));
-           
-               return;
-
-           case t_lval:
-               e1->Type = EiC_succType(e1->Type);
-               switch (EiC_gettype(e1->Type)) {
-                   case t_uchar:
-                       EiC_generate(&e1->Code, drefuchar, &e1->Val, 0);
-                       break;
-                   case t_char:
-                       EiC_generate(&e1->Code, drefchar, &e1->Val, 0);
-                       break;
-                   case t_short:
-                       EiC_generate(&e1->Code, drefshort, &e1->Val, 0);
-                       break;
-                   case t_ushort:
-                       EiC_generate(&e1->Code, drefushort, &e1->Val, 0);
-                       break;
-                   case t_int:
-                       EiC_generate(&e1->Code, drefint, &e1->Val, 0);
-                       break;
-                   case t_uint:
-                       EiC_generate(&e1->Code, drefuint, &e1->Val, 0);
-                       break;
-               CASE_LONG:EiC_generate(&e1->Code, dreflong, &e1->Val, 0);
-               break;
-               CASE_ULONG:EiC_generate(&e1->Code, drefulong, &e1->Val, 0);
-               break;
-                   case t_llong:EiC_generate(&e1->Code, drefllong, &e1->Val, 0);
-                       break;
-                   case t_float:
-                       EiC_generate(&e1->Code, dreffloat, &e1->Val, 0);
-                       break;
-                   case t_double:
-                       EiC_generate(&e1->Code, drefdouble, &e1->Val, 0);
-                       break;
-                   case t_array:
-                   case t_struct:
-                   case t_union:
-                       break;
-                   case t_pointer:
-                       if(issafe(e1->Type))
-                           EiC_generate(&e1->Code, drefptr, &e1->Val, EiC_GI(e1));
-                       else
-                           EiC_generate(&e1->Code, drefuptr, &e1->Val, EiC_GI(e1));
-                       break;
-               
-                   case t_funcdec:
-                   case t_func:
-                       e1->Type = EiC_succType(e1->Type);
-                       if(EiC_gettype(nextType(e1->Type)) == t_void)
-                           EiC_generate(&e1->Code, eiccall, &e1->Val, 0);
-                       else
-                           EiC_generate(&e1->Code, eiccall, &e1->Val, 1);
-                       break;
-                   case t_builtin:
-                       if(EiC_gettype(nextType(e1->Type)) == t_void)
-                          EiC_generate(&e1->Code, call, &e1->Val, 0);
-                       else
-                           EiC_generate(&e1->Code, call, &e1->Val, 1);
-                       e1->Type = EiC_succType(e1->Type);
-                       break;
-                   default:
-                       EiC_error("Illegal lvalue");
-                       break;
-               }
-               break;
-           case t_void:
-               return;
-
-           case ID:
-               EiC_error("Undeclared identifier %s",e1->Sym->id);
-               break;
-
-           default:
-               EiC_error("Unknown type through output");
-               return;
-       }
-       e1->Pflag = 1;
-    }
-}
-
-void EiC_do_inc_dec(token_t * e1, int op)
-{
-    val_t v;
-    int t;
-    
-    switch (EiC_gettype(e1->Type)) {
-      CASE_INT:
-       t = EiC_gettype(e1->Type);
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = incint;
-       else
-           op = decint;
-       EiC_exchtype(t,e1->Type);
-       break;
-      CASE_UINT:
-       t = EiC_gettype(e1->Type);
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = incuint;
-       else
-           op = decuint;
-       EiC_exchtype(t,e1->Type);
-       break;
-      CASE_LONG:
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = inclong;
-       else
-           op = declong;
-       break;
-      CASE_ULONG:
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = inculong;
-       else
-           op = deculong;
-       break;
-    case t_llong:
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = incllong;
-       else
-           op = decllong;
-       break;
-      
-      case t_pointer:
-       EiC_output(e1);
-       v.ival = EiC_get_sizeof(nextType(e1->Type));
-       if (op == INC)
-           op = incptr;
-       else
-           op = decptr;
-       break;
-      case t_lval:
-       v.ival = 1;
-       EiC_generate(&e1->Code, dupval, &v, 0);
-       EiC_output(e1);
-       EiC_do_inc_dec(e1, op);
-       v.ival = 1;
-       /*EiC_generate(&e1->Code, bump, &v, 0);*/
-       e1->Type = EiC_addtype(t_lval, e1->Type);
-       return;
-      case t_float:
-      case t_double:
-       t = EiC_gettype(e1->Type);
-       EiC_output(e1);
-       v.ival = 1;
-       if (op == INC)
-           op = incdouble;
-       else
-           op = decdouble;
-       EiC_exchtype(t,e1->Type);
-       break;
-       
-      default:
-       EiC_error("Cannot apply inc\\dec");
-       return;
-    }
-    EiC_generate(&e1->Code, op, &v, 0);
-}
-
-void EiC_do_stooutput(token_t * e1)
-{
-    
-    if (e1->Pflag == 0) {
-       switch (EiC_gettype(e1->Type)) {
-         case t_char:
-         case t_uchar:
-           EiC_generate(&e1->Code, stochar, &e1->Val, EiC_GI(e1));
-           break;
-         case t_short:
-         case t_ushort:
-           EiC_generate(&e1->Code, stoshort, &e1->Val, EiC_GI(e1));
-           break;
-         case t_int:
-         case t_uint:
-           EiC_generate(&e1->Code, stoint, &e1->Val, EiC_GI(e1));
-           break;
-         CASE_LONG:
-         CASE_ULONG:EiC_generate(&e1->Code, stolong, &e1->Val, EiC_GI(e1));
-           break;
-       case t_llong:EiC_generate(&e1->Code, stollong, &e1->Val, EiC_GI(e1));
-           break;
-
-         case t_float:
-           EiC_generate(&e1->Code, stofloat, &e1->Val, EiC_GI(e1));
-           break;
-         case t_double:
-           EiC_generate(&e1->Code, stodouble, &e1->Val, EiC_GI(e1));
-           break;
-         case t_pointer:
-           if(issafe(e1->Type))
-             EiC_generate(&e1->Code, stoptr, &e1->Val, EiC_GI(e1));
-           else
-             EiC_generate(&e1->Code, stouptr, &e1->Val, EiC_GI(e1));
-           break;
-         case t_struct:
-         case t_union:{
-             val_t v;
-             v.ival = EiC_get_sizeof(e1->Type);
-             EiC_output(e1);
-             EiC_generate(&e1->Code, refmem, &v, 0);
-         }
-           break;
-         case t_lval:
-           e1->Type = EiC_succType(e1->Type);
-           if(isconst(e1->Type) || isconstp(e1->Type))
-               EiC_error("Illegal assignment operation");
-           switch (EiC_gettype(e1->Type)) {
-             case t_uchar:
-             case t_char:
-               EiC_generate(&e1->Code, refchar, &e1->Val, 0);
-               break;
-             case t_short:
-             case t_ushort:
-               EiC_generate(&e1->Code, refshort, &e1->Val, 0);
-               break;
-             case t_int:
-             case t_uint:
-               EiC_generate(&e1->Code, refint, &e1->Val, 0);
-               break;
-             CASE_LONG:EiC_generate(&e1->Code, reflong, &e1->Val, 0);
-               break;
-             CASE_ULONG:EiC_generate(&e1->Code, refulong, &e1->Val, 0);
-               break;
-           case t_llong:
-             EiC_generate(&e1->Code, refllong, &e1->Val, 0);
-               break;
-             case t_float:
-               EiC_generate(&e1->Code, reffloat, &e1->Val, 0);
-               break;
-             case t_double:
-               EiC_generate(&e1->Code, refdouble, &e1->Val, 0);
-               break;
-             case t_pointer:
-               if(issafe(e1->Type))
-                   EiC_generate(&e1->Code, refptr, &e1->Val, EiC_GI(e1));
-               else
-                   EiC_generate(&e1->Code, refuptr, &e1->Val, EiC_GI(e1));
-               break;
-             case t_struct:
-             case t_union:{
-                 val_t v;
-                 v.ival = EiC_get_sizeof(e1->Type);
-                 EiC_generate(&e1->Code, refmem, &v, 0);
-             }
-               break;
-             default:
-               EiC_error("Illegal lvalue");
-               break;
-           }
-           break;
-         default:
-           EiC_error(" Invalid assignment");
-           break;
-       }
-       e1->Pflag = 1;
-    }
-}
-
-void binhconst(unsigned opr, token_t * e1, token_t * e2)
-{
-    void (*f) (unsigned, token_t *, token_t *);
-    int t;
-
-    if(!e1->Pflag && isconst(e1->Type) && isconst(e2->Type)) {
-      if(e2->Pflag) 
-       EiC_output(e1);
-      else {
-       do_binaryop(e1, e2, opr);
-       return;
-      }
-    
-    }
-    /*
-     * Now perform usual arithmetic conversion
-     * i.e promote to larger type.
-     */
-
-    if(EiC_gettype(e1->Type) < EiC_gettype(e2->Type))
-       t = EiC_gettype(e2->Type);
-    else
-       t = EiC_gettype(e1->Type);
-    
-    switch (t) {
-      CASE_INT:     f = binhint;    break;
-      CASE_UINT:    f = binhuint;   break;
-      CASE_LONG:    f = binhlong;   break;
-      CASE_ULONG:   f = binhulong;  break;
-      CASE_FLOAT:   f = binhdouble; break;
-      case t_llong: f = binhllong;  break;
-      
-      case t_array:
-      case t_pointer:
-       f = EiC_binhlval;
-       break;
-      default:
-       EiC_error("Unknown type in binhconst");
-       return;
-    }
-    (*f) (opr, e1, e2);
-}
-
-
-
-
-
-