DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦b304db051⟧ TextFile

    Length: 3457 (0xd81)
    Types: TextFile
    Names: »parse.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Adventure/src/munge/parse.c« 

TextFile

/*
**		    Copyright (c) 1985	Ken Wellsch
**
**     Permission is hereby granted to all users to possess, use, copy,
**     distribute, and modify the programs and files in this package
**     provided it is not for direct commercial benefit and secondly,
**     that this notice and all modification information be kept and
**     maintained in the package.
**
*/

#include "mdefs.h"

struct cm
{
	char *c_nam ;
	char c_num ;
} ;

struct cm commnd [MAXCOM] =
{
	"ACTION",	ACTION,
	"AT",		AT,
	"DEFINE",	DEFINE,
	"INCLUDE",	INCLUDE,
	"INITIAL",	INITIAL,
	"LABEL",	LABEL,
	"LIST",		LIST,
	"NOLIST",	NOLIST,
	"NULL",		NULL,
	"OBJECT",	OBJECT,
	"PLACE",	PLACE,
	"REPEAT",	REPEAT,
	"SYNONYM",	SYNON,
	"TEXT",		TEXT,
	"VARIABLE",	VARIABLE,
	"VERB",		VERB
} ;


int parse ()
{
	register int m ;

	m = getline (token,MAXLINE) ;
	for ( ; m != EOF ; m = getline (token,MAXLINE) )
	{
		if ( m == MAJOR && gettok (token,MAXLINE) == OK )
			exec (major(token)) ;
	}
	return ;
}

int getline (line,msize)
  char line[] ;
  int msize ;
{
	register int c, i ;

	line[0] = EOS ;

	if ( chkmaj () == MAJOR )
		return (MAJOR) ;

	c = skip () ;
	if ( c == PERCENT )
	{
		Ungetc (BLANK) ;
		return (NEXT) ;
	}

	if ( c == SLASH )
		c = Getc () ;
	
	for ( i = 0 ; i < msize ; i++ )
	{
		line[i] = c ;

		if ( c == NEWLINE )
		{
			line[i+1] = EOS ;
			return (OK) ;
		}
		if ( c == EOF )
			return (EOF) ;
		c = Getc () ;
	}
	Ungetc (BLANK) ;
	line[i] = EOS ;
	synerr ("Getline","line is too long (%d)!",msize) ;

	return (OK) ;
}

int gettok (tok,msize)
  char tok[] ;
  int msize ;
{
	register int c, i ;

	tok[0] = EOS ;
	if ( ( c = skip () ) == NEWLINE || c == EOF )
		return (c) ;

	for ( i = 0 ; i < msize ; i++ )
	{
		tok[i] = c ;
		if ( c == NEWLINE || c == EOF || sep(c) )
		{
			Ungetc (c) ;
			tok[i] = EOS ;
			return (OK) ;
		}
		c = Getc () ;
	}

	Ungetc (BLANK) ;
	tok[i] = EOS ;
	synerr ("Gettok","token is too long (%d)!",msize) ;
	return (OK) ;
}

int major (tok)
  char *tok ;
{
	register int i ;
	struct cm c ;

	for ( i = 0 ; i < MAXCOM ; i++ )
	{
		if ( strncmp (commnd[i].c_nam,tok,MATCHCOM) == 0 )
		{
			if ( i )
			{
				c = commnd[i] ;
				commnd[i] = commnd[0] ;
				commnd[0] = c ;
			}
			return (commnd[0].c_num) ;
		}
	}
	return (ERROR) ;
}

int exec (cmd)
  int cmd ;
{

	switch (cmd)
	{
		case ACTION:
			act () ;
			break ;
		case AT:
			at () ;
			break ;
		case DEFINE:
			def () ;
			break ;
		case INCLUDE:
			inc () ;
			break ;
		case INITIAL:
			init () ;
			break ;
		case LABEL:
			lab () ;
			break ;
		case LIST:
			list = YES ;
			break ;
		case NOLIST:
			list = NO ;
			break ;
		case NULL:
			null () ;
			break ;
		case OBJECT:
			obj () ;
			break ;
		case PLACE:
			place () ;
			break ;
		case REPEAT:
			rep () ;
			break ;
		case SYNON:
			syn () ;
			break ;
		case TEXT:
			text () ;
			break ;
		case VARIABLE:
			var () ;
			break ;
		case VERB:
			verb () ;
			break ;
		default:
			error ("Exec","%d -- Unrecognised Command.",cmd) ;
			break ;
	}
	return ;
}

#define isalpha(c)	(((c)>='a'&&(c)<='z')||((c)>='A'&&(c)<='Z'))

int chkmaj ()
{
	register int c ;

	for ( c = Getc() ; com(c) ; c = Getc() )	/* flush comments */
		while ( (c=Getc()) != NEWLINE )
			if ( c == EOF )
				return (OK) ;
	Ungetc (c) ;
	if ( isalpha(c) )
		return (MAJOR) ;
	return (OK) ;
}

int skip ()
{
	register int c ;

	for ( c = Getc () ; sep(c) ; c = Getc () )
		;

	if ( !com(c) )
		return (c) ;

	flushline () ;
	return (NEWLINE) ;
}