Blame lib/parser-sming.y

Packit 022b05
/*
Packit 022b05
 * parser-sming.y --
Packit 022b05
 *
Packit 022b05
 *      Syntax rules for parsing the SMIng 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: parser-sming.y 7966 2008-03-27 21:25:52Z schoenw $
Packit 022b05
 */
Packit 022b05
Packit 022b05
%{
Packit 022b05
Packit 022b05
#include <config.h>
Packit 022b05
    
Packit 022b05
#ifdef BACKEND_SMING
Packit 022b05
Packit 022b05
#define _ISOC99_SOURCE
Packit 022b05
#include <stdio.h>
Packit 022b05
#include <errno.h>
Packit 022b05
#include <stdlib.h>
Packit 022b05
#include <string.h>
Packit 022b05
#include <ctype.h>
Packit 022b05
#include <time.h>
Packit 022b05
#include <limits.h>
Packit 022b05
#include <float.h>
Packit 022b05
Packit 022b05
#if defined(_MSC_VER)
Packit 022b05
#include <malloc.h>
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#ifdef HAVE_WIN_H
Packit 022b05
#include "win.h"
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#include "smi.h"
Packit 022b05
#include "error.h"
Packit 022b05
#include "parser-sming.h"
Packit 022b05
#include "scanner-sming.h"
Packit 022b05
#include "data.h"
Packit 022b05
#include "check.h"
Packit 022b05
#include "util.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
 * These arguments are passed to yyparse() and yylex().
Packit 022b05
 */
Packit 022b05
#define YYPARSE_PARAM parserPtr
Packit 022b05
#define YYLEX_PARAM   parserPtr
Packit 022b05
Packit 022b05
    
Packit 022b05
    
Packit 022b05
#define thisParserPtr      ((Parser *)parserPtr)
Packit 022b05
#define thisModulePtr     (((Parser *)parserPtr)->modulePtr)
Packit 022b05
Packit 022b05
Packit 022b05
    
Packit 022b05
/*
Packit 022b05
 * NOTE: The argument lvalp ist not really a void pointer. Unfortunately,
Packit 022b05
 * we don't know it better at this point. bison generated C code declares
Packit 022b05
 * YYSTYPE just a few lines below based on the `%union' declaration.
Packit 022b05
 */
Packit 022b05
extern int yylex(void *lvalp, Parser *parserPtr);
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *typeIdentifier, *macroIdentifier, *identityIdentifier, 
Packit 022b05
	    *classIdentifier, *attributeIdentifier;
Packit 022b05
static char *importModulename = NULL;
Packit 022b05
static Type *typePtr = NULL;
Packit 022b05
static Macro *macroPtr = NULL;
Packit 022b05
static Identity *identityPtr = NULL;
Packit 022b05
static Class	*classPtr = NULL;
Packit 022b05
static Attribute *attributePtr = NULL;
Packit 022b05
static Event *eventPtr = NULL;
Packit 022b05
static SmiBasetype defaultBasetype = SMI_BASETYPE_UNKNOWN;
Packit 022b05
static NamedNumber *namedNumberPtr = NULL;
Packit 022b05
static int bitsFlag = 0; /* used to differentiate bits definition from enum*/
Packit 022b05
static int attributeFlag = 0; /* 
Packit 022b05
							   *Used to differentiate between attribute and
Packit 022b05
							   *and typedef to tie the type statement
Packit 022b05
							   *respectively to class or module.
Packit 022b05
							   */
Packit 022b05
Packit 022b05
Packit 022b05
#define SMI_EPOCH	631152000	/* 01 Jan 1990 00:00:00 */ 
Packit 022b05
 
Packit 022b05
Packit 022b05
static Type *
Packit 022b05
findType(char *spec, Parser *parserPtr, Module *modulePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
    Import *importPtr;
Packit 022b05
    char *module, *type;
Packit 022b05
Packit 022b05
    type = strstr(spec, "::");
Packit 022b05
    if (!type) {
Packit 022b05
	typePtr = findTypeByModuleAndName(modulePtr, spec);
Packit 022b05
	if (!typePtr) {
Packit 022b05
	    importPtr = findImportByName(spec, modulePtr);
Packit 022b05
	    if (importPtr) {
Packit 022b05
		typePtr = findTypeByModulenameAndName(importPtr->export.module,
Packit 022b05
						      spec);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	module = strtok(spec, ":");
Packit 022b05
	type = &type[2];
Packit 022b05
	typePtr = findTypeByModulenameAndName(module, type);
Packit 022b05
    }
Packit 022b05
    return typePtr;
Packit 022b05
}
Packit 022b05
 
Packit 022b05
 
Packit 022b05
static Identity *
Packit 022b05
findIdentity(char *spec, Parser *parserPtr, Module *modulePtr)
Packit 022b05
{
Packit 022b05
    Identity *identityPtr;
Packit 022b05
    Import *importPtr;
Packit 022b05
    char *module, *identity;
Packit 022b05
Packit 022b05
    identity = strstr(spec, "::");
Packit 022b05
    if (!identity) {
Packit 022b05
	identityPtr = findIdentityByModuleAndName(modulePtr, spec);
Packit 022b05
	if (!identityPtr) {
Packit 022b05
	    importPtr = findImportByName(spec, modulePtr);
Packit 022b05
	    if (importPtr) {
Packit 022b05
		identityPtr = findIdentityByModulenameAndName(importPtr->export.module,
Packit 022b05
						      spec);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	module = strtok(spec, ":");
Packit 022b05
	identity = &identity[2];
Packit 022b05
	identityPtr = findIdentityByModulenameAndName(module, identity);
Packit 022b05
    }
Packit 022b05
    return identityPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
static Class *
Packit 022b05
findClass(char *spec, Parser *parserPtr, Module *modulePtr)
Packit 022b05
{
Packit 022b05
    Class *classPtr;
Packit 022b05
    Import *importPtr;
Packit 022b05
    char *module, *class;
Packit 022b05
Packit 022b05
    class = strstr(spec, "::");
Packit 022b05
    if (!class) {
Packit 022b05
	classPtr = findClassByModuleAndName(modulePtr, spec);
Packit 022b05
	if (!classPtr) {
Packit 022b05
	    importPtr = findImportByName(spec, modulePtr);
Packit 022b05
	    if (importPtr) {
Packit 022b05
		classPtr = findClassByModulenameAndName(importPtr->export.module,
Packit 022b05
						      spec);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	module = strtok(spec, ":");
Packit 022b05
	class = &class[2];
Packit 022b05
	classPtr = findClassByModulenameAndName(module, class);
Packit 022b05
    }
Packit 022b05
    return classPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
static void
Packit 022b05
checkTypes(Parser *parserPtr, Module *modulePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
    
Packit 022b05
    for(typePtr = modulePtr->firstTypePtr;
Packit 022b05
	typePtr; typePtr = typePtr->nextPtr) {
Packit 022b05
Packit 022b05
	/*
Packit 022b05
	 * Complain about empty description clauses.
Packit 022b05
	 */
Packit 022b05
Packit 022b05
	if (! parserPtr->flags & SMI_FLAG_NODESCR
Packit 022b05
	    && (! typePtr->export.description
Packit 022b05
		|| ! typePtr->export.description[0])) {
Packit 022b05
	    smiPrintErrorAtLine(parserPtr, ERR_EMPTY_DESCRIPTION,
Packit 022b05
				typePtr->line, typePtr->export.name);
Packit 022b05
	}
Packit 022b05
	
Packit 022b05
	smiCheckNamedNumberRedefinition(parserPtr, typePtr);
Packit 022b05
	smiCheckNamedNumberSubtyping(parserPtr, typePtr);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static time_t
Packit 022b05
checkDate(Parser *parserPtr, char *date)
Packit 022b05
{
Packit 022b05
    struct tm	tm;
Packit 022b05
    time_t	anytime;
Packit 022b05
    int		i, len;
Packit 022b05
    char	*p;
Packit 022b05
Packit 022b05
    memset(&tm, 0, sizeof(tm));
Packit 022b05
    anytime = 0;
Packit 022b05
Packit 022b05
    len = strlen(date);
Packit 022b05
    if (len == 10 || len == 16) {
Packit 022b05
	for (i = 0; i < len; i++) {
Packit 022b05
	    if (((i < 4 || i == 5 || i == 6 || i == 8 || i == 9 || i == 11
Packit 022b05
		  || i == 12 || i == 14 || i == 15) && ! isdigit((int)date[i]))
Packit 022b05
		|| ((i == 4 || i == 7) && date[i] != '-')
Packit 022b05
		|| (i == 10 && date[i] != ' ')
Packit 022b05
		|| (i == 13 && date[i] != ':')) {
Packit 022b05
		smiPrintError(parserPtr, ERR_DATE_CHARACTER, date);
Packit 022b05
		anytime = (time_t) -1;
Packit 022b05
		break;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	smiPrintError(parserPtr, ERR_DATE_LENGTH, date);
Packit 022b05
	anytime = (time_t) -1;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (anytime == 0) {
Packit 022b05
	for (i = 0, p = date, tm.tm_year = 0; i < 4; i++, p++) {
Packit 022b05
	    tm.tm_year = tm.tm_year * 10 + (*p - '0');
Packit 022b05
	}
Packit 022b05
	p++;
Packit 022b05
	tm.tm_mon = (p[0]-'0') * 10 + (p[1]-'0');
Packit 022b05
	p += 3;
Packit 022b05
	tm.tm_mday = (p[0]-'0') * 10 + (p[1]-'0');
Packit 022b05
	p += 2;
Packit 022b05
	if (len == 16) {
Packit 022b05
	    p++;
Packit 022b05
	    tm.tm_hour = (p[0]-'0') * 10 + (p[1]-'0');
Packit 022b05
	    p += 3;
Packit 022b05
	    tm.tm_min = (p[0]-'0') * 10 + (p[1]-'0');
Packit 022b05
	}
Packit 022b05
	
Packit 022b05
	if (tm.tm_mon < 1 || tm.tm_mon > 12) {
Packit 022b05
	    smiPrintError(parserPtr, ERR_DATE_MONTH, date);
Packit 022b05
	}
Packit 022b05
	if (tm.tm_mday < 1 || tm.tm_mday > 31) {
Packit 022b05
	    smiPrintError(parserPtr, ERR_DATE_DAY, date);
Packit 022b05
	}
Packit 022b05
	if (tm.tm_hour < 0 || tm.tm_hour > 23) {
Packit 022b05
	    smiPrintError(parserPtr, ERR_DATE_HOUR, date);
Packit 022b05
	}
Packit 022b05
	if (tm.tm_min < 0 || tm.tm_min > 59) {
Packit 022b05
	    smiPrintError(parserPtr, ERR_DATE_MINUTES, date);
Packit 022b05
	}
Packit 022b05
	
Packit 022b05
	tm.tm_year -= 1900;
Packit 022b05
	tm.tm_mon -= 1;
Packit 022b05
	tm.tm_isdst = 0;
Packit 022b05
Packit 022b05
	anytime = timegm(&tm;;
Packit 022b05
Packit 022b05
	if (anytime == (time_t) -1) {
Packit 022b05
	    smiPrintError(parserPtr, ERR_DATE_VALUE, date);
Packit 022b05
	} else {
Packit 022b05
	    if (anytime < SMI_EPOCH) {
Packit 022b05
		smiPrintError(parserPtr, ERR_DATE_IN_PAST, date);
Packit 022b05
	    }
Packit 022b05
	    if (anytime > time(NULL)) {
Packit 022b05
		smiPrintError(parserPtr, ERR_DATE_IN_FUTURE, date);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return (anytime == (time_t) -1) ? 0 : anytime;
Packit 022b05
}
Packit 022b05
Packit 022b05
static char *hexToStr(char *hexStr, int len)
Packit 022b05
{
Packit 022b05
   union{
Packit 022b05
   	char ch;
Packit 022b05
   	long l;
Packit 022b05
   } hex2char;
Packit 022b05
   
Packit 022b05
   char* res =(char*)malloc(sizeof(char)*len/2+1);
Packit 022b05
   char* tmp =(char*)malloc(sizeof(char)*3);
Packit 022b05
   int i,j = 0;
Packit 022b05
Packit 022b05
   tmp[2]=0;
Packit 022b05
   for(i=2; i+1
Packit 022b05
   {
Packit 022b05
   	tmp[0]= hexStr[i];
Packit 022b05
   	tmp[1]= hexStr[i+1];
Packit 022b05
   	
Packit 022b05
   	hex2char.l = strtol(tmp,NULL,16);
Packit 022b05
   	res[j] = hex2char.ch;
Packit 022b05
   	
Packit 022b05
   	j++;
Packit 022b05
   }
Packit 022b05
   
Packit 022b05
   smiFree(tmp);
Packit 022b05
   
Packit 022b05
   res[j]=0;
Packit 022b05
   return res;
Packit 022b05
}
Packit 022b05
Packit 022b05
static void createBitsValue(SmiValue *valuePtr, Type *typePtr)
Packit 022b05
{
Packit 022b05
    List *bitsListPtr, *valueListPtr, *p, *pp, *nextPtr;
Packit 022b05
    int nBits, bit;
Packit 022b05
    
Packit 022b05
    if (valuePtr->basetype != SMI_BASETYPE_BITS)
Packit 022b05
	return;
Packit 022b05
	
Packit 022b05
	bitsListPtr = typePtr->listPtr;
Packit 022b05
	valueListPtr = (void *)valuePtr->value.ptr;
Packit 022b05
	for (nBits = 0, p = bitsListPtr; p; p = p->nextPtr) {
Packit 022b05
	    if (nBits < 1+((NamedNumber *)(p->ptr))->export.value.value.unsigned64) {
Packit 022b05
		nBits = 1+((NamedNumber *)(p->ptr))->export.value.value.unsigned64;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	valuePtr->value.ptr = smiMalloc((nBits+7)/8);
Packit 022b05
	memset(valuePtr->value.ptr, 0, (nBits+7)/8);
Packit 022b05
	valuePtr->len = (nBits+7)/8;
Packit 022b05
	for (p = valueListPtr; p;) {
Packit 022b05
	    for (pp = bitsListPtr; pp; pp = pp->nextPtr) {
Packit 022b05
		if (!strcmp(p->ptr,
Packit 022b05
			    ((NamedNumber *)(pp->ptr))->export.name)) {
Packit 022b05
		    bit = (int)(((NamedNumber *)(pp->ptr))->export.value.value.unsigned64);
Packit 022b05
		    valuePtr->value.ptr[bit/8] |=
Packit 022b05
			1 << (7-(bit%8));
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	    smiFree(p->ptr);
Packit 022b05
	    nextPtr = p->nextPtr;
Packit 022b05
	    smiFree(p);
Packit 022b05
	    p = nextPtr;
Packit 022b05
	}
Packit 022b05
}
Packit 022b05
Packit 022b05
			    
Packit 022b05
%}
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * The grammars start symbol.
Packit 022b05
 */
Packit 022b05
%start smingFile
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * We call the parser from within the parser when IMPORTing modules,
Packit 022b05
 * hence we need reentrant parser code. This is a bison feature.
Packit 022b05
 */
Packit 022b05
%pure_parser
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * The attributes.
Packit 022b05
 */
Packit 022b05
%union {
Packit 022b05
    char           *id;				/* identifier name           */
Packit 022b05
    int            rc;				/* >=0: ok, <0: error        */
Packit 022b05
    time_t	   date;			/* a date value		     */
Packit 022b05
    char	   *text;
Packit 022b05
    Module	   *modulePtr;
Packit 022b05
    Node	   *nodePtr;
Packit 022b05
    Object	   *objectPtr;
Packit 022b05
    Identity   *identityPtr;
Packit 022b05
    Macro	   *macroPtr;
Packit 022b05
    Type	   *typePtr;
Packit 022b05
    Class	   *classPtr;
Packit 022b05
    Attribute  *attributePtr;
Packit 022b05
    Event	   *eventPtr;
Packit 022b05
    Index	   index;
Packit 022b05
    Option	   *optionPtr;
Packit 022b05
    Refinement	   *refinementPtr;
Packit 022b05
    SmiStatus	   status;
Packit 022b05
    SmiAccess	   access;
Packit 022b05
    NamedNumber    *namedNumberPtr;
Packit 022b05
    Range	   *rangePtr;
Packit 022b05
    SmiValue	   *valuePtr;
Packit 022b05
    List	   *listPtr;
Packit 022b05
    Revision	   *revisionPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Tokens and their attributes.
Packit 022b05
 */
Packit 022b05
%token DOT
Packit 022b05
%token DOT_DOT
Packit 022b05
%token COLON_COLON
Packit 022b05
Packit 022b05
%token <text>ucIdentifier
Packit 022b05
%token <text>lcIdentifier
Packit 022b05
Packit 022b05
%token <text>floatValue
Packit 022b05
%token <text>textSegment
Packit 022b05
%token <text>decimalNumber
Packit 022b05
%token <text>hexadecimalNumber
Packit 022b05
%token <text>OID
Packit 022b05
Packit 022b05
%token <rc>moduleKeyword
Packit 022b05
%token <rc>importKeyword
Packit 022b05
%token <rc>revisionKeyword
Packit 022b05
%token <rc>identityKeyword
Packit 022b05
%token <rc>oidKeyword
Packit 022b05
%token <rc>dateKeyword
Packit 022b05
%token <rc>organizationKeyword
Packit 022b05
%token <rc>contactKeyword
Packit 022b05
%token <rc>descriptionKeyword
Packit 022b05
%token <rc>referenceKeyword
Packit 022b05
%token <rc>extensionKeyword
Packit 022b05
%token <rc>typedefKeyword
Packit 022b05
%token <rc>typeKeyword
Packit 022b05
%token <rc>formatKeyword
Packit 022b05
%token <rc>unitsKeyword
Packit 022b05
%token <rc>statusKeyword
Packit 022b05
%token <rc>accessKeyword
Packit 022b05
%token <rc>defaultKeyword
Packit 022b05
%token <rc>impliedKeyword
Packit 022b05
%token <rc>indexKeyword
Packit 022b05
%token <rc>augmentsKeyword
Packit 022b05
%token <rc>reordersKeyword
Packit 022b05
%token <rc>sparseKeyword
Packit 022b05
%token <rc>expandsKeyword
Packit 022b05
%token <rc>createKeyword
Packit 022b05
%token <rc>membersKeyword
Packit 022b05
%token <rc>objectsKeyword
Packit 022b05
%token <rc>mandatoryKeyword
Packit 022b05
%token <rc>optionalKeyword
Packit 022b05
%token <rc>refineKeyword
Packit 022b05
%token <rc>abnfKeyword
Packit 022b05
%token <rc>OctetStringKeyword
Packit 022b05
%token <rc>ObjectIdentifierKeyword
Packit 022b05
%token <rc>Integer32Keyword
Packit 022b05
%token <rc>Unsigned32Keyword
Packit 022b05
%token <rc>Integer64Keyword
Packit 022b05
%token <rc>Unsigned64Keyword
Packit 022b05
%token <rc>Float32Keyword
Packit 022b05
%token <rc>Float64Keyword
Packit 022b05
%token <rc>Float128Keyword
Packit 022b05
%token <rc>BitsKeyword
Packit 022b05
%token <rc>EnumerationKeyword
Packit 022b05
%token <rc>currentKeyword
Packit 022b05
%token <rc>deprecatedKeyword
Packit 022b05
%token <rc>obsoleteKeyword
Packit 022b05
%token <rc>readonlyKeyword
Packit 022b05
%token <rc>readwriteKeyword
Packit 022b05
Packit 022b05
%token <rc>parentKeyword
Packit 022b05
%token <rc>classKeyword
Packit 022b05
%token <rc>extendsKeyword
Packit 022b05
%token <rc>attributeKeyword
Packit 022b05
%token <rc>uniqueKeyword
Packit 022b05
%token <rc>eventKeyword
Packit 022b05
%token <rc>PointerKeyword
Packit 022b05
%token <rc>eventonlyKeyword
Packit 022b05
%token <rc>neginfKeyword
Packit 022b05
%token <rc>posinfKeyword
Packit 022b05
%token <rc>snanKeyword
Packit 022b05
%token <rc>qnanKeyword
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Types of non-terminal symbols.
Packit 022b05
 */
Packit 022b05
Packit 022b05
%type <rc>smingFile
Packit 022b05
%type <rc>moduleStatement_optsep_0n
Packit 022b05
%type <rc>moduleStatement_optsep_1n
Packit 022b05
%type <rc>moduleStatement_optsep
Packit 022b05
%type <modulePtr>moduleStatement
Packit 022b05
%type <rc>extensionStatement_stmtsep_0n
Packit 022b05
%type <rc>extensionStatement_stmtsep_1n
Packit 022b05
%type <rc>extensionStatement_stmtsep
Packit 022b05
%type <macroPtr>extensionStatement
Packit 022b05
%type <rc>identityStatement_stmtsep_0n
Packit 022b05
%type <rc>identityStatement_stmtsep_1n
Packit 022b05
%type <rc>identityStatement_stmtsep
Packit 022b05
%type <identityPtr>identityStatement
Packit 022b05
%type <identityPtr>parentStatement_stmtsep_01
Packit 022b05
%type <identityPtr>parentStatement
Packit 022b05
%type <rc>typedefStatement_stmtsep_0n
Packit 022b05
%type <rc>typedefStatement_stmtsep_1n
Packit 022b05
%type <rc>typedefStatement_stmtsep
Packit 022b05
%type <typePtr>typedefStatement
Packit 022b05
%type <rc>attributeStatement_stmtsep_0n
Packit 022b05
%type <rc>attributeStatement_stmtsep_1n
Packit 022b05
%type <rc>attributeStatement_stmtsep
Packit 022b05
%type <attributePtr>attributeStatement
Packit 022b05
%type <rc>eventStatement_stmtsep_0n
Packit 022b05
%type <rc>eventStatement_stmtsep_1n
Packit 022b05
%type <rc>eventStatement_stmtsep
Packit 022b05
%type <eventPtr>eventStatement
Packit 022b05
%type <rc>classStatement_stmtsep_0n
Packit 022b05
%type <rc>classStatement_stmtsep_1n
Packit 022b05
%type <rc>classStatement_stmtsep
Packit 022b05
%type <classPtr>classStatement
Packit 022b05
%type <classPtr>extendsStatement_stmtsep_01
Packit 022b05
%type <classPtr>extendsStatement
Packit 022b05
%type <rc>importStatement_stmtsep_0n
Packit 022b05
%type <rc>importStatement_stmtsep_1n
Packit 022b05
%type <rc>importStatement_stmtsep
Packit 022b05
%type <listPtr>importStatement
Packit 022b05
%type <rc>revisionStatement_stmtsep_0n
Packit 022b05
%type <rc>revisionStatement_stmtsep_1n
Packit 022b05
%type <rc>revisionStatement_stmtsep
Packit 022b05
%type <revisionPtr>revisionStatement
Packit 022b05
%type <typePtr>typedefTypeStatement
Packit 022b05
%type <attributePtr>attributeTypeStatement
Packit 022b05
%type <date>dateStatement
Packit 022b05
%type <text>organizationStatement
Packit 022b05
%type <text>contactStatement
Packit 022b05
%type <text>formatStatement_stmtsep_01
Packit 022b05
%type <text>formatStatement
Packit 022b05
%type <text>unitsStatement_stmtsep_01
Packit 022b05
%type <text>unitsStatement
Packit 022b05
%type <status>statusStatement_stmtsep_01
Packit 022b05
%type <status>statusStatement
Packit 022b05
%type <valuePtr>defaultStatement_stmtsep_01
Packit 022b05
%type <valuePtr>defaultStatement
Packit 022b05
%type <access>accessStatement_stmtsep_01
Packit 022b05
%type <access>accessStatement
Packit 022b05
%type <access>access
Packit 022b05
%type <text>descriptionStatement_stmtsep_01
Packit 022b05
%type <text>descriptionStatement
Packit 022b05
%type <text>referenceStatement_stmtsep_01
Packit 022b05
%type <text>referenceStatement
Packit 022b05
%type <text>abnfStatement_stmtsep_01
Packit 022b05
%type <text>abnfStatement
Packit 022b05
%type <typePtr>refinedBaseType_refinedType
Packit 022b05
%type <typePtr>refinedBaseType
Packit 022b05
%type <typePtr>refinedType
Packit 022b05
%type <attributePtr>attribute_refinedBaseType_refinedType
Packit 022b05
%type <attributePtr>attribute_refinedBaseType
Packit 022b05
%type <attributePtr>attribute_refinedType
Packit 022b05
%type <listPtr>optsep_anySpec_01
Packit 022b05
%type <listPtr>anySpec
Packit 022b05
%type <listPtr>optsep_numberSpec_01
Packit 022b05
%type <listPtr>numberSpec
Packit 022b05
%type <listPtr>furtherNumberElement_0n
Packit 022b05
%type <listPtr>furtherNumberElement_1n
Packit 022b05
%type <rangePtr>furtherNumberElement
Packit 022b05
%type <rangePtr>numberElement
Packit 022b05
%type <valuePtr>numberUpperLimit_01
Packit 022b05
%type <valuePtr>numberUpperLimit
Packit 022b05
%type <listPtr>optsep_floatSpec_01
Packit 022b05
%type <listPtr>floatSpec
Packit 022b05
%type <listPtr>furtherFloatElement_0n
Packit 022b05
%type <listPtr>furtherFloatElement_1n
Packit 022b05
%type <rangePtr>furtherFloatElement
Packit 022b05
%type <rangePtr>floatElement
Packit 022b05
%type <text>floatUpperLimit_01
Packit 022b05
%type <text>floatUpperLimit
Packit 022b05
%type <text>specialFloatValue
Packit 022b05
%type <listPtr>optsep_pointerRestr_01
Packit 022b05
%type <text>pointerRestr
Packit 022b05
%type <listPtr>bitsOrEnumerationSpec
Packit 022b05
%type <listPtr>bitsOrEnumerationList
Packit 022b05
%type <listPtr>furtherBitsOrEnumerationItem_0n
Packit 022b05
%type <listPtr>furtherBitsOrEnumerationItem_1n
Packit 022b05
%type <namedNumberPtr>furtherBitsOrEnumerationItem
Packit 022b05
%type <namedNumberPtr>bitsOrEnumerationItem
Packit 022b05
%type <listPtr>identifierList
Packit 022b05
%type <listPtr>furtherIdentifier_0n
Packit 022b05
%type <listPtr>furtherIdentifier_1n
Packit 022b05
%type <text>furtherIdentifier
Packit 022b05
%type <listPtr>uniqueStatement_stmtsep_01
Packit 022b05
%type <listPtr>uniqueStatement
Packit 022b05
%type <listPtr>uniqueSpec
Packit 022b05
%type <listPtr>bitsValue
Packit 022b05
%type <listPtr>bitsList
Packit 022b05
%type <listPtr>furtherLcIdentifier_0n
Packit 022b05
%type <listPtr>furtherLcIdentifier_1n
Packit 022b05
%type <text>furtherLcIdentifier
Packit 022b05
%type <text>identifier
Packit 022b05
%type <text>qucIdentifier
Packit 022b05
%type <text>qlcIdentifier
Packit 022b05
%type <text>text
Packit 022b05
%type <text>optsep_textSegment_0n
Packit 022b05
%type <text>optsep_textSegment_1n
Packit 022b05
%type <text>optsep_textSegment
Packit 022b05
%type <date>date
Packit 022b05
%type <text>format
Packit 022b05
%type <text>units
Packit 022b05
%type <valuePtr>anyValue
Packit 022b05
%type <status>status
Packit 022b05
%type <valuePtr>number
Packit 022b05
%type <valuePtr>negativeNumber
Packit 022b05
%type <valuePtr>signedNumber
Packit 022b05
%type <rc>optsep_comma_01
Packit 022b05
%type <rc>sep
Packit 022b05
%type <rc>optsep
Packit 022b05
%type <rc>stmtsep
Packit 022b05
%type <text>qOID
Packit 022b05
Packit 022b05
%%
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Yacc rules.
Packit 022b05
 *
Packit 022b05
 */
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * One mibFile may contain multiple MIB modules.
Packit 022b05
 * It's also possible that there's no module in a file.
Packit 022b05
 */
Packit 022b05
smingFile:		optsep moduleStatement_optsep_0n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed modules.
Packit 022b05
			     */
Packit 022b05
			    $$ = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
moduleStatement_optsep_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
	|		moduleStatement_optsep_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
moduleStatement_optsep_1n:	moduleStatement_optsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	|		moduleStatement_optsep_1n moduleStatement_optsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * modules or return -1, if at least one
Packit 022b05
			     * module failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
moduleStatement_optsep:	moduleStatement optsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Module *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1 != NULL) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
moduleStatement:	moduleKeyword sep ucIdentifier
Packit 022b05
			{
Packit 022b05
			    thisParserPtr->modulePtr = findModuleByName($3);
Packit 022b05
			    if (!thisParserPtr->modulePtr) {
Packit 022b05
				thisParserPtr->modulePtr =
Packit 022b05
				    addModule($3,
Packit 022b05
					      smiStrdup(thisParserPtr->path),
Packit 022b05
					      0,
Packit 022b05
					      thisParserPtr);
Packit 022b05
			    } else {
Packit 022b05
			        smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_MODULE_ALREADY_LOADED,
Packit 022b05
					      $3);
Packit 022b05
				free($3);
Packit 022b05
				/*
Packit 022b05
				 * this aborts parsing the whole file,
Packit 022b05
				 * not only the current module.
Packit 022b05
				 */
Packit 022b05
				YYABORT;
Packit 022b05
			    }
Packit 022b05
			    thisModulePtr->export.language = SMI_LANGUAGE_SMING;
Packit 022b05
			    thisParserPtr->modulePtr->numImportedIdentifiers
Packit 022b05
				                                           = 0;
Packit 022b05
			    thisParserPtr->modulePtr->numStatements = 0;
Packit 022b05
			    thisParserPtr->modulePtr->numModuleIdentities = 0;
Packit 022b05
			    thisParserPtr->firstIndexlabelPtr = NULL;
Packit 022b05
			    thisParserPtr->identityObjectName = NULL;
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			importStatement_stmtsep_0n
Packit 022b05
			organizationStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    if ($9) {
Packit 022b05
				setModuleOrganization(thisParserPtr->modulePtr,
Packit 022b05
						      $9);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			contactStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    if ($12) {
Packit 022b05
				setModuleContactInfo(thisParserPtr->modulePtr,
Packit 022b05
						     $12);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			descriptionStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    if ($15) {
Packit 022b05
				setModuleDescription(thisParserPtr->modulePtr,
Packit 022b05
						     $15, thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if ($18) {
Packit 022b05
				setModuleReference(thisParserPtr->modulePtr,
Packit 022b05
						   $18, thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			revisionStatement_stmtsep_0n
Packit 022b05
			extensionStatement_stmtsep_0n
Packit 022b05
			identityStatement_stmtsep_0n
Packit 022b05
			typedefStatement_stmtsep_0n
Packit 022b05
			classStatement_stmtsep_0n			
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    checkTypes(thisParserPtr, thisModulePtr);
Packit 022b05
			    
Packit 022b05
			    $$ = thisModulePtr;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
extensionStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		extensionStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed extension statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
extensionStatement_stmtsep_1n: extensionStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		extensionStatement_stmtsep_1n
Packit 022b05
			extensionStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * extensions or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
extensionStatement_stmtsep: extensionStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
extensionStatement:	extensionKeyword sep lcIdentifier
Packit 022b05
			{
Packit 022b05
			    macroIdentifier = $3;
Packit 022b05
			    macroPtr = addMacro(macroIdentifier,
Packit 022b05
						0,
Packit 022b05
						thisParserPtr);
Packit 022b05
			    setMacroDecl(macroPtr, SMI_DECL_EXTENSION);
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			statusStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (macroPtr && $8) {
Packit 022b05
				setMacroStatus(macroPtr, $8);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			descriptionStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (macroPtr && $10) {
Packit 022b05
				setMacroDescription(macroPtr, $10,
Packit 022b05
						    thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (macroPtr && $12) {
Packit 022b05
				setMacroReference(macroPtr, $12,
Packit 022b05
						  thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			abnfStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			   if (macroPtr && $14) {
Packit 022b05
				setMacroAbnf(macroPtr, $14,
Packit 022b05
						  thisParserPtr);
Packit 022b05
			   }
Packit 022b05
			}
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			    macroPtr = NULL;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
typedefStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		typedefStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed typedef statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
typedefStatement_stmtsep_1n: typedefStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		typedefStatement_stmtsep_1n
Packit 022b05
			typedefStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * typedefs or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
typedefStatement_stmtsep: typedefStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
typedefStatement:	typedefKeyword sep ucIdentifier
Packit 022b05
			{
Packit 022b05
			    typeIdentifier = $3;
Packit 022b05
			    /* 
Packit 022b05
			     *check for duplicate names in the module 
Packit 022b05
			     */
Packit 022b05
			    if(typePtr = 
Packit 022b05
			    	findType(typeIdentifier, thisParserPtr,thisModulePtr)) 
Packit 022b05
					if( typePtr->modulePtr == thisParserPtr->modulePtr)
Packit 022b05
					       smiPrintError(thisParserPtr,
Packit 022b05
										ERR_DUPLICATE_TYPE_NAME,
Packit 022b05
					      				typeIdentifier);
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			typedefTypeStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    if ($8) {
Packit 022b05
				if ($8->export.name) {
Packit 022b05
				    /*
Packit 022b05
				     * If the exact type has been found
Packit 022b05
				     * and no new Type structure has been
Packit 022b05
				     * created, we have to create a
Packit 022b05
				     * duplicate now.
Packit 022b05
				     */
Packit 022b05
				    typePtr = duplicateType($8, 0,
Packit 022b05
							    thisParserPtr);
Packit 022b05
				} else {
Packit 022b05
				    typePtr = $8;
Packit 022b05
				}
Packit 022b05
				typePtr = setTypeName(typePtr, typeIdentifier);
Packit 022b05
				setTypeDecl(typePtr, SMI_DECL_TYPEDEF);
Packit 022b05
			    }
Packit 022b05
			    defaultBasetype = typePtr->export.basetype;
Packit 022b05
			}
Packit 022b05
			defaultStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $11) {
Packit 022b05
			    	if(typePtr->export.basetype == 
Packit 022b05
			    					SMI_BASETYPE_ENUM) 
Packit 022b05
			    					//check ENUM value for correctness
Packit 022b05
    				{
Packit 022b05
    					if($11->len)
Packit 022b05
    	 				if(namedNumberPtr = findNamedNumberByName(typePtr,
Packit 022b05
    	 												 $11->value.ptr)){
Packit 022b05
    	 					smiFree($11);
Packit 022b05
    	 					$11 = &namedNumberPtr->export.value;
Packit 022b05
    	 				}
Packit 022b05
    	 				else{ smiPrintError(thisParserPtr,
Packit 022b05
					      		ERR_ENUM_NAME_NOT_DEFINED,
Packit 022b05
					      		$11->value.ptr);
Packit 022b05
					    }
Packit 022b05
    	 			}
Packit 022b05
    	 			//NOTE that the bits default value is set in the anyval
Packit 022b05
    	 			//rule
Packit 022b05
				setTypeValue(typePtr, $11);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			formatStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $13
Packit 022b05
				&& smiCheckFormat(thisParserPtr,
Packit 022b05
						  typePtr->export.basetype,
Packit 022b05
						  $13, 0)) {
Packit 022b05
				setTypeFormat(typePtr, $13);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			unitsStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $15) {
Packit 022b05
				setTypeUnits(typePtr, $15);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			statusStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $17) {
Packit 022b05
				setTypeStatus(typePtr, $17);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			descriptionStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $19) {
Packit 022b05
				setTypeDescription(typePtr, $19,
Packit 022b05
						   thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (typePtr && $21) {
Packit 022b05
				setTypeReference(typePtr, $21, thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    smiCheckNamedNumberSubtyping(thisParserPtr , typePtr);
Packit 022b05
			    smiCheckNamedNumbersOrder(thisParserPtr , typePtr);
Packit 022b05
			    smiCheckNamedNumberRedefinition(thisParserPtr , typePtr);
Packit 022b05
			    $$ = 0;
Packit 022b05
			    typePtr = NULL;
Packit 022b05
			    free(typeIdentifier);
Packit 022b05
			    defaultBasetype = SMI_BASETYPE_UNKNOWN;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
classStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		classStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed typedef statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
classStatement_stmtsep_1n: classStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		classStatement_stmtsep_1n
Packit 022b05
			classStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * classes or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
classStatement_stmtsep: classStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
classStatement: classKeyword sep ucIdentifier
Packit 022b05
			{
Packit 022b05
			    classIdentifier = $3;
Packit 022b05
			    if(findClassByModuleAndName(thisModulePtr, classIdentifier))
Packit 022b05
			    {
Packit 022b05
			    	smiPrintError(thisParserPtr,
Packit 022b05
										ERR_DUPLICATE_CLASS_NAME,
Packit 022b05
					      				attributeIdentifier);
Packit 022b05
			    }
Packit 022b05
			    else{
Packit 022b05
			    classPtr = addClass(classIdentifier,
Packit 022b05
						thisParserPtr);
Packit 022b05
			    setClassDecl(classPtr, SMI_DECL_CLASS);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			extendsStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if(classPtr && $8)
Packit 022b05
					classPtr->parentPtr = $8;
Packit 022b05
			}
Packit 022b05
			attributeStatement_stmtsep_0n
Packit 022b05
			uniqueStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				List *tmpList;
Packit 022b05
				Attribute *tmpAttribute;
Packit 022b05
				if(classPtr && $11)
Packit 022b05
				{
Packit 022b05
					
Packit 022b05
					//Check for "magic" value #@# that defines
Packit 022b05
					//scalar class. See NOTE after Class definitino in data.h
Packit 022b05
					if(!strcmp((char*)($11->ptr),"#@#"))
Packit 022b05
					{	
Packit 022b05
						classPtr->uniqueList = (List*)malloc(sizeof(List));
Packit 022b05
						classPtr->uniqueList->ptr = classPtr;
Packit 022b05
						classPtr->uniqueList->nextPtr = NULL;
Packit 022b05
						smiFree($11);
Packit 022b05
					}
Packit 022b05
					else
Packit 022b05
					{
Packit 022b05
						tmpList = $11;
Packit 022b05
						//convert  all attribute names to atributes
Packit 022b05
						for(tmpList; tmpList; tmpList=tmpList->nextPtr)
Packit 022b05
						{
Packit 022b05
							if(tmpAttribute = 
Packit 022b05
							(Attribute*)smiGetAttribute(&(classPtr->export),(char*)(tmpList->ptr)))
Packit 022b05
							{
Packit 022b05
								smiFree(tmpList->ptr);
Packit 022b05
								tmpList->ptr = tmpAttribute;
Packit 022b05
							}
Packit 022b05
							else
Packit 022b05
							{
Packit 022b05
								smiFree(tmpList->ptr);
Packit 022b05
								tmpList->ptr = NULL;
Packit 022b05
								smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_NOT_FOUND,
Packit 022b05
					      				attributeIdentifier);
Packit 022b05
							}
Packit 022b05
						}
Packit 022b05
						
Packit 022b05
						classPtr->uniqueList = $11;
Packit 022b05
					}
Packit 022b05
				}
Packit 022b05
			}
Packit 022b05
			eventStatement_stmtsep_0n
Packit 022b05
			statusStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (classPtr && $14) {
Packit 022b05
				setClassStatus(classPtr, $14);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			descriptionStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (classPtr && $16) {
Packit 022b05
				setClassDescription(classPtr, $16,
Packit 022b05
						    thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (classPtr && $18) {
Packit 022b05
				setClassReference(classPtr, $18,
Packit 022b05
						  thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			    classPtr = NULL;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
		
Packit 022b05
attributeStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		attributeStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed typedef statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
attributeStatement_stmtsep_1n: attributeStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		attributeStatement_stmtsep_1n
Packit 022b05
			attributeStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * attributes or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
attributeStatement_stmtsep: attributeStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
attributeStatement: attributeKeyword sep lcIdentifier
Packit 022b05
					{
Packit 022b05
						attributeIdentifier = $3;
Packit 022b05
						attributePtr = (Attribute*)smiGetAttribute(&(classPtr->export),
Packit 022b05
												attributeIdentifier);
Packit 022b05
						if(attributePtr)
Packit 022b05
						{
Packit 022b05
							smiPrintError(thisParserPtr,
Packit 022b05
										ERR_DUPLICATE_ATTRIBUTE_NAME,
Packit 022b05
					      				attributeIdentifier);
Packit 022b05
					      	attributePtr = NULL;
Packit 022b05
						}					
Packit 022b05
					}
Packit 022b05
					optsep '{' stmtsep
Packit 022b05
					attributeTypeStatement
Packit 022b05
					{
Packit 022b05
			    		if ($8) {
Packit 022b05
				    		attributePtr = $8;
Packit 022b05
							setAttributeName(attributePtr, 
Packit 022b05
											attributeIdentifier);
Packit 022b05
							setAttributeDecl(attributePtr, 
Packit 022b05
												SMI_DECL_ATTRIBUTE);
Packit 022b05
							defaultBasetype = attributePtr->export.basetype;
Packit 022b05
			    		}
Packit 022b05
					}
Packit 022b05
					accessStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
						if($10 && attributePtr){
Packit 022b05
						/* check whether there's access for class reference, 
Packit 022b05
						   which is not allowed */
Packit 022b05
							if(attributePtr->parentClassPtr)
Packit 022b05
								smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_CLASS_ACCESS,
Packit 022b05
					      							attributeIdentifier);
Packit 022b05
					      	else {
Packit 022b05
					      		setAttributeAccess(attributePtr,$10);
Packit 022b05
					      	}
Packit 022b05
						}
Packit 022b05
						else if(attributePtr && attributePtr->parentTypePtr)
Packit 022b05
						{
Packit 022b05
							smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_MISSING_ACCESS,
Packit 022b05
					      							attributeIdentifier);
Packit 022b05
						}
Packit 022b05
					}
Packit 022b05
					defaultStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
						if($12 && attributePtr){
Packit 022b05
							if(attributePtr->parentClassPtr)
Packit 022b05
								smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_CLASS_DEFAULT,
Packit 022b05
					      							attributeIdentifier);
Packit 022b05
					      	else{
Packit 022b05
					      		attributePtr->export.value = *$12;
Packit 022b05
					      	}
Packit 022b05
						}
Packit 022b05
						else if(attributePtr)
Packit 022b05
						{
Packit 022b05
							attributePtr->export.value.basetype = 
Packit 022b05
													SMI_BASETYPE_UNKNOWN;
Packit 022b05
						}
Packit 022b05
					}
Packit 022b05
					formatStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
			   			if($14 && attributePtr){
Packit 022b05
							if(attributePtr->parentClassPtr)
Packit 022b05
								smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_CLASS_FORMAT,
Packit 022b05
					      							attributeIdentifier);
Packit 022b05
					      	else{
Packit 022b05
					      		if (smiCheckFormat(thisParserPtr,
Packit 022b05
						  				attributePtr->export.basetype,$14, 0)) 
Packit 022b05
						  		{
Packit 022b05
									attributePtr->export.format = $14;
Packit 022b05
					      		}
Packit 022b05
					      	}
Packit 022b05
						}
Packit 022b05
			    	}
Packit 022b05
					unitsStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
			    		if($16 && attributePtr){
Packit 022b05
							if(attributePtr->parentClassPtr)
Packit 022b05
								smiPrintError(thisParserPtr,
Packit 022b05
										ERR_ATTRIBUTE_CLASS_UNITS,
Packit 022b05
					      							attributeIdentifier);
Packit 022b05
					      	else{
Packit 022b05
									attributePtr->export.units = $16;
Packit 022b05
					      	}
Packit 022b05
						}
Packit 022b05
					}
Packit 022b05
					statusStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
			   			if (attributePtr && $18) 
Packit 022b05
							attributePtr->export.status = $18;
Packit 022b05
					}
Packit 022b05
					descriptionStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
						if (attributePtr && $20) 
Packit 022b05
							attributePtr->export.description = $20;
Packit 022b05
					}
Packit 022b05
					referenceStatement_stmtsep_01
Packit 022b05
					{
Packit 022b05
						if (attributePtr && $22) 
Packit 022b05
							attributePtr->export.reference = $22;
Packit 022b05
			    	}
Packit 022b05
					'}' optsep ';'
Packit 022b05
					{
Packit 022b05
						$$ = attributePtr;
Packit 022b05
						attributePtr = NULL;
Packit 022b05
						defaultBasetype = SMI_BASETYPE_UNKNOWN;
Packit 022b05
					}
Packit 022b05
		;
Packit 022b05
Packit 022b05
eventStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		eventStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed event statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
eventStatement_stmtsep_1n: eventStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		eventStatement_stmtsep_1n
Packit 022b05
			eventStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * events or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
eventStatement_stmtsep: eventStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
eventStatement: eventKeyword sep lcIdentifier
Packit 022b05
			{
Packit 022b05
				//TODO check for repeated names
Packit 022b05
				eventPtr=addEvent($3,classPtr,thisParserPtr);
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			statusStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if($8 && eventPtr)
Packit 022b05
				eventPtr->export.status = $8;
Packit 022b05
			}
Packit 022b05
			descriptionStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if($10 && eventPtr)
Packit 022b05
				eventPtr->export.description = $10;
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if($12 && eventPtr)
Packit 022b05
				eventPtr->export.reference = $12;
Packit 022b05
			}
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
				$$ = eventPtr;
Packit 022b05
				eventPtr = NULL;
Packit 022b05
			}
Packit 022b05
		;
Packit 022b05
Packit 022b05
importStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
	|		importStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
importStatement_stmtsep_1n: importStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		importStatement_stmtsep_1n importStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * imports or return -1, if at least one
Packit 022b05
			     * module failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
importStatement_stmtsep: importStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got an (Object *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
importStatement:	importKeyword sep ucIdentifier
Packit 022b05
			{
Packit 022b05
			    importModulename = smiStrdup($3);
Packit 022b05
			}
Packit 022b05
			optsep '(' optsep
Packit 022b05
			identifierList
Packit 022b05
			{
Packit 022b05
			    List *listPtr, *nextPtr;
Packit 022b05
			    
Packit 022b05
			    for (listPtr = $8; listPtr; listPtr = nextPtr) {
Packit 022b05
				addImport(listPtr->ptr, thisParserPtr);
Packit 022b05
				thisParserPtr->modulePtr->
Packit 022b05
				                      numImportedIdentifiers++;
Packit 022b05
				nextPtr = listPtr->nextPtr;
Packit 022b05
				free(listPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			optsep ')' optsep ';'
Packit 022b05
			{
Packit 022b05
			    Module *modulePtr;
Packit 022b05
			    char *s = importModulename;
Packit 022b05
Packit 022b05
			    modulePtr = findModuleByName(s);
Packit 022b05
			    if (!modulePtr) {
Packit 022b05
				modulePtr = loadModule(s, thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			    checkImports(modulePtr, thisParserPtr);
Packit 022b05
			    free(s);
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
revisionStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		revisionStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
revisionStatement_stmtsep_1n: revisionStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		revisionStatement_stmtsep_1n revisionStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * revisions or return -1, if at least one
Packit 022b05
			     * module failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
revisionStatement_stmtsep: revisionStatement stmtsep
Packit 022b05
			   {
Packit 022b05
			       /*
Packit 022b05
				* If we got a (Revision *) return rc == 1,
Packit 022b05
				* otherwise parsing failed (rc == -1).
Packit 022b05
				*/
Packit 022b05
			       if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			       } else {
Packit 022b05
				   $$ = -1;
Packit 022b05
			       }
Packit 022b05
			   }
Packit 022b05
        ;
Packit 022b05
Packit 022b05
revisionStatement:	revisionKeyword optsep '{' stmtsep
Packit 022b05
			dateStatement stmtsep
Packit 022b05
			descriptionStatement stmtsep
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = addRevision($5, $7, thisParserPtr);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
identityStatement_stmtsep_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        |		identityStatement_stmtsep_1n
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Return the number of successfully
Packit 022b05
			     * parsed identity statements.
Packit 022b05
			     */
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
identityStatement_stmtsep_1n: identityStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		identityStatement_stmtsep_1n
Packit 022b05
			identityStatement_stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * Sum up the number of successfully parsed
Packit 022b05
			     * identities or return -1, if at least one
Packit 022b05
			     * failed.
Packit 022b05
			     */
Packit 022b05
			    if (($1 >= 0) && ($2 >= 0)) {
Packit 022b05
				$$ = $1 + $2;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
identityStatement_stmtsep: identityStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    /*
Packit 022b05
			     * If we got a (Type *) return rc == 1,
Packit 022b05
			     * otherwise parsing failed (rc == -1).
Packit 022b05
			     */
Packit 022b05
			    if ($1) {
Packit 022b05
				$$ = 1;
Packit 022b05
			    } else {
Packit 022b05
				$$ = -1;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
identityStatement:	identityKeyword sep lcIdentifier
Packit 022b05
			{
Packit 022b05
				identityIdentifier = $3;
Packit 022b05
				identityPtr = addIdentity(identityIdentifier,
Packit 022b05
						thisParserPtr);
Packit 022b05
			    setIdentityDecl(identityPtr, SMI_DECL_IDENTITY);
Packit 022b05
			}
Packit 022b05
			optsep '{' stmtsep
Packit 022b05
			parentStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if(identityPtr && $8) {
Packit 022b05
					setIdentityParent(identityPtr,$8);
Packit 022b05
				}
Packit 022b05
			}
Packit 022b05
			statusStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
			    if (identityPtr && $10) {
Packit 022b05
				setIdentityStatus(identityPtr, $10);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			descriptionStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				if (identityPtr && $12) {
Packit 022b05
				setIdentityDescription(identityPtr, $12,
Packit 022b05
						    			thisParserPtr);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
			referenceStatement_stmtsep_01
Packit 022b05
			{
Packit 022b05
				setIdentityReference(identityPtr, $14, 
Packit 022b05
									 thisParserPtr)
Packit 022b05
			}
Packit 022b05
			'}' optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			    identityPtr = NULL;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
typedefTypeStatement:	typeKeyword sep refinedBaseType_refinedType optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
attributeTypeStatement:	typeKeyword sep attribute_refinedBaseType_refinedType optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
dateStatement:		dateKeyword sep date optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
organizationStatement:	organizationKeyword sep text optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
contactStatement:	contactKeyword sep text optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
formatStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
	|		formatStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
formatStatement:	formatKeyword sep format optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
unitsStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		unitsStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
unitsStatement:		unitsKeyword sep units optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
statusStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = SMI_STATUS_CURRENT;
Packit 022b05
			}
Packit 022b05
        |               statusStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
statusStatement:	statusKeyword sep status optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
uniqueStatement_stmtsep_01:
Packit 022b05
        	{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		uniqueStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
		;
Packit 022b05
		
Packit 022b05
uniqueStatement:	uniqueKeyword sep '(' uniqueSpec ')' optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
uniqueSpec:	optsep_comma_01
Packit 022b05
			{
Packit 022b05
				$$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = "#@#"; //used to indicate that unique
Packit 022b05
			    				 //statement is present and empty
Packit 022b05
			    				 //i.e. the class is scalar
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
		|		lcIdentifier furtherLcIdentifier_0n optsep_comma_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = $2;
Packit 022b05
			}
Packit 022b05
		;
Packit 022b05
Packit 022b05
Packit 022b05
		
Packit 022b05
		
Packit 022b05
extendsStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |               extendsStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
		;
Packit 022b05
Packit 022b05
extendsStatement:	extendsKeyword sep ucIdentifier optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = findClass($3, thisParserPtr,thisModulePtr);
Packit 022b05
			    if(!$$)smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNKNOWN_CLASS,
Packit 022b05
					      $3);
Packit 022b05
			    
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
defaultStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		defaultStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
defaultStatement:	defaultKeyword sep anyValue optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
        
Packit 022b05
accessStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = SMI_ACCESS_UNKNOWN;
Packit 022b05
			}
Packit 022b05
        |		accessStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
accessStatement:	accessKeyword sep access optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
        
Packit 022b05
access:		readonlyKeyword
Packit 022b05
			{
Packit 022b05
				$$ = SMI_ACCESS_READ_ONLY;
Packit 022b05
			}
Packit 022b05
		|		readwriteKeyword
Packit 022b05
			{
Packit 022b05
				$$ = SMI_ACCESS_READ_WRITE;
Packit 022b05
			}
Packit 022b05
		|		eventonlyKeyword
Packit 022b05
			{
Packit 022b05
				$$ = SMI_ACCESS_EVENT_ONLY;
Packit 022b05
			}
Packit 022b05
		;
Packit 022b05
        
Packit 022b05
parentStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		parentStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
parentStatement:	parentKeyword sep lcIdentifier optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = findIdentity($3, thisParserPtr, thisModulePtr);
Packit 022b05
			    if(!$$)smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_IDENTITY_PARENT_NOT_FOUND,
Packit 022b05
					      $3);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
descriptionStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |               descriptionStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
descriptionStatement:	descriptionKeyword sep text optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
referenceStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		referenceStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
referenceStatement:	referenceKeyword sep text optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
abnfStatement_stmtsep_01: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		abnfStatement stmtsep
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
abnfStatement:		abnfKeyword sep text optsep ';'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
refinedBaseType_refinedType: refinedBaseType
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		refinedType
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
attribute_refinedBaseType_refinedType: attribute_refinedBaseType
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		attribute_refinedType
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
Packit 022b05
refinedBaseType:	OctetStringKeyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeOctetStringPtr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeOctetStringPtr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeOctetStringPtr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        |		ObjectIdentifierKeyword
Packit 022b05
			{
Packit 022b05
			    $$ = smiHandle->typeObjectIdentifierPtr;
Packit 022b05
			}
Packit 022b05
	|		Integer32Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeInteger32Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeInteger32Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeInteger32Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Unsigned32Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeUnsigned32Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeUnsigned32Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeUnsigned32Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Integer64Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeInteger64Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeInteger64Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeInteger64Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Unsigned64Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeUnsigned64Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeUnsigned64Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeUnsigned64Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float32Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeFloat32Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeFloat32Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeFloat32Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float64Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeFloat64Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeFloat64Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeFloat64Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float128Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeFloat128Ptr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeFloat128Ptr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeFloat128Ptr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		PointerKeyword optsep_pointerRestr_01
Packit 022b05
			{
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typePointerPtr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typePointerPtr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typePointerPtr);
Packit 022b05
				setTypeList($$, $2);				
Packit 022b05
				}
Packit 022b05
			}
Packit 022b05
	|		EnumerationKeyword bitsOrEnumerationSpec
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$2) {
Packit 022b05
				$$ = smiHandle->typeEnumPtr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeEnumPtr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeEnumPtr);
Packit 022b05
				setTypeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((NamedNumber *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		BitsKeyword 
Packit 022b05
			{
Packit 022b05
				bitsFlag = 1; //Since Enum elements can be 
Packit 022b05
							  //negative we must make sure
Packit 022b05
							  //that bits is not negative,
Packit 022b05
							  //so we raise bitsFlag and
Packit 022b05
							  //give error if there is
Packit 022b05
							  //negative value 
Packit 022b05
			}
Packit 022b05
			bitsOrEnumerationSpec
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    if (!$3) {
Packit 022b05
				$$ = smiHandle->typeBitsPtr;
Packit 022b05
			    } else {
Packit 022b05
				$$ = duplicateType(smiHandle->typeBitsPtr, 0,
Packit 022b05
						   thisParserPtr);
Packit 022b05
				setTypeParent($$, smiHandle->typeBitsPtr);
Packit 022b05
				setTypeList($$, $3);
Packit 022b05
				for (p = $3; p; p = p->nextPtr)
Packit 022b05
				    ((NamedNumber *)p->ptr)->typePtr = $$;
Packit 022b05
			    }
Packit 022b05
			    
Packit 022b05
			    bitsFlag = 0;//reset flag
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
	
Packit 022b05
attribute_refinedBaseType:	OctetStringKeyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    $$ = duplicateTypeToAttribute(smiHandle->typeOctetStringPtr,
Packit 022b05
												classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeOctetStringPtr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        |		ObjectIdentifierKeyword
Packit 022b05
			{
Packit 022b05
			    $$ = duplicateTypeToAttribute(
Packit 022b05
			    	smiHandle->typeObjectIdentifierPtr, classPtr, thisParserPtr);
Packit 022b05
			   	setAttributeParentType($$, smiHandle->typeObjectIdentifierPtr);
Packit 022b05
			}
Packit 022b05
	|		Integer32Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeInteger32Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeInteger32Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Unsigned32Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeUnsigned32Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeUnsigned32Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Integer64Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			   List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeInteger64Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeInteger64Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Unsigned64Keyword optsep_numberSpec_01
Packit 022b05
			{
Packit 022b05
			   List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeUnsigned64Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeUnsigned64Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float32Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeFloat32Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeFloat32Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float64Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			   List *p;
Packit 022b05
			    
Packit 022b05
				$$ = duplicateTypeToAttribute(smiHandle->typeFloat64Ptr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeFloat64Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		Float128Keyword optsep_floatSpec_01
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    $$ = duplicateTypeToAttribute(smiHandle->typeFloat128Ptr,
Packit 022b05
							  classPtr, thisParserPtr);
Packit 022b05
			    setAttributeParentType($$, smiHandle->typeFloat128Ptr);
Packit 022b05
			    if ($2) {
Packit 022b05
				setAttributeList($$, $2);
Packit 022b05
				for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    ((Range *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		PointerKeyword optsep_pointerRestr_01
Packit 022b05
			{
Packit 022b05
			    $$ = duplicateTypeToAttribute(smiHandle->typePointerPtr,
Packit 022b05
							  classPtr, thisParserPtr);
Packit 022b05
			    setAttributeParentType($$, smiHandle->typePointerPtr);
Packit 022b05
			    if ($2) {
Packit 022b05
				setAttributeList($$, $2);
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		EnumerationKeyword bitsOrEnumerationSpec
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    $$ = duplicateTypeToAttribute(smiHandle->typeEnumPtr,
Packit 022b05
													classPtr, thisParserPtr);
Packit 022b05
				setAttributeParentType($$, smiHandle->typeEnumPtr);
Packit 022b05
			    if ($2) {
Packit 022b05
					setAttributeList($$, $2);
Packit 022b05
					for (p = $2; p; p = p->nextPtr)
Packit 022b05
				    	((NamedNumber *)p->ptr)->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		BitsKeyword 
Packit 022b05
			{
Packit 022b05
				bitsFlag = 1; //Since Enum elements can be 
Packit 022b05
							  //negative we must make sure
Packit 022b05
							  //that bits is not negative,
Packit 022b05
							  //so we raise bitsFlag and
Packit 022b05
							  //give error if there is
Packit 022b05
							  //negative value 
Packit 022b05
			}
Packit 022b05
			bitsOrEnumerationSpec
Packit 022b05
			{
Packit 022b05
			    List *p;
Packit 022b05
			    
Packit 022b05
			    $$ = duplicateTypeToAttribute(smiHandle->typeBitsPtr,
Packit 022b05
							  classPtr, thisParserPtr);
Packit 022b05
			    setAttributeParentType($$, smiHandle->typeBitsPtr);
Packit 022b05
			    if ($1) {
Packit 022b05
				setAttributeList($$, $1);
Packit 022b05
				for (p = $1; p; p = p->nextPtr)
Packit 022b05
				    ((NamedNumber *)(p->ptr))->typePtr = (Type*)$$;
Packit 022b05
			    }
Packit 022b05
			    
Packit 022b05
			    bitsFlag = 0; /* reset flag */
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
refinedType:		qucIdentifier optsep_anySpec_01
Packit 022b05
			{
Packit 022b05
			    typePtr = findType($1, thisParserPtr,
Packit 022b05
					       thisModulePtr);
Packit 022b05
			    if (typePtr && $2) {
Packit 022b05
				typePtr = duplicateType(typePtr, 0,
Packit 022b05
							thisParserPtr);
Packit 022b05
				setTypeList(typePtr, $2);
Packit 022b05
			    }
Packit 022b05
Packit 022b05
			    $$ = typePtr;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
attribute_refinedType:		qucIdentifier optsep_anySpec_01
Packit 022b05
			{
Packit 022b05
			    Class *tmp;
Packit 022b05
			    typePtr = findType($1, thisParserPtr,
Packit 022b05
					       thisModulePtr);
Packit 022b05
			    if (typePtr && $2) {
Packit 022b05
				attributePtr = duplicateTypeToAttribute(typePtr,
Packit 022b05
											classPtr, thisParserPtr);
Packit 022b05
				setAttributeList(attributePtr, $2);
Packit 022b05
				setAttributeParentType(attributePtr, typePtr);
Packit 022b05
			    } else if( typePtr ){
Packit 022b05
			    	attributePtr = duplicateTypeToAttribute(typePtr,
Packit 022b05
											classPtr, thisParserPtr);
Packit 022b05
					setAttributeParentType(attributePtr, typePtr);
Packit 022b05
				} else if($2){
Packit 022b05
					smiPrintError(thisParserPtr, ERR_UNKNOWN_TYPE, $1);
Packit 022b05
					attributePtr = NULL;
Packit 022b05
				} else if (tmp = findClass($1,
Packit 022b05
										 thisParserPtr,thisModulePtr)){
Packit 022b05
					attributePtr = addAttribute($1, classPtr, thisParserPtr);
Packit 022b05
					setAttributeParentClass(attributePtr, tmp);
Packit 022b05
				} else {
Packit 022b05
					attributePtr = NULL;
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
											ERR_UNKNOWN_TYPE_OR_CLASS, $1);
Packit 022b05
				}
Packit 022b05
				
Packit 022b05
Packit 022b05
			    $$ = attributePtr;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
optsep_anySpec_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
	|		optsep anySpec
Packit 022b05
			{
Packit 022b05
			    $$ = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
anySpec:		numberSpec
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	|		floatSpec
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
optsep_numberSpec_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
	|		optsep numberSpec
Packit 022b05
			{
Packit 022b05
			    $$ = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
numberSpec:		'(' optsep numberElement furtherNumberElement_0n
Packit 022b05
			optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $3;
Packit 022b05
			    $$->nextPtr = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherNumberElement_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherNumberElement_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherNumberElement_1n:	furtherNumberElement
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherNumberElement_1n furtherNumberElement
Packit 022b05
			{
Packit 022b05
			    List *p, *pp;
Packit 022b05
			    
Packit 022b05
			    p = smiMalloc(sizeof(List));
Packit 022b05
			    p->ptr = $2;
Packit 022b05
			    p->nextPtr = NULL;
Packit 022b05
			    for (pp = $1; pp->nextPtr; pp = pp->nextPtr);
Packit 022b05
			    pp->nextPtr = p;
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherNumberElement:	optsep '|' optsep numberElement
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
numberElement:		signedNumber numberUpperLimit_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(Range));
Packit 022b05
			    $$->export.minValue = *$1;
Packit 022b05
			    if ($2) {
Packit 022b05
				$$->export.maxValue = *$2;
Packit 022b05
				smiFree($2);
Packit 022b05
			    } else {
Packit 022b05
				$$->export.maxValue = *$1;
Packit 022b05
			    }
Packit 022b05
			    smiFree($1);
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
numberUpperLimit_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		numberUpperLimit
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
numberUpperLimit:	optsep DOT_DOT optsep signedNumber
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
optsep_floatSpec_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		optsep floatSpec
Packit 022b05
			{
Packit 022b05
			    $$ = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
floatSpec:		'(' optsep floatElement furtherFloatElement_0n
Packit 022b05
			optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $3;
Packit 022b05
			    $$->nextPtr = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherFloatElement_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherFloatElement_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherFloatElement_1n:	furtherFloatElement
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherFloatElement_1n furtherFloatElement
Packit 022b05
			{
Packit 022b05
			    List *p, *pp;
Packit 022b05
			    
Packit 022b05
			    p = smiMalloc(sizeof(List));
Packit 022b05
			    p->ptr = $2;
Packit 022b05
			    p->nextPtr = NULL;
Packit 022b05
			    for (pp = $1; pp->nextPtr; pp = pp->nextPtr);
Packit 022b05
			    pp->nextPtr = p;
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherFloatElement:	optsep '|' optsep floatElement
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
floatElement:		floatValue floatUpperLimit_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(Range));
Packit 022b05
			    $$->export.minValue.basetype = SMI_BASETYPE_FLOAT64;
Packit 022b05
			    $$->export.minValue.value.float64 = strtod($1, NULL);
Packit 022b05
			    if ($2) {
Packit 022b05
				$$->export.maxValue.basetype =
Packit 022b05
				                          SMI_BASETYPE_FLOAT64;
Packit 022b05
				$$->export.maxValue.value.float64 =
Packit 022b05
				                              strtod($2, NULL);
Packit 022b05
			    } else {
Packit 022b05
				$$->export.maxValue = $$->export.minValue;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
floatUpperLimit_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		floatUpperLimit
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
floatUpperLimit:	optsep DOT_DOT optsep floatValue
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
specialFloatValue:
Packit 022b05
			neginfKeyword
Packit 022b05
			{
Packit 022b05
				$$="-inf";
Packit 022b05
			}
Packit 022b05
		|	posinfKeyword
Packit 022b05
			{
Packit 022b05
				$$="+inf";
Packit 022b05
			}
Packit 022b05
		|	qnanKeyword
Packit 022b05
			{
Packit 022b05
				$$="nan";
Packit 022b05
			}
Packit 022b05
		|	snanKeyword
Packit 022b05
			{
Packit 022b05
				$$="nan";
Packit 022b05
			}
Packit 022b05
	;		
Packit 022b05
        
Packit 022b05
optsep_pointerRestr_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		optsep pointerRestr
Packit 022b05
			{
Packit 022b05
			    NamedNumber *nn =(NamedNumber*)smiMalloc(sizeof(NamedNumber));
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = nn;
Packit 022b05
			    nn->export.name = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
pointerRestr:		'(' optsep qlcIdentifier optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
    ;
Packit 022b05
Packit 022b05
bitsOrEnumerationSpec:	'(' optsep bitsOrEnumerationList optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
bitsOrEnumerationList:	bitsOrEnumerationItem furtherBitsOrEnumerationItem_0n
Packit 022b05
			optsep_comma_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = $2;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherBitsOrEnumerationItem_0n: /* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherBitsOrEnumerationItem_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherBitsOrEnumerationItem_1n: furtherBitsOrEnumerationItem
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherBitsOrEnumerationItem_1n
Packit 022b05
			furtherBitsOrEnumerationItem
Packit 022b05
			{
Packit 022b05
			    List *p, *pp;
Packit 022b05
			    
Packit 022b05
			    p = smiMalloc(sizeof(List));
Packit 022b05
			    p->ptr = $2;
Packit 022b05
			    p->nextPtr = NULL;
Packit 022b05
			    for (pp = $1; pp->nextPtr; pp = pp->nextPtr);
Packit 022b05
			    pp->nextPtr = p;
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
	
Packit 022b05
furtherBitsOrEnumerationItem: optsep ',' optsep bitsOrEnumerationItem
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
bitsOrEnumerationItem:	lcIdentifier optsep '(' optsep signedNumber optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(NamedNumber));
Packit 022b05
			    $$->export.name = $1;
Packit 022b05
			    $$->export.value = *$5;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
identifierList:		identifier furtherIdentifier_0n optsep_comma_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = $2;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherIdentifier_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherIdentifier_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherIdentifier_1n:	furtherIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherIdentifier_1n furtherIdentifier
Packit 022b05
			{
Packit 022b05
			    List *p, *pp;
Packit 022b05
			    
Packit 022b05
			    p = smiMalloc(sizeof(List));
Packit 022b05
			    p->ptr = $2;
Packit 022b05
			    p->nextPtr = NULL;
Packit 022b05
			    for (pp = $1; pp->nextPtr; pp = pp->nextPtr);
Packit 022b05
			    pp->nextPtr = p;
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
furtherIdentifier:	optsep ',' optsep identifier
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
bitsValue:		'(' optsep bitsList optsep ')'
Packit 022b05
			{
Packit 022b05
			    $$ = $3;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
bitsList:		optsep_comma_01
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		lcIdentifier furtherLcIdentifier_0n optsep_comma_01
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = $2;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
//NOTE used also for unique statement
Packit 022b05
furtherLcIdentifier_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherLcIdentifier_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
furtherLcIdentifier_1n:	furtherLcIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(List));
Packit 022b05
			    $$->ptr = $1;
Packit 022b05
			    $$->nextPtr = NULL;
Packit 022b05
			}
Packit 022b05
        |		furtherLcIdentifier_1n furtherLcIdentifier
Packit 022b05
			{
Packit 022b05
			    List *p, *pp;
Packit 022b05
			    
Packit 022b05
			    p = smiMalloc(sizeof(List));
Packit 022b05
			    p->ptr = $2;
Packit 022b05
			    p->nextPtr = NULL;
Packit 022b05
			    for (pp = $1; pp->nextPtr; pp = pp->nextPtr);
Packit 022b05
			    pp->nextPtr = p;
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
furtherLcIdentifier:	optsep ',' optsep lcIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = $4;
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
identifier:		ucIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		lcIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
qucIdentifier:		ucIdentifier COLON_COLON ucIdentifier
Packit 022b05
			{
Packit 022b05
			    char *s;
Packit 022b05
Packit 022b05
			    s = smiMalloc(strlen($1) +
Packit 022b05
					    strlen($3) + 3);
Packit 022b05
			    sprintf(s, "%s::%s", $1, $3);
Packit 022b05
			    $$ = s;
Packit 022b05
			    free($1);
Packit 022b05
			    free($3);
Packit 022b05
			}
Packit 022b05
        |		ucIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
qlcIdentifier:		ucIdentifier COLON_COLON lcIdentifier
Packit 022b05
			{
Packit 022b05
			    char *s;
Packit 022b05
Packit 022b05
			    s = smiMalloc(strlen($1) +
Packit 022b05
					  strlen($3) + 3);
Packit 022b05
			    sprintf(s, "%s::%s", $1, $3);
Packit 022b05
			    $$ = s;
Packit 022b05
			}
Packit 022b05
        |		lcIdentifier
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
text:			textSegment optsep_textSegment_0n
Packit 022b05
			{
Packit 022b05
			    int len;
Packit 022b05
			    if ($2) {
Packit 022b05
				$$ = smiMalloc(strlen($1) + strlen($2) + 1);
Packit 022b05
				strcpy($$, $1);
Packit 022b05
				strcat($$, $2);
Packit 022b05
				free($1);
Packit 022b05
				free($2);
Packit 022b05
			    } else {
Packit 022b05
				$$ = smiStrdup($1);
Packit 022b05
			    }
Packit 022b05
			    len = strlen($$);
Packit 022b05
			    while (len > 0 && $$[len-1] == '\n') {
Packit 022b05
				$$[--len] = 0;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
optsep_textSegment_0n:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = NULL;
Packit 022b05
			}
Packit 022b05
        |		optsep_textSegment_1n
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
optsep_textSegment_1n:	optsep_textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		optsep_textSegment_1n optsep_textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(strlen($1) + strlen($2) + 1);
Packit 022b05
			    strcpy($$, $1);
Packit 022b05
			    strcat($$, $2);
Packit 022b05
			    free($1);
Packit 022b05
			    free($2);
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
optsep_textSegment:	optsep textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = smiStrdup($2);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
date:			textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = checkDate(thisParserPtr, $1);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
format:			textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = smiStrdup($1);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
units:			textSegment
Packit 022b05
			{
Packit 022b05
			    $$ = smiStrdup($1);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * The type of `anyValue' must be determined from the
Packit 022b05
 * context. `anyValue' appears only in default value clauses. Hence,
Packit 022b05
 * we set a global variable defaultBasetype in the object type
Packit 022b05
 * declaring clause to remember the expected type.  Here, we use this
Packit 022b05
 * variable to build an SmiValue with the appropriate base type.
Packit 022b05
 */
Packit 022b05
anyValue:		bitsValue
Packit 022b05
			{
Packit 022b05
			    if (defaultBasetype == SMI_BASETYPE_BITS) {
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_BITS;
Packit 022b05
				$$->value.ptr = (void*)($1);
Packit 022b05
				//set the bits value in the value.integer32
Packit 022b05
				if(typePtr){
Packit 022b05
					createBitsValue($$,typePtr);
Packit 022b05
				}
Packit 022b05
				else if(attributePtr){
Packit 022b05
				createBitsValue($$,
Packit 022b05
					(Type*)smiGetAttributeParentType(&(attributePtr->export)));
Packit 022b05
				}
Packit 022b05
			    } else {
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		decimalNumber
Packit 022b05
			{
Packit 022b05
			    /* Note: might also be an OID or signed */
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_UNSIGNED32;
Packit 022b05
				$$->value.unsigned32 = strtoul($1, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_UNSIGNED64;
Packit 022b05
				$$->value.unsigned64 = strtoull($1, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_INTEGER32:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER32;
Packit 022b05
				$$->value.integer32 = strtol($1, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_INTEGER64:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER64;
Packit 022b05
				$$->value.integer64 = strtoll($1, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OBJECTIDENTIFIER;
Packit 022b05
				$$->len = strlen($1);
Packit 022b05
				$$->value.ptr = smiStrdup($1);
Packit 022b05
				/* TODO */
Packit 022b05
				break;
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		'-' decimalNumber
Packit 022b05
			{
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_INTEGER32:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER32;
Packit 022b05
				$$->value.integer32 = - strtol($2, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_INTEGER64:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER64;
Packit 022b05
				$$->value.integer64 = - strtoll($2, NULL, 10);
Packit 022b05
				break;
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		hexadecimalNumber
Packit 022b05
			{
Packit 022b05
			    /* Note: might also be an octet string */
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_UNSIGNED32;
Packit 022b05
				$$->value.unsigned32 = strtoul($1, NULL, 16);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_UNSIGNED64;
Packit 022b05
				$$->value.unsigned64 = strtoull($1, NULL, 16);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_INTEGER32:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER32;
Packit 022b05
				$$->value.integer32 = strtol($1, NULL, 16);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_INTEGER64:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_INTEGER64;
Packit 022b05
				$$->value.integer64 = strtoll($1, NULL, 16);
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OCTETSTRING;
Packit 022b05
				$$->value.ptr = hexToStr($1,strlen($1));
Packit 022b05
				$$->len = strlen($$->value.ptr);
Packit 022b05
				break;
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		floatValue
Packit 022b05
			{
Packit 022b05
			    /* Note: might also be an OID */
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_FLOAT32:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT32;
Packit 022b05
				$$->value.float32 = strtof($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT64:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT64;
Packit 022b05
				$$->value.float64 = strtod($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT128:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT128;
Packit 022b05
				$$->value.float128 = strtold($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;		
Packit 022b05
			    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OBJECTIDENTIFIER;
Packit 022b05
				$$->value.ptr = smiMalloc(strlen($1)+1);
Packit 022b05
				strcpy($$->value.ptr,$1);
Packit 022b05
				$$->len = strlen($$->value.ptr);
Packit 022b05
				break;
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		'-' floatValue
Packit 022b05
			{
Packit 022b05
		
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_FLOAT32:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT32;
Packit 022b05
				$$->value.float32 = - strtof($2,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $2);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT64:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT64;
Packit 022b05
				$$->value.float64 = - strtof($2,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $2);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT128:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT128;
Packit 022b05
				$$->value.float128 = - strtof($2,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $2);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;		
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		specialFloatValue
Packit 022b05
			{
Packit 022b05
				  /* Note: might also be an OID */
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_FLOAT32:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT32;
Packit 022b05
				$$->value.float32 = strtof($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT64:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT64;
Packit 022b05
				$$->value.float64 = strtod($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_FLOAT128:
Packit 022b05
			    	$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_FLOAT128;
Packit 022b05
				$$->value.float128 = strtold($1,NULL);
Packit 022b05
				if(errno == ERANGE){
Packit 022b05
					smiPrintError(thisParserPtr, 
Packit 022b05
					ERR_FLOAT_OVERFLOW, $1);
Packit 022b05
					errno = 0;
Packit 022b05
				}
Packit 022b05
				break;
Packit 022b05
				default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }	
Packit 022b05
			}
Packit 022b05
	|		text
Packit 022b05
			{
Packit 022b05
			    if (defaultBasetype == SMI_BASETYPE_OCTETSTRING) {
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OCTETSTRING;
Packit 022b05
				$$->value.ptr = $1;
Packit 022b05
				$$->len = strlen($1);
Packit 022b05
			    } else {
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		qlcIdentifier
Packit 022b05
			{
Packit 022b05
			    /* Note: might be an Enumeration item or OID */
Packit 022b05
			    /* TODO: convert if it's an oid? */
Packit 022b05
			    switch (defaultBasetype) {
Packit 022b05
			    case SMI_BASETYPE_ENUM:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_ENUM;
Packit 022b05
				$$->value.ptr = $1;
Packit 022b05
				$$->len = strlen($1);
Packit 022b05
				/* TODO: XXX convert to int */
Packit 022b05
				break;
Packit 022b05
			    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OBJECTIDENTIFIER;
Packit 022b05
				$$->value.ptr = $1;
Packit 022b05
				$$->len = strlen($1);
Packit 022b05
				/* TODO: XXX convert to oid if found */
Packit 022b05
				break;
Packit 022b05
				case SMI_BASETYPE_POINTER:
Packit 022b05
				$$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OBJECTIDENTIFIER;
Packit 022b05
				$$->value.ptr = $1;
Packit 022b05
				$$->len = strlen($1);
Packit 022b05
				/* TODO: XXX check if valid reference found */
Packit 022b05
				break;
Packit 022b05
			    default:
Packit 022b05
				smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
				$$ = NULL;
Packit 022b05
				break;
Packit 022b05
			    }
Packit 022b05
			}
Packit 022b05
	|		qOID
Packit 022b05
			{
Packit 022b05
			    if (defaultBasetype == SMI_BASETYPE_OBJECTIDENTIFIER){
Packit 022b05
			    $$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
				$$->basetype = SMI_BASETYPE_OBJECTIDENTIFIER;
Packit 022b05
				$$->value.ptr = $1;
Packit 022b05
				$$->len = strlen($$->value.ptr);
Packit 022b05
			    }
Packit 022b05
			    else
Packit 022b05
			    	smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_UNEXPECTED_VALUETYPE);
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
	
Packit 022b05
qOID:		ucIdentifier COLON_COLON OID
Packit 022b05
			{
Packit 022b05
			    char *s;
Packit 022b05
Packit 022b05
			    s = smiMalloc(strlen($1) +
Packit 022b05
					  strlen($3) + 3);
Packit 022b05
			    sprintf(s, "%s::%s", $1, $3);
Packit 022b05
			    $$ = s;
Packit 022b05
			}
Packit 022b05
		|	OID
Packit 022b05
			{
Packit 022b05
				$$ = smiMalloc(strlen($1)+1);
Packit 022b05
				strcpy($$,$1);
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
status:			currentKeyword
Packit 022b05
			{
Packit 022b05
			    $$ = SMI_STATUS_CURRENT;
Packit 022b05
			}
Packit 022b05
        |		deprecatedKeyword
Packit 022b05
			{
Packit 022b05
			    $$ = SMI_STATUS_DEPRECATED;
Packit 022b05
			}
Packit 022b05
	|		obsoleteKeyword
Packit 022b05
			{
Packit 022b05
			    $$ = SMI_STATUS_OBSOLETE;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
number:			hexadecimalNumber
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
			    $$->basetype = SMI_BASETYPE_UNSIGNED64;
Packit 022b05
			    $$->value.unsigned64 = strtoull($1, NULL, 16);
Packit 022b05
			}
Packit 022b05
        |		decimalNumber
Packit 022b05
			{
Packit 022b05
			    $$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
			    $$->basetype = SMI_BASETYPE_UNSIGNED64;
Packit 022b05
			    $$->value.unsigned64 = strtoull($1, NULL, 10);
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
negativeNumber:		'-' decimalNumber
Packit 022b05
			{
Packit 022b05
			    if(bitsFlag){
Packit 022b05
			    smiPrintError(thisParserPtr,
Packit 022b05
					      ERR_BITS_NUMBER_NEGATIVE);
Packit 022b05
			    $$ = NULL;
Packit 022b05
			    }
Packit 022b05
			    $$ = smiMalloc(sizeof(SmiValue));
Packit 022b05
			    $$->basetype = SMI_BASETYPE_INTEGER64;
Packit 022b05
			    $$->value.integer64 = - strtoll($2, NULL, 10);
Packit 022b05
			}
Packit 022b05
        ;
Packit 022b05
Packit 022b05
signedNumber:		number
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
        |		negativeNumber
Packit 022b05
			{
Packit 022b05
			    $$ = $1;
Packit 022b05
			}
Packit 022b05
	;
Packit 022b05
Packit 022b05
/* decimalNumber, hexadecimalNumber, floatValue */
Packit 022b05
Packit 022b05
/* unknown... */
Packit 022b05
Packit 022b05
optsep_comma_01:	/* empty */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
/*	|		optsep ',' */
Packit 022b05
	;
Packit 022b05
Packit 022b05
sep:			/* empty, skipped by lexer */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        ;			
Packit 022b05
Packit 022b05
optsep:			/* empty, skipped by lexer */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        ;			
Packit 022b05
Packit 022b05
stmtsep:		/* empty, skipped by lexer */
Packit 022b05
			{
Packit 022b05
			    $$ = 0;
Packit 022b05
			}
Packit 022b05
        ;			
Packit 022b05
Packit 022b05
%%
Packit 022b05
Packit 022b05
#endif
Packit 022b05