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