s4:heimdal: import lorikeet-heimdal-202201172009 (commit 5a0b45cd723628b3690ea848548b...
[samba.git] / source4 / heimdal / lib / asn1 / symbol.h
index a39c8f46512d4073d886ad592eb2aad18f605c6a..b88386223b30590379e0e0b35905980fa8212b07 100644 (file)
@@ -36,7 +36,7 @@
 #ifndef _SYMBOL_H
 #define _SYMBOL_H
 
-#include "asn1_queue.h"
+#include <heimqueue.h>
 
 enum typetype {
     TBitString,
@@ -68,6 +68,8 @@ enum typetype {
 typedef enum typetype Typetype;
 
 struct type;
+struct value;
+struct typereference;
 
 struct value {
     enum { booleanvalue,
@@ -78,10 +80,11 @@ struct value {
     } type;
     union {
        int booleanvalue;
-       int integervalue;
+       int64_t integervalue;
        char *stringvalue;
        struct objid *objectidentifiervalue;
     } u;
+    struct symbol *s;
 };
 
 struct member {
@@ -92,13 +95,13 @@ struct member {
     int optional;
     int ellipsis;
     struct type *type;
-    ASN1_TAILQ_ENTRY(member) members;
+    HEIM_TAILQ_ENTRY(member) members;
     struct value *defval;
 };
 
 typedef struct member Member;
 
-ASN1_TAILQ_HEAD(memhead, member);
+HEIM_TAILQ_HEAD(memhead, member);
 
 struct symbol;
 
@@ -109,32 +112,110 @@ struct tagtype {
 };
 
 struct range {
-    int min;
-    int max;
+    /*
+     * We can't represent unsigned 64-bit ranges because max might be
+     * negative...
+     */
+    int64_t min;
+    int64_t max;
 };
 
-enum ctype { CT_CONTENTS, CT_USER } ;
+enum ctype { CT_CONTENTS, CT_USER, CT_TABLE_CONSTRAINT } ;
 
 struct constraint_spec;
 
+struct iosclassfield {
+    char *name;
+    struct type *type;
+    struct value *defval;
+    HEIM_TAILQ_ENTRY(iosclassfield) fields;
+    unsigned long id;
+    unsigned int optional:1;
+    unsigned int unique:1;
+};
+
+typedef struct iosclassfield Field;
+HEIM_TAILQ_HEAD(fieldhead, iosclassfield);
+
+struct iosobjectfield {
+    char *name;
+    struct type *type;
+    struct value *value;
+    HEIM_TAILQ_ENTRY(iosobjectfield) objfields;
+    unsigned long id;
+};
+
+typedef struct iosobjectfield ObjectField;
+HEIM_TAILQ_HEAD(objfieldhead, iosobjectfield);
+
+struct iosclass {
+    struct symbol *symbol;
+    struct fieldhead *fields;
+    unsigned long id;
+};
+
+typedef struct iosclass IOSClass;
+
+struct iosobject {
+    struct symbol *symbol;
+    struct objfieldhead *objfields;
+    ObjectField *typeidf;
+    IOSClass *iosclass;
+    HEIM_TAILQ_ENTRY(iosobject) objects;
+    unsigned long id;
+    unsigned int ellipsis:1;
+    unsigned int optional:1;
+};
+
+typedef struct iosobject IOSObject;
+HEIM_TAILQ_HEAD(objectshead, iosobject);
+
+struct iosobjectset {
+    struct symbol *symbol;
+    IOSClass *iosclass;
+    struct objectshead *objects;
+    unsigned long id;
+};
+
+typedef struct iosobjectset IOSObjectSet;
+
+struct typereference {
+    /*
+     * For now we don't support link fields, so we don't support chains of more
+     * than one field.
+     */
+    IOSClass *iosclass;
+    Field *field;
+};
+
 struct type {
     Typetype type;
     struct memhead *members;
     struct symbol *symbol;
     struct type *subtype;
+    struct typereference typeref; /* For type fields */
+    IOSClass *formal_parameter;
+    IOSObjectSet *actual_parameter;
     struct tagtype tag;
     struct range *range;
     struct constraint_spec *constraint;
+    unsigned long id;
 };
 
 typedef struct type Type;
 
+struct component_relation_constraint {
+    char *objectname;
+    char *membername;
+};
+
 struct constraint_spec {
     enum ctype ctype;
     union {
        struct {
            Type *type;
            struct value *encoding;
+            struct component_relation_constraint crel;
        } content;
     } u;
 };
@@ -148,15 +229,36 @@ struct objid {
 struct symbol {
     char *name;
     char *gen_name;
-    enum { SUndefined, SValue, Stype } stype;
+    enum { SUndefined, SValue, Stype, Sparamtype, Sclass, Sobj, Sobjset } stype;
     struct value *value;
     Type *type;
+    IOSClass *iosclass;
+    IOSObject *object;
+    IOSObjectSet *objectset;
+    HEIM_TAILQ_ENTRY(symbol) symlist;
+    unsigned int emitted_declaration:1;
+    unsigned int emitted_definition:1;
+    unsigned int emitted_tag_enums:1;
+    unsigned int emitted_template:1;
 };
 
 typedef struct symbol Symbol;
 
+//HEIM_TAILQ_HEAD(symhead, symbol);
+struct symhead {
+    struct symbol *tqh_first;
+    struct symbol **tqh_last;
+};
+
+extern struct symhead symbols;
+
 void initsym (void);
 Symbol *addsym (char *);
+Symbol *getsym(char *name);
 void output_name (char *);
 int checkundefined(void);
+void generate_types(void);
+void emitted_declaration(const Symbol *);
+void emitted_definition(const Symbol *);
+void emitted_tag_enums(const Symbol *);
 #endif