X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCval.c;h=d944b5c8cd38ec6fed8f35ac4946bc1250d6854b;hb=717cf743781d6240414f10bc16b532bf54c9efd1;hp=8d65e07fb5d6e64e999ead39c2080ebf4b080e33;hpb=55d7cd1be4218fc0a7c8a1a0829adba7b46285d1;p=fw%2Fsdcc diff --git a/src/SDCCval.c b/src/SDCCval.c index 8d65e07f..d944b5c8 100644 --- a/src/SDCCval.c +++ b/src/SDCCval.c @@ -304,10 +304,13 @@ symbolVal (symbol * sym) } if (*sym->rname) - sprintf (val->name, "%s", sym->rname); + { + SNPRINTF (val->name, sizeof(val->name), "%s", sym->rname); + } else - sprintf (val->name, "_%s", sym->name); - + { + SNPRINTF (val->name, sizeof(val->name), "_%s", sym->name); + } return val; } @@ -348,10 +351,9 @@ value *cheapestVal (value *val) { if (sval<0) { if (sval>=-32768) { SPEC_LONG(val->type)=0; - SPEC_CVAL(val->type).v_int = sval & 0xffff; + SPEC_CVAL(val->type).v_int = sval; if (sval>=-128) { SPEC_NOUN(val->type)=V_CHAR; - SPEC_CVAL(val->type).v_int &= 0xff; } } } else { // sval>=0 @@ -378,11 +380,11 @@ valueFromLit (double lit) if ((((long) lit) - lit) == 0) { - sprintf (buffer, "%ld", (long) lit); + SNPRINTF (buffer, sizeof(buffer), "%ld", (long) lit); return constVal (buffer); } - sprintf (buffer, "%f", lit); + SNPRINTF (buffer, sizeof(buffer), "%f", lit); return constFloatVal (buffer); } @@ -401,8 +403,7 @@ constFloatVal (char *s) return constVal ("0"); } - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_FLOAT; SPEC_SCLS (val->type) = S_LITERAL; SPEC_CVAL (val->type).v_float = sval; @@ -423,8 +424,7 @@ value *constVal (char *s) val = newValue (); /* alloc space for value */ - val->type = val->etype = newLink (); /* create the spcifier */ - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); /* create the spcifier */ SPEC_SCLS (val->type) = S_LITERAL; // let's start with an unsigned char SPEC_NOUN (val->type) = V_CHAR; @@ -663,10 +663,9 @@ strVal (char *s) val = newValue (); /* get a new one */ /* get a declarator */ - val->type = newLink (); + val->type = newLink (DECLARATOR); DCL_TYPE (val->type) = ARRAY; - val->type->next = val->etype = newLink (); - val->etype->class = SPECIFIER; + val->type->next = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->etype) = V_CHAR; SPEC_SCLS (val->etype) = S_LITERAL; @@ -756,7 +755,7 @@ copyValue (value * src) dest = newValue (); dest->sym = copySymbol (src->sym); - strcpy (dest->name, src->name); + strncpyz (dest->name, src->name, SDCC_NAME_MAX); dest->type = (src->type ? copyLinkChain (src->type) : NULL); dest->etype = (src->type ? getSpec (dest->type) : NULL); @@ -774,8 +773,7 @@ charVal (char *s) val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_CHAR; SPEC_USIGN(val->type) = 1; SPEC_SCLS (val->type) = S_LITERAL; @@ -788,37 +786,37 @@ charVal (char *s) switch (*s) { case 'n': - SPEC_CVAL (val->type).v_int = '\n'; + SPEC_CVAL (val->type).v_uint = '\n'; break; case 't': - SPEC_CVAL (val->type).v_int = '\t'; + SPEC_CVAL (val->type).v_uint = '\t'; break; case 'v': - SPEC_CVAL (val->type).v_int = '\v'; + SPEC_CVAL (val->type).v_uint = '\v'; break; case 'b': - SPEC_CVAL (val->type).v_int = '\b'; + SPEC_CVAL (val->type).v_uint = '\b'; break; case 'r': - SPEC_CVAL (val->type).v_int = '\r'; + SPEC_CVAL (val->type).v_uint = '\r'; break; case 'f': - SPEC_CVAL (val->type).v_int = '\f'; + SPEC_CVAL (val->type).v_uint = '\f'; break; case 'a': - SPEC_CVAL (val->type).v_int = '\a'; + SPEC_CVAL (val->type).v_uint = '\a'; break; case '\\': - SPEC_CVAL (val->type).v_int = '\\'; + SPEC_CVAL (val->type).v_uint = '\\'; break; case '\?': - SPEC_CVAL (val->type).v_int = '\?'; + SPEC_CVAL (val->type).v_uint = '\?'; break; case '\'': - SPEC_CVAL (val->type).v_int = '\''; + SPEC_CVAL (val->type).v_uint = '\''; break; case '\"': - SPEC_CVAL (val->type).v_int = '\"'; + SPEC_CVAL (val->type).v_uint = '\"'; break; case '0' : @@ -890,17 +888,32 @@ floatFromVal (value * val) return (double) SPEC_CVAL (val->etype).v_long; } - if (SPEC_NOUN(val->etype)==V_INT) { + if (SPEC_NOUN (val->etype) == V_INT) { if (SPEC_USIGN (val->etype)) return (double) SPEC_CVAL (val->etype).v_uint; else return (double) SPEC_CVAL (val->etype).v_int; - } else { // SPEC_NOUN==V_CHAR + } + + if (SPEC_NOUN (val->etype) == V_CHAR) { if (SPEC_USIGN (val->etype)) - return (double) ((unsigned char)SPEC_CVAL (val->etype).v_uint); + return (double) (unsigned char)SPEC_CVAL (val->etype).v_uint; else - return (double) ((signed char)SPEC_CVAL (val->etype).v_int); + return (double) (signed char)SPEC_CVAL (val->etype).v_int; + } + + if (IS_BITVAR(val->etype)) { + return (double) SPEC_CVAL (val->etype).v_uint; } + + if (SPEC_NOUN (val->etype) == V_VOID) { + return (double) SPEC_CVAL (val->etype).v_ulong; + } + + // we are lost ! + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "floatFromVal: unknown value"); + return 0; } @@ -928,13 +941,16 @@ valUnaryPM (value * val) SPEC_CVAL (val->etype).v_uint = 0-SPEC_CVAL (val->etype).v_uint; else SPEC_CVAL (val->etype).v_int = -SPEC_CVAL (val->etype).v_int; - if (SPEC_NOUN (val->etype)==V_CHAR) { - SPEC_CVAL (val->etype).v_uint &= 0xff; - } } } // -(unsigned 3) now really is signed SPEC_USIGN(val->etype)=0; + // -(unsigned char)135 now really is an int + if (SPEC_NOUN(val->etype) == V_CHAR) { + if (SPEC_CVAL(val->etype).v_int < -128) { + SPEC_NOUN(val->etype) = V_INT; + } + } return val; } @@ -958,10 +974,9 @@ valComplement (value * val) 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_NOUN (val->etype)==V_CHAR) { - SPEC_CVAL (val->etype).v_uint &= 0xff; - } } + // ~(unsigned 3) now really is signed + SPEC_USIGN(val->etype)=0; return val; } @@ -985,9 +1000,6 @@ valNot (value * val) 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_NOUN (val->etype)==V_CHAR) { - SPEC_CVAL (val->etype).v_uint &= 0xff; - } } return val; } @@ -1002,8 +1014,7 @@ valMult (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); 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 */ @@ -1043,8 +1054,7 @@ valDiv (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink(); - val->type->class = SPECIFIER; + val->type = val->etype = newLink(SPECIFIER); SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) || IS_FLOAT (rval->etype) ? V_FLOAT : V_INT); SPEC_SCLS (val->etype) = S_LITERAL; @@ -1089,8 +1099,7 @@ valMod (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_INT; /* type is int */ SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */ SPEC_USIGN (val->type) = (SPEC_USIGN (lval->etype) & SPEC_USIGN (rval->etype)); @@ -1129,8 +1138,7 @@ valPlus (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); 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 */ @@ -1168,8 +1176,7 @@ valMinus (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); 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 */ @@ -1296,7 +1303,8 @@ valBitwise (value * lval, value * rval, int op) /* create a new value */ val = newValue (); - val->type = copyLinkChain (lval->type); + val->type = copyLinkChain (getSize(rval->type) > getSize(lval->type) ? + rval->type : lval->type); val->etype = getSpec (val->type); switch (op) @@ -1433,9 +1441,6 @@ valCastLiteral (sym_link * dtype, double fval) SPEC_CVAL (val->etype).v_uint = (unsigned short)l; else SPEC_CVAL (val->etype).v_int = (short)l; - if (SPEC_NOUN (val->etype)==V_CHAR) { - SPEC_CVAL (val->etype).v_uint &= 0xff; - } } } return val; @@ -1447,7 +1452,6 @@ valCastLiteral (sym_link * dtype, double fval) int getNelements (sym_link * type, initList * ilist) { - sym_link *etype = getSpec (type); int i; if (!ilist) @@ -1458,13 +1462,13 @@ getNelements (sym_link * type, initList * ilist) /* if type is a character array and there is only one (string) initialiser then get the length of the string */ - if (IS_ARRAY (type) && IS_CHAR (etype) && !ilist->next) + if (IS_ARRAY (type) && IS_CHAR (type->next) && !ilist->next) { ast *iast = ilist->init.node; value *v = (iast->type == EX_VALUE ? iast->opval.val : NULL); if (!v) { - werror (W_INIT_WRONG); + werror (E_CONST_EXPECTED); return 0; } @@ -1481,7 +1485,6 @@ getNelements (sym_link * type, initList * ilist) i++; ilist = ilist->next; } - return i; } @@ -1519,14 +1522,18 @@ valForArray (ast * arrExpr) val = newValue (); if (!lval) - sprintf (buffer, "%s", AST_SYMBOL (arrExpr->left)->rname); + { + SNPRINTF (buffer, sizeof(buffer), "%s", AST_SYMBOL (arrExpr->left)->rname); + } else - sprintf (buffer, "%s", lval->name); + { + SNPRINTF (buffer, sizeof(buffer), "%s", lval->name); + } - sprintf (val->name, "(%s + %d)", buffer, + SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer, (int) AST_LIT_VALUE (arrExpr->right) * size); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (arrExpr->left->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; @@ -1586,14 +1593,18 @@ valForStructElem (ast * structT, ast * elemT) val = newValue (); if (!lval) - sprintf (buffer, "%s", AST_SYMBOL (structT)->rname); + { + SNPRINTF(buffer, sizeof(buffer), "%s", AST_SYMBOL (structT)->rname); + } else - sprintf (buffer, "%s", lval->name); + { + SNPRINTF (buffer, sizeof(buffer), "%s", lval->name); + } - sprintf (val->name, "(%s + %d)", buffer, + SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer, (int) sym->offset); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (structT->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; @@ -1630,7 +1641,7 @@ valForCastAggr (ast * aexpr, sym_link * type, ast * cnst, int op) val = newValue (); - sprintf (val->name, "(%s %c %d)", + SNPRINTF (val->name, sizeof(val->name), "(%s %c %d)", AST_SYMBOL (aexpr)->rname, op, getSize (type->next) * (int) AST_LIT_VALUE (cnst)); @@ -1653,7 +1664,7 @@ valForCastArr (ast * aexpr, sym_link * type) val = newValue (); - sprintf (val->name, "(%s)", + SNPRINTF (val->name, sizeof(val->name), "(%s)", AST_SYMBOL (aexpr)->rname); val->type = type;