Directive systag.
[idzebra-moved-to-github.git] / include / data1.h
1 /* $Id: data1.h,v 1.3 2002-12-02 16:55:14 adam Exp $
2    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
3    Index Data Aps
4
5 This file is part of the Zebra server.
6
7 Zebra is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Zebra; see the file LICENSE.zebra.  If not, write to the
19 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.
21 */
22
23 #ifndef DATA1_H
24 #define DATA1_H
25
26 #include <stdio.h>
27
28 #include <yaz/nmem.h>
29 #include <yaz/oid.h>
30 #include <yaz/proto.h>
31
32 #include <d1_attset.h>
33 #include <d1_map.h>
34 #include <yaz/yaz-util.h>
35 #include <yaz/wrbuf.h>
36
37 #define d1_isspace(c) strchr(" \r\n\t\f", c)
38 #define d1_isdigit(c) ((c) <= '9' && (c) >= '0')
39
40 YAZ_BEGIN_CDECL
41
42 #define data1_matchstr(s1, s2) yaz_matchstr(s1, s2)
43
44 #define DATA1_MAX_SYMBOL 31
45
46 typedef struct data1_name
47 {
48     char *name;
49     struct data1_name *next;
50 } data1_name;
51
52 typedef struct data1_absyn_cache_info *data1_absyn_cache;
53 typedef struct data1_attset_cache_info *data1_attset_cache;
54
55 typedef enum data1_datatype
56 {
57     DATA1K_unknown,
58     DATA1K_structured,
59     DATA1K_string,
60     DATA1K_numeric,
61     DATA1K_bool,
62     DATA1K_oid,
63     DATA1K_generalizedtime,
64     DATA1K_intunit,
65     DATA1K_int,
66     DATA1K_octetstring,
67     DATA1K_null
68 } data1_datatype;
69
70 typedef struct data1_marctab
71 {
72     char *name;
73     oid_value reference;
74
75     char record_status[2];
76     char implementation_codes[5];
77     int  indicator_length;
78     int  identifier_length;
79     char user_systems[4];
80
81     int  length_data_entry;
82     int  length_starting;
83     int  length_implementation;
84     char future_use[2];
85
86     int  force_indicator_length;
87     int  force_identifier_length;
88     struct data1_marctab *next;
89 } data1_marctab;
90
91 typedef struct data1_esetname
92 {
93     char *name;
94     Z_Espec1 *spec;
95     struct data1_esetname *next;
96 } data1_esetname;
97
98 /*
99  * Variant set definitions.
100  */
101
102 typedef struct data1_vartype
103 {
104     char *name;
105     struct data1_varclass *zclass;
106     int type;
107     data1_datatype datatype;
108     struct data1_vartype *next;
109 } data1_vartype;
110
111 typedef struct data1_varclass
112 {
113     char *name;
114     struct data1_varset *set;
115     int zclass;
116     data1_vartype *types;
117     struct data1_varclass *next;
118 } data1_varclass;
119
120 typedef struct data1_varset
121 {
122     char *name;
123     oid_value reference;
124     data1_varclass *classes;
125 } data1_varset;
126
127 /*
128  * Tagset definitions
129  */
130
131 struct data1_tagset;
132
133 typedef struct data1_tag
134 {
135     data1_name *names;
136 #define DATA1T_numeric 1
137 #define DATA1T_string 2
138     int which;
139     union
140     {
141         int numeric;
142         char *string;
143     } value;
144     data1_datatype kind;
145
146     struct data1_tagset *tagset;
147     struct data1_tag *next;
148 } data1_tag;
149
150 typedef struct data1_tagset data1_tagset;
151
152 struct data1_tagset
153 {
154     int type;                        /* type of tagset in current context */
155     char *name;                      /* symbolic name */
156     oid_value reference;
157     data1_tag *tags;                 /* tags defined by this set */
158     data1_tagset *children;          /* children */
159     data1_tagset *next;              /* sibling */
160 };
161
162 typedef struct data1_termlist
163 {
164     data1_att *att;
165     char *structure;
166     char *source;
167     struct data1_termlist *next;
168 } data1_termlist;
169
170 /*
171  * abstract syntax specification
172  */
173
174 typedef struct data1_element
175 {
176     char *name;
177     data1_tag *tag;
178     data1_termlist *termlists;
179     char *sub_name;
180     struct data1_element *children;
181     struct data1_element *next;
182 } data1_element;
183
184 typedef struct data1_sub_elements {
185     char *name;
186     struct data1_sub_elements *next;
187     data1_element *elements;
188 } data1_sub_elements;
189
190 typedef struct data1_xattr {
191     char *name;
192     char *value;
193     struct data1_xattr *next;
194     unsigned short what;  /* DATA1I_text, .. see data1_node.u.data */
195 } data1_xattr;
196
197 #if 0
198 typedef struct data1_absyn data1_absyn;
199 #else
200 typedef struct data1_absyn
201 {
202     char *name;
203     oid_value reference;
204     data1_tagset *tagset;
205     data1_attset *attset;
206     data1_varset *varset;
207     data1_esetname *esetnames;
208     data1_maptab *maptabs;
209     data1_marctab *marc;
210     data1_sub_elements *sub_elements;
211     data1_element *main_elements;
212     struct data1_systag *systags;
213     char *encoding;
214     int  enable_xpath_indexing;
215 } data1_absyn;
216 #endif
217 /*
218  * record data node (tag/data/variant)
219  */
220
221 typedef struct data1_node
222 {
223     /* the root of a record (containing global data) */
224 #define DATA1N_root 1 
225     /* a tag */
226 #define DATA1N_tag  2       
227     /* some data under a leaf tag or variant */
228 #define DATA1N_data 3
229     /* variant specification (a triple, actually) */
230 #define DATA1N_variant 4
231     /* comment (same as data) */
232 #define DATA1N_comment 5
233     /* preprocessing instruction */
234 #define DATA1N_preprocess 6
235     int which;
236     union
237     {
238         struct
239         {
240             char *type;
241             data1_absyn *absyn;  /* abstract syntax for this type */
242         } root;
243
244         struct 
245         {
246             char *tag;
247             data1_element *element;
248             int no_data_requested;
249             int get_bytes;
250             unsigned node_selected : 1;
251             unsigned make_variantlist : 1;
252             data1_xattr *attributes;
253         } tag;
254
255         struct
256         {
257             char *data;      /* filename or data */
258             int len;
259             /* text inclusion */
260 #define DATA1I_inctxt 1
261             /* binary data inclusion */
262 #define DATA1I_incbin 2
263         /* text data */
264 #define DATA1I_text 3 
265             /* numerical data */
266 #define DATA1I_num 4
267             /* object identifier */
268 #define DATA1I_oid 5
269             /* XML text */
270 #define DATA1I_xmltext 6
271             unsigned what:7;
272             unsigned formatted_text : 1;   /* newlines are significant */
273         } data;
274
275         struct
276         {
277             data1_vartype *type;
278             char *value;
279         } variant;
280
281         struct
282         {
283             char *target;
284             data1_xattr *attributes;
285         } preprocess;
286     } u;
287
288     void (*destroy)(struct data1_node *n);
289 #define DATA1_LOCALDATA 12
290     char lbuf[DATA1_LOCALDATA]; /* small buffer for local data */
291     struct data1_node *next;
292     struct data1_node *child;
293     struct data1_node *last_child;
294     struct data1_node *parent;
295     struct data1_node *root;
296 } data1_node;
297
298 YAZ_EXPORT data1_handle data1_create (void);
299
300 #define DATA1_FLAG_XML  1
301 YAZ_EXPORT data1_handle data1_createx (int flags);
302
303 YAZ_EXPORT void data1_destroy(data1_handle dh);
304 YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
305 YAZ_EXPORT data1_node *data1_read_node(data1_handle dh, const char **buf,
306                                        NMEM m);
307 YAZ_EXPORT data1_node *data1_read_nodex (data1_handle dh, NMEM m,
308                                          int (*get_byte)(void *fh), void *fh,
309                                          WRBUF wrbuf);
310 YAZ_EXPORT data1_node *data1_read_record(data1_handle dh, 
311                                          int (*rf)(void *, char *, size_t),
312                                          void *fh, NMEM m);
313 YAZ_EXPORT data1_absyn *data1_read_absyn(data1_handle dh, const char *file,
314                                          int file_must_exist);
315 YAZ_EXPORT data1_tag *data1_gettagbynum(data1_handle dh,
316                                         data1_tagset *s,
317                                         int type, int value);
318 YAZ_EXPORT data1_tagset *data1_empty_tagset (data1_handle dh);
319 YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh, 
320                                            const char *file,
321                                            int type);
322 YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh, 
323                                                     data1_absyn *abs,
324                                                     data1_element *parent,
325                                                     const char *tagname);
326 YAZ_EXPORT Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n,
327                                            int select, ODR o,
328                                            int *len);
329 YAZ_EXPORT data1_tag *data1_gettagbyname(data1_handle dh, data1_tagset *s,
330                                          const char *name);
331 YAZ_EXPORT void data1_free_tree(data1_handle dh, data1_node *t);
332 YAZ_EXPORT char *data1_nodetobuf(data1_handle dh, data1_node *n,
333                                  int select, int *len);
334 YAZ_EXPORT data1_node *data1_mk_tag_data_wd(data1_handle dh,
335                                             data1_node *at,
336                                             const char *tagname, NMEM m);
337 YAZ_EXPORT data1_node *data1_mk_tag_data(data1_handle dh, data1_node *at,
338                                          const char *tagname, NMEM m);
339 YAZ_EXPORT data1_datatype data1_maptype(data1_handle dh, char *t);
340 YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
341 YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
342                                                data1_varset *set,
343                                                char *zclass, char *type);
344 YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
345 YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
346 YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh, 
347                                                data1_absyn *a,
348                                                const char *name);
349 YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
350                                                  data1_absyn *absyn,
351                                                  const char *name);
352 YAZ_EXPORT data1_node *data1_mk_node2(data1_handle dh, NMEM m,
353                                       int type, data1_node *parent);
354
355 YAZ_EXPORT data1_node *data1_mk_tag (data1_handle dh, NMEM nmem, 
356                                      const char *tag, const char **attr,
357                                      data1_node *at);
358 YAZ_EXPORT data1_node *data1_mk_tag_n (data1_handle dh, NMEM nmem,
359                                        const char *tag, size_t len,
360                                        const char **attr,
361                                        data1_node *at);
362 YAZ_EXPORT void data1_tag_add_attr (data1_handle dh, NMEM nmem,
363                                     data1_node *res, const char **attr);
364
365 YAZ_EXPORT data1_node *data1_mk_text_n (data1_handle dh, NMEM mem,
366                                         const char *buf, size_t len,
367                                         data1_node *parent);
368 YAZ_EXPORT data1_node *data1_mk_text_nf (data1_handle dh, NMEM mem,
369                                          const char *buf, size_t len,
370                                          data1_node *parent);
371 YAZ_EXPORT data1_node *data1_mk_text (data1_handle dh, NMEM mem,
372                                       const char *buf, data1_node *parent);
373
374 YAZ_EXPORT data1_node *data1_mk_comment_n (data1_handle dh, NMEM mem,
375                                            const char *buf, size_t len,
376                                            data1_node *parent);
377
378 YAZ_EXPORT data1_node *data1_mk_comment (data1_handle dh, NMEM mem,
379                                          const char *buf, data1_node *parent);
380
381 YAZ_EXPORT data1_node *data1_mk_preprocess_n (data1_handle dh, NMEM nmem,
382                                               const char *target, size_t len,
383                                               const char **attr,
384                                               data1_node *at);
385
386 YAZ_EXPORT data1_node *data1_mk_preprocess (data1_handle dh, NMEM nmem,
387                                             const char *target,
388                                             const char **attr,
389                                             data1_node *at);
390
391 YAZ_EXPORT data1_node *data1_mk_root (data1_handle dh, NMEM nmem,
392                                       const char *name);
393 YAZ_EXPORT void data1_set_root(data1_handle dh, data1_node *res,
394                                NMEM nmem, const char *name);
395
396 YAZ_EXPORT data1_node *data1_mk_tag_data_int (data1_handle dh, data1_node *at,
397                                               const char *tag, int num,
398                                               NMEM nmem);
399 YAZ_EXPORT data1_node *data1_mk_tag_data_oid (data1_handle dh, data1_node *at,
400                                               const char *tag, Odr_oid *oid,
401                                               NMEM nmem);
402 YAZ_EXPORT data1_node *data1_mk_tag_data_text (data1_handle dh, data1_node *at,
403                                                const char *tag,
404                                                const char *str,
405                                                NMEM nmem);
406 YAZ_EXPORT data1_node *data1_mk_tag_data_text_uni (data1_handle dh,
407                                                    data1_node *at,
408                                                    const char *tag,
409                                                    const char *str,
410                                                    NMEM nmem);
411
412 YAZ_EXPORT data1_absyn *data1_get_absyn (data1_handle dh, const char *name);
413
414 YAZ_EXPORT data1_node *data1_search_tag (data1_handle dh, data1_node *n,
415                                          const char *tag);
416 YAZ_EXPORT data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem, 
417                                          const char *tag, data1_node *at);
418 YAZ_EXPORT data1_attset *data1_get_attset (data1_handle dh, const char *name);
419 YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
420 YAZ_EXPORT data1_node *data1_map_record(data1_handle dh, data1_node *n,
421                                         data1_maptab *map, NMEM m);
422 YAZ_EXPORT data1_marctab *data1_read_marctab (data1_handle dh,
423                                               const char *file);
424 YAZ_EXPORT char *data1_nodetomarc(data1_handle dh, data1_marctab *p,
425                                   data1_node *n, int selected, int *len);
426 YAZ_EXPORT char *data1_nodetoidsgml(data1_handle dh, data1_node *n,
427                                     int select, int *len);
428 YAZ_EXPORT Z_ExplainRecord *data1_nodetoexplain(data1_handle dh,
429                                                 data1_node *n, int select,
430                                                 ODR o);
431 YAZ_EXPORT Z_BriefBib *data1_nodetosummary(data1_handle dh, 
432                                            data1_node *n, int select,
433                                            ODR o);
434 YAZ_EXPORT char *data1_nodetosoif(data1_handle dh, data1_node *n, int select,
435                                   int *len);
436 YAZ_EXPORT void data1_set_tabpath(data1_handle dh, const char *path);
437 YAZ_EXPORT void data1_set_tabroot (data1_handle dp, const char *p);
438 YAZ_EXPORT const char *data1_get_tabpath(data1_handle dh);
439 YAZ_EXPORT const char *data1_get_tabroot(data1_handle dh);
440
441 YAZ_EXPORT WRBUF data1_get_wrbuf (data1_handle dp);
442 YAZ_EXPORT char **data1_get_read_buf (data1_handle dp, int **lenp);
443 YAZ_EXPORT char **data1_get_map_buf (data1_handle dp, int **lenp);
444 YAZ_EXPORT data1_absyn_cache *data1_absyn_cache_get (data1_handle dh);
445 YAZ_EXPORT data1_attset_cache *data1_attset_cache_get (data1_handle dh);
446 YAZ_EXPORT NMEM data1_nmem_get (data1_handle dh);
447 YAZ_EXPORT void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out);
448 YAZ_EXPORT char *data1_insert_string (data1_handle dh, data1_node *res,
449                                       NMEM m, const char *str);
450 YAZ_EXPORT char *data1_insert_string_n (data1_handle dh, data1_node *res,
451                                         NMEM m, const char *str, size_t len);
452 YAZ_EXPORT data1_node *data1_read_sgml (data1_handle dh, NMEM m,
453                                         const char *buf);
454 YAZ_EXPORT data1_node *data1_read_xml (data1_handle dh,
455                                        int (*rf)(void *, char *, size_t),
456                                        void *fh, NMEM m);
457 YAZ_EXPORT void data1_absyn_trav (data1_handle dh, void *handle,
458                                   void (*fh)(data1_handle dh,
459                                              void *h, data1_absyn *a));
460
461 YAZ_EXPORT data1_attset *data1_attset_search_id (data1_handle dh, int id);
462
463 YAZ_EXPORT char *data1_getNodeValue(data1_node* node, char* pTagPath);
464 YAZ_EXPORT data1_node *data1_LookupNode(data1_node* node, char* pTagPath);
465 YAZ_EXPORT int data1_CountOccurences(data1_node* node, char* pTagPath);
466
467 YAZ_EXPORT FILE *data1_path_fopen (data1_handle dh, const char *file,
468                                    const char *mode);
469
470 /* obsolete functions ... */
471
472 YAZ_EXPORT data1_node *data1_mk_node (data1_handle dh, NMEM m);
473 YAZ_EXPORT data1_node *data1_insert_taggeddata (data1_handle dh,
474                                                 data1_node *root,
475                                                 data1_node *at,
476                                                 const char *tagname, NMEM m);
477 YAZ_EXPORT data1_node *data1_mk_node_type (data1_handle dh, NMEM m, int type);
478 YAZ_EXPORT data1_node *data1_add_taggeddata (data1_handle dh, data1_node *root,
479                                              data1_node *at,
480                                              const char *tagname,
481                                              NMEM m);
482
483 YAZ_EXPORT data1_node *data1_get_root_tag (data1_handle dh, data1_node *n);
484
485 YAZ_EXPORT int data1_iconv (data1_handle dh, NMEM m, data1_node *n,
486                             const char *tocode, 
487                             const char *fromcode);
488
489 YAZ_EXPORT const char *data1_get_encoding (data1_handle dh, data1_node *n);
490
491 YAZ_EXPORT int data1_is_xmlmode(data1_handle dh);
492
493 YAZ_EXPORT const char *data1_systag_lookup(data1_absyn *absyn, const char *tag,
494                                            const char *default_value);
495
496 YAZ_END_CDECL
497
498 #endif