[comp.sources.bugs] New PC NetHack restmonchn

tom@uw-warp.UUCP (F. Thomas May) (01/11/88)

Forget about any other implementation of savemonchn()/restmonchn().  The
following implementation is much more maintainable than the
distributed/patched version and eliminates most of the differences between the
Unix code and the MSDOS code.

First, delete all remnants of the MSDOS savemonchn() and restmonchn()
routines.  Then replace the Unix restmonchn() with this (note that only two
#indefs needed to be added to the Unix code to make it MSDOS compatible):

struct monst *
restmonchn(fd)
register fd;
{
	register struct monst *mtmp, *mtmp2;
	register struct monst *first = 0;
	int xl;

	struct permonst *monbegin;
	long differ;

	mread(fd, (char *)&monbegin, sizeof(monbegin));
#ifndef MSDOS
	differ = (char *)(&mons[0]) - (char *)(monbegin);
#else
	differ = (long)(&mons[0]) - (long)(monbegin);
#endif

#ifdef LINT
	/* suppress "used before set" warning from lint */
	mtmp2 = 0;
#endif
	while(1) {
		mread(fd, (char *) &xl, sizeof(xl));
		if(xl == -1) break;
		mtmp = newmonst(xl);
		if(!first) first = mtmp;
		else mtmp2->nmon = mtmp;
		mread(fd, (char *) mtmp, (unsigned) xl + sizeof(struct monst));
		if(!mtmp->m_id)
			mtmp->m_id = flags.ident++;
#ifndef MSDOS
		mtmp->data = (struct permonst *)
			((char *) mtmp->data + differ);
#else
		mtmp->data = (struct permonst *)
			((long) mtmp->data + differ);
#endif
		if(mtmp->minvent)
			mtmp->minvent = restobjchn(fd);
		mtmp2 = mtmp;
	}
	if(first && mtmp2->nmon){
		impossible("Restmonchn: error reading monchn.");
		mtmp2->nmon = 0;
	}
	return(first);
}

The result will work under both Unix and MSDOS.  The existing Unix
savemonchn() code will now work with either operating system.

-- 
Tom May
uw-nsr!uw-warp!tom@beaver.cs.washington.edu
uw-beaver!uw-nsr!uw-warp!tom