fatbase

portable OpenBSD tools
git clone git://git.2f30.org/fatbase
Log | Files | Refs

yylex.c (4346B)


      1 /*	$OpenBSD: yylex.c,v 1.5 2003/06/04 17:34:44 millert Exp $	*/
      2 
      3 /* yylex - scanner front-end for flex */
      4 
      5 /*-
      6  * Copyright (c) 1990 The Regents of the University of California.
      7  * All rights reserved.
      8  *
      9  * This code is derived from software contributed to Berkeley by
     10  * Vern Paxson.
     11  * 
     12  * The United States Government has rights in this work pursuant
     13  * to contract no. DE-AC03-76SF00098 between the United States
     14  * Department of Energy and the University of California.
     15  *
     16  * Redistribution and use in source and binary forms, with or without
     17  * modification, are permitted provided that the following conditions
     18  * are met:
     19  *
     20  * 1. Redistributions of source code must retain the above copyright
     21  *    notice, this list of conditions and the following disclaimer.
     22  * 2. Redistributions in binary form must reproduce the above copyright
     23  *    notice, this list of conditions and the following disclaimer in the
     24  *    documentation and/or other materials provided with the distribution.
     25  *
     26  * Neither the name of the University nor the names of its contributors
     27  * may be used to endorse or promote products derived from this software
     28  * without specific prior written permission.
     29  *
     30  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
     31  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
     32  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     33  * PURPOSE.
     34  */
     35 
     36 /* $Header: /cvs/src/usr.bin/lex/yylex.c,v 1.5 2003/06/04 17:34:44 millert Exp $ */
     37 
     38 #include <ctype.h>
     39 #include "flexdef.h"
     40 #include "ytab.h"
     41 
     42 
     43 /* yylex - scan for a regular expression token */
     44 
     45 int yylex()
     46 	{
     47 	int toktype;
     48 	static int beglin = false;
     49 	extern char *yytext;
     50 
     51 	if ( eofseen )
     52 		toktype = EOF;
     53 	else
     54 		toktype = flexscan();
     55 
     56 	if ( toktype == EOF || toktype == 0 )
     57 		{
     58 		eofseen = 1;
     59 
     60 		if ( sectnum == 1 )
     61 			{
     62 			synerr( _( "premature EOF" ) );
     63 			sectnum = 2;
     64 			toktype = SECTEND;
     65 			}
     66 
     67 		else
     68 			toktype = 0;
     69 		}
     70 
     71 	if ( trace )
     72 		{
     73 		if ( beglin )
     74 			{
     75 			fprintf( stderr, "%d\t", num_rules + 1 );
     76 			beglin = 0;
     77 			}
     78 
     79 		switch ( toktype )
     80 			{
     81 			case '<':
     82 			case '>':
     83 			case '^':
     84 			case '$':
     85 			case '"':
     86 			case '[':
     87 			case ']':
     88 			case '{':
     89 			case '}':
     90 			case '|':
     91 			case '(':
     92 			case ')':
     93 			case '-':
     94 			case '/':
     95 			case '\\':
     96 			case '?':
     97 			case '.':
     98 			case '*':
     99 			case '+':
    100 			case ',':
    101 				(void) putc( toktype, stderr );
    102 				break;
    103 
    104 			case '\n':
    105 				(void) putc( '\n', stderr );
    106 
    107 				if ( sectnum == 2 )
    108 				beglin = 1;
    109 
    110 				break;
    111 
    112 			case SCDECL:
    113 				fputs( "%s", stderr );
    114 				break;
    115 
    116 			case XSCDECL:
    117 				fputs( "%x", stderr );
    118 				break;
    119 
    120 			case SECTEND:
    121 				fputs( "%%\n", stderr );
    122 
    123 				/* We set beglin to be true so we'll start
    124 				 * writing out numbers as we echo rules.
    125 				 * flexscan() has already assigned sectnum.
    126 				 */
    127 				if ( sectnum == 2 )
    128 					beglin = 1;
    129 
    130 				break;
    131 
    132 			case NAME:
    133 				fprintf( stderr, "'%s'", nmstr );
    134 				break;
    135 
    136 			case CHAR:
    137 				switch ( yylval )
    138 					{
    139 					case '<':
    140 					case '>':
    141 					case '^':
    142 					case '$':
    143 					case '"':
    144 					case '[':
    145 					case ']':
    146 					case '{':
    147 					case '}':
    148 					case '|':
    149 					case '(':
    150 					case ')':
    151 					case '-':
    152 					case '/':
    153 					case '\\':
    154 					case '?':
    155 					case '.':
    156 					case '*':
    157 					case '+':
    158 					case ',':
    159 						fprintf( stderr, "\\%c",
    160 							yylval );
    161 						break;
    162 
    163 					default:
    164 						if ( ! isascii( yylval ) ||
    165 						     ! isprint( yylval ) )
    166 							fprintf( stderr,
    167 								"\\%.3o",
    168 							(unsigned int) yylval );
    169 						else
    170 							(void) putc( yylval,
    171 								stderr );
    172 					break;
    173 					}
    174 
    175 				break;
    176 
    177 			case NUMBER:
    178 				fprintf( stderr, "%d", yylval );
    179 				break;
    180 
    181 			case PREVCCL:
    182 				fprintf( stderr, "[%d]", yylval );
    183 				break;
    184 
    185 			case EOF_OP:
    186 				fprintf( stderr, "<<EOF>>" );
    187 				break;
    188 
    189 			case OPTION_OP:
    190 				fprintf( stderr, "%s ", yytext );
    191 				break;
    192 
    193 			case OPT_OUTFILE:
    194 			case OPT_PREFIX:
    195 			case CCE_ALNUM:
    196 			case CCE_ALPHA:
    197 			case CCE_BLANK:
    198 			case CCE_CNTRL:
    199 			case CCE_DIGIT:
    200 			case CCE_GRAPH:
    201 			case CCE_LOWER:
    202 			case CCE_PRINT:
    203 			case CCE_PUNCT:
    204 			case CCE_SPACE:
    205 			case CCE_UPPER:
    206 			case CCE_XDIGIT:
    207 				fprintf( stderr, "%s", yytext );
    208 				break;
    209 
    210 			case 0:
    211 				fprintf( stderr, _( "End Marker\n" ) );
    212 				break;
    213 
    214 			default:
    215 				fprintf( stderr,
    216 				_( "*Something Weird* - tok: %d val: %d\n" ),
    217 					toktype, yylval );
    218 				break;
    219 			}
    220 		}
    221 
    222 	return toktype;
    223 	}