Configure searches for tk4.1 and tk7.5.
[ir-tcl-moved-to-github.git] / grs.c
1 /*
2  * IR toolkit for tcl/tk
3  * (c) Index Data 1995
4  * See the file LICENSE for details.
5  * Sebastian Hammer, Adam Dickmeiss
6  *
7  * $Log: grs.c,v $
8  * Revision 1.2  1995-09-20 11:37:01  adam
9  * Configure searches for tk4.1 and tk7.5.
10  * Work on GRS.
11  *
12  * Revision 1.1  1995/08/29  15:38:34  adam
13  * Added grs.c. new version.
14  *
15  */
16
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <ctype.h>
20 #include <assert.h>
21
22 #include "ir-tclp.h"
23
24 void ir_tcl_read_grs (Z_GenericRecord *r, IrTcl_GRS_Record **grs_record)
25 {
26     int i;
27     struct GRS_Record_entry *e;
28
29     *grs_record = NULL;
30     if (!r)
31         return;
32     *grs_record = ir_tcl_malloc (sizeof(**grs_record));
33     if (!((*grs_record)->noTags = r->num_elements))
34     {
35         (*grs_record)->entries = NULL;
36         return;
37     }
38     e = (*grs_record)->entries = ir_tcl_malloc (r->num_elements *
39                                                 sizeof(*e));
40     for (i = 0; i < r->num_elements; i++, e++)
41     {
42         Z_TaggedElement *t;
43
44         t = r->elements[i];
45         if (t->tagType)
46             e->tagType = *t->tagType;
47         else
48             e->tagType = 0;
49         e->tagWhich = t->tagValue->which;
50         if (t->tagValue->which == Z_StringOrNumeric_numeric)
51             e->tagVal.num = *t->tagValue->u.numeric;
52         else
53             ir_tcl_strdup (NULL, &e->tagVal.str, t->tagValue->u.string);
54         e->dataWhich = t->content->which;
55
56         switch (t->content->which)
57         {
58         case Z_ElementData_octets:
59             e->tagData.octets.len = t->content->u.octets->len;
60             e->tagData.octets.buf = ir_tcl_malloc (t->content->u.octets->len);
61             memcpy (e->tagData.octets.buf, t->content->u.octets->buf, 
62                     t->content->u.octets->len);
63             break;
64         case Z_ElementData_numeric:
65             e->tagData.num = *t->content->u.numeric;
66             break;
67         case Z_ElementData_date:
68             ir_tcl_strdup (NULL, &e->tagData.str, t->content->u.string);
69             break;            
70         case Z_ElementData_ext:
71             break;
72         case Z_ElementData_string:
73             ir_tcl_strdup (NULL, &e->tagData.str, t->content->u.string);
74             break;
75         case Z_ElementData_trueOrFalse:
76             e->tagData.bool = *t->content->u.trueOrFalse;
77             break;
78         case Z_ElementData_oid:
79             break;
80         case Z_ElementData_intUnit:
81             break;
82         case Z_ElementData_elementNotThere:
83         case Z_ElementData_elementEmpty:
84         case Z_ElementData_noDataRequested:
85             break;
86         case Z_ElementData_diagnostic:
87             break;
88         case Z_ElementData_subtree:
89             ir_tcl_read_grs (t->content->u.subtree, &e->tagData.sub);
90             break;
91         }
92     }
93 }
94
95 static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
96                              int argc, char **argv, int argno)
97 {
98     static char tmpbuf[32];
99     int i;
100     struct GRS_Record_entry *e = grs_record->entries;
101
102     if (argno >= argc)
103     {
104         for (i = 0; i<grs_record->noTags; i++, e++)
105         {
106
107             Tcl_AppendResult (interp, "{ ", NULL);
108             sprintf (tmpbuf, "%d", e->tagType);
109             Tcl_AppendElement (interp, tmpbuf);
110
111             if (e->tagWhich == Z_StringOrNumeric_numeric)
112             {
113                 Tcl_AppendResult (interp, " numeric ", NULL);
114                 sprintf (tmpbuf, "%d", e->tagVal.num);
115                 Tcl_AppendElement (interp, tmpbuf);
116             }
117             else
118             {
119                 Tcl_AppendResult (interp, " string ", NULL);
120                 Tcl_AppendElement (interp, e->tagVal.str);
121             }
122             switch (e->dataWhich)
123             {
124             case Z_ElementData_octets:
125                 Tcl_AppendResult (interp, " octets {} ", NULL);
126                 break;
127             case Z_ElementData_numeric:
128                 Tcl_AppendResult (interp, " numeric {} ", NULL);
129                 break;
130             case Z_ElementData_date:
131                 Tcl_AppendResult (interp, " date {} ", NULL);
132                 break;
133             case Z_ElementData_ext:
134                 Tcl_AppendResult (interp, " ext {} ", NULL);
135                 break;
136             case Z_ElementData_string:
137                 Tcl_AppendResult (interp, " string ", NULL);
138                 Tcl_AppendElement (interp, e->tagData.str );
139                 break;
140             case Z_ElementData_trueOrFalse:
141                 Tcl_AppendResult (interp, " bool ",
142                                   e->tagData.bool ? "1" : "0", " ", NULL);
143                 break;
144             case Z_ElementData_oid:
145                 Tcl_AppendResult (interp, " oid {} ", NULL);
146                 break;
147             case Z_ElementData_intUnit:
148                 Tcl_AppendResult (interp, " intUnit {} ", NULL);
149                 break;
150             case Z_ElementData_elementNotThere:
151                 Tcl_AppendResult (interp, " notThere {} ", NULL);
152                 break;
153             case Z_ElementData_elementEmpty:
154                 Tcl_AppendResult (interp, " empty {} ", NULL);
155                 break;
156             case Z_ElementData_noDataRequested:
157                 Tcl_AppendResult (interp, " notRequested {} ", NULL);
158                 break;
159             case Z_ElementData_diagnostic:
160                 Tcl_AppendResult (interp, " diagnostic {} ", NULL);
161                 break;
162             case Z_ElementData_subtree:
163                 Tcl_AppendResult (interp, " subtree { ", NULL);
164                 ir_tcl_get_grs_r (interp, e->tagData.sub, argc, argv, argno+1);
165                 Tcl_AppendResult (interp, " } ", NULL);
166                 break;
167             }
168             Tcl_AppendResult (interp, " } ", NULL);
169         }
170     }
171     return TCL_OK;
172 }
173
174 int ir_tcl_get_grs (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record, 
175                      int argc, char **argv)
176 {
177     return ir_tcl_get_grs_r (interp, grs_record, argc, argv, 4);
178 }
179