Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: Notesfiles $Revision: 1.6.2.17 $; site ea.UUCP Path: utzoo!linus!decvax!ittvax!dcdwest!sdcsvax!akgua!whuxlm!whuxl!houxm!ihnp4!inuxc!pur-ee!uiucdcs!ea!jejones From: jejones@ea.UUCP Newsgroups: net.micro.6809 Subject: Microware C utility Message-ID: <7300013@ea.UUCP> Date: Sun, 28-Oct-84 12:05:00 EST Article-I.D.: ea.7300013 Posted: Sun Oct 28 12:05:00 1984 Date-Received: Sat, 3-Nov-84 04:16:15 EST Lines: 254 Nf-ID: #N:ea:7300013:000:5488 Nf-From: ea!jejones Oct 28 11:05:00 1984 [If people can post hex dumps of Macintosh programs to net.sources, ...?] The following program lets one split a Microware C library file into its component pieces. This has various uses, and in particular lets one insert one's own versions of functions. (The header file at the beginning is one that I use continually, out of revulsion at the thought of using ints for boolean quantities. At least I can hide the fact...) Down with Funky Stuff, James Jones ------------------------------TEAR HERE------------------------------ # This is a shell archive. Remove anything before this line, then # unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # bool.h LibSplit.c echo x - bool.h sed 's/^ //' > "bool.h" << '//E*O*F bool.h//' /* * bool.h -- a header for those of us who think that C really * should have a Boolean type... */ typedef int bool; #define TRUE 1 #define FALSE 0 //E*O*F bool.h// echo x - LibSplit.c sed 's/^ //' > "LibSplit.c" << '//E*O*F LibSplit.c//' /* * LibSplit -- split library files into their component "modules" * * usage: LibSplit libfile [module ...] * * semantics: LibSplit will read the specified library file and * split out its component "modules." If "module" names are * explicitly given on the command line, then only those "modules" * will be extracted; otherwise, all "modules" from the library * file will be extracted. Each selected "module" is written into * a separate file named after the "module." */ #include#include /* * We are only concerned with library file structure inasmuch as it * permits us to chop a file into its components. Thus you will not * see here as much detail as in, say, rdump; only the needed stuff. */ #define ROFSYNC 0x62cd2387 /* ROF "sync bytes" */ /* ("magic number" to Unixoids) */ #define SYMLEN 9 /* maximum symbol length */ #define MAXNAME 16 /* maximum "module" name length */ /* definition/reference */ typedef struct { char r_flag; /* type/location */ unsigned r_offset; } def_ref; /* "module" header structure */ typedef struct { long h_sync; /* should == ROFSYNC */ unsigned h_tylan; /* type/language/attr/revision */ char h_valid; /* asm valid? */ char h_date[5]; /* creation date */ char h_edit; /* edition # */ char h_spare; /* next, sizes of: */ unsigned h_glbl, /* globals */ h_dglbl, /* direct page globals */ h_data, /* data */ h_ddata, /* direct page data */ h_ocode; /* code */ unsigned h_stack, h_entry; } binhead; binhead header; FILE *LibFP, *ModFP; bool GetCurr; main(argc, argv) int argc; char *argv[]; { int i, NMods; bool GetAll; char ModName[MAXNAME + 1]; char *LibFName; if (argc < 2) { fprintf(stderr, "usage: LibSplit libfile [module ...]\n"); exit(1); } if (GetAll = (argc == 2)) NMods = 30000; else NMods = argc - 2; LibFName = argv[1]; if ((LibFP = fopen(LibFName, "r")) == NULL) { fprintf(stderr, "LibSplit: can't open %s\n", LibFName); exit(1); } while (NMods > 0) { if (fread(&header, sizeof(header), 1, LibFP) < 1) break; if (header.h_sync != ROFSYNC) { fprintf(stderr, "%s is not a library file\n", LibFName); exit(1); } GetName(ModName); if (GetAll) GetCurr = TRUE; else { GetCurr = FALSE; for (i = 2; i < argc; i++) { if (strcmp(ModName, argv[i]) == 0) { GetCurr = TRUE; break; } } } if (GetCurr) { NMods--; if ((ModFP = fopen(ModName, "w")) == NULL) { fprintf(stderr, "LibSplit: can't create %s\n", ModName); exit(1); } fwrite(&header, sizeof(header), 1, ModFP); PutName(ModName); } CopyGlobalDefs(); CopyCode(); CopyExtRefs(); CopyRefs(); /* local references */ if (GetCurr) fclose(ModFP); } fclose(LibFP); } CopyGlobalDefs() { int GCount, Offset; char GSym[SYMLEN + 1], flag; GCount = getw(LibFP); if (GetCurr) putw(GCount, ModFP); for (; GCount > 0; GCount--) { GetName(GSym); if (GetCurr) { PutName(GSym); putc((flag = getc(LibFP)), ModFP); putw((Offset = getw(LibFP)), ModFP); } else fseek(LibFP, (long)(sizeof(char) + sizeof(int)), 1); } } CopyCode() { int HowMuch; char buffer[BUFSIZ]; HowMuch = header.h_ocode + header.h_ddata + header.h_data; if (GetCurr) { for (; HowMuch >= BUFSIZ; HowMuch -= BUFSIZ) { fread(buffer, 1, BUFSIZ, LibFP); fwrite(buffer, 1, BUFSIZ, ModFP); } if (HowMuch > 0) { fread(buffer, 1, HowMuch, LibFP); fwrite(buffer, 1, HowMuch, ModFP); } } else fseek(LibFP, (long) HowMuch, 1); } CopyExtRefs() { int ECount; char ESym[SYMLEN + 1]; putw((ECount = getw(LibFP)), ModFP); for (; ECount > 0; ECount--) { GetName(ESym); if (GetCurr) PutName(ESym); CopyRefs(); } } CopyRefs() { int RCount; def_ref ref; RCount = getw(LibFP); if (GetCurr) { putw(RCount, ModFP); for (; RCount > 0; RCount--) { fread(&ref, sizeof(ref), 1, LibFP); fwrite(&ref, sizeof(ref), 1, ModFP); } } else fseek(LibFP, (long) (RCount * sizeof(ref)), 1); } GetName(s) char *s; { while (*(s++) = getc(LibFP)) ; } PutName(s) char *s; { fputs(s, ModFP); putc('\0', ModFP); } //E*O*F LibSplit.c// exit 0