Implemented ILL protocol. Minor updates ASN.1 compiler.
[yaz-moved-to-github.git] / odr / test.c
1 #include <stdio.h>
2 #include <yaz/odr.h>
3
4 #if 0
5
6 typedef Odr_bitmask Z_ReferenceId;
7
8 typedef struct Z_InitRequest
9 {
10     Z_ReferenceId *referenceId;    /* OPTIONAL */
11     Odr_bitmask *options;
12     Odr_bitmask *protocolVersion;
13     int *preferredMessageSize;
14     int *maximumRecordSize;
15     char *idAuthentication;      /* OPTIONAL */
16     char *implementationId;      /* OPTIONAL */
17     char *implementationName;    /* OPTIONAL */
18     char *implementationVersion; /* OPTIONAL */
19 } Z_InitRequest;
20
21 int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt)
22 {
23     return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2, opt);
24 }
25
26 int z_InitRequest(ODR o, Z_InitRequest **p, int opt)
27 {
28     Z_InitRequest *pp;
29
30     if (!odr_sequence_begin(o, p, sizeof(Z_InitRequest)))
31         return opt;
32     pp = *p;
33     return
34         z_ReferenceId(o, &pp->referenceId, 1) &&
35         odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT, 
36             3, 0) &&
37         odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
38         odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
39             5, 0) &&
40         odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
41             6, 0) &&
42         odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
43             7, 1) &&
44         odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
45             110, 1) &&
46         odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
47             111, 1) &&
48         odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
49             ODR_CONTEXT, 112, 1) &&
50         odr_sequence_end(o);
51 }
52
53 struct A
54 {
55     int which;
56     union
57     {
58         int *b;   /* integer */
59         char *c;  /* visstring */
60     } u;
61 };
62
63 int f_A(ODR o, struct A **p, int opt)
64 {
65     int res;
66     Odr_arm arm[] =
67     {
68         { -1, -1, -1, 0, (Odr_fun) odr_integer },
69         { ODR_IMPLICIT, ODR_CONTEXT, 200, 1, (Odr_fun) odr_visiblestring },
70         { -1, -1, -1, -1, 0 }
71     };
72
73     if (o->direction == ODR_DECODE && !*p)
74         *p = odr_malloc(o, sizeof(**p));
75     res = odr_choice(o, arm, &(*p)->u, &(*p)->which);
76     if (!res)
77     {
78         *p = 0;
79         return opt;
80     }
81     return 1;
82 }
83
84 #if 0
85 int main()
86 {
87     int i;
88     unsigned char buf[4048];
89     struct odr o;
90     Z_InitRequest ireq, *ireqp, *ireq2p;
91     Odr_bitmask options, protocolVersion;
92     char *iId = "YAZ", *iName = "Yet Another Z39.50 Implementation",
93         *iVersion = "0.1";
94     int maximumRS = 4096, preferredMS = 2048;
95     static Odr_oid oid[] = {1, 2, 3, 4, -1}, *oidp1, *oidp2;
96
97     oidp1 = oid;
98
99     ODR_MASK_ZERO(&protocolVersion);
100     ODR_MASK_SET(&protocolVersion, 0);
101     ODR_MASK_SET(&protocolVersion, 1);
102
103     ODR_MASK_ZERO(&options);
104     ODR_MASK_SET(&options, 0);
105     ODR_MASK_SET(&options, 1);
106     ODR_MASK_SET(&options, 2);
107
108     ireq.referenceId = 0;
109     ireq.protocolVersion = &protocolVersion;
110     ireq.options = &options;
111     ireq.preferredMessageSize = &preferredMS;
112     ireq.maximumRecordSize = &maximumRS;
113     ireq.idAuthentication = 0;
114     ireq.implementationId = iId;
115     ireq.implementationName = iName;
116     ireq.implementationVersion = iVersion;
117     ireqp = &ireq;
118
119     o.buf = buf;
120     o.bp=o.buf;
121     o.left = o.buflen = 1024;
122     o.direction = ODR_PRINT;
123     o.print = stdout;
124     o.t_class = -1;
125
126     odr_oid(&o, &oidp1, 0);
127
128     exit(0);
129
130     o.direction = ODR_DECODE;
131     o.bp = o.buf;
132
133     odr_oid(&o, &oidp2, 0);
134 }    
135 #endif
136
137 #endif
138
139 int main()
140 {
141     Odr_bitmask a;
142     char command;
143     int val;
144     char line[100];
145
146     ODR_MASK_ZERO(&a);
147     while (gets(line))
148     {
149         int i;
150
151         sscanf(line, "%c %d", &command, &val);
152         switch (command)
153         {
154             case 's': ODR_MASK_SET(&a, val); break;
155             case 'c': ODR_MASK_CLEAR(&a, val); break;
156             case 'g': printf("%d\n", ODR_MASK_GET(&a, val)); break;
157             case 'l': break;
158             default: printf("enter c <v> or s <v> or l\n"); continue;
159         }
160         printf("top is %d\n", a.top);
161         for (i = 0; i <= a.top; i++)
162             printf("%2.2x ", a.bits[i] );
163         printf("\n");
164      }
165 }