Blame lib/scanner-smi.l

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
%%