* as/hc08/lkaomf51.c (OutputName): made name unsigned char,
[fw/sdcc] / as / mcs51 / lklibr.c
index fb8091c467e58648a754d60f0ab221a91bfb8469..c08b8580d22c4e46274831c27c04088a2b5e3144 100644 (file)
 #define EQ(A,B) !strcmp((A),(B))
 #define MAXLINE 254 /*when using fgets*/
 
-#if defined(__APPLE__) && defined(__MACH__)
-#include <sys/types.h>
-#include <sys/malloc.h>
-#else
-#include <malloc.h>
-#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 #include "aslink.h"
 
 /*)Module      lklibr.c
@@ -53,7 +48,7 @@ typedef struct slibrarysymbol mlibrarysymbol;
 typedef struct slibrarysymbol *pmlibrarysymbol;
 
 struct slibrarysymbol {
-       char name[NCPS];
+       char * name; /*Warning: allocate memory before using*/
        pmlibrarysymbol next;
 };
 
@@ -62,16 +57,19 @@ typedef struct slibraryfile *pmlibraryfile;
 
 struct slibraryfile {
        int loaded;
-       char *libspc;
-       char *str;
-       char relfil[PATH_MAX];
-       char filename[PATH_MAX];
+       char * libspc;
+       char * relfil; /*Warning: allocate memory before using*/
+       char * filename; /*Warning: allocate memory before using*/
     long offset; //if > 0, the embedded file offset in the library file libspc
        pmlibrarysymbol symbols;
        pmlibraryfile next;
 };
 
+/* First entry in the library object symbol cache */
+pmlibraryfile libr=NULL;
+
 int buildlibraryindex();
+void freelibraryindex (void);
 #endif /* INDEXLIB */
 
 /*)Function    VOID    addpath()
@@ -165,7 +163,7 @@ addlib()
     }
     if(foundcount == 0)
     {
-        printf("?ASlink-Warning-Couldn't find library '%s'\n", ip);
+        fprintf(stderr, "?ASlink-Warning-Couldn't find library '%s'\n", ip);
     }
 }
 
@@ -382,7 +380,7 @@ search()
 }
 
 /*Load a .rel file embedded in a sdcclib file*/
-void LoadRel(FILE * libfp, char * ModName)
+void LoadRel(char * libfname, FILE * libfp, char * ModName)
 {
        char str[NINPUT+2];
        int state=0;
@@ -402,7 +400,8 @@ void LoadRel(FILE * libfp, char * ModName)
                                        if(EQ(str, ModName)) state=1;
                                        else
                                        {
-                                               printf("Bad offset in library file str=%s, Modname=%s\n", str, ModName);
+                                               fprintf(stderr, "?Aslink-Error-Bad offset in library file %s(%s)\n",
+                            libfname, ModName);
                                                lkexit(1);
                                        }
                                }
@@ -548,7 +547,7 @@ int SdccLib(char * PathLib, FILE * libfp, char * DirLib, char * SymName)
                                                
                                                /*Jump to where the .rel begins and load it.*/
                                                fseek(libfp, lbfh->offset, SEEK_SET);
-                                               LoadRel(libfp, ModName);
+                                               LoadRel(PathLib, libfp, ModName);
 
                                                /* if cdb information required & .adb file present */
                                                if (dflag && dfp)
@@ -643,9 +642,6 @@ int SdccLib(char * PathLib, FILE * libfp, char * DirLib, char * SymName)
 
 #ifdef INDEXLIB
 
-/* First entry in the library object symbol cache */
-mlibraryfile libr;
-
 int fndsym( char *name )
 {
        struct lbfile *lbfh, *lbf;
@@ -656,16 +652,15 @@ int fndsym( char *name )
     int numfound=0;
 
        /* Build the index if this is the first call to fndsym */
-       if (libr.next==NULL)
-               buildlibraryindex();
+       if (libr==NULL) buildlibraryindex();
        
        /* Iterate through all library object files */
-       ThisLibr = libr.next;
-    FirstFound = libr.next; /*So gcc stops whining*/
+       ThisLibr = libr;
+    FirstFound = libr; /*So gcc stops whining*/
        while (ThisLibr)
     {
                /* Iterate through all symbols in an object file */
-               ThisSym = ThisLibr->symbols->next;
+               ThisSym = ThisLibr->symbols;
 
                while (ThisSym)
         {
@@ -687,9 +682,9 @@ int fndsym( char *name )
                                                lbf->next = lbfh;
                                        }
                                        lbfh->libspc = ThisLibr->libspc;
-                                       lbfh->filspc = ThisLibr->str;
+                                       lbfh->filspc = ThisLibr->filename;
                                        lbfh->relfil = (char *) new (strlen(ThisLibr->relfil) + 1);
-                                       strcpy(lbfh->relfil,ThisLibr->relfil);
+                                       strcpy(lbfh->relfil, ThisLibr->relfil);
                     lbfh->offset = ThisLibr->offset;
                     if(lbfh->offset>0)
                     { /*For an embedded object file in a library*/
@@ -723,13 +718,13 @@ int fndsym( char *name )
                 {
                     char absPath1[PATH_MAX];
                     char absPath2[PATH_MAX];
-#if defined(__BORLANDC__) || defined(_MSC_VER)
+#if defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW32__)
                     int j;
 
                     _fullpath(absPath1, FirstFound->libspc, PATH_MAX);
                     _fullpath(absPath2, ThisLibr->libspc, PATH_MAX);
-                    for(j=0; absPath1[j]!=0; j++) absPath1[j]=tolower(absPath1[j]);
-                    for(j=0; absPath2[j]!=0; j++) absPath2[j]=tolower(absPath2[j]);
+                    for(j=0; absPath1[j]!=0; j++) absPath1[j]=tolower((unsigned char)absPath1[j]);
+                    for(j=0; absPath2[j]!=0; j++) absPath2[j]=tolower((unsigned char)absPath2[j]);
 #else
                     realpath(FirstFound->libspc, absPath1);
                     realpath(ThisLibr->libspc, absPath2);
@@ -738,12 +733,12 @@ int fndsym( char *name )
                     {
                         if(numfound==1)
                         {
-                            printf("?Aslink-Warning-Definition of public symbol '%s'"
+                            fprintf(stderr, "?Aslink-Warning-Definition of public symbol '%s'"
                                    " found more than once:\n", name);
-                            printf("   Library: '%s', Module: '%s'\n",
+                            fprintf(stderr, "   Library: '%s', Module: '%s'\n",
                                     FirstFound->libspc, FirstFound->relfil);
                         }
-                        printf("   Library: '%s', Module: '%s'\n",
+                        fprintf(stderr, "   Library: '%s', Module: '%s'\n",
                                 ThisLibr->libspc, ThisLibr->relfil);
                         numfound++;
                     }
@@ -760,6 +755,7 @@ pmlibraryfile buildlibraryindex_SdccLib(char * PathLib, FILE * libfp, char * Dir
 {
        char ModName[NCPS]="";
        char FLine[MAXLINE+1];
+    char buff[PATH_MAX];
        int state=0;
        long IndexOffset=0, FileOffset;
     pmlibrarysymbol ThisSym = NULL;
@@ -794,27 +790,29 @@ pmlibraryfile buildlibraryindex_SdccLib(char * PathLib, FILE * libfp, char * Dir
                                        sscanf(FLine, "%s %ld", ModName, &FileOffset);
                                        state=2;
 
-                    /*create a new libraryfile object for this module*/
-                                       This->next = (pmlibraryfile)new( sizeof( mlibraryfile ));
-                                       if (This->next == NULL)
+                    /*Create a new libraryfile object for this module*/
+                    if(libr==NULL)
                     {
-                                               printf("panic: can't allocate memory.\n");
-                                               exit(-1);
-                                       }
-
-                                       This=This->next;
+                        libr=This=(pmlibraryfile)new( sizeof( mlibraryfile ));
+                    }
+                    else
+                    {
+                                           This->next=(pmlibraryfile)new( sizeof( mlibraryfile ));
+                                           This=This->next;
+                    }
                                        This->next = NULL;
-                                       This->loaded=-1; /*Kind of useless, but...*/
+                                       This->loaded=-1;
                     This->offset=FileOffset+IndexOffset;
                                        This->libspc=PathLib;
+                    
+                    This->relfil=(char *)new(strlen(ModName)+1);
                                        strcpy(This->relfil, ModName);
-
-                    sprintf(This->filename, "%s%s%crel", DirLib, ModName, FSEPX);
-
-                    This->str=This->filename;
-
-                                       ThisSym = This->symbols = (pmlibrarysymbol)malloc( sizeof(mlibrarysymbol));
-                                       ThisSym->next = NULL;
+                    
+                    sprintf(buff, "%s%s%crel", DirLib, ModName, FSEPX);
+                    This->filename=(char *)new(strlen(buff)+1);
+                    strcpy(This->filename, buff);
+                    
+                    This->symbols=ThisSym=NULL; /*Start a new linked list of symbols*/
                                }
                 else if(EQ(FLine, "</INDEX>"))
                                {
@@ -831,14 +829,17 @@ pmlibraryfile buildlibraryindex_SdccLib(char * PathLib, FILE * libfp, char * Dir
                 else
                                {
                                        /*Add the symbols*/
-                                       ThisSym->next = (pmlibrarysymbol)malloc(sizeof(mlibrarysymbol));
-                                       ThisSym=ThisSym->next;
-                                       if (ThisSym == NULL)
+                    if(ThisSym==NULL) /*First symbol of the current module*/
                     {
-                                               printf("panic: can't allocate memory.\n");
-                                               exit(-2);
-                                       }
+                                           ThisSym=This->symbols=(pmlibrarysymbol)new(sizeof(mlibrarysymbol));
+                    }
+                    else
+                    {
+                                           ThisSym->next = (pmlibrarysymbol)new(sizeof(mlibrarysymbol));
+                                       ThisSym=ThisSym->next;
+                    }
                                        ThisSym->next=NULL;
+                    ThisSym->name=(char *)new(strlen(FLine)+1);
                                        strcpy(ThisSym->name, FLine);
                 }
             break;
@@ -860,14 +861,12 @@ int buildlibraryindex(void)
 {
        FILE *libfp, *fp;
        struct lbname *lbnh;
-       char relfil[NINPUT+2], *str, *path;
+       char relfil[NINPUT+2], str[PATH_MAX], *path;
        char buf[NINPUT+2], c;
        char symname[NINPUT+2];
-       pmlibraryfile This;
+       pmlibraryfile This=NULL;
        pmlibrarysymbol ThisSym;
 
-       This=&libr;
-
        /*
         * Search through every library in the linked list "lbnhead".
         */
@@ -876,7 +875,7 @@ int buildlibraryindex(void)
     {
                if ((libfp = fopen(lbnh->libspc, "r")) == NULL)
                {
-                       fprintf(stderr, "Cannot open library file %s\n",
+                       fprintf(stderr, "?Aslink-Error-Cannot open library file %s\n",
                                lbnh->libspc);
                        lkexit(1);
                }
@@ -894,8 +893,7 @@ int buildlibraryindex(void)
             chop_crlf(relfil);
             if (path != NULL)
             {
-                               str = (char *)new(strlen(path)+strlen(relfil)+6);
-                               strcpy(str,path);
+                               strcpy(str, path);
 #ifdef OTHERSYSTEM
                                if (str[strlen(str)-1] != '/')
                                {
@@ -905,15 +903,13 @@ int buildlibraryindex(void)
                        }
             else
             {
-                               str = (char *)new(strlen(relfil) + 5);
+                strcpy(str, "");
                        }
 
             if(strcmp(relfil, "<SDCCLIB>")==0)
                        {
-                /*Get the built in index of a library*/
+                /*Get the built in index of this library*/
                                This=buildlibraryindex_SdccLib(lbnh->libspc, libfp, str, This);
-                               free(str);
-                               fclose(libfp);
                                break; /*get the index for next library*/
                        }
                 
@@ -936,22 +932,28 @@ int buildlibraryindex(void)
             if ((fp = fopen(str, "r")) != NULL)
             {
                 /* Opened OK - create a new libraryfile object for it */
-                This->next = (pmlibraryfile)new( sizeof( mlibraryfile ));
-                if (This->next == NULL)
+                if(libr==NULL)
                 {
-                       printf("panic: can't allocate memory.\n");
-                       exit(-1);
+                    libr=This=(pmlibraryfile)new( sizeof( mlibraryfile ));
+                }
+                else
+                {
+                                       This->next=(pmlibraryfile)new( sizeof( mlibraryfile ));
+                               This=This->next;
                 }
-
-                           This=This->next;
                            This->next = NULL;
                            This->loaded=-1;
-                This->offset=-1; /*There should be a rel file*/
-
-                               strcpy( This->filename, str );
+                This->offset=-1; /*We have a stand alone .rel file*/
+                               This->libspc = lbnh->libspc;
+                
+                This->relfil=(char *)new(strlen(relfil)+1);
+                               strcpy(This->relfil, relfil);
+                
+                This->filename=(char *)new(strlen(str)+1);
+                               strcpy(This->filename, str);
 
-                               ThisSym = This->symbols = (pmlibrarysymbol)malloc( sizeof(mlibrarysymbol));
-                               ThisSym->next = NULL;
+                /*Start a new linked list of symbols for this module:*/
+                This->symbols=ThisSym=NULL;
 
                                /*
                                 * Read in the object file.  Look for lines that
@@ -982,28 +984,62 @@ int buildlibraryindex(void)
                                        /* If it's an actual symbol, record it */
                                if (c == 'D')
                     {
-                                               ThisSym->next = (pmlibrarysymbol)malloc(sizeof(mlibrarysymbol));
-                                               ThisSym=ThisSym->next;
-                                               if (ThisSym == NULL)
+                        if(ThisSym==NULL)
                         {
-                                                       printf("panic: can't allocate memory.\n");
-                                                       exit(-2);
-                                               }
+                                           ThisSym=This->symbols=(pmlibrarysymbol)new(sizeof(mlibrarysymbol));
+                        }
+                        else
+                        {
+                                                   ThisSym->next=(pmlibrarysymbol)new(sizeof(mlibrarysymbol));
+                                                   ThisSym=ThisSym->next;
+                        }
                                                This->loaded=0;
                                                ThisSym->next=NULL;
-                                               This->str = str;
-                                               strcpy(This->relfil,relfil);
+                        ThisSym->name=(char *)new(strlen(symname)+1);
                                                strcpy(ThisSym->name, symname);
-                                               This->libspc = lbnh->libspc;
                                        }
                                } /* Closes while - read object file */
                                fclose(fp);
                        } /* Closes if object file opened OK */
+            else
+            {
+                           fprintf(stderr, "?Aslink-Warning-Cannot open library module %s\n", str);
+            }
                } /* Ends while - processing all in libr */
                fclose(libfp);
        } /* Ends good open of libr file */
        return 0;
 }
+
+/*Release all memory allocated for the in-memory library index*/
+void freelibraryindex (void)
+{
+       pmlibraryfile ThisLibr, ThisLibr2Free;
+       pmlibrarysymbol ThisSym, ThisSym2Free;
+
+       ThisLibr = libr;
+
+    while (ThisLibr)
+    {
+               ThisSym = ThisLibr->symbols;
+
+               while (ThisSym)
+        {
+            free(ThisSym->name);
+            ThisSym2Free=ThisSym;
+            ThisSym=ThisSym->next;
+            free(ThisSym2Free);
+        }
+        free(ThisLibr->filename);
+        free(ThisLibr->relfil);
+        ThisLibr2Free=ThisLibr;
+        ThisLibr=ThisLibr->next;
+        free(ThisLibr2Free);
+    }
+    
+    libr=NULL;
+}
+
 #else /* INDEXLIB */
 
 int
@@ -1028,7 +1064,7 @@ char *name;
        {
                if ((libfp = fopen(lbnh->libspc, "r")) == NULL)
                {
-                       fprintf(stderr, "Cannot open library file %s\n",
+                       fprintf(stderr, "?Aslink-Error-Cannot open library file %s\n",
                                lbnh->libspc);
                        lkexit(1);
                }
@@ -1063,7 +1099,6 @@ char *name;
                        if(strcmp(relfil, "<SDCCLIB>")==0)
                        {
                                result=SdccLib(lbnh->libspc, libfp, str, name);
-                               fclose(libfp);
                                if(result) return(1); /*Found the symbol*/
                                free(str);
                                /*The symbol is not in the current library,
@@ -1176,7 +1211,7 @@ void loadfile_SdccLib(char * libspc, char * module, long offset)
        if ((fp = fopen(libspc,"r")) != NULL)
        {
                fseek(fp, offset, SEEK_SET);
-               LoadRel(fp, module);
+               LoadRel(libspc, fp, module);
                fclose(fp);
        }
 }
@@ -1217,6 +1252,9 @@ library()
                        loadfile_SdccLib(lbfh->libspc, lbfh->relfil, lbfh->offset);
                }
        }
+#ifdef INDEXLIB
+    freelibraryindex();
+#endif
 }
 
 /*)Function    VOID    loadfile(filspc)
@@ -1261,3 +1299,4 @@ char *filspc;
                fclose(fp);
        }
 }
+