Fixed a character pointer bug
[fw/sdcc] / src / SDCCval.c
index 3c20fe8ac114d7835ab89d628eb24543c76b03f6..daf3f930f4c6497b6ea7bbbde5a9056370864bc7 100644 (file)
     You are forbidden to forbid anyone else to use, share and improve
     what you give them.   Help stamp out software-hoarding!  
 -------------------------------------------------------------------------*/
-#include <stdio.h>
-#include <string.h>
+
+#include "common.h"
 #include <math.h>
 #include <stdlib.h>
 #include <limits.h>
-#include "SDCCglobl.h"
-#include "SDCCsymt.h"
-#include "SDCCval.h"
-#include "SDCCast.h"
-#include "SDCCy.h"
 
 int            cNestLevel ;
 
@@ -583,7 +578,7 @@ double   floatFromVal ( value *val )
     if (!val)
        return 0;
 
-    if (SPEC_SCLS(val->etype) != S_LITERAL) {
+    if (val->etype && SPEC_SCLS(val->etype) != S_LITERAL) {
        werror(E_CONST_EXPECTED,val->name);
        return 0;
     }
@@ -1203,10 +1198,10 @@ value *valForArray (ast *arrExpr)
     sprintf(val->name,"(%s + %d)",buffer,
            (int)AST_LIT_VALUE(arrExpr->right)*size);    
     
-    val->type = newLink();
+    val->type = newLink();    
     if (SPEC_SCLS(arrExpr->left->etype) == S_CODE) {
        DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+       DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
        if (SPEC_SCLS(arrExpr->left->etype) == S_XDATA)
@@ -1218,7 +1213,10 @@ value *valForArray (ast *arrExpr)
                if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA)
                    DCL_TYPE(val->type) = IPOINTER ;
                else
-                   DCL_TYPE(val->type) = POINTER ;
+                   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;
@@ -1272,7 +1270,7 @@ value *valForStructElem(ast *structT, ast *elemT)
     val->type = newLink();
     if (SPEC_SCLS(structT->etype) == S_CODE) {
        DCL_TYPE(val->type) = CPOINTER ;
-       DCL_PTR_CONST(val->type) = 1;
+       DCL_PTR_CONST(val->type) = port->mem.code_ro;
     }
     else
        if (SPEC_SCLS(structT->etype) == S_XDATA)
@@ -1284,7 +1282,10 @@ value *valForStructElem(ast *structT, ast *elemT)
                if (SPEC_SCLS(structT->etype) == S_IDATA)
                    DCL_TYPE(val->type) = IPOINTER ;
                else
-                   DCL_TYPE(val->type) = POINTER ;
+                   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;