ftp.nice.ch/pub/next/games/strategic/NetHack.s.tar.gz#/NetHackSource/src/lev_main.c

This is lev_main.c in view mode; [Download] [Up]

/*	SCCS Id: @(#)lev_main.c	3.0	89/07/02
/*	Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed.  See license for details. */

/*
 * This file contains the main function for the parser
 * and some useful functions needed by yacc
 */

/* #include "hack.h"	/* uncomment for the Mac */

#ifdef AMIGA
#include "hack.h"
#undef exit
#endif
#include <stdio.h>

#define MAX_ERRORS	25

extern int line_number;
char *fname = "(stdin)";
int fatal_error = 0;

#ifdef LATTICE
long *alloc(unsigned int);
#ifdef exit
#undef exit
#endif
#include <stdlib.h>
#endif

#ifdef	FDECL
int  FDECL (main, (int, char **));
int  NDECL (yyparse);
void FDECL (yyerror, (char *));
void FDECL (yywarning, (char *));
int  NDECL (yywrap);
#endif

#ifdef LSC
_main(argc, argv)
#else
main(argc, argv) 
#endif
int argc;
char **argv;
{
	FILE *fin;
	int i;

#if defined(MACOS) && defined(SMALLDATA)
# ifdef THINKC4
#include <console.h>
# endif
#define YYLMAX	2048
	extern char	*yysbuf, *yytext, *yysptr;
	Handle temp;
	Str255 name;
	long	j;
	extern struct permonst *mons;
	extern struct objclass *objects;

	/* sub in the Nethack resource filename */
	strcpy((char *)name, "\010NH3.rsrc");
	yysbuf = (char *)alloc(YYLMAX);
	yysptr = yysbuf;
	yytext = (char *)alloc(YYLMAX);

	(void)OpenResFile(name);
	temp = GetResource(HACK_DATA, MONST_DATA);
	if (temp) {
		DetachResource(temp);
		MoveHHi(temp);
		HLock(temp);
		i = GetHandleSize(temp);
		mons = (struct permonst *)(*temp);
	} else {
		panic("Can't get MONST resource data.");
	}
	
	temp = GetResource(HACK_DATA, OBJECT_DATA);
	if (temp) {
		DetachResource(temp);
		MoveHHi(temp);
		HLock(temp);
		i = GetHandleSize(temp);
		objects = (struct objclass *)(*temp);
		for (j = 0; j< NROFOBJECTS+1; j++) {
			objects[j].oc_name = sm_obj[j].oc_name;
			objects[j].oc_descr = sm_obj[j].oc_descr;
		}
	} else {
		panic("Can't get OBJECT resource data.");
	}
# ifdef THINKC4
	argc = ccommand(&argv);
# endif
#endif

	if (argc == 1)		/* Read standard input */
	    yyparse();
	else 			/* Otherwise every argument is a filename */
	    for(i=1; i<argc; i++) {
#if defined(VMS) || defined(AZTEC_C)
		    extern FILE *yyin;
		    yyin = fin = fopen(argv[i], "r");
#else
		    fin = freopen(argv[i], "r", stdin);
#endif
		    fname = argv[i];
		    if (!fin) 
			fprintf(stderr,"Can't open %s\n", argv[i]);
		    else
			yyparse();
		    line_number = 1;
		    fatal_error = 0;
	    }
	return 0;
}

/* 
 * Each time the parser detects an error, it uses this function.
 * Here we take count of the errors. To continue farther than
 * MAX_ERRORS wouldn't be reasonable.
 */

void yyerror(s)
char *s;
{
	fprintf(stderr,"%s : line %d : %s\n",fname,line_number, s);
	if (++fatal_error > MAX_ERRORS) {
		fprintf(stderr,"Too many errors, good bye!\n");
		exit(1);
	}
}

/* 
 * Just display a warning (that is : a non fatal error)
 */

void yywarning(s)
char *s;
{
	fprintf(stderr,"%s : line %d : WARNING : %s\n",fname,line_number,s);
}

yywrap()
{
       return 1;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.