fix "line #=0" and "missing function name" bugs in rsym data. There's one issue this fix causes - apparently macros will have their file/line # reported, instead of the location they are being invoked, but this is a far cry better than before.
Modified: trunk/reactos/tools/rsym.c

Modified: trunk/reactos/tools/rsym.c
--- trunk/reactos/tools/rsym.c	2006-01-15 00:51:40 UTC (rev 20879)
+++ trunk/reactos/tools/rsym.c	2006-01-15 01:12:00 UTC (rev 20880)
@@ -141,9 +141,10 @@
   PSTAB_ENTRY StabEntry;
   ULONG Count, i;
   ULONG_PTR Address, LastFunctionAddress;
-  int First;
+  int First = 1;
   char *Name;
   char FuncName[256];
+  PROSSYM_ENTRY Current;
 
   StabEntry = StabSymbolsBase;
   Count = StabSymbolsLength / sizeof(STAB_ENTRY);
@@ -161,11 +162,20 @@
       fprintf(stderr, "Failed to allocate memory for converted .stab symbols\n");
       return 1;
     }
+  Current = *SymbolsBase;
+  memset ( Current, 0, sizeof(*Current) );
 
   LastFunctionAddress = 0;
-  First = 1;
   for (i = 0; i < Count; i++)
     {
+      if ( 0 == LastFunctionAddress )
+        {
+          Address = StabEntry[i].n_value - ImageBase;
+        }
+      else
+        {
+          Address = LastFunctionAddress + StabEntry[i].n_value;
+        }
       switch (StabEntry[i].n_type)
         {
           case N_SO:
@@ -179,32 +189,37 @@
               {
                 continue;
               }
-            Address = StabEntry[i].n_value - ImageBase;
-            if (Address != (*SymbolsBase)[*SymbolsCount].Address && ! First)
+            if ( First || Address != Current->Address )
               {
-                (*SymbolsCount)++;
+                if ( !First )
+                  {
+                    memset ( ++Current, 0, sizeof(*Current) );
+                    Current->FunctionOffset = Current[-1].FunctionOffset;
+                  }
+                else
+                  First = 0;
+                Current->Address = Address;
               }
-            (*SymbolsBase)[*SymbolsCount].Address = Address;
-            (*SymbolsBase)[*SymbolsCount].FileOffset = FindOrAddString((char *) StabStringsBase
-                                                                       + StabEntry[i].n_strx,
-                                                                       StringsLength,
-                                                                       StringsBase);
-            (*SymbolsBase)[*SymbolsCount].FunctionOffset = 0;
-            (*SymbolsBase)[*SymbolsCount].SourceLine = 0;
-            LastFunctionAddress = 0;
+            Current->FileOffset = FindOrAddString((char *)StabStringsBase
+                                                  + StabEntry[i].n_strx,
+                                                  StringsLength,
+                                                  StringsBase);
             break;
           case N_FUN:
-            if (0 == StabEntry[i].n_desc || StabEntry[i].n_value < ImageBase) /* line # 0 isn't valid */
+            if (0 == StabEntry[i].n_desc || StabEntry[i].n_value < ImageBase)
               {
+                LastFunctionAddress = 0; /* line # 0 = end of function */
                 continue;
               }
-            Address = StabEntry[i].n_value - ImageBase;
-            if (Address != (*SymbolsBase)[*SymbolsCount].Address && ! First)
+            if ( First || Address != Current->Address )
               {
-                (*SymbolsCount)++;
-                (*SymbolsBase)[*SymbolsCount].FileOffset = (*SymbolsBase)[*SymbolsCount - 1].FileOffset;
+                if ( !First )
+                  memset ( ++Current, 0, sizeof(*Current) );
+                else
+                  First = 0;
+                Current->Address = Address;
+                Current->FileOffset = Current[-1].FileOffset;
               }
-            (*SymbolsBase)[*SymbolsCount].Address = Address;
             if (sizeof(FuncName) <= strlen((char *) StabStringsBase + StabEntry[i].n_strx))
               {
                 free(*SymbolsBase);
@@ -217,36 +232,32 @@
               {
                 *Name = '\0';
               }
-            (*SymbolsBase)[*SymbolsCount].FunctionOffset = FindOrAddString(FuncName,
-                                                                           StringsLength,
-                                                                           StringsBase);
-            (*SymbolsBase)[*SymbolsCount].SourceLine = 0;
+            Current->FunctionOffset = FindOrAddString(FuncName,
+                                                      StringsLength,
+                                                      StringsBase);
+            Current->SourceLine = 0;
             LastFunctionAddress = Address;
             break;
           case N_SLINE:
-            if (0 == LastFunctionAddress)
+            if ( First || Address != Current->Address )
               {
-                Address = StabEntry[i].n_value - ImageBase;
+                if ( !First )
+                  {
+                    memset ( ++Current, 0, sizeof(*Current) );
+                    Current->FileOffset = Current[-1].FileOffset;
+                    Current->FunctionOffset = Current[-1].FunctionOffset;
+                  }
+                else
+                  First = 0;
+                Current->Address = Address;
               }
-            else
-              {
-                Address = LastFunctionAddress + StabEntry[i].n_value;
-              }
-            if (Address != (*SymbolsBase)[*SymbolsCount].Address && ! First)
-              {
-                (*SymbolsCount)++;
-                (*SymbolsBase)[*SymbolsCount].FileOffset = (*SymbolsBase)[*SymbolsCount - 1].FileOffset;
-                (*SymbolsBase)[*SymbolsCount].FunctionOffset = (*SymbolsBase)[*SymbolsCount - 1].FunctionOffset;
-              }
-            (*SymbolsBase)[*SymbolsCount].Address = Address;
-            (*SymbolsBase)[*SymbolsCount].SourceLine = StabEntry[i].n_desc;
+            Current->SourceLine = StabEntry[i].n_desc;
             break;
           default:
             continue;
         }
-      First = 0;
     }
-  (*SymbolsCount)++;
+  *SymbolsCount = (Current - *SymbolsBase + 1);
 
   qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry);
 
@@ -265,6 +276,7 @@
   PCOFF_SYMENT CoffEntry;
   char FuncName[256];
   char *p;
+  PROSSYM_ENTRY Current;
 
   CoffEntry = (PCOFF_SYMENT) CoffSymbolsBase;
   Count = CoffSymbolsLength / sizeof(COFF_SYMENT);
@@ -275,12 +287,13 @@
       return 1;
     }
   *SymbolsCount = 0;
+  Current = *SymbolsBase;
 
   for (i = 0; i < Count; i++)
     {
       if (ISFCN(CoffEntry[i].e_type) || C_EXT == CoffEntry[i].e_sclass)
         {
-          (*SymbolsBase)[*SymbolsCount].Address = CoffEntry[i].e_value;
+          Current->Address = CoffEntry[i].e_value;
           if (0 < CoffEntry[i].e_scnum)
             {
               if (PEFileHeader->NumberOfSections < CoffEntry[i].e_scnum)
@@ -290,9 +303,9 @@
                           CoffEntry[i].e_scnum, PEFileHeader->NumberOfSections);
                   return 1;
                 }
-              (*SymbolsBase)[*SymbolsCount].Address += PESectionHeaders[CoffEntry[i].e_scnum - 1].VirtualAddress;
+              Current->Address += PESectionHeaders[CoffEntry[i].e_scnum - 1].VirtualAddress;
             }
-          (*SymbolsBase)[*SymbolsCount].FileOffset = 0;
+          Current->FileOffset = 0;
           if (0 == CoffEntry[i].e.e.e_zeroes)
             {
               if (sizeof(FuncName) <= strlen((char *) CoffStringsBase + CoffEntry[i].e.e.e_offset))
@@ -316,15 +329,16 @@
               *p = '\0';
             }
           p = ('_' == FuncName[0] || '@' == FuncName[0] ? FuncName + 1 : FuncName);
-          (*SymbolsBase)[*SymbolsCount].FunctionOffset = FindOrAddString(p,
+          Current->FunctionOffset = FindOrAddString(p,
                                                                          StringsLength,
                                                                          StringsBase);
-          (*SymbolsBase)[*SymbolsCount].SourceLine = 0;
-          (*SymbolsCount)++;
+          Current->SourceLine = 0;
+          memset ( ++Current, 0, sizeof(*Current) );
         }
       i += CoffEntry[i].e_numaux;
     }
 
+  *SymbolsCount = (Current - *SymbolsBase + 1);
   qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry);
 
   return 0;