⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asn1p_l.l

📁 ASN.1解析解码工具,可以解析各种ASN.1格式的文件,并对相应的BER文件解码
💻 L
字号:
%{#include <string.h>#include <errno.h>#include <assert.h>#include "asn1parser/asn1parser.h"
#define yy_create_buffer asn1p__create_buffer
#define yy_delete_buffer asn1p__delete_buffer
#define yy_scan_buffer asn1p__scan_buffer
#define yy_scan_string asn1p__scan_string
#define yy_scan_bytes asn1p__scan_bytes
#define yy_flex_debug asn1p__flex_debug
#define yy_init_buffer asn1p__init_buffer
#define yy_flush_buffer asn1p__flush_buffer
#define yy_load_buffer_state asn1p__load_buffer_state
#define yy_switch_to_buffer asn1p__switch_to_buffer
#define yyin asn1p_in
#define yyleng asn1p_leng
#define yylex asn1p_lex
#define yyout asn1p_out
#define yyrestart asn1p_restart
#define yytext asn1p_text
#define yylineno asn1p_lineno
void yyrestart( FILE *input_file );void yy_load_buffer_state( void );YY_BUFFER_STATE yy_create_buffer( FILE *file, int size );void yy_init_buffer( YY_BUFFER_STATE b, FILE *file );void yy_flush_buffer( YY_BUFFER_STATE b );YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len );#include "asn1parser/asn1p_y.h"extern YYSTYPE asn1p_lval;int asn1p_lex(void);void asn1p_lexer_hack_push_opaque_state(void);		/* Used in .y */void asn1p_lexer_hack_enable_with_syntax(void);		/* Used in .y */void asn1p_lexer_hack_push_encoding_control(void);	/* Used in .y */#define	YY_FATAL_ERROR(msg)	do {			\		fprintf(stderr,				\			"lexer error at line %d, "	\			"text \"%s\"\n",		\			yylineno, yytext);		\		exit(1);				\	} while(0)int asn1p_lexer_pedantic_1990 = 0;int asn1p_lexer_types_year = 0;int asn1p_lexer_constructs_year = 0;int asn1p_as_pointer;static asn1c_integer_t _lex_atoi(const char *ptr);static double          _lex_atod(const char *ptr);/* * Check that the type is defined in the year of the standard choosen. */#define	TYPE_LIFETIME(fyr, lyr)				\	(!asn1p_lexer_types_year			\	|| (fyr && fyr <= asn1p_lexer_types_year)	\	|| (lyr && lyr  > asn1p_lexer_types_year))/* * Check the the construction (or concept, i.e. CLASS) is defined in * a given year. */#define	CONSTRUCT_LIFETIME(fyr, lyr)			\	(!asn1p_lexer_constructs_year			\	|| (fyr && fyr <= asn1p_lexer_constructs_year)	\	|| (lyr && lyr  > asn1p_lexer_constructs_year))/* * Append quoted string. */#define	QAPPEND(text, tlen)	do {				\		char *prev_text = asn1p_lval.tv_opaque.buf;	\		int prev_len = asn1p_lval.tv_opaque.len;	\		char *p;					\								\		p = malloc((tlen) + prev_len + 1);		\		if(p == NULL) return -1;			\								\		if(prev_text) memcpy(p, prev_text, prev_len);	\		memcpy(p + prev_len, text, tlen);		\		p[prev_len + (tlen)] = '\0';			\								\		free(asn1p_lval.tv_opaque.buf);			\		asn1p_lval.tv_opaque.buf = p;			\		asn1p_lval.tv_opaque.len = (tlen) + prev_len;	\	} while(0)%}%option	never-interactive%option	noinput %option	noyywrap stack/* Performance penalty is OK */%option yylineno	/* Controlled from within application */%option debug		%pointer%x dash_comment%x idash_comment%x cpp_comment%x quoted%x opaque%x encoding_control%x with_syntax/* Newline */NL	[\r\v\f\n]/* White-space */WSP	[\t\r\v\f\n ]%%-{3,}/[\r\n]	/* Immediately terminated long comment */-{3,}/[^-\r\n]	yy_push_state(idash_comment);	/* Incorrect, but acceptable */<idash_comment>{	-{3,}	yy_pop_state(); /* Acceptable end of comment */}--<[ \t]*ASN1C.RepresentAsPointer[ \t]*>--	asn1p_as_pointer = 1;<INITIAL,with_syntax>--		yy_push_state(dash_comment);<dash_comment,idash_comment>{	{NL}	yy_pop_state();	--	yy_pop_state();	/* End of comment */	-	/* Eat single dash */	[^\r\v\f\n-]+	/* Eat */}<INITIAL,cpp_comment,with_syntax>"/*"		yy_push_state(cpp_comment);<cpp_comment>{	[^*/<]	/* Eat */	"*/"	yy_pop_state();	.	/* Eat */}	/*	 * This is state is being set from corresponding .y module when	 * higher-level data is necessary to make proper parsing of the	 * underlying data. Thus, we enter the <opaque> state and save	 * everything for later processing.	 */<opaque>{	"{"	{			yy_push_state(opaque);			asn1p_lval.tv_opaque.buf = strdup(yytext);			asn1p_lval.tv_opaque.len = yyleng;			return TOK_opaque;		}	"}"	{			yy_pop_state();			asn1p_lval.tv_opaque.buf = strdup(yytext);			asn1p_lval.tv_opaque.len = yyleng;			return TOK_opaque;		}	[^{}:=]+	{			asn1p_lval.tv_opaque.buf = strdup(yytext);			asn1p_lval.tv_opaque.len = yyleng;			return TOK_opaque;		}	"::="	{			fprintf(stderr,				"ASN.1 Parser syncronization failure: "				"\"%s\" at line %d must not appear "				"inside value definition\n",				yytext, yylineno);			return -1;		}	[:=]	{			asn1p_lval.tv_opaque.buf = strdup(yytext);			asn1p_lval.tv_opaque.len = yyleng;			return TOK_opaque;		}	}\"[^\"]*		{			asn1p_lval.tv_opaque.buf = 0;			asn1p_lval.tv_opaque.len = 0;			QAPPEND(yytext+1, yyleng-1);			yy_push_state(quoted);		}<quoted>{	\"\"	{ QAPPEND(yytext, yyleng-1); }	/* Add a single quote */	[^\"]+	{ QAPPEND(yytext, yyleng); }	\"	{			yy_pop_state();			/* Do not append last quote:			// QAPPEND(yytext, yyleng); */			if(asn1p_lexer_pedantic_1990			&& strchr(yytext, '\n')) {				fprintf(stderr, "%s: "				"Newlines are prohibited by ASN.1:1990\n",				asn1p_lval.tv_opaque.buf);				return -1;			}			return TOK_cstring;		}	}<encoding_control>{	ENCODING-CONTROL	{			const char *s = "ENCODING-CONTROL";			const char *p = s + sizeof("ENCODING-CONTROL") - 2;			for(; p >= s; p--) unput(*p);			yy_pop_state();		}	END	unput('D'); unput('N'); unput('E'); yy_pop_state();	[^{} \t\r\v\f\n]+	[[:alnum:]]+	.	/* Eat everything else */	"\n"	}'[0-9A-F \t\r\v\f\n]+'H {		/* " \t\r\n" weren't allowed in ASN.1:1990. */		asn1p_lval.tv_str = yytext;		return TOK_hstring;	}'[01 \t\r\v\f\n]+'B	{		/* " \t\r\n" weren't allowed in ASN.1:1990. */		asn1p_lval.tv_str = strdup(yytext);		return TOK_bstring;	}-[1-9][0-9]*	{		asn1p_lval.a_int = _lex_atoi(yytext);		if(errno == ERANGE)			return -1;		return TOK_number_negative;	}[1-9][0-9]*	{		asn1p_lval.a_int = _lex_atoi(yytext);		if(errno == ERANGE)			return -1;		return TOK_number;	}"0"	{		asn1p_lval.a_int = _lex_atoi(yytext);		if(errno == ERANGE)			return -1;		return TOK_number;	}[-+]?[0-9]+[.]?([eE][-+]?)?[0-9]+ {		asn1p_lval.a_dbl = _lex_atod(yytext);		if(errno == ERANGE)			return -1;		return TOK_realnumber;	}ABSENT			return TOK_ABSENT;ALL			return TOK_ALL;ANY			{				/* Appeared in 1990, removed in 1997 */				if(TYPE_LIFETIME(1990, 1997))					return TOK_ANY;					fprintf(stderr, "Keyword \"%s\" at line %d "					"is obsolete\n", yytext, yylineno);				REJECT;			}APPLICATION		return TOK_APPLICATION;AUTOMATIC		return TOK_AUTOMATIC;BEGIN			return TOK_BEGIN;BIT			return TOK_BIT;BMPString		{				if(TYPE_LIFETIME(1994, 0))					return TOK_BMPString;				REJECT;			}BOOLEAN			return TOK_BOOLEAN;BY			return TOK_BY;CHARACTER		return TOK_CHARACTER;CHOICE			return TOK_CHOICE;CLASS			return TOK_CLASS;COMPONENT		return TOK_COMPONENT;COMPONENTS		return TOK_COMPONENTS;CONSTRAINED		return TOK_CONSTRAINED;CONTAINING		return TOK_CONTAINING;DEFAULT			return TOK_DEFAULT;DEFINED			{				/* Appeared in 1990, removed in 1997 */				if(TYPE_LIFETIME(1990, 1997))					return TOK_DEFINED;				fprintf(stderr, "Keyword \"%s\" at line %d "					"is obsolete\n", yytext, yylineno);				/* Deprecated since */				REJECT;			}DEFINITIONS		return TOK_DEFINITIONS;EMBEDDED		return TOK_EMBEDDED;ENCODED			return TOK_ENCODED;ENCODING-CONTROL	return TOK_ENCODING_CONTROL;END			return TOK_END;ENUMERATED		return TOK_ENUMERATED;EXCEPT			return TOK_EXCEPT;EXPLICIT		return TOK_EXPLICIT;EXPORTS			return TOK_EXPORTS;EXTENSIBILITY		return TOK_EXTENSIBILITY;EXTERNAL		return TOK_EXTERNAL;FALSE			return TOK_FALSE;FROM			return TOK_FROM;GeneralizedTime		return TOK_GeneralizedTime;GeneralString		return TOK_GeneralString;GraphicString		return TOK_GraphicString;IA5String		return TOK_IA5String;IDENTIFIER		return TOK_IDENTIFIER;IMPLICIT		return TOK_IMPLICIT;IMPLIED			return TOK_IMPLIED;IMPORTS			return TOK_IMPORTS;INCLUDES		return TOK_INCLUDES;INSTANCE		return TOK_INSTANCE;INSTRUCTIONS		return TOK_INSTRUCTIONS;INTEGER			return TOK_INTEGER;INTERSECTION		return TOK_INTERSECTION;ISO646String		return TOK_ISO646String;MAX			return TOK_MAX;MIN			return TOK_MIN;MINUS-INFINITY		return TOK_MINUS_INFINITY;NULL			return TOK_NULL;NumericString		return TOK_NumericString;OBJECT			return TOK_OBJECT;ObjectDescriptor	return TOK_ObjectDescriptor;OCTET			return TOK_OCTET;OF			return TOK_OF;OPTIONAL		return TOK_OPTIONAL;PATTERN			return TOK_PATTERN;PDV			return TOK_PDV;PLUS-INFINITY		return TOK_PLUS_INFINITY;PRESENT			return TOK_PRESENT;PrintableString		return TOK_PrintableString;PRIVATE			return TOK_PRIVATE;REAL			return TOK_REAL;RELATIVE-OID		return TOK_RELATIVE_OID;SEQUENCE		return TOK_SEQUENCE;SET			return TOK_SET;SIZE			return TOK_SIZE;STRING			return TOK_STRING;SYNTAX			return TOK_SYNTAX;T61String		return TOK_T61String;TAGS			return TOK_TAGS;TeletexString		return TOK_TeletexString;TRUE			return TOK_TRUE;UNION			return TOK_UNION;UNIQUE			return TOK_UNIQUE;UNIVERSAL		return TOK_UNIVERSAL;UniversalString		{				if(TYPE_LIFETIME(1994, 0))					return TOK_UniversalString;				REJECT;			}UTCTime			return TOK_UTCTime;UTF8String		{				if(TYPE_LIFETIME(1994, 0))					return TOK_UTF8String;				REJECT;			}VideotexString		return TOK_VideotexString;VisibleString		return TOK_VisibleString;WITH			return TOK_WITH;<INITIAL,with_syntax>&[A-Z][A-Za-z0-9]*([-][A-Za-z0-9]+)*	{		asn1p_lval.tv_str = strdup(yytext);		return TOK_typefieldreference;	}<INITIAL,with_syntax>&[a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)*	{		asn1p_lval.tv_str = strdup(yytext);		return TOK_valuefieldreference;	}[a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)*	{		asn1p_lval.tv_str = strdup(yytext);		return TOK_identifier;	}	/*	 * objectclassreference	 */[A-Z][A-Z0-9]*([-][A-Z0-9]+)*	{		asn1p_lval.tv_str = strdup(yytext);		return TOK_capitalreference;	}	/*	 * typereference, modulereference	 * NOTE: TOK_objectclassreference must be combined	 * with this token to produce true typereference.	 */[A-Z][A-Za-z0-9]*([-][A-Za-z0-9]+)*	{		asn1p_lval.tv_str = strdup(yytext);		return TOK_typereference;	}"::="		return TOK_PPEQ;"..."		return TOK_ThreeDots;".."		return TOK_TwoDots;<with_syntax>{	[A-Z][A-Za-z0-9]*([-][A-Za-z0-9]+)*	{				asn1p_lval.tv_str = strdup(yytext);				return TOK_Literal;			}	","		{				asn1p_lval.tv_str = strdup(yytext);				return TOK_Literal;			}	"{"		{				yy_push_state(with_syntax);				asn1p_lval.tv_str = strdup(yytext);				return TOK_Literal;			}	"["		return '[';	"]"		return ']';	{WSP}+		{			asn1p_lval.tv_opaque.buf = strdup(yytext);			asn1p_lval.tv_opaque.len = yyleng;			return TOK_whitespace;			}	"}"		{				yy_pop_state();				if(YYSTATE == with_syntax) {					asn1p_lval.tv_str = strdup(yytext);					return TOK_Literal;				} else {					return '}';				}			}}{WSP}+	/* Ignore whitespace */[{][\t\r\v\f\n ]*[0-7][,][\t\r\v\f\n ]*[0-9]+[\t\r\v\f\n ]*[}]	{		asn1c_integer_t v1 = -1, v2 = -1;		char *p;		for(p = yytext; *p; p++)			if(*p >= '0' && *p <= '9')			{ v1 = _lex_atoi(p); break; }		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */		for(; *p; p++) if(*p >= '0' && *p <= '9')			{ v2 = _lex_atoi(p); break; }		if(v1 < 0 || v1 > 7) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.14 "				"mandates 0..7 range for Tuple's TableColumn\n",				yytext, yylineno);			return -1;		}		if(v2 < 0 || v2 > 15) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.14 "				"mandates 0..15 range for Tuple's TableRow\n",				yytext, yylineno);			return -1;		}		asn1p_lval.a_int = (v1 << 4) + v2;		return TOK_tuple;	}[{][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[\t\r\v\f\n ]*[}]	{		asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1;		char *p;		for(p = yytext; *p; p++)			if(*p >= '0' && *p <= '9')			{ v1 = _lex_atoi(p); break; }		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */		for(; *p; p++) if(*p >= '0' && *p <= '9')			{ v2 = _lex_atoi(p); break; }		while(*p >= '0' && *p <= '9') p++;		for(; *p; p++) if(*p >= '0' && *p <= '9')			{ v3 = _lex_atoi(p); break; }		while(*p >= '0' && *p <= '9') p++;		for(; *p; p++) if(*p >= '0' && *p <= '9')			{ v4 = _lex_atoi(p); break; }		if(v1 < 0 || v1 > 127) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "				"mandates 0..127 range for Quadruple's Group\n",				yytext, yylineno);			return -1;		}		if(v2 < 0 || v2 > 255) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "				"mandates 0..255 range for Quadruple's Plane\n",				yytext, yylineno);			return -1;		}		if(v3 < 0 || v3 > 255) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "				"mandates 0..255 range for Quadruple's Row\n",				yytext, yylineno);			return -1;		}		if(v4 < 0 || v4 > 255) {			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "				"mandates 0..255 range for Quadruple's Cell\n",				yytext, yylineno);			return -1;		}		asn1p_lval.a_int = (v1 << 24) | (v2 << 16) | (v3 << 8) | v4;		return TOK_quadruple;	}[(){},;:|!.&@\[\]^]	return yytext[0];[^A-Za-z0-9:=,{}<.@()[]'\"|&^*;!-] {		if(TYPE_LIFETIME(1994, 0))			fprintf(stderr, "ERROR: ");		fprintf(stderr,		"Symbol '%c' at line %d is prohibited "		"by ASN.1:1994 and ASN.1:1997\n",			yytext[0], yylineno);		if(TYPE_LIFETIME(1994, 0))			return -1;	}<*>.	{		fprintf(stderr,			"Unexpected token at line %d: \"%s\"\n",			yylineno, yytext);		while(YYSTATE != INITIAL)			yy_pop_state();		if(0) {			yy_top_state();	/* Just to use this function. */			yy_fatal_error("Parse error");		}		return -1;}<*><<EOF>>      {		while(YYSTATE != INITIAL)			yy_pop_state();		yyterminate();	}%%/* * Very dirty but wonderful hack allowing to rule states from within .y file. */void asn1p_lexer_hack_push_opaque_state() { yy_push_state(opaque); }/* * Another hack which disables recognizing some tokens when inside WITH SYNTAX. */void asn1p_lexer_hack_enable_with_syntax() { yy_push_state(with_syntax); }/* Yet another */void asn1p_lexer_hack_push_encoding_control() {	yy_push_state(encoding_control);}static asn1c_integer_t_lex_atoi(const char *ptr) {	asn1c_integer_t value;	if(asn1p_atoi(ptr, &value)) {		fprintf(stderr,			"Value \"%s\" at line %d is too large "			"for this compiler! Please contact the asn1c author.\n",			ptr, yylineno);		errno = ERANGE;	}	return value;}static double_lex_atod(const char *ptr) {	double value;	errno = 0;	value = strtod(ptr, 0);	if(errno) {		fprintf(stderr,			"Value \"%s\" at line %d is outside of `double` range "			"in this compiler! Please contact the asn1c author.\n",			ptr, yylineno);		errno = ERANGE;	}	return value;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -