1 %{
2 /*	SCCS Id: @(#)lev_lex.c	3.4	2002/03/27	*/
3 /*	Copyright (c) 1989 by Jean-Christophe Collet */
4 /* NetHack may be freely redistributed.  See license for details. */
5 
6 #define LEV_LEX_C
7 
8 #include "hack.h"
9 #include "lev_comp.h"
10 #include "sp_lev.h"
11 
12 /* Most of these don't exist in flex, yywrap is macro and
13  * yyunput is properly declared in flex.skel.
14  */
15 #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
16 int FDECL(yyback, (int *,int));
17 int NDECL(yylook);
18 int NDECL(yyinput);
19 int NDECL(yywrap);
20 int NDECL(yylex);
21 	/* Traditional lexes let yyunput() and yyoutput() default to int;
22 	 * newer ones may declare them as void since they don't return
23 	 * values.  For even more fun, the lex supplied as part of the
24 	 * newer unbundled compiler for SunOS 4.x adds the void declarations
25 	 * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
26 	 * int) while the bundled lex and the one with the older unbundled
27 	 * compiler do not.  To detect this, we need help from outside --
28 	 * sys/unix/Makefile.utl.
29 	 *
30 	 * Digital UNIX is difficult and still has int in spite of all
31 	 * other signs.
32 	 */
33 # if defined(NeXT) || defined(SVR4) || defined(_AIX32)
34 #  define VOIDYYPUT
35 # endif
36 # if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
37 #  if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
38 #   define VOIDYYPUT
39 #  endif
40 # endif
41 # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
42 #  if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
43 #   define VOIDYYPUT
44 #  endif
45 # endif
46 # if defined(VOIDYYPUT) && defined(__osf__)
47 #  undef VOIDYYPUT
48 # endif
49 # ifdef VOIDYYPUT
50 void FDECL(yyunput, (int));
51 void FDECL(yyoutput, (int));
52 # else
53 int FDECL(yyunput, (int));
54 int FDECL(yyoutput, (int));
55 # endif
56 #endif	/* !FLEX_SCANNER && !FLEXHACK_SCANNER */
57 
58 #ifdef FLEX_SCANNER
59 #define YY_MALLOC_DECL \
60 	      genericptr_t FDECL(malloc, (size_t)); \
61 	      genericptr_t FDECL(realloc, (genericptr_t,size_t));
62 #endif
63 
64 void FDECL(init_yyin, (FILE *));
65 void FDECL(init_yyout, (FILE *));
66 
67 /*
68  * This doesn't always get put in lev_comp.h
69  * (esp. when using older versions of bison).
70  */
71 extern YYSTYPE yylval;
72 
73 int line_number = 1, colon_line_number = 1;
74 static char map[4096];
75 static int map_cnt = 0;
76 
77 %}
78 %e 1500
79 %p 5000
80 %n 700
81 %s MAPC
82 %%
83 <MAPC>ENDMAP	{
84 		  BEGIN(INITIAL);
85 		  yylval.map = (char *) alloc(map_cnt + 1);
86 		  (void) strncpy(yylval.map, map, map_cnt);
87 		  yylval.map[map_cnt] = 0;
88 		  map_cnt = 0;
89 		  return MAP_ID;
90 		}
91 <MAPC>[-|}{+ABCISHKPLWTF\\#. 0123456789]*\r?\n	{
92 		  int len = yyleng;
93 		  /* convert \r\n to \n */
94 		  if (len >= 2 && yytext[len - 2] == '\r') len -= 1;
95 		  line_number++;
96 		  (void) strncpy(map + map_cnt, yytext, len);
97 		  map_cnt += len;
98 		  map[map_cnt - 1] = '\n';
99 		  map[map_cnt] = '\0';
100 		}
101 ^#.*\n		{ line_number++; }
102 :		{ colon_line_number = line_number; return ':'; }
103 MESSAGE		return MESSAGE_ID;
104 MAZE		return MAZE_ID;
105 NOMAP		return NOMAP_ID;
106 LEVEL		return LEVEL_ID;
107 INIT_MAP	return LEV_INIT_ID;
108 FLAGS		return FLAGS_ID;
109 GEOMETRY	return GEOMETRY_ID;
110 ^MAP\r?\n		{ BEGIN(MAPC); line_number++; }
111 OBJECT		return OBJECT_ID;
112 CONTAINER	return COBJECT_ID;
113 MONSTER		return MONSTER_ID;
114 TRAP		return TRAP_ID;
115 DOOR		return DOOR_ID;
116 DRAWBRIDGE	return DRAWBRIDGE_ID;
117 MAZEWALK	return MAZEWALK_ID;
118 WALLIFY		return WALLIFY_ID;
119 REGION		return REGION_ID;
120 RANDOM_OBJECTS	return RANDOM_OBJECTS_ID;
121 RANDOM_MONSTERS	return RANDOM_MONSTERS_ID;
122 RANDOM_PLACES	return RANDOM_PLACES_ID;
123 ALTAR		return ALTAR_ID;
124 LADDER		return LADDER_ID;
125 STAIR		return STAIR_ID;
126 PORTAL		return PORTAL_ID;
127 TELEPORT_REGION	return TELEPRT_ID;
128 BRANCH		return BRANCH_ID;
129 FOUNTAIN	return FOUNTAIN_ID;
130 SINK		return SINK_ID;
131 POOL		return POOL_ID;
132 NON_DIGGABLE	return NON_DIGGABLE_ID;
133 NON_PASSWALL	return NON_PASSWALL_ID;
134 ROOM		return ROOM_ID;
135 SUBROOM		return SUBROOM_ID;
136 RANDOM_CORRIDORS	return RAND_CORRIDOR_ID;
137 CORRIDOR	return CORRIDOR_ID;
138 GOLD		return GOLD_ID;
139 ENGRAVING	return ENGRAVING_ID;
140 NAME		return NAME_ID;
141 CHANCE		return CHANCE_ID;
142 levregion	return LEV;
143 open		{ yylval.i=D_ISOPEN; return DOOR_STATE; }
144 closed		{ yylval.i=D_CLOSED; return DOOR_STATE; }
145 locked		{ yylval.i=D_LOCKED; return DOOR_STATE; }
146 nodoor		{ yylval.i=D_NODOOR; return DOOR_STATE; }
147 broken		{ yylval.i=D_BROKEN; return DOOR_STATE; }
148 north		{ yylval.i=W_NORTH; return DIRECTION; }
149 east		{ yylval.i=W_EAST; return DIRECTION; }
150 south		{ yylval.i=W_SOUTH; return DIRECTION; }
151 west		{ yylval.i=W_WEST; return DIRECTION; }
152 random		{ yylval.i = -1; return RANDOM_TYPE; }
153 none		{ yylval.i = -2; return NONE; }
154 object		return O_REGISTER;
155 monster		return M_REGISTER;
156 place		return P_REGISTER;
157 align		return A_REGISTER;
158 left		{ yylval.i=1; return LEFT_OR_RIGHT; }
159 half-left	{ yylval.i=2; return LEFT_OR_RIGHT; }
160 center		{ yylval.i=3; return CENTER; }
161 half-right	{ yylval.i=4; return LEFT_OR_RIGHT; }
162 right		{ yylval.i=5; return LEFT_OR_RIGHT; }
163 top		{ yylval.i=1; return TOP_OR_BOT; }
164 bottom		{ yylval.i=5; return TOP_OR_BOT; }
165 lit		{ yylval.i=1; return LIGHT_STATE; }
166 unlit		{ yylval.i=0; return LIGHT_STATE; }
167 filled		{ yylval.i=0; return FILLING; }
168 unfilled	{ yylval.i=1; return FILLING; }
169 noalign		{ yylval.i= AM_NONE; return ALIGNMENT; }
170 law		{ yylval.i= AM_LAWFUL; return ALIGNMENT; }
171 neutral		{ yylval.i= AM_NEUTRAL; return ALIGNMENT; }
172 chaos		{ yylval.i= AM_CHAOTIC; return ALIGNMENT; }
173 coaligned	{ yylval.i= AM_SPLEV_CO; return ALIGNMENT; }
174 noncoaligned	{ yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; }
175 peaceful	{ yylval.i=1; return MON_ATTITUDE; }
176 hostile		{ yylval.i=0; return MON_ATTITUDE; }
177 asleep		{ yylval.i=1; return MON_ALERTNESS; }
178 awake		{ yylval.i=0; return MON_ALERTNESS; }
179 m_feature	{ yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; }
180 m_monster	{ yylval.i= M_AP_MONSTER;   return MON_APPEARANCE; }
181 m_object	{ yylval.i= M_AP_OBJECT;    return MON_APPEARANCE; }
182 sanctum		{ yylval.i=2; return ALTAR_TYPE; }
183 shrine		{ yylval.i=1; return ALTAR_TYPE; }
184 altar		{ yylval.i=0; return ALTAR_TYPE; }
185 up		{ yylval.i=1; return UP_OR_DOWN; }
186 down		{ yylval.i=0; return UP_OR_DOWN; }
187 false		{ yylval.i=0; return BOOLEAN; }
188 true		{ yylval.i=1; return BOOLEAN; }
189 dust		{ yylval.i=DUST; return ENGRAVING_TYPE; }
190 engrave		{ yylval.i=ENGRAVE; return ENGRAVING_TYPE; }
191 burn		{ yylval.i=BURN; return ENGRAVING_TYPE; }
192 mark		{ yylval.i=MARK; return ENGRAVING_TYPE; }
193 blessed		{ yylval.i=1; return CURSE_TYPE; }
194 uncursed	{ yylval.i=2; return CURSE_TYPE; }
195 cursed		{ yylval.i=3; return CURSE_TYPE; }
196 contained	{ return CONTAINED; }
197 noteleport	{ yylval.i=NOTELEPORT; return FLAG_TYPE; }
198 hardfloor	{ yylval.i=HARDFLOOR; return FLAG_TYPE; }
199 nommap		{ yylval.i=NOMMAP; return FLAG_TYPE; }
200 arboreal	{ yylval.i=ARBOREAL; return FLAG_TYPE; }	/* KMH */
201 shortsighted	{ yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
202 \[\ *[0-9]+\%\ *\] { yylval.i = atoi(yytext + 1); return PERCENT; }
203 [+\-]?[0-9]+	{ yylval.i=atoi(yytext); return INTEGER; }
204 \"[^"]*\"	{ yytext[yyleng-1] = 0; /* Discard the trailing \" */
205 		  yylval.map = (char *) alloc(strlen(yytext+1)+1);
206 		  Strcpy(yylval.map, yytext+1); /* Discard the first \" */
207 		  return STRING; }
208 \r?\n		{ line_number++; }
209 [ \t]+		;
210 '\\.'		{ yylval.i = yytext[2]; return CHAR; }
211 '.'		{ yylval.i = yytext[1]; return CHAR; }
212 .		{ return yytext[0]; }
213 %%
214 #ifdef	AMIGA
215 long *alloc(n)
216 	unsigned n;
217 {
218 	return ((long *)malloc (n));
219 }
220 #endif
221 
222 /* routine to switch to another input file; needed for flex */
223 void init_yyin( input_f )
224 FILE *input_f;
225 {
226 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
227 	if (yyin)
228 	    yyrestart(input_f);
229 	else
230 #endif
231 	    yyin = input_f;
232 }
233 /* analogous routine (for completeness) */
234 void init_yyout( output_f )
235 FILE *output_f;
236 {
237 	yyout = output_f;
238 }
239 
240 /*lev_comp.l*/
241