From: jwalz Date: Sat, 5 Jan 2002 21:06:00 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: MOVE2GIT~3619 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3c8cfccffa63411434d9bc1b05559d9a2a12fb2c;p=nethack *** empty log message *** --- diff --git a/util/dgn_comp.l b/util/dgn_comp.l new file mode 100644 index 000000000..6cefdd2f4 --- /dev/null +++ b/util/dgn_comp.l @@ -0,0 +1,164 @@ +%{ +/* SCCS Id: @(#)dgn_lex.c 3.3 96/03/02 */ +/* Copyright (c) 1989 by Jean-Christophe Collet */ +/* Copyright (c) 1990 by M. Stephenson */ +/* NetHack may be freely redistributed. See license for details. */ + +#define DGN_COMP + +#include "config.h" +#include "dgn_comp.h" +#include "dgn_file.h" + +/* + * Most of these don't exist in flex, yywrap is macro and + * yyunput is properly declared in flex.skel. + */ +#if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) +int FDECL(yyback, (int *,int)); +int NDECL(yylook); +int NDECL(yyinput); +int NDECL(yywrap); +int NDECL(yylex); + /* Traditional lexes let yyunput() and yyoutput() default to int; + * newer ones may declare them as void since they don't return + * values. For even more fun, the lex supplied as part of the + * newer unbundled compiler for SunOS 4.x adds the void declarations + * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain + * int) while the bundled lex and the one with the older unbundled + * compiler do not. To detect this, we need help from outside -- + * sys/unix/Makefile.utl. + * + * Digital UNIX is difficult and still has int in spite of all + * other signs. + */ +# if defined(NeXT) || defined(SVR4) || defined(_AIX32) +# define VOIDYYPUT +# endif +# if !defined(VOIDYYPUT) && defined(POSIX_TYPES) +# if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) +# define VOIDYYPUT +# endif +# endif +# if !defined(VOIDYYPUT) && defined(WEIRD_LEX) +# if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) +# define VOIDYYPUT +# endif +# endif +# if defined(VOIDYYPUT) && defined(__osf__) +# undef VOIDYYPUT +# endif +# ifdef VOIDYYPUT +void FDECL(yyunput, (int)); +void FDECL(yyoutput, (int)); +# else +int FDECL(yyunput, (int)); +int FDECL(yyoutput, (int)); +# endif +#endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ + +#ifdef FLEX_SCANNER +#define YY_MALLOC_DECL \ + genericptr_t FDECL(malloc, (size_t)); \ + genericptr_t FDECL(realloc, (genericptr_t,size_t)); +#endif + + +void FDECL(init_yyin, (FILE *)); +void FDECL(init_yyout, (FILE *)); + +/* this doesn't always get put in dgn_comp.h + * (esp. when using older versions of bison) + */ + +extern YYSTYPE yylval; + +int line_number = 1; +/* + * This is a hack required by Michael Hamel to get things + * working on the Mac. + */ +#if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) +#undef input +#undef unput +#define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; } +# ifndef YYNEWLINE +# define YYNEWLINE 10 +# endif + +char +input() /* Under MPW \n is chr(13)! Compensate for this. */ +{ + if (yysptr > yysbuf) return(*--yysptr); + else { + yytchar = getc(yyin); + if (yytchar == '\n') { + yylineno++; + return(YYNEWLINE); + } + if (yytchar == EOF) return(0); + else return(yytchar); + } +} +#endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */ + +%} +%% +DUNGEON return(A_DUNGEON); +up { yylval.i=1; return(UP_OR_DOWN); } +down { yylval.i=0; return(UP_OR_DOWN); } +ENTRY return(ENTRY); +stair return(STAIR); +no_up return(NO_UP); +no_down return(NO_DOWN); +portal return(PORTAL); +PROTOFILE return(PROTOFILE); +DESCRIPTION return(DESCRIPTION); +LEVELDESC return(LEVELDESC); +ALIGNMENT return(ALIGNMENT); +LEVALIGN return(LEVALIGN); +town { yylval.i=TOWN ; return(DESCRIPTOR); } +hellish { yylval.i=HELLISH ; return(DESCRIPTOR); } +mazelike { yylval.i=MAZELIKE ; return(DESCRIPTOR); } +roguelike { yylval.i=ROGUELIKE ; return(DESCRIPTOR); } +unaligned { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } +noalign { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } +lawful { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); } +neutral { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); } +chaotic { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); } +BRANCH return(BRANCH); +CHAINBRANCH return(CHBRANCH); +LEVEL return(LEVEL); +RNDLEVEL return(RNDLEVEL); +CHAINLEVEL return(CHLEVEL); +RNDCHLEVEL return(RNDCHLEVEL); +[-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); } +\"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */ + yylval.str = (char *) alloc(strlen(yytext+1)+1); + Strcpy(yylval.str, yytext+1); /* Discard the first \" */ + return(STRING); } +^#.*\n { line_number++; } +\n { line_number++; } +[ \t]+ ; /* skip trailing tabs & spaces */ +. { return yytext[0]; } +%% + +/* routine to switch to another input file; needed for flex */ +void init_yyin( input_f ) +FILE *input_f; +{ +#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) + if (yyin) + yyrestart(input_f); + else +#endif + yyin = input_f; +} +/* analogous routine (for completeness) */ +void init_yyout( output_f ) +FILE *output_f; +{ + yyout = output_f; +} + +/*dgn_comp.l*/