win32api not available
[fw/sdcc] / src / SDCCsymt.c
index 51702c9e652f4aeef9d3d91a85957bfc77f7c635..217265cd1f8902dafbf89d314e5d1d88d0f67107 100644 (file)
@@ -112,6 +112,12 @@ addSym (bucket ** stab,
     checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
   }
 
+  /* prevent overflow of the (r)name buffers */
+  if (strlen(sname)>SDCC_SYMNAME_MAX) {
+    werror (W_SYMBOL_NAME_TOO_LONG, SDCC_SYMNAME_MAX);
+    sname[SDCC_SYMNAME_MAX]='\0';
+  }
+
   /* the symbols are always added at the head of the list  */
   i = hashKey (sname);
   /* get a free entry */
@@ -531,8 +537,9 @@ sym_link *
 mergeSpec (sym_link * dest, sym_link * src, char *name)
 {
 
-  sym_link *symlink;
+  sym_link *symlink=dest;
 
+#if 0
   if (!IS_SPEC(dest)) {
     // This can happen for pointers, find the end type
     while (dest && !IS_SPEC(dest))
@@ -550,6 +557,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name)
   } else {
     symlink=dest;
   }
+#endif
 
   if (!IS_SPEC(dest) || !IS_SPEC(src)) {
     werror (E_INTERNAL_ERROR, __FILE__, __LINE__, "cannot merge declarator");
@@ -1416,10 +1424,14 @@ computeType (sym_link * type1, sym_link * type2)
 
   reType = getSpec (rType);
 
-  /* if either of them unsigned then make this unsigned */
-  if ((SPEC_USIGN (etype1) || SPEC_USIGN (etype2)) && !IS_FLOAT (reType))
+  /* if either of them unsigned but not val then make this unsigned */
+  if (((!IS_LITERAL(type1) && SPEC_USIGN (etype1)) || 
+       (!IS_LITERAL(type2) && SPEC_USIGN (etype2))) && 
+      !IS_FLOAT (reType))
     SPEC_USIGN (reType) = 1;
-
+  else
+    SPEC_USIGN (reType) = 0;
+  
   /* if result is a literal then make not so */
   if (IS_LITERAL (reType))
     SPEC_SCLS (reType) = S_REGISTER;
@@ -1869,10 +1881,11 @@ void PT(sym_link *type)
 /*-----------------------------------------------------------------*/
 /* printTypeChain - prints the type chain in human readable form   */
 /*-----------------------------------------------------------------*/
-void 
-printTypeChain (sym_link * type, FILE * of)
+void
+printTypeChain (sym_link * start, FILE * of)
 {
   int nlr = 0;
+  sym_link * type, * search;
 
   if (!of)
     {
@@ -1880,61 +1893,70 @@ printTypeChain (sym_link * type, FILE * of)
       nlr = 1;
     }
 
+  if (start==NULL) {
+    fprintf (of, "**err**");
+    return;
+  }
+
+  /* print the chain as it is written in the source: */
+  /* start with the last entry                       */
+  for (type = start; type && type->next; type = type->next)
+    ;
   while (type)
     {
       if (IS_DECL (type))
        {
-         if (DCL_PTR_VOLATILE(type)) {
+         if (DCL_PTR_VOLATILE (type)) {
            fprintf (of, "volatile ");
          }
          switch (DCL_TYPE (type))
            {
            case FUNCTION:
-             fprintf (of, "function ");
+             fprintf (of, "function");
              break;
            case GPOINTER:
-             fprintf (of, "_generic * ");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "generic *");
              break;
            case CPOINTER:
-             fprintf (of, "_code * ");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "code *");
              break;
            case FPOINTER:
-             fprintf (of, "_far * ");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "far *");
              break;
            case EEPPOINTER:
-             fprintf (of, "_eeprom * ");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "eeprom * ");
              break;
 
            case POINTER:
-             fprintf (of, "_near * ");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "near *");
              break;
            case IPOINTER:
-             fprintf (of, "_idata *");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "idata *");
              break;
            case PPOINTER:
-             fprintf (of, "_pdata *");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "pdata *");
              break;
            case UPOINTER:
-             fprintf (of, " _unkown *");
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
+             fprintf (of, "unkown *");
              break;
            case ARRAY:
-             fprintf (of, "array of ");
+             fprintf (of, "array of");
              break;
            }
        }
@@ -1952,19 +1974,19 @@ printTypeChain (sym_link * type, FILE * of)
            case V_INT:
              if (IS_LONG (type))
                fprintf (of, "long ");
-             fprintf (of, "int ");
+             fprintf (of, "int");
              break;
 
            case V_CHAR:
-             fprintf (of, "char ");
+             fprintf (of, "char");
              break;
 
            case V_VOID:
-             fprintf (of, "void ");
+             fprintf (of, "void");
              break;
 
            case V_FLOAT:
-             fprintf (of, "float ");
+             fprintf (of, "float");
              break;
 
            case V_STRUCT:
@@ -1972,7 +1994,7 @@ printTypeChain (sym_link * type, FILE * of)
              break;
 
            case V_SBIT:
-             fprintf (of, "sbit ");
+             fprintf (of, "sbit");
              break;
 
            case V_BIT:
@@ -1980,15 +2002,20 @@ printTypeChain (sym_link * type, FILE * of)
              break;
 
            case V_DOUBLE:
-             fprintf (of, "double ");
+             fprintf (of, "double");
              break;
 
            default:
-             fprintf (of, "unknown type ");
+             fprintf (of, "unknown type");
              break;
            }
        }
-      type = type->next;
+       /* search entry in list before "type" */
+    for (search = start; search && search->next != type;)
+       search = search->next;
+    type = search;
+    if (type)
+      fputc (' ', of);
     }
   if (nlr)
     fprintf (of, "\n");
@@ -1997,7 +2024,7 @@ printTypeChain (sym_link * type, FILE * of)
 /*-----------------------------------------------------------------*/
 /* cdbTypeInfo - print the type information for debugger           */
 /*-----------------------------------------------------------------*/
-void 
+void
 cdbTypeInfo (sym_link * type, FILE * of)
 {
   fprintf (of, "{%d}", getSize (type));