155682Smarkm/*
2233294Sstas * Copyright (c) 1997 - 2005 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
2055682Smarkm *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
34233294Sstas/* $Id$ */
3555682Smarkm
3655682Smarkm#ifndef _SYMBOL_H
3755682Smarkm#define _SYMBOL_H
3855682Smarkm
39178825Sdfr#include "asn1_queue.h"
4055682Smarkm
41233294Sstasenum typetype {
42178825Sdfr    TBitString,
43178825Sdfr    TBoolean,
44233294Sstas    TChoice,
45178825Sdfr    TEnumerated,
46233294Sstas    TGeneralString,
47233294Sstas    TTeletexString,
48233294Sstas    TGeneralizedTime,
49178825Sdfr    TIA5String,
50233294Sstas    TInteger,
51178825Sdfr    TNull,
52233294Sstas    TOID,
53233294Sstas    TOctetString,
54178825Sdfr    TPrintableString,
55233294Sstas    TSequence,
56178825Sdfr    TSequenceOf,
57233294Sstas    TSet,
58178825Sdfr    TSetOf,
59233294Sstas    TTag,
60233294Sstas    TType,
61233294Sstas    TUTCTime,
62178825Sdfr    TUTF8String,
63178825Sdfr    TBMPString,
64178825Sdfr    TUniversalString,
65178825Sdfr    TVisibleString
66178825Sdfr};
67178825Sdfr
6855682Smarkmtypedef enum typetype Typetype;
6955682Smarkm
7055682Smarkmstruct type;
7155682Smarkm
72178825Sdfrstruct value {
73233294Sstas    enum { booleanvalue,
74233294Sstas	   nullvalue,
75233294Sstas	   integervalue,
76233294Sstas	   stringvalue,
77178825Sdfr	   objectidentifiervalue
78178825Sdfr    } type;
79178825Sdfr    union {
80178825Sdfr	int booleanvalue;
81178825Sdfr	int integervalue;
82178825Sdfr	char *stringvalue;
83178825Sdfr	struct objid *objectidentifiervalue;
84178825Sdfr    } u;
85178825Sdfr};
86178825Sdfr
8755682Smarkmstruct member {
88178825Sdfr    char *name;
89178825Sdfr    char *gen_name;
90178825Sdfr    char *label;
91178825Sdfr    int val;
92178825Sdfr    int optional;
93178825Sdfr    int ellipsis;
94178825Sdfr    struct type *type;
95178825Sdfr    ASN1_TAILQ_ENTRY(member) members;
96178825Sdfr    struct value *defval;
9755682Smarkm};
9855682Smarkm
9955682Smarkmtypedef struct member Member;
10055682Smarkm
101178825SdfrASN1_TAILQ_HEAD(memhead, member);
102178825Sdfr
10355682Smarkmstruct symbol;
10455682Smarkm
105178825Sdfrstruct tagtype {
106178825Sdfr    int tagclass;
107178825Sdfr    int tagvalue;
108178825Sdfr    enum { TE_IMPLICIT, TE_EXPLICIT } tagenv;
109178825Sdfr};
110178825Sdfr
111178825Sdfrstruct range {
112178825Sdfr    int min;
113178825Sdfr    int max;
114178825Sdfr};
115178825Sdfr
116178825Sdfrenum ctype { CT_CONTENTS, CT_USER } ;
117178825Sdfr
118178825Sdfrstruct constraint_spec;
119178825Sdfr
12055682Smarkmstruct type {
121178825Sdfr    Typetype type;
122178825Sdfr    struct memhead *members;
123178825Sdfr    struct symbol *symbol;
124178825Sdfr    struct type *subtype;
125178825Sdfr    struct tagtype tag;
126178825Sdfr    struct range *range;
127178825Sdfr    struct constraint_spec *constraint;
12855682Smarkm};
12955682Smarkm
13055682Smarkmtypedef struct type Type;
13155682Smarkm
132178825Sdfrstruct constraint_spec {
133178825Sdfr    enum ctype ctype;
134178825Sdfr    union {
135178825Sdfr	struct {
136178825Sdfr	    Type *type;
137178825Sdfr	    struct value *encoding;
138178825Sdfr	} content;
139178825Sdfr    } u;
140178825Sdfr};
141178825Sdfr
142178825Sdfrstruct objid {
143178825Sdfr    const char *label;
144178825Sdfr    int value;
145178825Sdfr    struct objid *next;
146178825Sdfr};
147178825Sdfr
14855682Smarkmstruct symbol {
149178825Sdfr    char *name;
150178825Sdfr    char *gen_name;
151178825Sdfr    enum { SUndefined, SValue, Stype } stype;
152178825Sdfr    struct value *value;
153178825Sdfr    Type *type;
15455682Smarkm};
15555682Smarkm
15655682Smarkmtypedef struct symbol Symbol;
15755682Smarkm
15855682Smarkmvoid initsym (void);
15955682SmarkmSymbol *addsym (char *);
16055682Smarkmvoid output_name (char *);
161178825Sdfrint checkundefined(void);
16255682Smarkm#endif
163