- 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
- DCL_TYPE(val->type) = POINTER ;
- val->type->next = sym->type;
- val->etype = getSpec(val->type);
- return val;
+ else
+ {
+ SNPRINTF (buffer, sizeof(buffer), "%s", lval->name);
+ }
+
+ SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer,
+ (int) sym->offset);
+
+ val->type = newLink (DECLARATOR);
+ if (SPEC_SCLS (structT->etype) == S_CODE)
+ {
+ 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;
+ val->type->next = sym->type;
+ val->etype = getSpec (val->type);
+ 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 ();
+
+ SNPRINTF (val->name, sizeof(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;
+}
+
+/*-----------------------------------------------------------------*/
+/* valForCastAggr - will return value for a cast of an aggregate */
+/* with no constant */
+/*-----------------------------------------------------------------*/
+value *
+valForCastArr (ast * aexpr, sym_link * type)
+{
+ value *val;
+
+ if (!IS_AST_SYM_VALUE (aexpr))
+ return NULL;
+
+ val = newValue ();
+
+ SNPRINTF (val->name, sizeof(val->name), "(%s)",
+ AST_SYMBOL (aexpr)->rname);
+
+ val->type = type;
+ val->etype = getSpec (val->type);
+ return val;