155682Smarkm/*
2178825Sdfr * Copyright (c) 1997 - 2005 Kungliga Tekniska H�gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
555682Smarkm *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
955682Smarkm *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
2055682Smarkm *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
34178825Sdfr/* $Id: symbol.h 19539 2006-12-28 17:15:05Z lha $ */
3555682Smarkm
3655682Smarkm#ifndef _SYMBOL_H
3755682Smarkm#define _SYMBOL_H
3855682Smarkm
39178825Sdfr#include "asn1_queue.h"
4055682Smarkm
41178825Sdfrenum typetype {
42178825Sdfr    TBitString,
43178825Sdfr    TBoolean,
44178825Sdfr    TChoice,
45178825Sdfr    TEnumerated,
46178825Sdfr    TGeneralString,
47178825Sdfr    TGeneralizedTime,
48178825Sdfr    TIA5String,
49178825Sdfr    TInteger,
50178825Sdfr    TNull,
51178825Sdfr    TOID,
52178825Sdfr    TOctetString,
53178825Sdfr    TPrintableString,
54178825Sdfr    TSequence,
55178825Sdfr    TSequenceOf,
56178825Sdfr    TSet,
57178825Sdfr    TSetOf,
58178825Sdfr    TTag,
59178825Sdfr    TType,
60178825Sdfr    TUTCTime,
61178825Sdfr    TUTF8String,
62178825Sdfr    TBMPString,
63178825Sdfr    TUniversalString,
64178825Sdfr    TVisibleString
65178825Sdfr};
66178825Sdfr
6755682Smarkmtypedef enum typetype Typetype;
6855682Smarkm
6955682Smarkmstruct type;
7055682Smarkm
71178825Sdfrstruct value {
72178825Sdfr    enum { booleanvalue,
73178825Sdfr	   nullvalue,
74178825Sdfr	   integervalue,
75178825Sdfr	   stringvalue,
76178825Sdfr	   objectidentifiervalue
77178825Sdfr    } type;
78178825Sdfr    union {
79178825Sdfr	int booleanvalue;
80178825Sdfr	int integervalue;
81178825Sdfr	char *stringvalue;
82178825Sdfr	struct objid *objectidentifiervalue;
83178825Sdfr    } u;
84178825Sdfr};
85178825Sdfr
8655682Smarkmstruct member {
87178825Sdfr    char *name;
88178825Sdfr    char *gen_name;
89178825Sdfr    char *label;
90178825Sdfr    int val;
91178825Sdfr    int optional;
92178825Sdfr    int ellipsis;
93178825Sdfr    struct type *type;
94178825Sdfr    ASN1_TAILQ_ENTRY(member) members;
95178825Sdfr    struct value *defval;
9655682Smarkm};
9755682Smarkm
9855682Smarkmtypedef struct member Member;
9955682Smarkm
100178825SdfrASN1_TAILQ_HEAD(memhead, member);
101178825Sdfr
10255682Smarkmstruct symbol;
10355682Smarkm
104178825Sdfrstruct tagtype {
105178825Sdfr    int tagclass;
106178825Sdfr    int tagvalue;
107178825Sdfr    enum { TE_IMPLICIT, TE_EXPLICIT } tagenv;
108178825Sdfr};
109178825Sdfr
110178825Sdfrstruct range {
111178825Sdfr    int min;
112178825Sdfr    int max;
113178825Sdfr};
114178825Sdfr
115178825Sdfrenum ctype { CT_CONTENTS, CT_USER } ;
116178825Sdfr
117178825Sdfrstruct constraint_spec;
118178825Sdfr
11955682Smarkmstruct type {
120178825Sdfr    Typetype type;
121178825Sdfr    struct memhead *members;
122178825Sdfr    struct symbol *symbol;
123178825Sdfr    struct type *subtype;
124178825Sdfr    struct tagtype tag;
125178825Sdfr    struct range *range;
126178825Sdfr    struct constraint_spec *constraint;
12755682Smarkm};
12855682Smarkm
12955682Smarkmtypedef struct type Type;
13055682Smarkm
131178825Sdfrstruct constraint_spec {
132178825Sdfr    enum ctype ctype;
133178825Sdfr    union {
134178825Sdfr	struct {
135178825Sdfr	    Type *type;
136178825Sdfr	    struct value *encoding;
137178825Sdfr	} content;
138178825Sdfr    } u;
139178825Sdfr};
140178825Sdfr
141178825Sdfrstruct objid {
142178825Sdfr    const char *label;
143178825Sdfr    int value;
144178825Sdfr    struct objid *next;
145178825Sdfr};
146178825Sdfr
14755682Smarkmstruct symbol {
148178825Sdfr    char *name;
149178825Sdfr    char *gen_name;
150178825Sdfr    enum { SUndefined, SValue, Stype } stype;
151178825Sdfr    struct value *value;
152178825Sdfr    Type *type;
15355682Smarkm};
15455682Smarkm
15555682Smarkmtypedef struct symbol Symbol;
15655682Smarkm
15755682Smarkmvoid initsym (void);
15855682SmarkmSymbol *addsym (char *);
15955682Smarkmvoid output_name (char *);
160178825Sdfrint checkundefined(void);
16155682Smarkm#endif
162