|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* scanner-smi.l --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Lexical rules for scanning the SMIv1/v2 MIB module language.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit |
022b05 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* @(#) $Id: scanner-smi.l 6539 2007-02-01 08:23:54Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
%option noyywrap
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
%{
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <ctype.h>
|
|
Packit |
022b05 |
#include <errno.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#if defined(HAVE_WIN_H)
|
|
Packit |
022b05 |
#include "win.h"
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "error.h"
|
|
Packit |
022b05 |
#include "util.h"
|
|
Packit |
022b05 |
#include "parser-smi.h"
|
|
Packit |
022b05 |
#include "parser-smi.tab.h"
|
|
Packit |
022b05 |
#include "scanner-smi.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef HAVE_DMALLOC_H
|
|
Packit |
022b05 |
#include <dmalloc.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* we need a reentrant parser, so yylex gets arguments */
|
|
Packit |
022b05 |
#if 0
|
|
Packit |
022b05 |
#define YY_DECL int yylex YY_PROTO((YYSTYPE *lvalp, void *parser))
|
|
Packit |
022b05 |
#else
|
|
Packit |
022b05 |
#define YY_DECL int yylex(YYSTYPE *lvalp, void *parser)
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define thisParser (*(Parser *) parser)
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define MAX_UNSIGNED64 "18446744073709551615"
|
|
Packit |
022b05 |
#define MIN_UNSIGNED64 0
|
|
Packit |
022b05 |
#define MAX_UNSIGNED32 4294967295
|
|
Packit |
022b05 |
#define MIN_UNSIGNED32 0
|
|
Packit |
022b05 |
#define MAX_INTEGER32 2147483647
|
|
Packit |
022b05 |
#define MIN_INTEGER32 -2147483648
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* This makes the usual notation when referencing attributes also
|
|
Packit |
022b05 |
* work with our pure parser code.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
#define yylval (*lvalp)
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static YY_BUFFER_STATE yybuffer[MAX_LEX_DEPTH];
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int lexDepth = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int
|
|
Packit |
022b05 |
smiEnterLexRecursion(file)
|
|
Packit |
022b05 |
FILE *file;
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (lexDepth >= MAX_LEX_DEPTH) {
|
|
Packit |
022b05 |
return (-1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
yybuffer[lexDepth++] = YY_CURRENT_BUFFER;
|
|
Packit |
022b05 |
yy_switch_to_buffer(yy_create_buffer(file, YY_BUF_SIZE));
|
|
Packit |
022b05 |
return (lexDepth);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void
|
|
Packit |
022b05 |
smiLeaveLexRecursion()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
yy_delete_buffer(YY_CURRENT_BUFFER);
|
|
Packit |
022b05 |
yy_switch_to_buffer(yybuffer[--lexDepth]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
%}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex pattern definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
delim ([^a-zA-Z0-9-])|--
|
|
Packit |
022b05 |
enddelim ([^a-zA-Z0-9-])|--|""
|
|
Packit |
022b05 |
eol ("\n"|"\n\015"|"\015\n"|"\015")
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex state definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
%s Macro
|
|
Packit |
022b05 |
%s Choice
|
|
Packit |
022b05 |
%s Exports
|
|
Packit |
022b05 |
%s Comment
|
|
Packit |
022b05 |
%s Skipline
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
%%
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for skipping MACRO.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>MACRO {
|
|
Packit |
022b05 |
BEGIN(Macro);
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MACRO;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Macro>{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Macro>. {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Macro>END/{delim} {
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return END;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for skipping EXPORTS.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>EXPORTS {
|
|
Packit |
022b05 |
BEGIN(Exports);
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return EXPORTS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Exports>{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Exports>[^\;]* {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Exports>\; {
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
return yytext[0];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for skipping CHOICE.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>CHOICE {
|
|
Packit |
022b05 |
BEGIN(Choice);
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return CHOICE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Choice>{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Choice>[^\}] {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Choice>\} {
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
return yytext[0];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for comments.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>"--" {
|
|
Packit |
022b05 |
BEGIN(Comment);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Comment>"--" {
|
|
Packit |
022b05 |
thisParser.lcline = thisParser.line;
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* Special-case a common error (dashed seperator lines with
|
|
Packit |
022b05 |
* 4n+1 dashes, meaning a single dash outside the comment).
|
|
Packit |
022b05 |
* Print the "lexically unexpected" error that you would normally
|
|
Packit |
022b05 |
* get, and stick in the comment FYI also.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
<Comment>"---"{eol} {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_COMMENT_TERMINATES);
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_LEX_UNEXPECTED_CHAR);
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Comment>{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<Comment>[^-\n\015]* {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
<Comment>"-" {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for some special tokens.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>[\[\]\{\}\(\)\:\;\,\-\.\|] {
|
|
Packit |
022b05 |
return yytext[0];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>".." {
|
|
Packit |
022b05 |
return DOT_DOT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>"::=" {
|
|
Packit |
022b05 |
return COLON_COLON_EQUAL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for white space.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>[ \t]* {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for known keywords.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>AGENT-CAPABILITIES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return AGENT_CAPABILITIES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>APPLICATION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return APPLICATION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>AUGMENTS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return AUGMENTS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>BEGIN/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return BEGIN_;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>BITS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return BITS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>CONTACT-INFO/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return CONTACT_INFO;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>CREATION-REQUIRES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return CREATION_REQUIRES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>Counter32/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return COUNTER32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>Counter64/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return COUNTER64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>DEFINITIONS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return DEFINITIONS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>DEFVAL/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return DEFVAL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>DESCRIPTION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return DESCRIPTION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>DISPLAY-HINT/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return DISPLAY_HINT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>END/{enddelim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return END;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>ENTERPRISE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return ENTERPRISE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>EXTENDS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return EXTENDS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>FROM/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return FROM;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>GROUP/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return GROUP;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>Gauge32/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return GAUGE32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>IDENTIFIER/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return IDENTIFIER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>IMPLICIT/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return IMPLICIT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>IMPLIED/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return IMPLIED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>IMPORTS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return IMPORTS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>INCLUDES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INCLUDES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>INDEX/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INDEX;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>INSTALL-ERRORS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INSTALL_ERRORS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>INTEGER/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INTEGER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>Integer32/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INTEGER32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>Integer64/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return INTEGER64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>IpAddress/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return IPADDRESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>LAST-UPDATED/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return LAST_UPDATED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>MANDATORY-GROUPS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MANDATORY_GROUPS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>MAX-ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MAX_ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>MIN-ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MIN_ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>MODULE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MODULE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>MODULE-COMPLIANCE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MODULE_COMPLIANCE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>MODULE-IDENTITY/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return MODULE_IDENTITY;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>NOTIFICATION-GROUP/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return NOTIFICATION_GROUP;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>NOTIFICATION-TYPE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return NOTIFICATION_TYPE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>NOTIFICATIONS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return NOTIFICATIONS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OBJECT/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OBJECT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OBJECT-GROUP/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OBJECT_GROUP;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OBJECT-IDENTITY/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OBJECT_IDENTITY;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OBJECT-TYPE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OBJECT_TYPE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OBJECTS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OBJECTS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OCTET/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OCTET;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>OF/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OF;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>ORGANIZATION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return ORGANIZATION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>Opaque/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return OPAQUE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-DEFINITIONS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_DEFINITIONS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-INDEX/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_INDEX;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-MIN-ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_MIN_ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-REFERENCES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_REFERENCES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>PIB-TAG/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PIB_TAG;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>POLICY-ACCESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return POLICY_ACCESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>PRODUCT-RELEASE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return PRODUCT_RELEASE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>REFERENCE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return REFERENCE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>REVISION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return REVISION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>SEQUENCE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return SEQUENCE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>SIZE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return SIZE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>STATUS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return STATUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>STRING/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return STRING;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>SUBJECT-CATEGORIES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return SUBJECT_CATEGORIES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>SUPPORTS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return SUPPORTS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>SYNTAX/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return SYNTAX;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>TEXTUAL-CONVENTION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return TEXTUAL_CONVENTION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>TimeTicks/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return TIMETICKS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>TRAP-TYPE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return TRAP_TYPE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>UNIQUENESS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return UNIQUENESS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>UNITS/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return UNITS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>UNIVERSAL/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return UNIVERSAL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>Unsigned32/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return UNSIGNED32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>Unsigned64/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return UNSIGNED64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SPPI specific */
|
|
Packit |
022b05 |
<INITIAL>VALUE/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return VALUE;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>VARIABLES/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return VARIABLES;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>VARIATION/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return VARIATION;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI(ng) specific */
|
|
Packit |
022b05 |
<INITIAL>WRITE-SYNTAX/{delim} {
|
|
Packit |
022b05 |
yylval.id = yytext;
|
|
Packit |
022b05 |
return WRITE_SYNTAX;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for forbidden keywords. Do you use {delim} here because it
|
|
Packit |
022b05 |
* introduces a trailing context which is (a) slow and (b) causes
|
|
Packit |
022b05 |
* REJECT to be used.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>ABSENT|ANY|BIT|BOOLEAN|BY|COMPONENT|COMPONENTS|DEFAULT|DEFINED|ENUMERATED|EXPLICIT|EXTERNAL|FALSE|MAX|MIN|MINUS-INFINITY|NULL|OPTIONAL|PLUS-INFINITY|PRESENT|PRIVATE|REAL|SET|TAGS|TRUE|WITH/[^a-zA-Z0-9-] {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_ILLEGAL_KEYWORD, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>ABSENT|ANY|BIT|BOOLEAN|BY|COMPONENT|COMPONENTS|DEFAULT|DEFINED|ENUMERATED|EXPLICIT|EXTERNAL|FALSE|MAX|MIN|MINUS-INFINITY|NULL|OPTIONAL|PLUS-INFINITY|PRESENT|PRIVATE|REAL|SET|TAGS|TRUE|WITH/-- {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_ILLEGAL_KEYWORD, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for descriptors.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* e.g. module names: REF: draft,p.12-13 */
|
|
Packit |
022b05 |
<INITIAL>[A-Z](-?[a-zA-Z0-9_]+)*-? {
|
|
Packit |
022b05 |
if (yytext[yyleng-1] == '-') {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_ID_ENDS_IN_HYPHEN, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (strchr(yytext, '_')) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_UNDERSCORE_IN_IDENTIFIER, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
yylval.id = smiStrdup(yytext);
|
|
Packit |
022b05 |
return UPPERCASE_IDENTIFIER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* same for lowercase names */
|
|
Packit |
022b05 |
<INITIAL>[a-z](-?[a-zA-Z0-9_]+)*-? {
|
|
Packit |
022b05 |
if (yytext[yyleng-1] == '-') {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_ID_ENDS_IN_HYPHEN, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (strchr(yytext, '_')) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_UNDERSCORE_IN_IDENTIFIER, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
yylval.id = smiStrdup(yytext);
|
|
Packit |
022b05 |
return LOWERCASE_IDENTIFIER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for numbers.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>0+/[0-9] {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_LEADING_ZEROS);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>([1-9][0-9]*|0)/[^0-9] {
|
|
Packit |
022b05 |
errno = 0;
|
|
Packit |
022b05 |
yylval.unsigned32 = strtoul(yytext, NULL, 10);
|
|
Packit |
022b05 |
if (errno == ERANGE) {
|
|
Packit |
022b05 |
/* TODO: proper handling for SPPI vs SMI modules. */
|
|
Packit |
022b05 |
if ((thisParser.modulePtr->export.language == SMI_LANGUAGE_SPPI) ||
|
|
Packit |
022b05 |
(thisParser.modulePtr->export.language == SMI_LANGUAGE_SMIV2)) {
|
|
Packit |
022b05 |
yylval.unsigned64 = strtoull(yytext, NULL, 10);
|
|
Packit |
022b05 |
if (errno == ERANGE) {
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Dirty hack - on my system strtoull returns ERANGE for
|
|
Packit |
022b05 |
* numbers that definitely are in range for 64 bit types.
|
|
Packit |
022b05 |
* Nevertheless strtoull returns the correct value. To
|
|
Packit |
022b05 |
* check this we convert the number back to a string.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
char tmpbuf[24];
|
|
Packit |
022b05 |
sprintf(tmpbuf, "%llu", yylval.unsigned64);
|
|
Packit |
022b05 |
if (strcmp(yytext, tmpbuf))
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_SPPI_UNSIGNED64_NUMBER_RANGE, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NUMBER64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* We don't want to see this error for the SNMPv2-SMI module,
|
|
Packit |
022b05 |
* neither for COPS-PR-SPPI. */
|
|
Packit |
022b05 |
if (strcmp(thisParser.modulePtr->export.name, "SNMPv2-SMI") &&
|
|
Packit |
022b05 |
strcmp(thisParser.modulePtr->export.name, "COPS-PR-SPPI")) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_SMIV2_UNSIGNED_NUMBER_RANGE, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NUMBER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>-([1-9][0-9]*|0)/[^0-9] {
|
|
Packit |
022b05 |
errno = 0;
|
|
Packit |
022b05 |
yylval.integer32 = strtol(yytext, NULL, 10);
|
|
Packit |
022b05 |
if (errno == ERANGE) {
|
|
Packit |
022b05 |
/* TODO: proper handling for SPPI vs SMI modules. */
|
|
Packit |
022b05 |
if (thisParser.modulePtr->export.language == SMI_LANGUAGE_SPPI) {
|
|
Packit |
022b05 |
yylval.integer64 = strtoll(yytext, NULL, 10);
|
|
Packit |
022b05 |
if (errno == ERANGE) {
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Dirty hack - on my system strtoull returns ERANGE for
|
|
Packit |
022b05 |
* numbers that definitely are in range for 64 bit types.
|
|
Packit |
022b05 |
* Nevertheless strtoull returns the correct value. To
|
|
Packit |
022b05 |
* check this we convert the number back to a string.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
char tmpbuf[24];
|
|
Packit |
022b05 |
sprintf(tmpbuf, "%lld", yylval.integer64);
|
|
Packit |
022b05 |
if (strcmp(yytext, tmpbuf))
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_SPPI_SIGNED64_NUMBER_RANGE, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NEGATIVENUMBER64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
/* We don't want to see this error for the COPS-PR-SPPI module. */
|
|
Packit |
022b05 |
if (strcmp(thisParser.modulePtr->export.name, "COPS-PR-SPPI"))
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_SMIV2_SIGNED_NUMBER_RANGE, yytext);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NEGATIVENUMBER;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Lex rules for binary, hexadecimal and quoted strings (RFC 2578 3.1.1)
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>\'[01]*\'[bB] {
|
|
Packit |
022b05 |
yylval.text = yytext + 1;
|
|
Packit |
022b05 |
yytext[yyleng-2] = '\0';
|
|
Packit |
022b05 |
if ((yyleng-3) % 8) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_BIN_STRING_MUL8, yylval.text);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return BIN_STRING;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>\'[0123456789AaBbCcDdEeFf]*\'[hH] {
|
|
Packit |
022b05 |
yylval.text = yytext + 1;
|
|
Packit |
022b05 |
yytext[yyleng-2] = '\0';
|
|
Packit |
022b05 |
if ((yyleng-3) % 2) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_HEX_STRING_MUL2, yylval.text);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return HEX_STRING;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
<INITIAL>\"[^\"]*\" {
|
|
Packit |
022b05 |
char *s, *d; /* the source and destination pointer */
|
|
Packit |
022b05 |
int column = 0; /* the current column */
|
|
Packit |
022b05 |
int newlineflag = 0; /* we have just passed a newline */
|
|
Packit |
022b05 |
int cutoffcolumn = 0; /* cut off white space up to this column */
|
|
Packit |
022b05 |
/* (computed by caculating the indentation */
|
|
Packit |
022b05 |
/* of the first column) */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
yytext[yyleng-1] = '\0';
|
|
Packit |
022b05 |
for (d = yytext, s = yytext+1; s[0]; s++, d++) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((s[0] == '\n' && s[1] == '\r') /* newline sequence */
|
|
Packit |
022b05 |
|| (s[0] == '\r' && s[1] == '\n')) {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
d[0] = '\n';
|
|
Packit |
022b05 |
s++;
|
|
Packit |
022b05 |
newlineflag = 1;
|
|
Packit |
022b05 |
column = 0;
|
|
Packit |
022b05 |
if (cutoffcolumn < 0) cutoffcolumn = 0;
|
|
Packit |
022b05 |
} else if (s[0] == '\n' || s[0] == '\r') { /* simple newline */
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
d[0] = '\n';
|
|
Packit |
022b05 |
newlineflag = 1;
|
|
Packit |
022b05 |
column = 0;
|
|
Packit |
022b05 |
if (cutoffcolumn < 0) cutoffcolumn = 0;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
if (newlineflag && isspace((int)(unsigned char)s[0])) { /* space after newline */
|
|
Packit |
022b05 |
if (cutoffcolumn <= 0) {
|
|
Packit |
022b05 |
cutoffcolumn -= (s[0] == '\t') ? (8-((column-1) % 8)) : 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
column += (s[0] == '\t') ? (8-((column-1) % 8)) : 1;
|
|
Packit |
022b05 |
if (cutoffcolumn <= 0 || column <= cutoffcolumn) {
|
|
Packit |
022b05 |
d--;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
d[0] = s[0];
|
|
Packit |
022b05 |
newlineflag = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else { /* everything else */
|
|
Packit |
022b05 |
if (! isascii(s[0])) {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_ILLEGAL_CHAR_IN_STRING,
|
|
Packit |
022b05 |
s[0], (unsigned char) s[0]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
d[0] = s[0];
|
|
Packit |
022b05 |
newlineflag = 0;
|
|
Packit |
022b05 |
if (cutoffcolumn < 0) {
|
|
Packit |
022b05 |
cutoffcolumn *= -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
d[0] = '\0';
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
yylval.text = yytext;
|
|
Packit |
022b05 |
return QUOTED_STRING;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Skip the remainder of the line
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
<Skipline>.*{eol} {
|
|
Packit |
022b05 |
thisParser.line++;
|
|
Packit |
022b05 |
BEGIN(INITIAL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Everything else...
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
. {
|
|
Packit |
022b05 |
smiPrintError(parser, ERR_LEX_UNEXPECTED_CHAR);
|
|
Packit |
022b05 |
BEGIN(Skipline);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
%%
|