ref: dccebc26a1d24f28a40b96d428e6409999ae01f8
dir: /src/libmach/objread.c/
#include <stdio.h> #include <scc/mach.h> #include "libmach.h" static int (*freadv[])(Obj *, FILE *) = { [COFF32] = coff32read, }; static int (*fsymsv[])(Obj *) = { [COFF32] = coff32getsyms, }; static int (*fsectsv[])(Obj *) = { [COFF32] = coff32getsect, }; static int getsects(Obj *obj) { int fmt; fmt = FORMAT(obj->type); if (fmt >= NFORMATS) return -1; return (*fsectsv[fmt])(obj); } static int getsyms(Obj *obj) { int fmt; fmt = FORMAT(obj->type); if (fmt >= NFORMATS) return -1; return (*fsymsv[fmt])(obj); } static int readfile(Obj *obj, FILE *fp) { int fmt; fmt = FORMAT(obj->type); if (fmt >= NFORMATS) return -1; if ((*freadv[fmt])(obj, fp) < 0) return -1; obj->fp = fp; return 0; } int objread(Obj *obj, FILE *fp) { objfree(obj, TARGETDEL | GENERICDEL); if (readfile(obj, fp) < 0) goto err; if (getsyms(obj) < 0) goto err; if (getsects(obj) < 0) goto err; return 0; err: objfree(obj, TARGETDEL | GENERICDEL); return -1; }