libmach: Resize Map in setmap - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cfd8977458f82d690f2d1af9e378b4f1b743514b
 (DIR) parent 9fca757b99d81dd58763d1c2f5c59ab435923aa6
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Wed, 14 Feb 2024 19:34:07 +0100
       
       libmach: Resize Map in setmap
       
       In many cases we will not know the number of
       mappings at the very beginning, so resizing
       it in setmap makes sense.
       
       Diffstat:
         M include/scc/scc/mach.h              |       3 ++-
         M src/libmach/coff32/coff32loadmap.c  |       2 +-
         M src/libmach/newmap.c                |      18 +++++++++++++-----
         M src/libmach/setmap.c                |      25 ++++++++++++++-----------
       
       4 files changed, 30 insertions(+), 18 deletions(-)
       ---
 (DIR) diff --git a/include/scc/scc/mach.h b/include/scc/scc/mach.h
       @@ -113,7 +113,8 @@ extern int getindex(int, long *, char ***, long **, FILE *);
        
        #endif
        
       -extern Map *newmap(int);
       +extern Map *newmap(Map *, int);
       +extern Map *remap(Map *, int);
        
        extern Obj *newobj(int);
        extern void delobj(Obj *);
 (DIR) diff --git a/src/libmach/coff32/coff32loadmap.c b/src/libmach/coff32/coff32loadmap.c
       @@ -16,7 +16,7 @@ coff32loadmap(Obj *obj, FILE *fp)
                FILHDR *hdr = &coff->hdr;
        
                nsec = hdr->f_nscns;
       -        if ((map = newmap(nsec)) == NULL)
       +        if ((map = newmap(NULL, nsec)) == NULL)
                        return NULL;
        
                for (scn = coff->scns; nsec--; ++scn) {
 (DIR) diff --git a/src/libmach/newmap.c b/src/libmach/newmap.c
       @@ -9,11 +9,9 @@
        #include "libmach.h"
        
        Map *
       -newmap(int n)
       +remap(Map *map, int n)
        {
                size_t vsiz;
       -        struct mapsec *p;
       -        Map *map;
        
                if (n > SIZE_MAX/sizeof(struct mapsec))
                        goto out_range;
       @@ -22,11 +20,11 @@ newmap(int n)
                        goto out_range;
                vsiz += sizeof(*map);
        
       -        if ((map = malloc(vsiz)) == NULL)
       +        if ((map = realloc(map, vsiz)) == NULL)
                        return NULL;
        
                map->n = n;
       -        memset(map->sec, 0, vsiz);
       +        return map;
        
                return map;
        
       @@ -34,3 +32,13 @@ out_range:
                errno = ERANGE;
                return NULL;
        }
       +
       +Map *
       +newmap(Map *map, int n)
       +{
       +        if ((map = remap(map, n)) == NULL)
       +                return NULL;
       +        memset(map->sec, 0, n * sizeof(struct mapsec));
       +
       +        return map;
       +}
 (DIR) diff --git a/src/libmach/setmap.c b/src/libmach/setmap.c
       @@ -18,15 +18,19 @@ setmap(Map *map,
        
                n = map->n;
                for (sec = map->sec; n--; sec++) {
       -                if (!sec->name) {
       -                        sec->name = name;
       -                        sec->fp = fp,
       -                        sec->begin = begin;
       -                        sec->end = end;
       -                        sec->offset = off;
       -                        return 0;
       -                }
       +                if (!sec->name || !strcmp(sec->name, name))
       +                        goto found;
                }
        
       -        return -1;
       -}
       -\ No newline at end of file
       +        if ((map = remap(map, map->n+1 )) == NULL)
       +                return -1;
       +        sec = &map->sec[map->n-1];
       +
       +found:
       +        sec->name = name;
       +        sec->fp = fp,
       +        sec->begin = begin;
       +        sec->end = end;
       +        sec->offset = off;
       +        return 0;
       +}