Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are met:
      6  *
      7  *    1. Redistributions of source code must retain the above copyright notice,
      8  *       this list of conditions and the following disclaimer.
      9  *
     10  *    2. Redistributions in binary form must reproduce the above copyright notice,
     11  *       this list of conditions and the following disclaimer in the documentation
     12  *       and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
     15  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     16  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     17  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     18  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     21  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  * The views and conclusions contained in the software and documentation are those
     26  * of the authors and should not be interpreted as representing official policies,
     27  * either expressed or implied, of Tresys Technology, LLC.
     28  */
     29 
     30 %{
     31 	#include <stdint.h>
     32 	#include <sepol/errcodes.h>
     33 	#include "cil_internal.h"
     34 	#include "cil_lexer.h"
     35 	#include "cil_log.h"
     36 	#include "cil_mem.h"
     37 	char *value =  NULL;
     38 	int line = 1;
     39 %}
     40 
     41 %option nounput
     42 %option noinput
     43 %option noyywrap
     44 %option prefix="cil_yy"
     45 
     46 digit		[0-9]
     47 alpha		[a-zA-Z]
     48 spec_char	[\[\]\.\@\=\/\*\-\_\$\%\+\-\!\|\&\^\:\~\`\#\{\}\'\<\>\?\,]
     49 symbol		({digit}|{alpha}|{spec_char})+
     50 white		[ \t]
     51 newline		[\n\r]
     52 qstring		\"[^"\n]*\"
     53 hll_lm          ^;;\*
     54 comment		;
     55 
     56 %%
     57 {newline}	line++; return NEWLINE;
     58 {hll_lm}	value=yytext; return HLL_LINEMARK;
     59 {comment}	value=yytext; return COMMENT;
     60 "("		value=yytext; return OPAREN;
     61 ")"		value=yytext; return CPAREN;
     62 {symbol}	value=yytext; return SYMBOL;
     63 {white}		;
     64 {qstring}	value=yytext; return QSTRING;
     65 <<EOF>>		return END_OF_FILE;
     66 .		value=yytext; return UNKNOWN;
     67 %%
     68 
     69 int cil_lexer_setup(char *buffer, uint32_t size)
     70 {
     71 	size = (yy_size_t)size;
     72 	if (yy_scan_buffer(buffer, size) == NULL) {
     73 		cil_log(CIL_INFO, "Lexer failed to setup buffer\n");
     74 		return SEPOL_ERR;
     75 	}
     76 
     77 	line = 1;
     78 
     79 	return SEPOL_OK;
     80 }
     81 
     82 void cil_lexer_destroy(void)
     83 {
     84 	yylex_destroy();
     85 }
     86 
     87 int cil_lexer_next(struct token *tok)
     88 {
     89 	tok->type = yylex();
     90 	tok->value = value;
     91 	tok->line = line;
     92 
     93 	return SEPOL_OK;
     94 }
     95