scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit cfd8977458f82d690f2d1af9e378b4f1b743514b
parent 9fca757b99d81dd58763d1c2f5c59ab435923aa6
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:
Minclude/scc/scc/mach.h | 3++-
Msrc/libmach/coff32/coff32loadmap.c | 2+-
Msrc/libmach/newmap.c | 18+++++++++++++-----
Msrc/libmach/setmap.c | 25++++++++++++++-----------
4 files changed, 30 insertions(+), 18 deletions(-)

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 *); 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) { 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; +} 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; +}