1) Port decides whether to handle GPOINTER unqualified pointers treated as port-...
[fw/sdcc] / src / SDCCast.c
index 5d17fab58fd8261108bbe37c390853216d749044..116ef2c63de01c455562be2854de0f3529af9a27 100644 (file)
@@ -574,10 +574,50 @@ funcOfType (char *name, sym_link * type, sym_link * argType,
 
 }
 
+/*-----------------------------------------------------------------*/
+/* funcOfTypeVarg :- function of type with name and argtype        */
+/*-----------------------------------------------------------------*/
+symbol *
+funcOfTypeVarg (char *name, char * rtype, int nArgs , char **atypes)
+{
+  
+    symbol *sym;
+    int i ;
+    /* create the symbol */
+    sym = newSymbol (name, 0);
+    
+    /* setup return value */
+    sym->type = newLink ();
+    DCL_TYPE (sym->type) = FUNCTION;
+    sym->type->next = typeFromStr(rtype);
+    sym->etype = getSpec (sym->type);
+    
+    /* if arguments required */
+    if (nArgs) {
+       value *args;
+       args = FUNC_ARGS(sym->type) = newValue ();
+       
+       for ( i = 0 ; i < nArgs ; i++ ) {
+           args->type = typeFromStr(atypes[i]);
+           args->etype = getSpec (args->type);
+           SPEC_EXTR(args->etype)=1;
+           if ((i + 1) == nArgs) break;
+           args = args->next = newValue ();
+       }
+    }
+    
+    /* save it */
+    addSymChain (sym);
+    sym->cdef = 1;
+    allocVariables (sym);
+    return sym;
+
+}
+
 /*-----------------------------------------------------------------*/
 /* reverseParms - will reverse a parameter tree                    */
 /*-----------------------------------------------------------------*/
-void 
+static void 
 reverseParms (ast * ptree)
 {
   ast *ttree;
@@ -674,13 +714,13 @@ processParms (ast * func,
       if (IS_PTR(ftype) && !IS_GENPTR(ftype))
        {
          newType = newAst_LINK (copyLinkChain(ftype));
-         DCL_TYPE (newType->opval.lnk) = GPOINTER;
+         DCL_TYPE (newType->opval.lnk) = port->unqualified_pointer;
        }
 
       if (IS_AGGREGATE (ftype))
        {
          newType = newAst_LINK (copyLinkChain (ftype));
-         DCL_TYPE (newType->opval.lnk) = GPOINTER;
+         DCL_TYPE (newType->opval.lnk) = port->unqualified_pointer;
        }
       if (newType)
        {
@@ -804,6 +844,12 @@ createIvalStruct (ast * sym, sym_link * type, initList * ilist)
       lAst = decorateType (resolveSymbols (lAst));
       rast = decorateType (resolveSymbols (createIval (lAst, sflds->type, iloop, rast)));
     }
+
+  if (iloop) {
+    werror (W_EXCESS_INITIALIZERS, "struct", 
+           sym->opval.val->sym->name, sym->opval.val->sym->lineDef);
+  }
+
   return rast;
 }
 
@@ -1011,42 +1057,7 @@ createIval (ast * sym, sym_link * type, initList * ilist, ast * wid)
 /*-----------------------------------------------------------------*/
 /* initAggregates - initialises aggregate variables with initv     */
 /*-----------------------------------------------------------------*/
-
-/* this has to go */ void printIval (symbol *, sym_link *, initList *, FILE *);
-
 ast * initAggregates (symbol * sym, initList * ival, ast * wid) {
-  ast *ast;
-  symbol *newSym;
-
-  if (getenv("TRY_THE_NEW_INITIALIZER")) {
-
-    if (!TARGET_IS_MCS51 || !(options.model==MODEL_LARGE)) {
-      fprintf (stderr, "Can't \"TRY_THE_NEW_INITIALIZER\" unless "
-              "with -mmcs51 and --model-large\n");
-      exit(404);
-    }
-
-    if (SPEC_OCLS(sym->etype)==xdata &&
-       getSize(sym->type) > 16) { // else it isn't worth it: do it the old way
-
-      // copy this symbol
-      newSym=copySymbol (sym);
-      SPEC_OCLS(newSym->etype)=code;
-      sprintf (newSym->name, "%s_init__", sym->name);
-      sprintf (newSym->rname,"%s_init__", sym->rname);
-      addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
-
-      // emit it in the static segment
-      addSet(&statsg->syms, newSym);
-
-      // now memcpy() the entire array from cseg
-      ast=newNode (ARRAYINIT, // ASSIGN_AGGREGATE
-                  newAst_VALUE (symbolVal (sym)), 
-                  newAst_VALUE (symbolVal (newSym)));
-      return decorateType(resolveSymbols(ast));
-    }
-  }
-  
   return createIval (newAst_VALUE (symbolVal (sym)), sym->type, ival, wid);
 }
 
@@ -1078,22 +1089,22 @@ gatherAutoInit (symbol * autoChain)
        {
          symbol *newSym;
          
-         // this can only be a constant
-         if (!inInitMode && !IS_LITERAL(sym->ival->init.node->etype)) {
-           werror (E_CONST_EXPECTED);
-         }
-
          /* insert the symbol into the symbol table */
          /* with level = 0 & name = rname       */
          newSym = copySymbol (sym);
          addSym (SymbolTab, newSym, newSym->rname, 0, 0, 1);
 
          /* now lift the code to main */
-         if (IS_AGGREGATE (sym->type))
+         if (IS_AGGREGATE (sym->type)) {
            work = initAggregates (sym, sym->ival, NULL);
-         else
+         } else {
+           if (getNelements(sym->type, sym->ival)>1) {
+             werror (W_EXCESS_INITIALIZERS, "scalar", 
+                     sym->name, sym->lineDef);
+           }
            work = newNode ('=', newAst_VALUE (symbolVal (newSym)),
                            list2expr (sym->ival));
+         }
 
          setAstLineno (work, sym->lineDef);
 
@@ -1109,11 +1120,16 @@ gatherAutoInit (symbol * autoChain)
       /* if there is an initial value */
       if (sym->ival && SPEC_SCLS (sym->etype) != S_CODE)
        {
-         if (IS_AGGREGATE (sym->type))
+         if (IS_AGGREGATE (sym->type)) {
            work = initAggregates (sym, sym->ival, NULL);
-         else
+         } else {
+           if (getNelements(sym->type, sym->ival)>1) {
+             werror (W_EXCESS_INITIALIZERS, "scalar", 
+                     sym->name, sym->lineDef);
+           }
            work = newNode ('=', newAst_VALUE (symbolVal (sym)),
                            list2expr (sym->ival));
+         }
 
          setAstLineno (work, sym->lineDef);
          sym->ival = NULL;
@@ -1774,48 +1790,6 @@ reverseLoop (ast * loop, symbol * sym, ast * init, ast * end)
 
 }
 
-//#define DEMAND_INTEGER_PROMOTION
-
-#ifdef DEMAND_INTEGER_PROMOTION
-
-/*-----------------------------------------------------------------*/
-/* walk a tree looking for the leaves. Add a typecast to the given */
-/* type to each value leaf node.           */
-/*-----------------------------------------------------------------*/
-void 
-pushTypeCastToLeaves (sym_link * type, ast * node, ast ** parentPtr)
-{
-  if (!node || IS_CALLOP(node))
-    {
-      /* WTF? We should never get here. */
-      return;
-    }
-
-  if (!node->left && !node->right)
-    {
-      /* We're at a leaf; if it's a value, apply the typecast */
-      if (node->type == EX_VALUE && IS_INTEGRAL (TTYPE (node)))
-       {
-         *parentPtr = decorateType (newNode (CAST,
-                                        newAst_LINK (copyLinkChain (type)),
-                                             node));
-       }
-    }
-  else
-    {
-      if (node->left)
-       {
-         pushTypeCastToLeaves (type, node->left, &(node->left));
-       }
-      if (node->right)
-       {
-         pushTypeCastToLeaves (type, node->right, &(node->right));
-       }
-    }
-}
-
-#endif
-
 /*-----------------------------------------------------------------*/
 /* decorateType - compute type for this tree also does type cheking */
 /*          this is done bottom up, since type have to flow upwards */
@@ -1919,7 +1893,9 @@ decorateType (ast * tree)
     ast *dtl, *dtr;
 
     dtl = decorateType (tree->left);
-    dtr = decorateType (tree->right);
+    /* delay right side for '?' operator since conditional macro expansions might
+       rely on this */
+    dtr = (tree->opval.op == '?' ? tree->right : decorateType (tree->right));
 
     /* this is to take care of situations
        when the tree gets rewritten */
@@ -2014,6 +1990,33 @@ decorateType (ast * tree)
                                     (tree->right->type == EX_VALUE ?
                               tree->right->opval.val : NULL));
       TETYPE (tree) = getSpec (TTYPE (tree));
+
+      /* adjust the storage class */
+      switch (DCL_TYPE(tree->left->ftype)) {
+      case POINTER:
+       break;
+      case FPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_XDATA; 
+       break;
+      case CPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_CODE; 
+       break;
+      case GPOINTER:
+       break;
+      case PPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_XSTACK; 
+       break;
+      case IPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_IDATA;
+       break;
+      case EEPPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_EEPROM;
+       break;
+      case UPOINTER:
+      case ARRAY:
+      case FUNCTION:
+      }
+
       return tree;
 
 /*------------------------------------------------------------------*/
@@ -2134,8 +2137,10 @@ decorateType (ast * tree)
        DCL_TYPE (p) = IPOINTER;
       else if (SPEC_SCLS (tree->left->etype) == S_EEPROM)
        DCL_TYPE (p) = EEPPOINTER;
+      else if (SPEC_OCLS(tree->left->etype))
+         DCL_TYPE (p) = PTR_TYPE(SPEC_OCLS(tree->left->etype));
       else
-       DCL_TYPE (p) = POINTER;
+         DCL_TYPE (p) = POINTER;
 
       if (IS_AST_SYM_VALUE (tree->left))
        {
@@ -2827,6 +2832,79 @@ decorateType (ast * tree)
                               tree->opval.val->type);
       return tree;
 
+      /*------------------------------------------------------------------*/
+      /*----------------------------*/
+      /*             typeof         */
+      /*----------------------------*/
+    case TYPEOF:
+       /* return typeof enum value */
+       tree->type = EX_VALUE;
+       {
+           int typeofv = 0;
+           if (IS_SPEC(tree->right->ftype)) {
+               switch (SPEC_NOUN(tree->right->ftype)) {
+               case V_INT:
+                   if (SPEC_LONG(tree->right->ftype)) typeofv = TYPEOF_LONG;
+                   else typeofv = TYPEOF_INT;
+                   break;
+               case V_FLOAT:
+                   typeofv = TYPEOF_FLOAT;
+                   break;
+               case V_CHAR:
+                   typeofv = TYPEOF_CHAR;
+                   break;
+               case V_VOID:
+                   typeofv = TYPEOF_VOID;
+                   break;
+               case V_STRUCT:
+                   typeofv = TYPEOF_STRUCT;
+                   break;
+               case V_BIT:
+                   typeofv = TYPEOF_BIT;
+                   break;
+               case V_SBIT:
+                   typeofv = TYPEOF_SBIT;
+                   break;
+               default:
+                   break;
+               }
+           } else {
+               switch (DCL_TYPE(tree->right->ftype)) {
+               case POINTER:
+                   typeofv = TYPEOF_POINTER;
+                   break;
+               case FPOINTER:
+                   typeofv = TYPEOF_FPOINTER;
+                   break;
+               case CPOINTER:
+                   typeofv = TYPEOF_CPOINTER;
+                   break;
+               case GPOINTER:
+                   typeofv = TYPEOF_GPOINTER;
+                   break;
+               case PPOINTER:
+                   typeofv = TYPEOF_PPOINTER;
+                   break;
+               case IPOINTER:
+                   typeofv = TYPEOF_IPOINTER;
+                   break;
+               case ARRAY:
+                   typeofv = TYPEOF_ARRAY;
+                   break;
+               case FUNCTION:
+                   typeofv = TYPEOF_FUNCTION;
+                   break;
+               default:
+                   break;
+               }
+           }
+           sprintf (buffer, "%d", typeofv);
+           tree->opval.val = constVal (buffer);
+           tree->right = tree->left = NULL;
+           TETYPE (tree) = getSpec (TTYPE (tree) =
+                                    tree->opval.val->type);
+       }
+       return tree;
       /*------------------------------------------------------------------*/
       /*----------------------------*/
       /* conditional operator  '?'  */
@@ -2836,13 +2914,14 @@ decorateType (ast * tree)
       assert(IS_COLON_OP(tree->right));
       /* if already known then replace the tree : optimizer will do it
         but faster to do it here */
-      if (IS_LITERAL (LTYPE(tree))) {
+      if (IS_LITERAL (LTYPE(tree))) {    
          if ( ((int) floatFromVal (valFromType (LETYPE (tree)))) != 0) {
-             return tree->right->left ;
+             return decorateType(tree->right->left) ;
          } else {
-             return tree->right->right ;
+             return decorateType(tree->right->right) ;
          }
       } else {
+         tree->right = decorateType(tree->right);
          TTYPE (tree) = RTYPE(tree);
          TETYPE (tree) = getSpec (TTYPE (tree));
       }
@@ -3064,7 +3143,8 @@ decorateType (ast * tree)
        goto errorTreeReturn;
       }
 
-      if (options.stackAuto || IFFUNC_ISREENT (LTYPE (tree)))
+      if ((options.stackAuto || IFFUNC_ISREENT (LTYPE (tree))) && 
+         !IFFUNC_ISBUILTIN(LTYPE(tree)))
        {
          //FUNC_ARGS(tree->left->ftype) = 
          //reverseVal (FUNC_ARGS(tree->left->ftype));
@@ -3928,6 +4008,63 @@ optimizeCompare (ast * root)
   vright = (root->right->type == EX_VALUE ?
            root->right->opval.val : NULL);
 
+  //#define EXPERIMENTAL
+#ifdef EXPERIMENTAL
+  /* if left is unsigned and right is literal */
+  if (vleft && vright && 
+      IS_UNSIGNED(vleft->etype) &&
+      IS_LITERAL(vright->etype)) {
+    double dval=floatFromVal(vright);
+    int op=root->opval.op;
+
+    fprintf (stderr,"op: '");
+    switch (op) {
+    case LE_OP: fprintf (stderr, "<= '"); break;
+    case EQ_OP: fprintf (stderr, "== '"); break;
+    case GE_OP: fprintf (stderr, ">= '"); break;
+    default: fprintf (stderr, "%c '", op); break;
+    }
+    fprintf (stderr, "%f\n", dval);
+
+    switch (op)
+      {
+      case EQ_OP:
+      case LE_OP:
+      case '<':
+       if (dval<0 || (op=='<' && dval==0)) {
+         // unsigned is never < 0
+         werror (W_IF_NEVER_TRUE);
+         optExpr = newAst_VALUE (constVal("0"));
+         return decorateType (optExpr);
+       }
+       if (dval==0) {
+         if (op==LE_OP) {
+           // change this into a cheaper EQ_OP
+           fprintf (stderr, "warning *** changed '<=' to '==' because of unsigned\n");
+           root->opval.op=EQ_OP;
+           return root;
+         }
+       }
+       break;
+      case GE_OP:
+      case '>':
+       if (dval>0 || (op==GE_OP && dval==0)) {
+         // unsigned is never < 0
+         werror (W_IF_ALWAYS_TRUE);
+         optExpr = newAst_VALUE (constVal("1"));
+         return decorateType (optExpr);
+       }
+       if (dval==0) {
+         if (op=='>') {
+           // change this into a cheaper reversed EQ_OP
+           fprintf (stderr, "warning *** changed '>' to '!=' because of unsigned\n");
+           root->opval.op=EQ_OP;
+         }
+       }
+      }
+  }
+#endif
+
   /* if left is a BITVAR in BITSPACE */
   /* and right is a LITERAL then opt- */
   /* imize else do nothing       */
@@ -4102,10 +4239,6 @@ createFunction (symbol * name, ast * body)
   name->lastLine = yylineno;
   currFunc = name;
 
-#if 0 // jwk: this is now done in addDecl()
-  processFuncArgs (currFunc);
-#endif
-
   /* set the stack pointer */
   /* PENDING: check this for the mcs51 */
   stackPtr = -port->stack.direction * port->stack.call_overhead;
@@ -4190,7 +4323,7 @@ skipall:
 
   /* we are done freeup memory & cleanup */
   noLineno--;
-  labelKey = 1;
+  if (port->reset_labelKey) labelKey = 1;
   name->key = 0;
   FUNC_HASBODY(name->type) = 1;
   addSet (&operKeyReset, name);
@@ -4263,7 +4396,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                INDENT(indent,outfile);
                fprintf(outfile,"{\n");
                while (decls) {
-                       INDENT(indent+4,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"DECLARE SYMBOL (%s=%p) type (",
                                decls->name, decls);
                        printTypeChain(decls->type,outfile);
@@ -4271,7 +4404,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        
                        decls = decls->next;                    
                }
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->right,outfile,indent+2);
                INDENT(indent,outfile);
                fprintf(outfile,"}\n");
                return;
@@ -4338,8 +4471,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"ARRAY_OP (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
 
                /*------------------------------------------------------------------*/
@@ -4350,8 +4483,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"STRUCT_ACCESS (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
 
                /*------------------------------------------------------------------*/
@@ -4362,8 +4495,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"PTR_ACCESS (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
 
                /*------------------------------------------------------------------*/
@@ -4374,14 +4507,14 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"INC_OP (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
 
        case DEC_OP:
                fprintf(outfile,"DEC_OP (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
 
                /*------------------------------------------------------------------*/
@@ -4393,14 +4526,14 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"& (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
-                       ast_print(tree->right,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
+                       ast_print(tree->right,outfile,indent+2);
                } else {
                        fprintf(outfile,"ADDRESS_OF (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
-                       ast_print(tree->right,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
+                       ast_print(tree->right,outfile,indent+2);
                }
                return ;
                /*----------------------------*/
@@ -4410,8 +4543,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"OR (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4421,8 +4554,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"XOR (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                
                /*------------------------------------------------------------------*/
@@ -4433,8 +4566,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"DIV (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4444,8 +4577,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"MOD (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
 
                /*------------------------------------------------------------------*/
@@ -4457,7 +4590,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"DEREF (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
                        return ;
                }                       
                /*------------------------------------------------------------------*/
@@ -4467,8 +4600,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"MULT (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
 
 
@@ -4482,7 +4615,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"UPLUS (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
                } else {
                        /*------------------------------------------------------------------*/
                        /*----------------------------*/
@@ -4491,8 +4624,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"ADD (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
-                       ast_print(tree->right,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
+                       ast_print(tree->right,outfile,indent+2);
                }
                return;
                /*------------------------------------------------------------------*/
@@ -4504,7 +4637,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"UMINUS (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
                } else {
                        /*------------------------------------------------------------------*/
                        /*----------------------------*/
@@ -4513,8 +4646,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"SUB (%p) type (",tree);
                        printTypeChain(tree->ftype,outfile);
                        fprintf(outfile,")\n");
-                       ast_print(tree->left,outfile,indent+4);
-                       ast_print(tree->right,outfile,indent+4);
+                       ast_print(tree->left,outfile,indent+2);
+                       ast_print(tree->right,outfile,indent+2);
                }
                return;
                /*------------------------------------------------------------------*/
@@ -4525,7 +4658,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"COMPL (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4535,7 +4668,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"NOT (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4545,34 +4678,34 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"RRC (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
 
        case RLC:
                fprintf(outfile,"RLC (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
        case GETHBIT:
                fprintf(outfile,"GETHBIT (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
        case LEFT_OP:
                fprintf(outfile,"LEFT_SHIFT (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case RIGHT_OP:
                fprintf(outfile,"RIGHT_SHIFT (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4584,22 +4717,22 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,") to type (");
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                
        case AND_OP:
                fprintf(outfile,"ANDAND (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case OR_OP:
                fprintf(outfile,"OROR (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                
                /*------------------------------------------------------------------*/
@@ -4610,43 +4743,43 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"GT(>) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case '<':
                fprintf(outfile,"LT(<) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case LE_OP:
                fprintf(outfile,"LE(<=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case GE_OP:
                fprintf(outfile,"GE(>=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case EQ_OP:
                fprintf(outfile,"EQ(==) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
        case NE_OP:
                fprintf(outfile,"NE(!=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                /*------------------------------------------------------------------*/
                /*----------------------------*/
                /*             sizeof         */
@@ -4663,16 +4796,16 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"QUEST(?) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
 
        case ':':
                fprintf(outfile,"COLON(:) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                
                /*------------------------------------------------------------------*/
@@ -4683,50 +4816,50 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"MULASS(*=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case DIV_ASSIGN:
                fprintf(outfile,"DIVASS(/=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case AND_ASSIGN:
                fprintf(outfile,"ANDASS(&=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case OR_ASSIGN:
                fprintf(outfile,"ORASS(*=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case XOR_ASSIGN:
                fprintf(outfile,"XORASS(*=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case RIGHT_ASSIGN:
                fprintf(outfile,"RSHFTASS(>>=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case LEFT_ASSIGN:
                fprintf(outfile,"LSHFTASS(*=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4736,8 +4869,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"SUBASS(-=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4747,8 +4880,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"ADDASS(+=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4758,8 +4891,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"ASSIGN(=) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;     
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4769,8 +4902,8 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"COMMA(,) (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4781,14 +4914,14 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"CALL (%p) type (",tree);
                printTypeChain(tree->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->left,outfile,indent+4);
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               ast_print(tree->right,outfile,indent+2);
                return;
        case PARAM:
                fprintf(outfile,"PARMS\n");
-               ast_print(tree->left,outfile,indent+4);
-               if (tree->right && !IS_AST_PARAM(tree->right)) {
-                       ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
+               if (tree->right /*&& !IS_AST_PARAM(tree->right)*/) {
+                       ast_print(tree->right,outfile,indent+2);
                }
                return ;
                /*------------------------------------------------------------------*/
@@ -4799,15 +4932,15 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                fprintf(outfile,"RETURN (%p) type (",tree);
                printTypeChain(tree->right->ftype,outfile);
                fprintf(outfile,")\n");
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
                /*     label statement        */
                /*----------------------------*/
        case LABEL :
-               fprintf(outfile,"LABEL (%p)",tree);
-               ast_print(tree->left,outfile,indent+4);
+               fprintf(outfile,"LABEL (%p)\n",tree);
+               ast_print(tree->left,outfile,indent+2);
                ast_print(tree->right,outfile,indent);
                return;
                /*------------------------------------------------------------------*/
@@ -4820,7 +4953,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        fprintf(outfile,"SWITCH (%p) ",tree);
                        ast_print(tree->left,outfile,0);
                        for (val = tree->values.switchVals.swVals; val ; val = val->next) {
-                               INDENT(indent+4,outfile);
+                               INDENT(indent+2,outfile);
                                fprintf(outfile,"CASE 0x%x GOTO _case_%d_%d\n",
                                        (int) floatFromVal(val),
                                        tree->values.switchVals.swNum,
@@ -4835,7 +4968,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                /*----------------------------*/
        case IFX:
                fprintf(outfile,"IF (%p) \n",tree);
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                if (tree->trueLabel) {
                        INDENT(indent,outfile);
                        fprintf(outfile,"NE(!=) 0 goto %s\n",tree->trueLabel->name);
@@ -4844,7 +4977,7 @@ void ast_print (ast * tree, FILE *outfile, int indent)
                        INDENT(indent,outfile);
                        fprintf(outfile,"EQ(==) 0 goto %s\n",tree->falseLabel->name);
                }
-               ast_print(tree->right,outfile,indent+4);
+               ast_print(tree->right,outfile,indent+2);
                return ;
                /*------------------------------------------------------------------*/
                /*----------------------------*/
@@ -4853,22 +4986,22 @@ void ast_print (ast * tree, FILE *outfile, int indent)
        case FOR:
                fprintf(outfile,"FOR (%p) \n",tree);
                if (AST_FOR( tree, initExpr)) {
-                       INDENT(indent+4,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"INIT EXPR ");
-                       ast_print(AST_FOR(tree, initExpr),outfile,indent+4);
+                       ast_print(AST_FOR(tree, initExpr),outfile,indent+2);
                }
                if (AST_FOR( tree, condExpr)) {
-                       INDENT(indent+4,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"COND EXPR ");
-                       ast_print(AST_FOR(tree, condExpr),outfile,indent+4);
+                       ast_print(AST_FOR(tree, condExpr),outfile,indent+2);
                }
                if (AST_FOR( tree, loopExpr)) {
-                       INDENT(indent+4,outfile);
+                       INDENT(indent+2,outfile);
                        fprintf(outfile,"LOOP EXPR ");
-                       ast_print(AST_FOR(tree, loopExpr),outfile,indent+4);
+                       ast_print(AST_FOR(tree, loopExpr),outfile,indent+2);
                }
                fprintf(outfile,"FOR LOOP BODY \n");
-               ast_print(tree->left,outfile,indent+4);
+               ast_print(tree->left,outfile,indent+2);
                return ;
        default:
            return ;