billr@saab.CNA.TEK.COM (Bill Randle) (02/09/91)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 12, Issue 32 Archive-name: NetHack3/Patch10h Patch-To: NetHack3: Volume 7, Issue 56-93 Environment: #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 8 (of 8)." # Contents: Install.mac others/exesmurf.c others/exesmurf.doc # src/lev_main.c # Wrapped by billr@saab on Fri Feb 8 17:19:03 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Install.mac' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'Install.mac'\" to \"'Install.mac.orig'\" mv -f 'Install.mac' 'Install.mac.orig' fi echo shar: Extracting \"'Install.mac'\" \(15825 characters\) sed "s/^X//" >'Install.mac' <<'END_OF_FILE' XMacintosh NetHack 3.0 (Patchlevel 10) Installation Guide Xlast modified: January 27th, 1991 X(A fixed width font is recommended for this document, Courier 10) X X XAcknowledgements X================ XOriginal credit for porting NetHack 3.0 to the Macintosh goes to Johnny XLee and Michael Sokolov. David Hairston, Kevin Sitze, Andy Swanson, Jon XWatte and Tom West helped polish this port in later versions. X X XPreliminary Notes X================ XThese instructions are optimized for the Think C 4.0 compiler. Other XMacintosh compilers should be okay however some work will be needed to Xcomplete the build. For other compilers that use "make", you can use the Xvarious Makefiles and your compiler errors as guides in building the game. X XYou should maintain the file/folder structure given in the distribution Xfile "Files". These notes assume that file structure which is outlined Xbelow. Place the "top" folder appropriately in your compilers development Xfolder. You'll need ~6MB disk space for Macintosh only development, Xhowever you will use less space by cleaning up after each phase of the Xbuild detailed below. X X XDistribution File Structure (Think C 4.0) X================ Xtop {folder, appropriately placed in Think C 4.0 development tree} X Files X Install.mac X Makefile.top {if you need Makefiles, Think C 4.0 doesn't} X auxil {folder} X all auxiliary support files. X include {folder} X all header files. X mac {folder} X all Macintosh specific files. X others {folder} X pcconf.c, pcmain.c, pctty.c & random.c only. X **** remove this copy of lev_lex.c! **** X src {folder} X all source files. X **** keep this copy of lev_lex.c! **** X X XNon-Think C 4.0 Users X================ XIf your compiler doesn't handle subfolders you'll need to place all the Xinter-related source (*.c) and header (*.h) files in a common folder. It Xwill require some work but you should be able to follow the dependencies Xin the Makefiles to build the game. X XIf your compiler utilizes the make/Makefile facilities, then remove the Xtags from the Makefiles (auxil, src and top) and edit appropriately. X X XGetting Started X================ XUsers of Think C 4.0 should decode the 5 BinHex 4.0 encoded *.hqx files in Xthe mac folder, thus creating 3 Think C project files and 2 associated XResEdit resource files. There are various BinHex 4.0 decoders which can Xdo this, including the applications BinHex 4.0 and Stuffit and the desk Xaccessory BinHqx DA 1.02. Move the 5 extracted files (makedefs.proj, Xmakedefs.proj.rsrc, sp_lev.proj, nethack.proj and nethack.proj.rsrc) to Xthe "top" folder. X XUse your favorite text editor to create an empty file of type "TEXT". XName this file "news" and save it in the auxil folder. If you decide to Xuse the NEWS compile option (recommended) then write a message in the X"news" file which may get displayed at the start of every game. X XCreate a folder called "Dungeon" in the "top" folder. This is where we'll Xplace the files needed to run NetHack. X XFinally, Think C 4.0 users should have no problem compiling the NetHack Xsources, as distributed. If you make changes to the sources then consider Xbacking up your disk to prevent problems. Also, trash (or alter the Xcreator signature of) older versions of NetHack 3.0 to avoid conflicts. X XOkay, let's get started. We're going to make 3 applications, in order: X(1) makedefs, to create customized files for the game, (2) spec_lev, to Xcreate special challenging maze-like levels and (3) nethack! The full Xbuild from scratch takes about an hour using Think C 4.0 . X X XMacintosh Configuration X================ XEdit the header file "config.h" (in the include folder) as follows. The Xchanges below occur sequentially. Scan forward to find: X X * Section 1: OS selection. X XComment out: #define UNIX XUncomment : #define MACOS {bottom of the ifdef __MSDOS__ else clause}. X XScan forward to the segment: X X#ifdef MACOS X#define THINKC4 /* for the Think C 4.0 compiler */ X XNote that marginal support has been provided for other compilers but it Xwill take some work to complete the build using those compilers. This Xsegment is configured properly for Think C 4.0 users, by default. If your Xcompiler doesn't handle the "defined(x)" compiler directive then you Xshould define "KR1ED", this is done automatically here for LSC and AZTEC. X XScan forward to: X X * Section 2: Some global parameters and filenames. X XChange "izchak" to a suitable wizard id. A good choice is "wizard". XThis is the name that needs to appear in the NetHack "Set Options..." Xdialog in order to enable the selection of wizard (debug) mode. X XComment out: #define LOGFILE "logfile" X XScan forward to: X X * Section 3: Definitions that may vary with system type. X XThe configuration here is okay for THINKC4, LSC and AZTEC. X XScan forward to: X X * Section 4: THE FUN STUFF!!! X XThe defines here default to configuring a full-featured game. If you want Xa current indicator of your score during play (recommended) then X XUncomment: #define SCORE_ON_BOTL X XSave the config.h file. X XIf you customize the game then look at the header files macconf.h and Xsystem.h. This isn't necessary for simply building the default game. X X XBuilding Makedefs X================ XMakedefs depends on the source files: X alloc.c macfile.c makedefs.c monst.c objects.c panic.c X XThink C 4.0 users should open the project file "makedefs.proj". Others Xshould refer to Makefile.src for help. X XWe need to re-configure for makedefs so Open the header file "config.h". XScan forward (in Section 1) to: X X#ifdef MACOS X XComment out: #define CUSTOM_IO . XUncomment : #define MAKEDEFS_C . X XClose and save the config.h file. X XBuild the makedefs application. The Think C 4.0 project uses resources Xfrom the "makedefs.proj.rsrc" file. X XSave the application in the "top" folder and Close the project. X XRun the makedefs application, sequentially choosing all seven options. XThis will require re-launching each time. You've now created additional Xauxiliary files for the game and added icons and signatures to these 12 Xfiles (in the auxil folder): cmdhelp, data, help, hh, history, license, XMacHelp, news, opthelp, oracles, record, and rumors. These files should be Xcopied into the "Dungeon" folder. X XIf you decide to change features in the game, remember to always rebuild Xmakedefs first to setup the needed data structures and so on for the game. X X XBuilding Spec_levs X================ XThis application depends on the source files: X alloc.c lev_comp.c lev_lex.c lev_main.c X macfile.c monst.c objects.c panic.c X XIf you copied the alternate file others:lev_lex.c, you should remove it Xnow to avoid problems with src:lev_lex.c. X XThink C 4.0 users should open the project file "spec_lev.proj". Others Xshould refer to Makefile.src for help. X XThe changes needed to build this application are more complicated than Xbefore, however the checklist provided below should cover all the bases. XWe need to re-configure for spec_levs (and subsequently for NetHack) so XOpen the header file "config.h". X XScan forward (in Section 1) to: X X#ifdef MACOS X XComment out: #define MAKEDEFS_C X XClose and save the header file "config.h". X XOpen the source file (in the src folder) "lev_lex.c". Make the following Xchanges, which appear sequentially: X Find Replace with X {... near the beginning ...} X int yyleng; extern char yytext[]; int yyleng; extern char *yytext; X int yymorfg; int yymorfg; X extern char *yysptr, yysbuf[]; extern char *yysptr, *yysbuf; X int yytchar; int yytchar; X FILE *yyin ={stdin}, *yyout ={stdout}; FILE *yyin =stdin, *yyout =stdout; X {... near the end ...} X {... If you're using LSC or THINKC4 comment out: ...} X {... #define NLSTATE yyprevious=YYNEWLINE ...} X char yytext[YYLMAX]; char *yytext; X {... Skip a line ...} X char yysbuf[YYLMAX]; char *yysbuf; X char *yysptr = yysbuf; char *yysptr; X XScan backward (near the beginning) to: X X#define MONDATA_H /* comment this line for pre-compiled headers */ X#define MONFLAG_H /* comment this line for pre-compiled headers */ X XComment out: #define MONDATA_H and MONFLAG_H X XCut the line: X X#include "hack.h" X Xand Paste it back in again at the very beginning of the file! X XSave the changes to lev_lex.c and close the file. X XOpen the source file, "lev_comp.c". X XScan forward to: X X#define MONDATA_H /* comment this line for pre-compiled headers */ X#define MONFLAG_H /* comment this line for pre-compiled headers */ X XComment out: #define MONDATA_H and MONFLAG_H X XCut the line: X X#include "hack.h" X Xand Paste it back in again at the very beginning of the file! X XScan forward (near the middle of the file) and make this change: X Find Replace with X #endif not lint #endif /* not lint */ X XSave the changes to lev_comp.c and close the file. X XFinally, we need to block some compiler directives in the source files X"alloc.c" and "panic.c" in order to use pre-compiled headers. X XOpen the source file "alloc.c". X XComment out: #define ALLOC_C and EXTERN_H X XSave the changes to alloc.c and close the file. X XOpen the source file "panic.c". X XComment out: #define NEED_VARARGS X XSave the changes to panic.c and close the file. X XNow we need to prepare the pre-compiled header files "hack.h" Xand "config.h". We'll do this again in the NetHack project. X XShell out to the Finder and _copy_ the files hack.h and config.h Xto pre_hack.h and pre_config.h, respectively. Be careful not to Xlose these files as you'll need them to complete the build. Switch Xback to the compiler. X XOpen the file "pre_hack.h". Choose the Source menu option Precompile Xand save the resulting file as "hack.h" (overwriting the old hack.h). XOpen the file "pre_config.h" and Precompile it saving the result as X"config.h" (again overwrite the old config.h). X XBuild the spec_lev application and save it into the "top" folder. Close Xthe spec_lev project. X XBefore running the spec_lev application let's restore the pre-compiled Xheader files. Trash "hack.h" and "config.h". Now rename "pre_hack.h" and X"pre_config.h" to "hack.h" and "config.h", respectively. X XRun the spec_lev application, it will show you what file it is currently Xworking on and create the 5 special levels: castle, endgame, tower1, Xtower2 and tower3 in the top folder. These 5 files should be moved into Xthe Dungeon folder. X XIf you're motivated to create customized special levels it should be Xpossible to modify the special level compiler to accommodate your efforts. XYou'll also want to edit the "descrip[]" and "argc" variables, in Xlev_main.c within the ifdef MACOS segments, to get the compiler to Xrecognize your custom levels. You probably won't bother (no one has)! X XIf you decide to change features in the game, remember to always rebuild Xspec_levs to reflect those changes in the special level files. X X XBuilding NetHack X================ XThis is what you've been waiting for! The file "Segments.mac" shows the Xsource dependencies for this application and suggests a workable scheme Xfor creating properly sized segments. X XThink C 4.0 users should open the project file "nethack.proj". Others Xshould refer to the various Makefiles for help. X XThe checklist below indicates the changes needed to build the game. X XOpen the header file "config.h". X XScan forward (in Section 1) to: X X#ifdef MACOS X XUncomment: #define CUSTOM_IO X XSave the changes to config.h and close the file. X XOpen the source file, "topten.c". X XScan forward to: X X#define MONATTK_H /* comment line for pre-compiled headers */ X#define MONFLAG_H /* comment line for pre-compiled headers */ X XComment out: #define MONATTK_H and MONFLAG_H X XScan forward to: X X#define POINTSMIN 1 /* must be > 0 */ X#define ENTRYMAX 100 /* must be >= 10 */ X XChange POINTSMIN to 51 and ENTRYMAX to 50 to reduce the size and Xclutter in the record file. X XComment out: #define PERS_IS_UID X XClose topten.c and save the changes. X XThink C 4.0 users are going to, again, use pre-compiled headers and Xthis requires a minor lexical change to the files listed below. We'll Xuse a feature from the Search menu to make this operation easier. X XFiles needing a lexical change for pre-compiled headers: Xapply.c end.c extralev.c mkroom.c mon.c monmove.c Xpager.c pctty.c pri.c priest.c save.c shk.c Xsounds.c termcap.c topl.c X XInvoke the "Find" command from the "Search" menu. Enter these fields: X Search For: Replace with: X ^\(#.*pre-compiled headers \*\/\) /*\1 X XCheck the "Grep" and "Multi-File Search" check boxes (you'll be Xlooking in all .c files) then click the "Don't Find" button. X XNow repeat this sequence: X1) Select "Find in Next File" from the "Search" menu. X2) When it finally makes a match, Select "Replace All". X3) Click the "Okay" button in the ensuing alert and then close and save X the file. Now go back to (1), until there are no more matches. X XShell out to the Finder and then _copy_ the files hack.h and config.h to Xpre_hack.h. and pre_config.h, respectively. Switch back to the compiler. X XOpen the file "pre_hack.h" and Precompile it, saving the result as "hack.h" X(overwriting the old hack.h). Open the file "pre_config.h" and Precompile Xit, saving the result as "config.h" (overwriting the old config.h). X XOpen the "Options" dialog (under the Edit menu) and choose the X"Code Generation" radio button. Look to be sure that "MacHeaders" is X_not_ being automatically being included in the project (unchecked). XAlso, make sure that the other options here are set to your liking. X XBuild the application, this make take a few minutes. Save the game into Xthe dungeon folder. Close the nethack project and you're ready to play the Xgame (I hope all went well). X X XMiscellaneous Notes X================ XLow Memory: XIf you are attempting to build NetHack 3.0 on a 1M Macintosh using Think C X4.0, then memory may be a problem. It is suggested that you turn off Xdebugging info for monst.c and objects.c . Also, if for some reason, Xcompilation stops in the segment containing these two files after they Xhave been compiled, then you should drag these two files into a separate Xsegment, finish compiling the files of the original segment and then Xrestore these two files to the original segment. Alternatively, you may Xdecide to "Kompile" monst.c and objects.c separately while preserving the Xgiven segmentation scheme. X XCleanup: XIt's a good idea to always rebuild the makedefs and spec_lev applications Xfrom scratch. Therefore you can trash these applications and also remove Xthe objects from their respective projects (Think C compilers) to conserve Xdisk space. The same can be done for your nethack project. Consider the Xchanges outlined above and undo them as needed to rebuild the project, if Xyou decide to modify the game. If you're satisfied with the "default" Xgame you can trash all the files for a real saving! X XCompatibility: XYou should trash bones and save files from previous versions since they Xwill not work with this version. The single exception is that pl9 bones Xand saves work with pl10. Generally, record files will always work however Xnew scores may have a different format. It may be more convenient to start Xfresh with a new scoreboard (record file) for each patchlevel. X XExtra Memory: XIf you can afford the RAM space you might consider giving the game a 1M Xpartition in Multifinder instead of the default 750k. X XSupport: XBug reports should be submitted to the InterNet e-mail address: Xnethack-bugs@linc.cis.upenn.edu X XWe, the members of the Macintosh NetHack Development Team, hope you enjoy Xthe game. We've worked hard at porting and polishing it to make it behave Xin the Macintosh way! END_OF_FILE if test 15825 -ne `wc -c <'Install.mac'`; then echo shar: \"'Install.mac'\" unpacked with wrong size! fi # end of 'Install.mac' if test -f 'others/exesmurf.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'others/exesmurf.c'\" to \"'others/exesmurf.c.orig'\" mv -f 'others/exesmurf.c' 'others/exesmurf.c.orig' fi echo shar: Extracting \"'others/exesmurf.c'\" \(13430 characters\) sed "s/^X//" >'others/exesmurf.c' <<'END_OF_FILE' X/****************************************************************************** X* * X* EXE header list and modify * X* * X* by Pierre Martineau, 91/01/29 * X* * X* Version 1.2 * X* * X>*****************************************************************************< X* Modified (stephen@estragon.uchicago.edu): * X* 1990oct23 sps Overlay splitter-outer first cut * X* 31 Error handling; some #defines * X* nov01 /l * X* 91jan29 Changed default overlay file names to conform to ovlmgr 30a0 * X******************************************************************************/ X X#include <string.h> X#include <stdlib.h> X#include <stdio.h> X#include <math.h> X X/** parameters ***************************************************************/ X#define MAXFILENAME 128 /* Probably overkill - theoretical limit is 80 */ X#define NPARTS 36 /* Maximum # of overlay files (excluding root .EXE)*/ X#define COPYBUFSIZE 32768 /* Fair sized buffer for file copy */ X#define BAKEXT ".BAK"/* Extension for .exe backups */ X#define OVLEXT ".OVL"/* Default extension for overlay files */ X/* #define MANYZEROES */ /* Old style default: foo00001.ovl, not foo0.ovl */ X/*****************************************************************************/ X X#define BOOLEAN int X#define TRUE 1 X#define FALSE 0 X Xint sstrccnt(register char const *s, register char c) X { int n = 0; X X while (*s) if (*s++ == c) n++; X return n; X } X XFILE *wrkfile, *outfile; Xlong min, max, stk; XBOOLEAN listflg = FALSE; XBOOLEAN verbose = FALSE; XBOOLEAN minflg = FALSE; XBOOLEAN maxflg = FALSE; XBOOLEAN stkflg = FALSE; X Xint column = 0; X Xstruct exehdr { Xunsigned signature; Xunsigned mod512; Xunsigned pages; Xunsigned relocitems; Xunsigned headerparas; Xunsigned minalloc; Xunsigned maxalloc; Xunsigned ss; Xunsigned sp; Xunsigned checksum; Xunsigned ip; Xunsigned cs; Xunsigned relocptr; Xunsigned ovlnum; X} exehdr_area; X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ Xchar *dot, *slash; Xchar fname[MAXFILENAME], oname[MAXFILENAME], zname[MAXFILENAME]; Xchar *jname = NULL; Xchar *args; Xint i; Xlong offset, oldstk; Xunsigned nparts = 0, part = 0, partstart[NPARTS + 2]; X X printf("EXE list and modify V1.1s, by Pierre Martineau, 90/05/20.\n"); X printf("This program may be freely distributed.\n"); X X if ((argc < 2) || (argc > NPARTS + 2)) { X usage(); X return; X } X X/* Process any remaining arguments */ X X if (argc == 2) { X listflg = TRUE; X verbose = TRUE; /* ??? */ X } X else { X i = 2; X while (argc-- > 2) { X args = argv[i]; X if ('0' <= args[0] && args[0] <= '9') { /* File split request */ X if (nparts >= NPARTS) { X printf("\nToo many .OVL files requested (max. %d)\n", NPARTS); X usage(); X return; X } X else if (!atoi(args)) { X printf("\nCan't relocate the root overlay (#0)\n"); X usage(); X return; X } X else if (nparts && partstart[nparts - 1] >= atoi(args)) { X printf("\nOverlay starts must be in ascending order\n"); X usage(); X return; X } X partstart[nparts++] = atoi(args); X } else { X if ((args[0] != '-') && (args[0] != '/')) { X printf("\nInvalid switch in paramater %s!\n", argv[i]); X usage(); X return; X } X args++; X if (strnicmp(args, "min", 3) == 0) { X args += 3; X min = atol(args); X minflg = TRUE; X } X else if (strnicmp(args, "max", 3) == 0) { X args += 3; X max = atol(args); X maxflg = TRUE; X } X else if (strnicmp(args, "stk", 3) == 0) { X args += 3; X stk = atol(args); X stkflg = TRUE; X } X else if (strnicmp(args, "v", 1) == 0) { X listflg = TRUE; X verbose = TRUE; X } X else if (strnicmp(args, "l", 1) == 0) X listflg = TRUE; X else if (strnicmp(args, "p", 1) == 0) { X args++; X jname = args; X } X else { X printf("\nInvalid paramater %s!\n", argv[i]); X usage(); X return; X } X } X i++; X } X } X X/* Extract filename from first argumemt */ X X strcpy(fname, argv[1]); X dot = strrchr(fname, '.'); X slash = strrchr(fname, '\\'); X if ((dot == NULL) || (slash > dot)) X strcat(fname, ".exe"); X X if (nparts) { X strcpy(oname,fname); X *strrchr(fname, '.') = '\0'; X strcat(fname,BAKEXT); X if (!stricmp(oname,fname)) { X printf( X "\nI refuse to split a file with extension "BAKEXT": %s\n", X oname X ); X return; X } X if (!jname || nparts > 1 && !sstrccnt(jname, '?')) { X char ext[5]; X char *t; X X if (!jname) { X strcpy(zname, oname); X *strrchr(zname, '.') = '\0'; X strcpy(ext, OVLEXT); X } else { X if (strrchr(jname, '.') && X (!strrchr(jname, '\\') || X strrchr(jname, '.') > strrchr(jname, '\\') X ) X ) { X strncpy(ext, strrchr(jname, '.'), sizeof(ext)); X ext[sizeof(ext) - 1] = '\0'; X strncpy(zname, jname, strrchr(jname, '.') - jname); X zname[strrchr(jname, '.') - jname] = '\0'; X } else { X strcpy(zname, jname); X strcpy(ext, OVLEXT); X } X } X t = strrchr(zname, '\\') ? strrchr(zname, '\\') + 1: X strrchr(zname, ':') ? strrchr(zname, ':') + 1: X zname; X if (strlen(t) >= 8) X t[7] = '\0'; X#if defined(MANYZEROES) X while (strlen(t) < 8) X#endif X strcat(t, "?"); X strcat(zname, ext); X jname = zname; X } X if (rename(oname,fname)) { /* This assumes oldname, newname. X There's some confusion. OK for TC2.0 */ X printf("\nCouldn't rename (original) %s to %s\n", oname, fname); X return; X } X if ((outfile = fopen(oname, "wb")) == NULL) { X printf("\nCouldn't create file %s\n",oname); X return; X } X } X X if ((wrkfile = fopen(fname, "r+b")) == NULL) { X printf("\nCouldn't open file %s\n", fname); X return; X } X X fread(&exehdr_area, sizeof (struct exehdr), 1, wrkfile); X if (exehdr_area.signature != 0x5a4d) { X printf("\nNot an EXE file!\n"); X return; X } X X while(!feof(wrkfile)) { X if (nparts) { X if (exehdr_area.ovlnum == partstart[part]) { X fclose(outfile); X { X int p = part + 1; X strcpy(oname, jname); X while (sstrccnt(oname, '?') > 1) { X *strrchr(oname, '?') = '0' + p % 10; X p /= 10; X } X *strchr(oname, '?') = (p > 9 ? 'a' - 10 : '0') + p; X } X part++; X if ((outfile = fopen(oname, "wb")) == NULL) { X printf("\nCan't open file %s\n", oname); X return; X } X } X fwrite(&exehdr_area, sizeof (struct exehdr), 1, outfile); X if (ferror(outfile)) { X printf("\nWrite error while moving overlay header in %s\n", oname); X return; X } X } X if (listflg) X show_hdr(); X else if (nparts) X printf("[overlay %d]\r", exehdr_area.ovlnum); /* Keep talking... */ X if ((minflg || maxflg || stkflg) && (exehdr_area.ovlnum == 0) && (exehdr_area.signature == 0x5a4d)) { X if (minflg) X exehdr_area.minalloc = min; X if (maxflg) X exehdr_area.maxalloc = max; X if (stkflg) { X oldstk = exehdr_area.sp; X exehdr_area.sp = stk; X if (!minflg) { X exehdr_area.minalloc += ((stk - oldstk) / 16); X printf("\nAdjusting size of minalloc!\n"); X } X } X fseek(nparts ? outfile : wrkfile, ftell(wrkfile) - sizeof (struct exehdr), SEEK_SET); X fwrite(&exehdr_area, sizeof (struct exehdr), 1, nparts ? outfile : wrkfile); X if (ferror(nparts ? outfile : wrkfile)) { X printf("Write error while trying to update header!\n"); X fclose(nparts ? outfile : wrkfile); X return; X } X } X offset = exehdr_area.pages; X offset *= 512L; X offset -= sizeof(struct exehdr); X if (nparts) { /* Copy the stuff across */ X static char buffer[COPYBUFSIZE]; X while (offset > sizeof(buffer)) { X fread(buffer, sizeof(buffer), 1, wrkfile); X if (ferror(wrkfile)) { X printf("\nRead error in overlay body\n"); X return; X } X fwrite(buffer, sizeof(buffer), 1, outfile); X if (ferror(outfile)) { X printf("\nWrite error moving overlay body, file %s\n", oname); X return; X } X offset -= sizeof(buffer); X } X fread(buffer, (unsigned)offset, 1, wrkfile); X if (ferror(wrkfile)) { X printf("\nRead error in overlay body\n"); X return; X } X fwrite(buffer, (unsigned)offset, 1, outfile); X if (ferror(outfile)) { X printf("\nWrite error moving overlay body, file %s\n", oname); X return; X } X } else fseek(wrkfile, offset, SEEK_CUR); X fread(&exehdr_area, sizeof (struct exehdr), 1, wrkfile); X if (ferror(wrkfile)) { X printf("Read error while trying to get a header!\n"); X fclose(wrkfile); X return; X } X } X if (nparts) { X fclose(outfile); X if (!listflg) printf(" \r"); X } X fclose(wrkfile); X if (listflg && !verbose && column % 4) printf("\n"); X} X Xshow_hdr() X{ Xlong lsize; X X lsize = exehdr_area.pages; X if (exehdr_area.mod512 != 0) X lsize--; X lsize *= 512L; X lsize += exehdr_area.minalloc * 16; X lsize += exehdr_area.mod512; X lsize -= exehdr_area.headerparas * 16; X X if (verbose) { X printf("\nOverlay: %d\n", exehdr_area.ovlnum); X printf("Size (512 byte pages)\t-%6x\t\t%6u\n", exehdr_area.pages, exehdr_area.pages); X printf("Remainder (last page)\t-%6x\t\t%6u\n", exehdr_area.mod512, exehdr_area.mod512); X printf("Header size (in paras)\t-%6x\t\t%6u\n", exehdr_area.headerparas, exehdr_area.headerparas); X printf("Minalloc (in paras)\t-%6x\t\t%6u\n", exehdr_area.minalloc, exehdr_area.minalloc); X printf("Maxalloc (in paras)\t-%6x\t\t%6u\n", exehdr_area.maxalloc, exehdr_area.maxalloc); X printf("Load size (in bytes)\t-%6lx\t\t%6lu\n", lsize, lsize); X printf("Relocation items\t-%6x\t\t%6u\n", exehdr_area.relocitems, exehdr_area.relocitems); X printf("Relocation table offset\t-%6x\t\t%6u\n", exehdr_area.relocptr, exehdr_area.relocptr); X printf("Checksum\t\t-%6x\t\t%6u\n", exehdr_area.checksum, exehdr_area.checksum); X printf("Initial CS:IP\t\t- %04x:%04x\n", exehdr_area.cs, exehdr_area.ip); X printf("Initial SS:SP\t\t- %04x:%04x\n", exehdr_area.ss, exehdr_area.sp); X } else { X if (!exehdr_area.ovlnum) { X printf("\nOverlay: %d\n", exehdr_area.ovlnum); X printf("Minalloc (in paras)\t-%6x\t\t%6u\n", exehdr_area.minalloc, exehdr_area.minalloc); X printf("Maxalloc (in paras)\t-%6x\t\t%6u\n", exehdr_area.maxalloc, exehdr_area.maxalloc); X printf("Stored size (in bytes)\t-%6lx\t\t%6lu\n", exehdr_area.pages * 512L, exehdr_area.pages * 512L); X printf("Load size (in bytes)\t-%6lx\t\t%6lu\n", lsize, lsize); X printf("Initial CS:IP, SS:SP\t- %04x:%04x\t %04x:%04x\n", exehdr_area.cs, exehdr_area.ip, exehdr_area.ss, exehdr_area.sp); X } else { X static bis = 0; X if (!bis++) X printf("\nOvl StrdSz LoadSz | Ovl StrdSz LoadSz | Ovl StrdSz LoadSz | Ovl StrdSz LoadSz\n"); X printf("%3d:%6lu %6lu%s", exehdr_area.ovlnum, exehdr_area.pages * 512L, lsize, ++column % 4 ? " | " : "\n"); X } X } X} X Xusage() X{ X printf("\nUsage: exesmurf exe_file [/l] [/v] [/min#####] [/max#####] [/stk#####]\n"); X printf(" [n1 n2...nn] [/p????????.???]\n"); X printf(" where: min = minalloc\n"); X printf(" max = maxalloc\n"); X printf(" stk = stack size\n"); X printf(" ##### = decimal number of paragraphs\n"); X printf(" ni = overlay starting each new .OVL file, n1 < n2 <...< nn\n"); X printf(" p = DOS filename, maybe with ?s, for overlay files.\n"); X} END_OF_FILE if test 13430 -ne `wc -c <'others/exesmurf.c'`; then echo shar: \"'others/exesmurf.c'\" unpacked with wrong size! fi # end of 'others/exesmurf.c' if test -f 'others/exesmurf.doc' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'others/exesmurf.doc'\" to \"'others/exesmurf.doc.orig'\" mv -f 'others/exesmurf.doc' 'others/exesmurf.doc.orig' fi echo shar: Extracting \"'others/exesmurf.doc'\" \(4793 characters\) sed "s/^X//" >'others/exesmurf.doc' <<'END_OF_FILE' X PC NetHack Support Utilities X ============================ X Last revision: 1991January29 X XThis file contains documentation for the NetHack MS-DOS support Xutility EXESMURF.EXE. This utility examines and modifies the load Xparameters of an .EXE file and can be used to split .OVL files off a Xmonolithic overlaid executable using ovlmgr. X XEXESMURF X-------- Xexesmurf FILENAME[.EXT] /v Xexesmurf FILENAME[.EXT] /minN Xexesmurf FILENAME[.EXT] /maxN Xexesmurf FILENAME[.EXT] /l Xexesmurf FILENAME[.EXT] N... [/pPATTERN] X XThe programme exesmurf is basically a reimplementation of Microsoft's XEXEMOD utility. However, this incarnation is one that is X"overlay-aware" (as they say). It will provide the user with Xinformation about the executable and its overlays, and allow you to Xmodify the executable's parameters and overlay locations. X XThis program is made available for all users who were not graced with a Xrelease of EXEMOD in their Microsoft product, or who need the Xadditional functionality it provides. X X/v. XIf exesmurf is invoked with a filename as argument, optionally Xfollowed by a /v, the filename's exeheader is listed for your viewing Xpleasure, along with the headers of any Microsoft-format overlays the Xfile may contain. The listing is verbose; if there are many overlays Xyou will want to redirect the output. Note that the redundancy in the Xoutput listing largely reflects redundancy in the file structure. X X/minN, /maxN, /stackN. XExesmurf may also be used to modify the "minalloc", "maxalloc" and X"stack" allocation parameters of the executable file. This can be Xaccomplished with the /min, /max, and /stack flags respectively. Any Xarguments to these flags should be *immediately* followed by a decimal Xnumber N. Note that this is inconsistent with the arguments to EXEMOD Xwhich takes hex numbers, and *needs* a space between the flag and the Xnumber. X X/l. XThe /l option requests a version of the /v listing (see above) in Xwhich the information about overlays is very much compressed; only Xtheir decimal file and load sizes are given, in a multi-column format. XThe resulting display will generally fit on a single screen. This Xturns out to be very useful when contemplating appropriate parameters Xfor the overlay splitting operation described next. X XN... [/pPATTERN]. XThe overlay-unpacking function of exesmurf is invoked by following the Xfilename argument by a sequence of decimal numbers. Each of these Xnumbers is an overlay number at which a new external overlay file is Xto be started. The main executable file will keep its old name after Xthe overlays have been unloaded; the original input file will be Xretained, with its extension changed to .BAK. By default, the output Xfiles will be derived from the input file name by appending a Xdiscriminating character (in sequence, 0, 1, ..., 9, a, b, ..., z) to Xthe basename and changing the extension to .OVL; but if the basename Xis a full 8 characters long, the discriminating character will replace Xthe last character instead. This default is chosen for compatibility Xwith ovlmgr. The default may be overridden with the /p option, which Xspecifies a file PATTERN - a file name, possibly complete with Xextension, containing one or more ? characters (* is not allowed), Xwhich will be replaced by discriminating characters. If there is Xexactly one questionmark, it will be replaced by a digit or letter in Xthe sequence described above, but if more than one questionmark Xappears a decimal numbering scheme is used instead. X Note that the numeric arguments are overlay numbers, not Xindices, and they indicate the starting overlays of files. This Xpermits us to manipulate files in which (for some reason) the overlays Xare not stored in ascending order, but it does mean that if a Xmentioned overlay does not exist in the original file, no new overlay Xfile will be started. This is a realistic risk, since the Microsoft Xlinker does not seem to generate overlays at all if there is no actual Xcode generated into the segments in question. X Note further that this operation can be reversed with the DOS Xcopy/b operation, always supposing that it works as documented in your Xrelease of the operating system: the overlays are simply moved Xpage-by-page to the external files. X No guarantees are made as to how this programme will behave if Xthere is debug information or other strangeness stored after the last Xoverlay in the file. X XWhenever exesmurf is invoked, the extension .EXE is assumed for the Xfile if no extension is given. Other extensions are probably only Xmeaningful for examining overlay files. X---------------------------------------------------------------------- XStephen P Spackman stephen@estragon.uchicago.edu X---------------------------------------------------------------------- END_OF_FILE if test 4793 -ne `wc -c <'others/exesmurf.doc'`; then echo shar: \"'others/exesmurf.doc'\" unpacked with wrong size! fi # end of 'others/exesmurf.doc' if test -f 'src/lev_main.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'src/lev_main.c'\" to \"'src/lev_main.c.orig'\" mv -f 'src/lev_main.c' 'src/lev_main.c.orig' fi echo shar: Extracting \"'src/lev_main.c'\" \(3435 characters\) sed "s/^X//" >'src/lev_main.c' <<'END_OF_FILE' X/* SCCS Id: @(#)lev_main.c 3.0 89/07/02 X/* Copyright (c) 1989 by Jean-Christophe Collet */ X/* NetHack may be freely redistributed. See license for details. */ X X/* X * This file contains the main function for the parser X * and some useful functions needed by yacc X */ X X#include "hack.h" X X#ifdef MSDOS X# undef exit X# ifndef AMIGA Xextern void FDECL(exit, (int)); X# endif X#endif X#ifdef LATTICE Xlong *alloc(unsigned int); X# ifdef exit X# undef exit X# endif X#include <stdlib.h> X#endif X X#define MAX_ERRORS 25 X Xextern int line_number; Xchar *fname = "(stdin)"; Xint fatal_error = 0; X X/* Flex 2.3 bug work around */ Xint yy_more_len = 0; X Xint FDECL (main, (int, char **)); Xint NDECL (yyparse); Xvoid FDECL (yyerror, (char *)); Xvoid FDECL (yywarning, (char *)); Xint NDECL (yywrap); Xvoid FDECL (init_yyin, (FILE *)); Xvoid FDECL (init_yyout, (FILE *)); X X#ifdef LSC X# define main _main X#endif Xmain(argc, argv) Xint argc; Xchar **argv; X{ X FILE *fin; X int i; X X#if defined(MACOS) && defined(SMALLDATA) X# ifdef THINKC4 X#include <console.h> X# endif X#define YYLMAX 2048 X extern char *yysbuf, *yytext, *yysptr; X Handle temp; X Str255 name; X long j; X extern struct permonst *mons; X extern struct objclass *objects; X /* 3 special level description files */ X char *descrip[] = {"lev_comp", ":auxil:castle.des", X ":auxil:endgame.des", ":auxil:tower.des"}; X X /* sub in the Nethack resource filename */ X Strcpy((char *)name, "\021nethack.proj.rsrc"); X yysbuf = (char *)alloc(YYLMAX); X yysptr = yysbuf; X yytext = (char *)alloc(YYLMAX); X X (void)OpenResFile(name); X temp = GetResource(HACK_DATA, MONST_DATA); X if (temp) { X DetachResource(temp); X MoveHHi(temp); X HLock(temp); X i = GetHandleSize(temp); X mons = (struct permonst *)(*temp); X } else { X panic("Can't get MONST resource data."); X } X X temp = GetResource(HACK_DATA, OBJECT_DATA); X if (temp) { X DetachResource(temp); X MoveHHi(temp); X HLock(temp); X i = GetHandleSize(temp); X objects = (struct objclass *)(*temp); X for (j = 0; j< NROFOBJECTS+1; j++) { X objects[j].oc_name = sm_obj[j].oc_name; X objects[j].oc_descr = sm_obj[j].oc_descr; X } X } else { X panic("Can't get OBJECT resource data."); X } X argc = 4; /* argv[0] is irrelevant, argv[i] = descrip[i] */ X argv = descrip; X#endif /* !MACOS || !SMALLDATA */ X X init_yyout(stdout); X if (argc == 1) { /* Read standard input */ X init_yyin(stdin); X yyparse(); X } else { /* Otherwise every argument is a filename */ X for(i=1; i<argc; i++) { X fname = argv[i]; X#ifdef MACOS X fprintf(stdout, "Working on %s\n", fname); X#endif X fin = freopen(fname, "r", stdin); X if (!fin) { X fprintf(stderr,"Can't open \"%s\" for input.\n", fname); X perror(fname); X } else { X init_yyin(fin); X yyparse(); X } X line_number = 1; X fatal_error = 0; X } X } X#ifndef VMS X return 0; X#else X return 1; /* vms success */ X#endif /*VMS*/ X} X X/* X * Each time the parser detects an error, it uses this function. X * Here we take count of the errors. To continue farther than X * MAX_ERRORS wouldn't be reasonable. X */ X Xvoid yyerror(s) Xchar *s; X{ X fprintf(stderr,"%s : line %d : %s\n",fname,line_number, s); X if (++fatal_error > MAX_ERRORS) { X fprintf(stderr,"Too many errors, good bye!\n"); X exit(1); X } X} X X/* X * Just display a warning (that is : a non fatal error) X */ X Xvoid yywarning(s) Xchar *s; X{ X fprintf(stderr,"%s : line %d : WARNING : %s\n",fname,line_number,s); X} X Xyywrap() X{ X return 1; X} END_OF_FILE if test 3435 -ne `wc -c <'src/lev_main.c'`; then echo shar: \"'src/lev_main.c'\" unpacked with wrong size! fi # end of 'src/lev_main.c' echo shar: End of archive 8 \(of 8\). cp /dev/null ark8isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0