scc

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

commit a4c40d95dec037a875469cddc7987c8d3783c86a
parent 260689938154916eebc6d7002c81f001a8771ab3
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Fri,  8 May 2026 19:44:40 +0200

libmach: Unify coff32getidx and elfgetidx

Diffstat:
Msrc/libmach/Makefile | 1+
Msrc/libmach/coff32/Makefile | 2--
Dsrc/libmach/coff32/coff32getidx.c | 13-------------
Dsrc/libmach/coff32/coff32xgetidx.c | 73-------------------------------------------------------------------------
Asrc/libmach/getidx32.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/libmach/getindex.c | 17+++++++++++++----
Msrc/libmach/libmach.h | 2+-
7 files changed, 87 insertions(+), 93 deletions(-)

diff --git a/src/libmach/Makefile b/src/libmach/Makefile @@ -17,6 +17,7 @@ OBJS =\ delobj.o\ findsec.o\ findseg.o\ + getidx32.o\ getindex.o\ getsec.o\ getsym.o\ diff --git a/src/libmach/coff32/Makefile b/src/libmach/coff32/Makefile @@ -6,7 +6,6 @@ include $(PROJECTDIR)/scripts/rules.mk OBJS =\ coff32archs.o\ coff32del.o\ - coff32getidx.o\ coff32getsec.o\ coff32getsym.o\ coff32loadmap.o\ @@ -20,7 +19,6 @@ OBJS =\ coff32strip.o\ coff32type.o\ coff32write.o\ - coff32xgetidx.o\ COFFHDRS =\ $(INCDIR)/bits/scc/coff32/aouthdr.h\ diff --git a/src/libmach/coff32/coff32getidx.c b/src/libmach/coff32/coff32getidx.c @@ -1,13 +0,0 @@ -#include <stdio.h> - -#include <scc/mach.h> -#include <scc/coff32.h> - -#include "../libmach.h" -#include "fun.h" - -int -coff32getidx(long *nsyms, char ***namep, long **offsp, FILE *fp) -{ - return coff32xgetidx(BIG_ENDIAN, nsyms, namep, offsp, fp); -} diff --git a/src/libmach/coff32/coff32xgetidx.c b/src/libmach/coff32/coff32xgetidx.c @@ -1,73 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <scc/mach.h> -#include <scc/cstd.h> -#include <scc/coff32.h> - -#include "../libmach.h" -#include "fun.h" - -int -coff32xgetidx(int order, long *nsyms, char ***namep, long **offsp, FILE *fp) -{ - long i, n; - long *offs; - char **names; - unsigned char buf[EXTIDENTSIZ+1]; - - if (fread(buf, 4, 1, fp) != 1) - return -1; - unpack(order, buf, "l", &n); - - if (n <= 0) - return -1; - - if ((names = calloc(sizeof(char *), n)) == NULL) - return -1; - - if ((offs = calloc(sizeof(long), n)) == NULL) - goto err1; - - for (i = 0; i < n; i++) { - fread(buf, 4, 1, fp); - unpack(order, buf, "l", offs[i]); - } - - for (i = 0; i < n; i++) { - int j, c; - char *s; - - for (j = 0; j < EXTIDENTSIZ; j++) { - if ((c = getc(fp)) == EOF || c == '\0') - break; - buf[j] = c; - } - if (c != '\0') - goto err2; - buf[j] = '\0'; - - if ((s = malloc(j)) == NULL) - goto err2; - memcpy(s, buf, j); - names[i]= s; - } - - if (ferror(fp)) - goto err2; - - *offsp = offs; - *namep = names; - *nsyms = n; - - return 0; - -err2: - free(offs); -err1: - for (i = 0; i < n; i++) - free(names[i]); - free(*names); - return -1; -} diff --git a/src/libmach/getidx32.c b/src/libmach/getidx32.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <scc/mach.h> +#include <scc/cstd.h> +#include <scc/coff32.h> + +#include "libmach.h" + +int +getidx32(int order, long *nsyms, char ***namep, long **offsp, FILE *fp) +{ + long i, n; + long *offs; + char **names; + unsigned char buf[EXTIDENTSIZ+1]; + + if (fread(buf, 4, 1, fp) != 1) + return -1; + unpack(order, buf, "l", &n); + + if (n <= 0) + return -1; + + if ((names = calloc(sizeof(char *), n)) == NULL) + return -1; + + if ((offs = calloc(sizeof(long), n)) == NULL) + goto err1; + + for (i = 0; i < n; i++) { + fread(buf, 4, 1, fp); + unpack(order, buf, "l", offs[i]); + } + + for (i = 0; i < n; i++) { + int j, c; + char *s; + + for (j = 0; j < EXTIDENTSIZ; j++) { + if ((c = getc(fp)) == EOF || c == '\0') + break; + buf[j] = c; + } + if (c != '\0') + goto err2; + buf[j] = '\0'; + + if ((s = malloc(j)) == NULL) + goto err2; + memcpy(s, buf, j); + names[i]= s; + } + + if (ferror(fp)) + goto err2; + + *offsp = offs; + *namep = names; + *nsyms = n; + + return 0; + +err2: + free(offs); +err1: + for (i = 0; i < n; i++) + free(names[i]); + free(*names); + return -1; +} diff --git a/src/libmach/getindex.c b/src/libmach/getindex.c @@ -8,9 +8,13 @@ #include "elf/fun.h" #include "coff32/fun.h" -static int (*ops[NFORMATS])(long *, char ***, long **, FILE *) = { - [COFF32] = coff32getidx, -}; +static int (*ops[NFORMATS])(int, long *, char ***, long **, FILE *); + +static int +getidx(int type, long *nsyms, char ***namep, long **offsp, FILE *fp) +{ + return getidx32(BIG_ENDIAN, nsyms, namep, offsp, fp); +} int getindex(int type, long *nsyms, char ***names, long **offs, FILE *fp) @@ -23,6 +27,11 @@ getindex(int type, long *nsyms, char ***names, long **offs, FILE *fp) return -1; } - return (*ops[fmt])(nsyms, names, offs, fp); + return (*ops[fmt])(type, nsyms, names, offs, fp); } +static int (*ops[NFORMATS])(int, long *, char ***, long **, FILE *) = { + [COFF32] = getidx, + [ELF] = getidx, +}; + diff --git a/src/libmach/libmach.h b/src/libmach/libmach.h @@ -1,7 +1,7 @@ #ifdef stdin int copysec(Mapsec *, FILE *); int setidx32(int, long, char *[], long [], FILE *); -int setidx64(int, long, char *[], long [], FILE *); +int getidx32(int, long *, char ***, long **, FILE *); #endif /* common functions */