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. */
12 /* Most of these don't exist in flex, yywrap is macro and
13 * yyunput is properly declared in flex.skel.
15 #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
16 int FDECL(yyback, (int *,int));
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.
30 * Digital UNIX is difficult and still has int in spite of all
33 # if defined(NeXT) || defined(SVR4) || defined(_AIX32)
36 # if !defined(VOIDYYPUT) && defined(POSIX_TYPES)
37 # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS)
41 # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
42 # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1)
46 # if defined(VOIDYYPUT) && defined(__osf__)
50 void FDECL(yyunput, (int));
51 void FDECL(yyoutput, (int));
53 int FDECL(yyunput, (int));
54 int FDECL(yyoutput, (int));
56 #endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
59 #define YY_MALLOC_DECL \
60 genericptr_t FDECL(malloc, (size_t)); \
61 genericptr_t FDECL(realloc, (genericptr_t,size_t));
64 void FDECL(init_yyin, (FILE *));
65 void FDECL(init_yyout, (FILE *));
68 * This doesn't always get put in lev_comp.h
69 * (esp. when using older versions of bison).
71 extern YYSTYPE yylval;
73 int line_number = 1, colon_line_number = 1;
74 static char map[4096];
75 static int map_cnt = 0;
85 yylval.map = (char *) alloc(map_cnt + 1);
86 (void) strncpy(yylval.map, map, map_cnt);
87 yylval.map[map_cnt] = 0;
91 <MAPC>[-|}{+ABCISHKPLWTF\\#. 0123456789]*\r?\n {
93 /* convert \r\n to \n */
94 if (len >= 2 && yytext[len - 2] == '\r') len -= 1;
96 (void) strncpy(map + map_cnt, yytext, len);
98 map[map_cnt - 1] = '\n';
101 ^#.*\n { line_number++; }
102 : { colon_line_number = line_number; return ':'; }
103 MESSAGE return MESSAGE_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;
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;
132 NON_DIGGABLE return NON_DIGGABLE_ID;
133 NON_PASSWALL return NON_PASSWALL_ID;
135 SUBROOM return SUBROOM_ID;
136 RANDOM_CORRIDORS return RAND_CORRIDOR_ID;
137 CORRIDOR return CORRIDOR_ID;
139 ENGRAVING return ENGRAVING_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 \" */
208 \r?\n { line_number++; }
210 '\\.' { yylval.i = yytext[2]; return CHAR; }
211 '.' { yylval.i = yytext[1]; return CHAR; }
212 . { return yytext[0]; }
218 return ((long *)malloc (n));
222 /* routine to switch to another input file; needed for flex */
223 void init_yyin( input_f )
226 #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
233 /* analogous routine (for completeness) */
234 void init_yyout( output_f )