Changed Safe_calloc to use 2 arguements to mimic teh standard calloc function
[fw/sdcc] / src / SDCCval.c
index c1dff7198a18a9aeaf2581cb8c2cbf812c849d50..46eab66911444dd7ce4d5cd8fe85ac9c17670557 100644 (file)
@@ -1,44 +1,45 @@
 /*----------------------------------------------------------------------
-    SDCCval.c :- has routine to do all kinds of fun stuff with the 
+    SDCCval.c :- has routine to do all kinds of fun stuff with the
                 value wrapper & with initialiser lists.
-    
+
     Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
 
     This program is free software; you can redistribute it and/or modify it
     under the terms of the GNU General Public License as published by the
     Free Software Foundation; either version 2, or (at your option) any
     later version.
-    
+
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
-    
+
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-    
+
     In other words, you are welcome to use, share and improve this program.
     You are forbidden to forbid anyone else to use, share and improve
-    what you give them.   Help stamp out software-hoarding!  
+    what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 
 #include "common.h"
 #include <math.h>
 #include <stdlib.h>
 #include <limits.h>
+#include "newalloc.h"
 
-int            cNestLevel ;
+int   cNestLevel ;
 
 /*-----------------------------------------------------------------*/
-/* newValue - allocates and returns a new value                   */
+/* newValue - allocates and returns a new value        */
 /*-----------------------------------------------------------------*/
 value *newValue ()
 {
     value *val ;
-    
-    ALLOC(val,sizeof(value));
-    
+
+    val = Safe_calloc(1,sizeof(value));
+
     return val ;
 }
 
@@ -48,71 +49,71 @@ value *newValue ()
 initList *newiList ( int type, void *ilist)
 {
     initList *nilist;
-    
-    
-    ALLOC(nilist,sizeof(initList));    
-    
-    nilist->type = type        ;
+
+
+    nilist = Safe_calloc(1,sizeof(initList));
+
+    nilist->type = type ;
     nilist->lineno = yylineno ;
-    
+
     switch (type)   {
     case INIT_NODE :
-       nilist->init.node = (struct ast *) ilist ;
-       break ;
-       
+  nilist->init.node = (struct ast *) ilist ;
+  break ;
+
     case INIT_DEEP :
-       nilist->init.deep = (struct initList *) ilist ;
-       break ;
+  nilist->init.deep = (struct initList *) ilist ;
+  break ;
     }
-    
+
     return nilist ;
 }
 
 /*------------------------------------------------------------------*/
-/* revinit   - reverses the initial values for a value  chain       */
+/* revinit   - reverses the initial values for a value  chain        */
 /*------------------------------------------------------------------*/
 initList *revinit   ( initList   *val)
 {
     initList  *prev  , *curr, *next ;
-    
+
     if (!val)
-       return NULL ;
-    
+  return NULL ;
+
     prev = val ;
     curr = val->next ;
-    
+
     while (curr)   {
-       next = curr->next ;
-       curr->next = prev   ;
-       prev = curr ;
-       curr = next ;
+  next = curr->next ;
+  curr->next = prev   ;
+  prev = curr ;
+  curr = next ;
     }
     val->next = (void *) NULL ;
     return prev ;
 }
 
 /*------------------------------------------------------------------*/
-/* copyIlist - copy initializer list                               */
+/* copyIlist - copy initializer list            */
 /*------------------------------------------------------------------*/
 initList *copyIlist (initList *src)
 {
     initList *dest = NULL;
-    
+
     if (!src)
-       return NULL ;
-    
+  return NULL ;
+
     switch (src->type) {
     case INIT_DEEP :
-       dest = newiList (INIT_DEEP,copyIlist (src->init.deep));
-       break;
+  dest = newiList (INIT_DEEP,copyIlist (src->init.deep));
+  break;
     case INIT_NODE :
-       dest = newiList (INIT_NODE,copyAst (src->init.node)) ;
-       break;
+  dest = newiList (INIT_NODE,copyAst (src->init.node)) ;
+  break;
     }
-    
+
     if ( src->next )
-       dest->next = copyIlist(src->next);
-    
+  dest->next = copyIlist(src->next);
+
     return dest ;
 }
 
@@ -122,10 +123,10 @@ initList *copyIlist (initList *src)
 double list2int (initList   *val)
 {
     initList *i = val;
-    
+
     if ( i->type == INIT_DEEP )
-       return list2int (val->init.deep) ;
-    
+  return list2int (val->init.deep) ;
+
     return floatFromVal(constExprValue(val->init.node,TRUE));
 }
 
@@ -135,21 +136,21 @@ double list2int (initList   *val)
 value *list2val (initList   *val)
 {
     if (!val)
-       return NULL;
+  return NULL;
 
     if ( val->type == INIT_DEEP )
-       return list2val (val->init.deep) ;
-    
+  return list2val (val->init.deep) ;
+
     return constExprValue(val->init.node,TRUE);
 }
 
 /*------------------------------------------------------------------*/
 /* list2expr - returns the first expression in the initializer list */
 /*------------------------------------------------------------------*/
-ast    *list2expr ( initList   *ilist)
+ast *list2expr ( initList *ilist)
 {
     if ( ilist->type == INIT_DEEP )
-       return list2expr (ilist->init.deep) ;
+  return list2expr (ilist->init.deep) ;
     return ilist->init.node ;
 }
 
@@ -159,41 +160,41 @@ ast       *list2expr ( initList   *ilist)
 void resolveIvalSym ( initList *ilist)
 {
     if ( ! ilist )
-       return ;
-    
+  return ;
+
     if ( ilist->type == INIT_NODE )
-       ilist->init.node = decorateType(resolveSymbols (ilist->init.node));
-    
+  ilist->init.node = decorateType(resolveSymbols (ilist->init.node));
+
     if ( ilist->type == INIT_DEEP )
-       resolveIvalSym (ilist->init.deep);
-    
+  resolveIvalSym (ilist->init.deep);
+
     resolveIvalSym (ilist->next);
 }
 
 /*-----------------------------------------------------------------*/
-/* symbolVal - creates a value for a symbol                       */
+/* symbolVal - creates a value for a symbol              */
 /*-----------------------------------------------------------------*/
 value *symbolVal ( symbol  *sym )
 {
     value *val ;
-    
+
     if (!sym)
-       return NULL ;
-    
+  return NULL ;
+
     val = newValue();
     val->sym = sym ;
-    
+
     if ( sym->type ) {
-       val->type = sym->type;
-       val->etype= getSpec(val->type);
+  val->type = sym->type;
+  val->etype= getSpec(val->type);
     }
-    
+
     if ( *sym->rname )
-       sprintf (val->name,"%s",sym->rname);
+  sprintf (val->name,"%s",sym->rname);
     else
-       sprintf(val->name,"_%s",sym->name);
-    
-    
+  sprintf(val->name,"_%s",sym->name);
+
+
     return val ;
 }
 
@@ -203,12 +204,12 @@ value *symbolVal ( symbol  *sym )
 value *valueFromLit (float lit)
 {
     char buffer[50];
-    
-    if ( ( ((long) lit ) - lit ) == 0 ) {      
-       sprintf(buffer,"%ld",(long) lit);
-       return constVal (buffer);
+
+    if ( ( ((long) lit ) - lit ) == 0 ) {
+  sprintf(buffer,"%ld",(long) lit);
+  return constVal (buffer);
     }
-    
+
     sprintf(buffer,"%f",lit);
     return constFloatVal (buffer);
 }
@@ -220,189 +221,189 @@ value *constFloatVal ( char *s )
 {
     value *val = newValue();
     float sval;
-    
+
     if(sscanf (s,"%f",&sval) != 1) {
-       werror(E_INVALID_FLOAT_CONST,s);
-       return constVal("0");
+  werror(E_INVALID_FLOAT_CONST,s);
+  return constVal("0");
     }
-    
+
     val->type = val->etype = newLink();
     val->type->class = SPECIFIER ;
     SPEC_NOUN(val->type) = V_FLOAT ;
     SPEC_SCLS(val->type) = S_LITERAL;
     SPEC_CVAL(val->type).v_float = sval;
-    
+
     return val;
 }
 
 /*-----------------------------------------------------------------*/
-/* constVal - converts a INTEGER constant into a value            */
+/* constVal - converts a INTEGER constant into a value       */
 /*-----------------------------------------------------------------*/
 value *constVal   (char *s)
 {
     value *val ;
     short hex = 0 , octal = 0 ;
     char  scanFmt[10] ;
-    int         scI = 0 ;
+    int  scI = 0 ;
     unsigned long sval ;
-    
-    val = newValue() ;       /* alloc space for value   */
-    
+
+    val = newValue() ;        /* alloc space for value   */
+
     val->type = val->etype = newLink() ; /* create the spcifier */
-    val->type->class   = SPECIFIER ;
+    val->type->class  = SPECIFIER ;
     SPEC_NOUN(val->type) =  V_INT ;
     SPEC_SCLS(val->type) =  S_LITERAL ;
-    
+
     /* set the _unsigned flag if 'uU' found */
     if (strchr(s,'u') || strchr(s,'U'))
-       SPEC_USIGN(val->type) = 1;
-    
+  SPEC_USIGN(val->type) = 1;
+
     /* set the _long flag if 'lL' is found */
     if (strchr(s,'l') || strchr(s,'L'))
-       SPEC_LONG(val->type) = 1;
-    
+  SPEC_LONG(val->type) = 1;
+
     hex = ((strchr(s,'x') || strchr(s,'X')) ? 1 : 0) ;
-    
+
     /* set the octal flag   */
     if (!hex && *s == '0' && *(s+1) )
-       octal = 1 ;
-    
+  octal = 1 ;
+
     /* create the scan string */
     scanFmt[scI++] = '%' ;
-    
+
     if (octal)
-       scanFmt[scI++] = 'o' ;
+  scanFmt[scI++] = 'o' ;
     else
-       if (hex)
-           scanFmt[scI++] = 'x' ;
-       else
-           if (SPEC_USIGN(val->type))
-               scanFmt[scI++] = 'u' ;
-           else
-               scanFmt[scI++] = 'd' ;
-    
+  if (hex)
+      scanFmt[scI++] = 'x' ;
+  else
+      if (SPEC_USIGN(val->type))
+    scanFmt[scI++] = 'u' ;
+      else
+    scanFmt[scI++] = 'd' ;
+
     scanFmt[scI++] = '\0' ;
-    
+
     /* if hex or octal then set the unsigned flag   */
     if ( hex || octal ) {
-       SPEC_USIGN(val->type) = 1 ;
-       sscanf(s,scanFmt,&sval);
+  SPEC_USIGN(val->type) = 1 ;
+  sscanf(s,scanFmt,&sval);
     } else
-       sval = atol(s);
-    
-    
+  sval = atol(s);
+
+
     if (SPEC_LONG(val->type) || sval > 32768) {
-       if (SPEC_USIGN(val->type))
-           SPEC_CVAL(val->type).v_ulong = sval ;
-       else
-           SPEC_CVAL(val->type).v_long = sval ;
-       SPEC_LONG(val->type) = 1;
+  if (SPEC_USIGN(val->type))
+      SPEC_CVAL(val->type).v_ulong = sval ;
+  else
+      SPEC_CVAL(val->type).v_long = sval ;
+  SPEC_LONG(val->type) = 1;
     }
     else {
-       if (SPEC_USIGN(val->type))
-           SPEC_CVAL(val->type).v_uint = sval ;
-       else
-           SPEC_CVAL(val->type).v_int = sval ;
+  if (SPEC_USIGN(val->type))
+      SPEC_CVAL(val->type).v_uint = sval ;
+  else
+      SPEC_CVAL(val->type).v_int = sval ;
     }
 
     // check the size and make it a short if required
     if (sval < 256 )
-       SPEC_SHORT(val->etype) = 1;                     
-    
+  SPEC_SHORT(val->etype) = 1;
+
     return val ;
-    
+
 }
 
 /*------------------------------------------------------------------*/
 /* copyStr - copies src to dest ignoring leading & trailing \"s     */
 /*------------------------------------------------------------------*/
-void   copyStr (char *dest, char *src )
+void  copyStr (char *dest, char *src )
 {
     unsigned int x;
     while (*src) {
-       if (*src == '\"' ) 
-           src++ ;
-       else
-           if ( *src == '\\' ) {
-               src++ ;
-               switch (*src) {
-               case 'n'        :
-                   *dest++ = '\n';
-                   break ;
-               case 't'        :
-                   *dest++ = '\t';
-                   break;
-               case 'v'        :
-                   *dest++ = '\v';
-                   break;
-               case 'b'        :
-                   *dest++ = '\b';
-                   break;
-               case 'r'        :
-                   *dest++ = '\r';
-                   break;
-               case 'f'        :
-                   *dest++ = '\f';
-                   break;
-               case 'a' :
-                   *dest++ = '\a';
-                   break;
-               case '0':
-                   /* embedded octal or hex constant */
-                   if (*(src+1) == 'x' ||
-                       *(src+1) == 'X') {
-                       x = strtol(src,&src,16);
-                       *dest++ = x;
-                   } else {
-                       /* must be octal */
-                       x = strtol(src,&src,8);
-                       *dest++ = x;
-                   }
-                   break;
-                       
-               case '\\':
-                   *dest++ = '\\';
-                   break;
-               case '\?':
-                   *dest++ = '\?';
-                   break;
-               case '\'':
-                   *dest++ = '\'';
-                   break;
-               case '\"':
-                   *dest++ = '\"';
-                   break;                  
-               default :
-                   *dest++ = *src ;
-               }
-               src++ ;
-           }
-           else
-               *dest++ = *src++ ;
+  if (*src == '\"' )
+      src++ ;
+  else
+      if ( *src == '\\' ) {
+    src++ ;
+    switch (*src) {
+    case 'n'  :
+        *dest++ = '\n';
+        break ;
+    case 't'  :
+        *dest++ = '\t';
+        break;
+    case 'v'  :
+        *dest++ = '\v';
+        break;
+    case 'b'  :
+        *dest++ = '\b';
+        break;
+    case 'r'  :
+        *dest++ = '\r';
+        break;
+    case 'f'  :
+        *dest++ = '\f';
+        break;
+    case 'a' :
+        *dest++ = '\a';
+        break;
+    case '0':
+        /* embedded octal or hex constant */
+        if (*(src+1) == 'x' ||
+      *(src+1) == 'X') {
+      x = strtol(src,&src,16);
+      *dest++ = x;
+        } else {
+      /* must be octal */
+      x = strtol(src,&src,8);
+      *dest++ = x;
+        }
+        break;
+
+    case '\\':
+        *dest++ = '\\';
+        break;
+    case '\?':
+        *dest++ = '\?';
+        break;
+    case '\'':
+        *dest++ = '\'';
+        break;
+    case '\"':
+        *dest++ = '\"';
+        break;
+    default :
+        *dest++ = *src ;
     }
-    
+    src++ ;
+      }
+      else
+    *dest++ = *src++ ;
+    }
+
     *dest = '\0' ;
 }
 
 /*------------------------------------------------------------------*/
-/* strVal - converts a string constant to a value                  */
+/* strVal - converts a string constant to a value       */
 /*------------------------------------------------------------------*/
-value *strVal  ( char  *s )
+value *strVal  ( char *s )
 {
     value *val ;
-    
-    val = newValue() ;       /* get a new one */
-    
-    /* get a declarator        */
+
+    val = newValue() ;        /* get a new one */
+
+    /* get a declarator */
     val->type   =  newLink();
     DCL_TYPE(val->type) = ARRAY ;
     DCL_ELEM(val->type) = strlen(s) - 1;
     val->type->next = val->etype = newLink() ;
-    val->etype->class      =  SPECIFIER;
+    val->etype->class     =  SPECIFIER;
     SPEC_NOUN(val->etype)   =  V_CHAR   ;
     SPEC_SCLS(val->etype)   =  S_LITERAL;
-    
-    ALLOC_ATOMIC(SPEC_CVAL(val->etype).v_char,strlen(s)+1);
+
+    SPEC_CVAL(val->etype).v_char = Safe_calloc(1,strlen(s)+1);
     copyStr (SPEC_CVAL(val->etype).v_char,s);
     return val;
 }
@@ -411,47 +412,47 @@ value *strVal  ( char     *s )
 /*------------------------------------------------------------------*/
 /* reverseValWithType - reverses value chain with type & etype      */
 /*------------------------------------------------------------------*/
-value  *reverseValWithType ( value *val )
+value *reverseValWithType ( value *val )
 {
-    link *type ;
-    link *etype;
-    
-    if (!val) 
-       return NULL ;
-    
+    sym_link *type ;
+    sym_link *etype;
+
+    if (!val)
+  return NULL ;
+
     /* save the type * etype chains */
     type = val->type ;
     etype = val->etype ;
-    
+
     /* set the current one 2b null */
     val->type = val->etype = NULL;
     val = reverseVal (val);
-    
+
     /* restore type & etype */
     val->type = type ;
     val->etype = etype ;
-    
+
     return val;
 }
 
 /*------------------------------------------------------------------*/
-/* reverseVal - reverses the values for a value  chain                     */
+/* reverseVal - reverses the values for a value  chain        */
 /*------------------------------------------------------------------*/
-value   *reverseVal   ( value  *val)
+value  *reverseVal   ( value  *val)
 {
     value  *prev  , *curr, *next ;
-    
+
     if (!val)
-       return NULL ;
-    
+  return NULL ;
+
     prev = val ;
     curr = val->next ;
-    
+
     while (curr) {
-       next = curr->next ;
-       curr->next = prev   ;
-       prev = curr ;
-       curr = next ;
+  next = curr->next ;
+  curr->next = prev   ;
+  prev = curr ;
+  curr = next ;
     }
     val->next = (void *) NULL ;
     return prev ;
@@ -463,13 +464,13 @@ value      *reverseVal   ( value  *val)
 value *copyValueChain ( value *src )
 {
     value *dest ;
-    
+
     if ( ! src )
-       return NULL ;
-    
+  return NULL ;
+
     dest = copyValue (src);
     dest->next = copyValueChain (src->next);
-    
+
     return dest ;
 }
 
@@ -479,90 +480,90 @@ value *copyValueChain ( value *src )
 value *copyValue  (value   *src)
 {
     value *dest ;
-    
+
     dest = newValue();
     dest->sym    = copySymbol(src->sym);
     strcpy(dest->name,src->name);
     dest->type   = (src->type ? copyLinkChain(src->type) : NULL) ;
     dest->etype  = (src->type ? getSpec(dest->type) : NULL);
-    
+
     return dest ;
 }
 
 /*------------------------------------------------------------------*/
-/* charVal - converts a character constant to a value              */
+/* charVal - converts a character constant to a value       */
 /*------------------------------------------------------------------*/
 value *charVal ( char *s )
 {
     value *val ;
-    
+
     val = newValue ();
-    
+
     val->type = val->etype = newLink();
     val->type->class = SPECIFIER  ;
     SPEC_NOUN(val->type) = V_CHAR ;
     SPEC_SCLS(val->type) = S_LITERAL ;
-    
-    s++ ;      /* get rid of quotation */
-    /* if \ then special processing    */
-    if ( *s == '\\' )  {
-       s++ ;   /* go beyond the backslash      */
-       switch (*s)             {
-       case 'n'        :
-           SPEC_CVAL(val->type).v_int = '\n';
-           break ;
-       case 't'        :
-           SPEC_CVAL(val->type).v_int = '\t';
-           break;
-       case 'v'        :
-           SPEC_CVAL(val->type).v_int = '\v';
-           break;
-       case 'b'        :
-           SPEC_CVAL(val->type).v_int = '\b';
-           break;
-       case 'r'        :
-           SPEC_CVAL(val->type).v_int = '\r';
-           break;
-       case 'f'        :
-           SPEC_CVAL(val->type).v_int = '\f';
-           break;
-       case 'a' :
-           SPEC_CVAL(val->type).v_int = '\a';
-           break;
-       case '\\':
-           SPEC_CVAL(val->type).v_int = '\\';
-           break;
-       case '\?':
-           SPEC_CVAL(val->type).v_int = '\?';
-           break;
-       case '\'':
-           SPEC_CVAL(val->type).v_int = '\'';
-           break;
-       case '\"':
-           SPEC_CVAL(val->type).v_int = '\"';
-           break;
-       case '0'        :
-           sscanf(s,"%o",&SPEC_CVAL(val->type).v_int);
-           break;
-       case 'x' :
-           s++ ; /* go behond the 'x' */
-           sscanf(s,"%x",&SPEC_CVAL(val->type).v_int);
-           break;
-       default :
-           SPEC_CVAL(val->type).v_int = *s;
-           break;
-       }
+
+    s++ ; /* get rid of quotation */
+    /* if \ then special processing */
+    if ( *s == '\\' ) {
+  s++ ; /* go beyond the backslash  */
+  switch (*s)   {
+  case 'n'  :
+      SPEC_CVAL(val->type).v_int = '\n';
+      break ;
+  case 't'  :
+      SPEC_CVAL(val->type).v_int = '\t';
+      break;
+  case 'v'  :
+      SPEC_CVAL(val->type).v_int = '\v';
+      break;
+  case 'b'  :
+      SPEC_CVAL(val->type).v_int = '\b';
+      break;
+  case 'r'  :
+      SPEC_CVAL(val->type).v_int = '\r';
+      break;
+  case 'f'  :
+      SPEC_CVAL(val->type).v_int = '\f';
+      break;
+  case 'a' :
+      SPEC_CVAL(val->type).v_int = '\a';
+      break;
+  case '\\':
+      SPEC_CVAL(val->type).v_int = '\\';
+      break;
+  case '\?':
+      SPEC_CVAL(val->type).v_int = '\?';
+      break;
+  case '\'':
+      SPEC_CVAL(val->type).v_int = '\'';
+      break;
+  case '\"':
+      SPEC_CVAL(val->type).v_int = '\"';
+      break;
+  case '0'  :
+      sscanf(s,"%o",&SPEC_CVAL(val->type).v_int);
+      break;
+  case 'x' :
+      s++ ; /* go behond the 'x' */
+      sscanf(s,"%x",&SPEC_CVAL(val->type).v_int);
+      break;
+  default :
+      SPEC_CVAL(val->type).v_int = *s;
+      break;
+  }
     }
-    else       /* not a backslash */
-       SPEC_CVAL(val->type).v_int = *s;
-    
+    else  /* not a backslash */
+  SPEC_CVAL(val->type).v_int = *s;
+
     return val ;
 }
 
 /*------------------------------------------------------------------*/
 /* valFromType - creates a value from type given                    */
 /*------------------------------------------------------------------*/
-value *valFromType ( link *type)
+value *valFromType ( sym_link *type)
 {
     value *val = newValue();
     val->type = copyLinkChain(type);
@@ -571,38 +572,38 @@ value *valFromType ( link *type)
 }
 
 /*------------------------------------------------------------------*/
-/* floatFromVal - value to unsinged integer conversion             */
+/* floatFromVal - value to unsinged integer conversion        */
 /*------------------------------------------------------------------*/
 double   floatFromVal ( value *val )
 {
     if (!val)
-       return 0;
+  return 0;
 
     if (val->etype && SPEC_SCLS(val->etype) != S_LITERAL) {
-       werror(E_CONST_EXPECTED,val->name);
-       return 0;
+  werror(E_CONST_EXPECTED,val->name);
+  return 0;
     }
-    
+
     /* if it is not a specifier then we can assume that */
     /* it will be an unsigned long                      */
     if (!IS_SPEC(val->type))
-       return (double) SPEC_CVAL(val->etype).v_ulong;
+  return (double) SPEC_CVAL(val->etype).v_ulong;
 
     if (SPEC_NOUN(val->etype) == V_FLOAT )
-       return (double) SPEC_CVAL(val->etype).v_float ;
+  return (double) SPEC_CVAL(val->etype).v_float ;
     else {
-       if (SPEC_LONG(val->etype)) {
-           if (SPEC_USIGN(val->etype))
-               return (double) SPEC_CVAL(val->etype).v_ulong ;
-           else
-               return (double) SPEC_CVAL(val->etype).v_long  ;
-       }
-       else {
-           if (SPEC_USIGN(val->etype))
-               return (double) SPEC_CVAL(val->etype).v_uint ;
-           else
-               return (double) SPEC_CVAL(val->etype).v_int  ;
-       }
+  if (SPEC_LONG(val->etype)) {
+      if (SPEC_USIGN(val->etype))
+    return (double) SPEC_CVAL(val->etype).v_ulong ;
+      else
+    return (double) SPEC_CVAL(val->etype).v_long  ;
+  }
+  else {
+      if (SPEC_USIGN(val->etype))
+    return (double) SPEC_CVAL(val->etype).v_uint ;
+      else
+    return (double) SPEC_CVAL(val->etype).v_int  ;
+  }
     }
 }
 
@@ -614,23 +615,23 @@ value *valUnaryPM (value   *val)
 {
     /* depending on type */
     if (SPEC_NOUN(val->etype) == V_FLOAT )
-       SPEC_CVAL(val->etype).v_float = -1.0 * SPEC_CVAL(val->etype).v_float;
+  SPEC_CVAL(val->etype).v_float = -1.0 * SPEC_CVAL(val->etype).v_float;
     else {
-       if ( SPEC_LONG(val->etype)) {
-           if (SPEC_USIGN(val->etype))
-               SPEC_CVAL(val->etype).v_ulong = - SPEC_CVAL(val->etype).v_ulong ;
-           else
-               SPEC_CVAL(val->etype).v_long  = - SPEC_CVAL(val->etype).v_long;
-       }
-       else {
-           if (SPEC_USIGN(val->etype))
-               SPEC_CVAL(val->etype).v_uint  = -  SPEC_CVAL(val->etype).v_uint ;
-           else
-               SPEC_CVAL(val->etype).v_int   = - SPEC_CVAL(val->etype).v_int ; 
-       }
+  if ( SPEC_LONG(val->etype)) {
+      if (SPEC_USIGN(val->etype))
+    SPEC_CVAL(val->etype).v_ulong = - SPEC_CVAL(val->etype).v_ulong ;
+      else
+    SPEC_CVAL(val->etype).v_long  = - SPEC_CVAL(val->etype).v_long;
+  }
+  else {
+      if (SPEC_USIGN(val->etype))
+    SPEC_CVAL(val->etype).v_uint  = -  SPEC_CVAL(val->etype).v_uint ;
+      else
+    SPEC_CVAL(val->etype).v_int   = - SPEC_CVAL(val->etype).v_int ;
+  }
     }
     return val ;
-    
+
 }
 
 /*------------------------------------------------------------------*/
@@ -640,16 +641,16 @@ value *valComplement ( value  *val)
 {
     /* depending on type */
     if ( SPEC_LONG(val->etype)) {
-       if (SPEC_USIGN(val->etype))
-           SPEC_CVAL(val->etype).v_ulong = ~SPEC_CVAL(val->etype).v_ulong ;
-       else
-           SPEC_CVAL(val->etype).v_long  = ~SPEC_CVAL(val->etype).v_long;
+  if (SPEC_USIGN(val->etype))
+      SPEC_CVAL(val->etype).v_ulong = ~SPEC_CVAL(val->etype).v_ulong ;
+  else
+      SPEC_CVAL(val->etype).v_long  = ~SPEC_CVAL(val->etype).v_long;
     }
     else {
-       if (SPEC_USIGN(val->etype))
-           SPEC_CVAL(val->etype).v_uint  = ~SPEC_CVAL(val->etype).v_uint ;
-       else
-           SPEC_CVAL(val->etype).v_int   = ~SPEC_CVAL(val->etype).v_int ; 
+  if (SPEC_USIGN(val->etype))
+      SPEC_CVAL(val->etype).v_uint  = ~SPEC_CVAL(val->etype).v_uint ;
+  else
+      SPEC_CVAL(val->etype).v_int   = ~SPEC_CVAL(val->etype).v_int ;
     }
     return val ;
 }
@@ -661,16 +662,16 @@ value *valNot ( value  *val)
 {
     /* depending on type */
     if ( SPEC_LONG(val->etype)) {
-       if (SPEC_USIGN(val->etype))
-           SPEC_CVAL(val->etype).v_ulong = !SPEC_CVAL(val->etype).v_ulong ;
-       else
-           SPEC_CVAL(val->etype).v_long  = !SPEC_CVAL(val->etype).v_long;
+  if (SPEC_USIGN(val->etype))
+      SPEC_CVAL(val->etype).v_ulong = !SPEC_CVAL(val->etype).v_ulong ;
+  else
+      SPEC_CVAL(val->etype).v_long  = !SPEC_CVAL(val->etype).v_long;
     }
     else {
-       if (SPEC_USIGN(val->etype))
-           SPEC_CVAL(val->etype).v_uint  = !SPEC_CVAL(val->etype).v_uint ;
-       else
-           SPEC_CVAL(val->etype).v_int   = !SPEC_CVAL(val->etype).v_int ; 
+  if (SPEC_USIGN(val->etype))
+      SPEC_CVAL(val->etype).v_uint  = !SPEC_CVAL(val->etype).v_uint ;
+  else
+      SPEC_CVAL(val->etype).v_int   = !SPEC_CVAL(val->etype).v_int ;
     }
     return val ;
 }
@@ -681,38 +682,38 @@ value *valNot ( value  *val)
 value *valMult (value  *lval, value *rval)
 {
     value *val ;
-    
+
     /* create a new value */
     val = newValue();
     val->type = val->etype = newLink();
     val->type->class = SPECIFIER  ;
-    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) || 
-                           IS_FLOAT(rval->etype) ? V_FLOAT : V_INT ); 
+    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) ||
+          IS_FLOAT(rval->etype) ? V_FLOAT : V_INT );
     SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
     SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
     SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-    
+
     if (IS_FLOAT(val->type))
-       SPEC_CVAL(val->type).v_float = floatFromVal(lval) * floatFromVal(rval);
+  SPEC_CVAL(val->type).v_float = floatFromVal(lval) * floatFromVal(rval);
     else {
-       if (SPEC_LONG(val->type)) {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) * 
-                   (unsigned long) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) * 
-                   (long) floatFromVal(rval);
-       }
-       else {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) * 
-                   (unsigned) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) * 
-                   (int) floatFromVal(rval);
-       }
+  if (SPEC_LONG(val->type)) {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) *
+        (unsigned long) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) *
+        (long) floatFromVal(rval);
+  }
+  else {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) *
+        (unsigned) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) *
+        (int) floatFromVal(rval);
+  }
     }
-    return val ;   
+    return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -723,41 +724,41 @@ value *valDiv  (value  *lval, value *rval)
     value *val ;
 
     if (floatFromVal(rval) == 0) {
-       werror(E_DIVIDE_BY_ZERO);
-       return rval;
+  werror(E_DIVIDE_BY_ZERO);
+  return rval;
     }
-       
+
     /* create a new value */
     val = newValue();
     val->type = val->etype = ((floatFromVal(lval) / floatFromVal(rval)) < 256 ?
-                             newCharLink() : newIntLink());
+            newCharLink() : newIntLink());
     if (IS_FLOAT(lval->etype) || IS_FLOAT(rval->etype))
-       SPEC_NOUN(val->etype) = V_FLOAT ;
+  SPEC_NOUN(val->etype) = V_FLOAT ;
     SPEC_SCLS(val->etype) = S_LITERAL ;
     SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
     SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-    
+
     if (IS_FLOAT(val->type))
-       SPEC_CVAL(val->type).v_float = floatFromVal(lval) / floatFromVal(rval);
+  SPEC_CVAL(val->type).v_float = floatFromVal(lval) / floatFromVal(rval);
     else {
-       if (SPEC_LONG(val->type)) {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) /
-                   (unsigned long) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) /
-                   (long) floatFromVal(rval);
-       }
-       else {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) /
-                   (unsigned) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) / 
-                   (int) floatFromVal(rval);
-       }
+  if (SPEC_LONG(val->type)) {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) /
+        (unsigned long) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) /
+        (long) floatFromVal(rval);
+  }
+  else {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) /
+        (unsigned) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) /
+        (int) floatFromVal(rval);
+  }
     }
-    return val ;   
+    return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -766,7 +767,7 @@ value *valDiv  (value  *lval, value *rval)
 value *valMod  (value  *lval, value *rval)
 {
     value *val ;
-    
+
     /* create a new value */
     val = newValue();
     val->type = val->etype = newLink();
@@ -775,25 +776,25 @@ value *valMod  (value  *lval, value *rval)
     SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
     SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
     SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-    
+
     if (SPEC_LONG(val->type)) {
-       if (SPEC_USIGN(val->type))
-           SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) % 
-               (unsigned long) floatFromVal(rval);
-       else
-           SPEC_CVAL(val->type).v_long = (unsigned long) floatFromVal(lval) % 
-               (unsigned long) floatFromVal(rval);
+  if (SPEC_USIGN(val->type))
+      SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) %
+    (unsigned long) floatFromVal(rval);
+  else
+      SPEC_CVAL(val->type).v_long = (unsigned long) floatFromVal(lval) %
+    (unsigned long) floatFromVal(rval);
     }
     else {
-       if (SPEC_USIGN(val->type))
-           SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) % 
-               (unsigned) floatFromVal(rval);
-       else
-           SPEC_CVAL(val->type).v_int = (unsigned) floatFromVal(lval) % 
-               (unsigned) floatFromVal(rval);
+  if (SPEC_USIGN(val->type))
+      SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) %
+    (unsigned) floatFromVal(rval);
+  else
+      SPEC_CVAL(val->type).v_int = (unsigned) floatFromVal(lval) %
+    (unsigned) floatFromVal(rval);
     }
-    
-    return val ;   
+
+    return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -802,38 +803,38 @@ value *valMod  (value  *lval, value *rval)
 value *valPlus (value  *lval, value *rval)
 {
     value *val ;
-    
+
     /* create a new value */
     val = newValue();
     val->type = val->etype = newLink();
     val->type->class = SPECIFIER  ;
-    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) || 
-                           IS_FLOAT(rval->etype) ? V_FLOAT : V_INT ); 
+    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) ||
+          IS_FLOAT(rval->etype) ? V_FLOAT : V_INT );
     SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
     SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
     SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-    
+
     if (IS_FLOAT(val->type))
-       SPEC_CVAL(val->type).v_float = floatFromVal(lval) + floatFromVal(rval);
+  SPEC_CVAL(val->type).v_float = floatFromVal(lval) + floatFromVal(rval);
     else {
-       if (SPEC_LONG(val->type)) {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) +
-                   (unsigned long) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) +
-                   (long) floatFromVal(rval);
-       }
-       else {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) +
-                   (unsigned) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) + 
-                   (int) floatFromVal(rval);
-       }
+  if (SPEC_LONG(val->type)) {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) +
+        (unsigned long) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) +
+        (long) floatFromVal(rval);
+  }
+  else {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) +
+        (unsigned) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) +
+        (int) floatFromVal(rval);
+  }
     }
-    return val ;     
+    return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -842,37 +843,37 @@ value *valPlus (value  *lval, value *rval)
 value *valMinus (value  *lval, value *rval)
 {
     value *val ;
-    
+
     /* create a new value */
     val = newValue();
     val->type = val->etype = newLink();
     val->type->class = SPECIFIER  ;
-    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) || 
-                           IS_FLOAT(rval->etype) ? V_FLOAT : V_INT ); 
+    SPEC_NOUN(val->type) = (IS_FLOAT(lval->etype) ||
+          IS_FLOAT(rval->etype) ? V_FLOAT : V_INT );
     SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
     SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
     SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-    
+
     if (IS_FLOAT(val->type))
-       SPEC_CVAL(val->type).v_float = floatFromVal(lval) - floatFromVal(rval);
+  SPEC_CVAL(val->type).v_float = floatFromVal(lval) - floatFromVal(rval);
     else {
-       if (SPEC_LONG(val->type)) {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) -
-                   (unsigned long) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) -
-                   (long) floatFromVal(rval);
-       }
-       else {
-           if (SPEC_USIGN(val->type))
-               SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) -
-                   (unsigned) floatFromVal(rval);
-           else
-               SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) - (int) floatFromVal(rval);
-       }
+  if (SPEC_LONG(val->type)) {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) -
+        (unsigned long) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) -
+        (long) floatFromVal(rval);
+  }
+  else {
+      if (SPEC_USIGN(val->type))
+    SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) -
+        (unsigned) floatFromVal(rval);
+      else
+    SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) - (int) floatFromVal(rval);
+  }
     }
-    return val ; 
+    return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -890,45 +891,45 @@ value *valShift (value  *lval, value *rval, int lr)
    SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
    SPEC_USIGN(val->type) = (SPEC_USIGN(lval->etype) | SPEC_USIGN(rval->etype));
    SPEC_LONG(val->type) = (SPEC_LONG(lval->etype) | SPEC_LONG(rval->etype));
-   
+
    if (lr) {
        if (SPEC_LONG(val->type)) {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) << 
-                  (unsigned long) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) << 
-                  (long) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) <<
+       (unsigned long) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) <<
+       (long) floatFromVal(rval);
        }
        else {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) << 
-                  (unsigned) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) << 
-                  (int) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) <<
+       (unsigned) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) <<
+       (int) floatFromVal(rval);
        }
    }
    else {
        if (SPEC_LONG(val->type)) {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) >>
-                  (unsigned long) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) >>
-                  (long) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) >>
+       (unsigned long) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) >>
+       (long) floatFromVal(rval);
        }
        else {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) >>
-                  (unsigned) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) >>
-                  (int) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) >>
+       (unsigned) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) >>
+       (int) floatFromVal(rval);
        }
    }
 
-   return val ;   
+   return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -943,15 +944,15 @@ value *valCompare (value  *lval, value *rval, int ctype)
    val->type = val->etype = newCharLink();
    val->type->class = SPECIFIER  ;
    SPEC_NOUN(val->type) = V_INT ;   /* type is int */
-   SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */   
+   SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
 
    switch (ctype)
    {
-   case '<' :                 
+   case '<' :
        SPEC_CVAL(val->type).v_int = floatFromVal(lval) < floatFromVal(rval);
        break ;
 
-   case '>' :    
+   case '>' :
        SPEC_CVAL(val->type).v_int = floatFromVal(lval) > floatFromVal(rval);
       break ;
 
@@ -970,10 +971,10 @@ value *valCompare (value  *lval, value *rval, int ctype)
    case NE_OP  :
        SPEC_CVAL(val->type).v_int = floatFromVal(lval) != floatFromVal(rval);
        break ;
-       
-   }                            
 
-   return val ;   
+   }
+
+   return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -992,63 +993,63 @@ value *valBitwise (value  *lval, value *rval, int op)
    {
    case '&' :
        if (SPEC_LONG(val->type)) {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) &
-                  (unsigned long) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) &
-                  (long) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) &
+       (unsigned long) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) &
+       (long) floatFromVal(rval);
        }
        else {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) &
-                  (unsigned) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) & (int) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) &
+       (unsigned) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_int = (int) floatFromVal(lval) & (int) floatFromVal(rval);
        }
        break ;
 
    case '|' :
        if (SPEC_LONG(val->type)) {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) |
-                  (unsigned long) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) |
-                  (long) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) |
+       (unsigned long) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) |
+       (long) floatFromVal(rval);
        }
        else {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) |
-                  (unsigned) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_int = 
-                  (int) floatFromVal(lval) | (int) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) |
+       (unsigned) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_int =
+       (int) floatFromVal(lval) | (int) floatFromVal(rval);
        }
+
       break ;
 
    case '^' :
        if (SPEC_LONG(val->type)) {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) ^
-                  (unsigned long) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) ^
-                  (long) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_ulong = (unsigned long) floatFromVal(lval) ^
+       (unsigned long) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_long = (long) floatFromVal(lval) ^
+       (long) floatFromVal(rval);
        }
        else {
-          if (SPEC_USIGN(val->type))
-              SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) ^
-                  (unsigned) floatFromVal(rval);
-          else
-              SPEC_CVAL(val->type).v_int = 
-                  (int) floatFromVal(lval) ^ (int) floatFromVal(rval);
+     if (SPEC_USIGN(val->type))
+         SPEC_CVAL(val->type).v_uint = (unsigned) floatFromVal(lval) ^
+       (unsigned) floatFromVal(rval);
+     else
+         SPEC_CVAL(val->type).v_int =
+       (int) floatFromVal(lval) ^ (int) floatFromVal(rval);
        }
-      break ;               
+      break ;
    }
 
-   return val ;   
+   return val ;
 }
 
 /*------------------------------------------------------------------*/
@@ -1062,7 +1063,7 @@ value *valLogicAndOr (value  *lval, value *rval, int op)
    val = newValue();
    val->type = val->etype = newCharLink();
    val->type->class = SPECIFIER  ;
-   SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */  
+   SPEC_SCLS(val->type) = S_LITERAL;/* will remain literal */
 
    switch (op)
    {
@@ -1074,20 +1075,20 @@ value *valLogicAndOr (value  *lval, value *rval, int op)
        SPEC_CVAL(val->type).v_int = floatFromVal(lval)  || floatFromVal(rval);
        break ;
    }
-  
-   
-   return val ;   
+
+
+   return val ;
 }
 
 /*------------------------------------------------------------------*/
 /* valCastLiteral - casts a literal value to another type           */
 /*------------------------------------------------------------------*/
-value *valCastLiteral (link *dtype, double fval)
+value *valCastLiteral (sym_link *dtype, double fval)
 {
     value *val ;
 
     if (!dtype)
-       return NULL ;
+  return NULL ;
 
     val = newValue();
     val->etype = getSpec (val->type = copyLinkChain(dtype));
@@ -1095,25 +1096,25 @@ value *valCastLiteral (link *dtype, double fval)
     /* if it is not a specifier then we can assume that */
     /* it will be an unsigned long                      */
     if (!IS_SPEC(val->type)) {
-       SPEC_CVAL(val->etype).v_ulong = (unsigned long) fval;
-       return val;
+  SPEC_CVAL(val->etype).v_ulong = (unsigned long) fval;
+  return val;
     }
 
     if (SPEC_NOUN(val->etype) == V_FLOAT )
-       SPEC_CVAL(val->etype).v_float = fval;
+  SPEC_CVAL(val->etype).v_float = fval;
     else {
-       if (SPEC_LONG(val->etype)) {
-           if (SPEC_USIGN(val->etype))
-               SPEC_CVAL(val->etype).v_ulong = (unsigned long) fval;
-           else
-               SPEC_CVAL(val->etype).v_long  = (long) fval;
-       }
-       else {
-           if (SPEC_USIGN(val->etype))
-               SPEC_CVAL(val->etype).v_uint = (unsigned int) fval;
-           else
-               SPEC_CVAL(val->etype).v_int  = (int) fval;   
-       }
+  if (SPEC_LONG(val->etype)) {
+      if (SPEC_USIGN(val->etype))
+    SPEC_CVAL(val->etype).v_ulong = (unsigned long) fval;
+      else
+    SPEC_CVAL(val->etype).v_long  = (long) fval;
+  }
+  else {
+      if (SPEC_USIGN(val->etype))
+    SPEC_CVAL(val->etype).v_uint = (unsigned int) fval;
+      else
+    SPEC_CVAL(val->etype).v_int  = (int) fval;
+  }
     }
     return val;
 }
@@ -1121,37 +1122,37 @@ value *valCastLiteral (link *dtype, double fval)
 /*------------------------------------------------------------------*/
 /* getNelements - determines # of elements from init list           */
 /*------------------------------------------------------------------*/
-int getNelements (link *type,initList *ilist)
+int getNelements (sym_link *type,initList *ilist)
 {
-    link *etype = getSpec(type);
+    sym_link *etype = getSpec(type);
     int i;
 
     if (! ilist)
-       return 0;
+  return 0;
 
     if (ilist->type == INIT_DEEP)
-       ilist = ilist->init.deep;
+  ilist = ilist->init.deep;
 
     /* if type is a character array and there is only one
        initialiser then get the length of the string */
     if (IS_ARRAY(type) && IS_CHAR(etype) && !ilist->next) {
-       ast *iast = ilist->init.node;
-       value *v = (iast->type == EX_VALUE ? iast->opval.val : NULL);
-       if (!v) {
-           werror(E_INIT_WRONG);
-           return 0;
-       }
-       if (!IS_ARRAY(v->type) || !IS_CHAR(v->etype)) {
-            werror(E_INIT_WRONG);
-            return 0;
-       }
-       return DCL_ELEM(v->type);
+  ast *iast = ilist->init.node;
+  value *v = (iast->type == EX_VALUE ? iast->opval.val : NULL);
+  if (!v) {
+      werror(E_INIT_WRONG);
+      return 0;
+  }
+  if (!IS_ARRAY(v->type) || !IS_CHAR(v->etype)) {
+       werror(E_INIT_WRONG);
+       return 0;
+  }
+  return DCL_ELEM(v->type);
     }
 
     i = 0 ;
     while (ilist) {
-       i++;
-       ilist = ilist->next;
+  i++;
+  ilist = ilist->next;
     }
 
     return i;
@@ -1168,55 +1169,55 @@ value *valForArray (ast *arrExpr)
     /* if the right or left is an array
        resolve it first */
     if (IS_AST_OP(arrExpr->left)) {
-       if (arrExpr->left->opval.op == '[')
-           lval = valForArray(arrExpr->left);
-       else
-           if (arrExpr->left->opval.op == '.')
-               lval = valForStructElem(arrExpr->left->left,
-                                       arrExpr->left->right);
-           else
-               if (arrExpr->left->opval.op == PTR_OP &&
-                   IS_ADDRESS_OF_OP(arrExpr->left->left))
-                   lval = valForStructElem(arrExpr->left->left->left,
-                                           arrExpr->left->right);
-               else
-                   return NULL;
-                   
+  if (arrExpr->left->opval.op == '[')
+      lval = valForArray(arrExpr->left);
+  else
+      if (arrExpr->left->opval.op == '.')
+    lval = valForStructElem(arrExpr->left->left,
+          arrExpr->left->right);
+      else
+    if (arrExpr->left->opval.op == PTR_OP &&
+        IS_ADDRESS_OF_OP(arrExpr->left->left))
+        lval = valForStructElem(arrExpr->left->left->left,
+              arrExpr->left->right);
+    else
+        return NULL;
+
     } else
-       if (!IS_AST_SYM_VALUE(arrExpr->left))
-           return NULL ;
-    
+  if (!IS_AST_SYM_VALUE(arrExpr->left))
+      return NULL ;
+
     if (!IS_AST_LIT_VALUE(arrExpr->right))
-       return NULL;
-    
+  return NULL;
+
     val = newValue();
     if (!lval)
-       sprintf(buffer,"%s",AST_SYMBOL(arrExpr->left)->rname);
+  sprintf(buffer,"%s",AST_SYMBOL(arrExpr->left)->rname);
     else
-       sprintf(buffer,"%s",lval->name);
-      
+  sprintf(buffer,"%s",lval->name);
+
     sprintf(val->name,"(%s + %d)",buffer,
-           (int)AST_LIT_VALUE(arrExpr->right)*size);    
-    
-    val->type = newLink();    
+      (int)AST_LIT_VALUE(arrExpr->right)*size);
+
+    val->type = newLink();
     if (SPEC_SCLS(arrExpr->left->etype) == S_CODE) {
-       DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+  DCL_TYPE(val->type) = CPOINTER ;
+  DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
-       if (SPEC_SCLS(arrExpr->left->etype) == S_XDATA)
-           DCL_TYPE(val->type) = FPOINTER;
-       else
-           if (SPEC_SCLS(arrExpr->left->etype) == S_XSTACK )
-               DCL_TYPE(val->type) = PPOINTER ;
-           else
-               if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA)
-                   DCL_TYPE(val->type) = IPOINTER ;
-               else
-                   if (SPEC_SCLS(arrExpr->left->etype) == S_EEPROM)
-                       DCL_TYPE(val->type) = EEPPOINTER ;
-                   else
-                       DCL_TYPE(val->type) = POINTER ;
+  if (SPEC_SCLS(arrExpr->left->etype) == S_XDATA)
+      DCL_TYPE(val->type) = FPOINTER;
+  else
+      if (SPEC_SCLS(arrExpr->left->etype) == S_XSTACK )
+    DCL_TYPE(val->type) = PPOINTER ;
+      else
+    if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA)
+        DCL_TYPE(val->type) = IPOINTER ;
+    else
+        if (SPEC_SCLS(arrExpr->left->etype) == S_EEPROM)
+      DCL_TYPE(val->type) = EEPPOINTER ;
+        else
+      DCL_TYPE(val->type) = POINTER ;
     val->type->next = arrExpr->left->ftype;
     val->etype = getSpec(val->type);
     return val;
@@ -1233,60 +1234,82 @@ value *valForStructElem(ast *structT, ast *elemT)
 
     /* left could be furthur derefed */
     if (IS_AST_OP(structT)) {
-       if (structT->opval.op == '[')
-           lval = valForArray(structT);
-       else
-           if (structT->opval.op == '.')
-               lval = valForStructElem(structT->left,structT->right);
-           else
-               if (structT->opval.op == PTR_OP &&
-                   IS_ADDRESS_OF_OP(structT->left))
-                   lval = valForStructElem(structT->left->left,
-                                           structT->right);
-               else
-                   return NULL;
+  if (structT->opval.op == '[')
+      lval = valForArray(structT);
+  else
+      if (structT->opval.op == '.')
+    lval = valForStructElem(structT->left,structT->right);
+      else
+    if (structT->opval.op == PTR_OP &&
+        IS_ADDRESS_OF_OP(structT->left))
+        lval = valForStructElem(structT->left->left,
+              structT->right);
+    else
+        return NULL;
     }
 
     if (!IS_AST_SYM_VALUE(elemT))
-       return NULL;
+  return NULL;
 
     if (!IS_STRUCT(structT->etype))
-       return NULL;
+  return NULL;
 
     if ((sym = getStructElement(SPEC_STRUCT(structT->etype),
-                               AST_SYMBOL(elemT))) == NULL) {
-       return NULL;
+        AST_SYMBOL(elemT))) == NULL) {
+  return NULL;
     }
 
     val = newValue();
     if (!lval)
-       sprintf(buffer,"%s",AST_SYMBOL(structT)->rname);
+  sprintf(buffer,"%s",AST_SYMBOL(structT)->rname);
     else
-       sprintf(buffer,"%s",lval->name);
-      
+  sprintf(buffer,"%s",lval->name);
+
     sprintf(val->name,"(%s + %d)",buffer,
-           (int)sym->offset);   
-    
+      (int)sym->offset);
+
     val->type = newLink();
     if (SPEC_SCLS(structT->etype) == S_CODE) {
-       DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+  DCL_TYPE(val->type) = CPOINTER ;
+  DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
-       if (SPEC_SCLS(structT->etype) == S_XDATA)
-           DCL_TYPE(val->type) = FPOINTER;
-       else
-           if (SPEC_SCLS(structT->etype) == S_XSTACK )
-               DCL_TYPE(val->type) = PPOINTER ;
-           else
-               if (SPEC_SCLS(structT->etype) == S_IDATA)
-                   DCL_TYPE(val->type) = IPOINTER ;
-               else
-                   if (SPEC_SCLS(structT->etype) == S_EEPROM)
-                       DCL_TYPE(val->type) = EEPPOINTER ;
-                   else
-                       DCL_TYPE(val->type) = POINTER ;
+  if (SPEC_SCLS(structT->etype) == S_XDATA)
+      DCL_TYPE(val->type) = FPOINTER;
+  else
+      if (SPEC_SCLS(structT->etype) == S_XSTACK )
+    DCL_TYPE(val->type) = PPOINTER ;
+      else
+    if (SPEC_SCLS(structT->etype) == S_IDATA)
+        DCL_TYPE(val->type) = IPOINTER ;
+    else
+        if (SPEC_SCLS(structT->etype) == S_EEPROM)
+      DCL_TYPE(val->type) = EEPPOINTER ;
+        else
+      DCL_TYPE(val->type) = POINTER ;
     val->type->next = sym->type;
     val->etype = getSpec(val->type);
-    return val; 
+    return val;
+}
+
+/*-----------------------------------------------------------------*/
+/* valForCastAggr - will return value for a cast of an aggregate   */
+/*                  plus minus a constant                          */
+/*-----------------------------------------------------------------*/
+value *valForCastAggr (ast *aexpr, sym_link *type, ast *cnst, int op)
+{
+    value *val;
+
+    if (!IS_AST_SYM_VALUE(aexpr)) return NULL;
+    if (!IS_AST_LIT_VALUE(cnst)) return NULL;
+
+    val = newValue();
+
+    sprintf(val->name,"(%s %c %d)",
+     AST_SYMBOL(aexpr)->rname, op,
+     getSize(type->next)*(int)AST_LIT_VALUE(cnst));
+
+    val->type = type;
+    val->etype = getSpec(val->type);
+    return val;
 }