Not using the deprecated yaz-util.h any more
[idzebra-moved-to-github.git] / include / idzebra / data1.h
1 /* $Id: data1.h,v 1.5 2004-12-10 11:56:21 heikki Exp $
2    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
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 <idzebra/version.h>
33
34 /* Old yaz-util includes */
35 #include <yaz/yconfig.h>
36 #include <yaz/yaz-version.h>
37 #include <yaz/xmalloc.h>
38 #include <yaz/ylog.h>  
39 #include <yaz/tpath.h>
40 #include <yaz/options.h>
41 #include <yaz/wrbuf.h>
42 #include <yaz/nmem.h>
43 #include <yaz/readconf.h>
44 #include <yaz/marcdisp.h>
45 #include <yaz/yaz-iconv.h>
46
47 #define d1_isspace(c) strchr(" \r\n\t\f", c)
48 #define d1_isdigit(c) ((c) <= '9' && (c) >= '0')
49
50 YAZ_BEGIN_CDECL
51
52 #define data1_matchstr(s1, s2) yaz_matchstr(s1, s2)
53
54 #define DATA1_MAX_SYMBOL 31
55
56 /*
57  * This structure describes a attset, perhaps made up by inclusion
58  * (supersetting) of other attribute sets. When indexing and searching,
59  * we perform a normalisation, where we associate a given tag with
60  * the set that originally defined it, rather than the superset. This
61  * allows the most flexible access. Eg, the tags common to GILS and BIB-1
62  * should be searchable by both names.
63  */
64
65 struct data1_attset;
66
67 typedef struct data1_local_attribute
68 {
69     int local;
70     struct data1_local_attribute *next;
71 } data1_local_attribute;
72
73 typedef struct data1_attset data1_attset;    
74 typedef struct data1_att data1_att;
75 typedef struct data1_attset_child data1_attset_child;
76
77 struct data1_att
78 {
79     data1_attset *parent;          /* attribute set */
80     char *name;                    /* symbolic name of this attribute */
81     int value;                     /* attribute value */
82     data1_local_attribute *locals; /* local index values */
83     data1_att *next;
84 };
85
86 struct data1_attset_child {
87     data1_attset *child;
88     data1_attset_child *next;
89 };
90
91 struct data1_attset
92 {
93     char *name;          /* symbolic name */
94     oid_value reference;   /* external ID of attset */
95     data1_att *atts;          /* attributes */
96     data1_attset_child *children;  /* included attset */
97     data1_attset *next;       /* next in cache */
98 };
99
100 typedef struct data1_handle_info *data1_handle;
101
102 YAZ_EXPORT data1_att *data1_getattbyname(data1_handle dh, data1_attset *s,
103                                          char *name);
104 YAZ_EXPORT data1_attset *data1_read_attset(data1_handle dh, const char *file);
105
106 YAZ_EXPORT data1_attset *data1_empty_attset(data1_handle dh);
107
108 typedef struct data1_maptag
109 {
110     int new_field;
111     int type;
112 #define D1_MAPTAG_numeric 1
113 #define D1_MAPTAG_string 2
114     int which;
115     union
116     {
117         int numeric;
118         char *string;
119     } value;
120     struct data1_maptag *next;
121 } data1_maptag;
122
123 typedef struct data1_mapunit
124 {
125     int no_data;
126     char *source_element_name;
127     data1_maptag *target_path;
128     struct data1_mapunit *next;
129 } data1_mapunit;
130
131 typedef struct data1_maptab
132 {
133     char *name;
134     oid_value target_absyn_ref;
135     char *target_absyn_name;
136     data1_mapunit *map;
137     struct data1_maptab *next;
138 } data1_maptab;
139
140 typedef struct data1_name
141 {
142     char *name;
143     struct data1_name *next;
144 } data1_name;
145
146 typedef struct data1_absyn_cache_info *data1_absyn_cache;
147 typedef struct data1_attset_cache_info *data1_attset_cache;
148 typedef struct data1_absyn data1_absyn;
149
150 typedef enum data1_datatype
151 {
152     DATA1K_unknown,
153     DATA1K_structured,
154     DATA1K_string,
155     DATA1K_numeric,
156     DATA1K_bool,
157     DATA1K_oid,
158     DATA1K_generalizedtime,
159     DATA1K_intunit,
160     DATA1K_int,
161     DATA1K_octetstring,
162     DATA1K_null
163 } data1_datatype;
164
165 typedef struct data1_marctab
166 {
167     char *name;
168     oid_value reference;
169
170     char record_status[2];
171     char implementation_codes[5];
172     int  indicator_length;
173     int  identifier_length;
174     char user_systems[4];
175
176     int  length_data_entry;
177     int  length_starting;
178     int  length_implementation;
179     char future_use[2];
180
181     int  force_indicator_length;
182     int  force_identifier_length;
183     char leader[24]; /* Fixme! Need linear access to LEADER of MARC record */  
184     struct data1_marctab *next;
185 } data1_marctab;
186
187 typedef struct data1_esetname
188 {
189     char *name;
190     Z_Espec1 *spec;
191     struct data1_esetname *next;
192 } data1_esetname;
193
194 /*
195  * Variant set definitions.
196  */
197
198 typedef struct data1_vartype
199 {
200     char *name;
201     struct data1_varclass *zclass;
202     int type;
203     data1_datatype datatype;
204     struct data1_vartype *next;
205 } data1_vartype;
206
207 typedef struct data1_varclass
208 {
209     char *name;
210     struct data1_varset *set;
211     int zclass;
212     data1_vartype *types;
213     struct data1_varclass *next;
214 } data1_varclass;
215
216 typedef struct data1_varset
217 {
218     char *name;
219     oid_value reference;
220     data1_varclass *classes;
221 } data1_varset;
222
223 /*
224  * Tagset definitions
225  */
226
227 struct data1_tagset;
228
229 typedef struct data1_tag
230 {
231     data1_name *names;
232 #define DATA1T_numeric 1
233 #define DATA1T_string 2
234     int which;
235     union
236     {
237         int numeric;
238         char *string;
239     } value;
240     data1_datatype kind;
241
242     struct data1_tagset *tagset;
243     struct data1_tag *next;
244 } data1_tag;
245
246 typedef struct data1_tagset data1_tagset;
247
248 struct data1_tagset
249 {
250     int type;                        /* type of tagset in current context */
251     char *name;                      /* symbolic name */
252     oid_value reference;
253     data1_tag *tags;                 /* tags defined by this set */
254     data1_tagset *children;          /* children */
255     data1_tagset *next;              /* sibling */
256 };
257
258 typedef struct data1_termlist
259 {
260     data1_att *att;
261     char *structure;
262     char *source;
263     struct data1_termlist *next;
264 } data1_termlist;
265
266 /*
267  * abstract syntax specification
268  */
269
270 typedef struct data1_element
271 {
272     char *name;
273     data1_tag *tag;
274     data1_termlist *termlists;
275     char *sub_name;
276     struct data1_element *children;
277     struct data1_element *next;
278     struct data1_hash_table *hash;
279 } data1_element;
280
281 typedef struct data1_sub_elements {
282     char *name;
283     struct data1_sub_elements *next;
284     data1_element *elements;
285 } data1_sub_elements;
286
287 typedef struct data1_xattr {
288     char *name;
289     char *value;
290     struct data1_xattr *next;
291     unsigned short what;  /* DATA1I_text, .. see data1_node.u.data */
292 } data1_xattr;
293
294
295 /*
296  * record data node (tag/data/variant)
297  */
298
299 typedef struct data1_node
300 {
301     /* the root of a record (containing global data) */
302 #define DATA1N_root 1 
303     /* a tag */
304 #define DATA1N_tag  2       
305     /* some data under a leaf tag or variant */
306 #define DATA1N_data 3
307     /* variant specification (a triple, actually) */
308 #define DATA1N_variant 4
309     /* comment (same as data) */
310 #define DATA1N_comment 5
311     /* preprocessing instruction */
312 #define DATA1N_preprocess 6
313     int which;
314     union
315     {
316         struct
317         {
318             char *type;
319             struct data1_absyn *absyn;  /* abstract syntax for this type */
320         } root;
321
322         struct 
323         {
324             char *tag;
325             data1_element *element;
326             int no_data_requested;
327             int get_bytes;
328             unsigned node_selected : 1;
329             unsigned make_variantlist : 1;
330             data1_xattr *attributes;
331         } tag;
332
333         struct
334         {
335             char *data;      /* filename or data */
336             int len;
337             /* text inclusion */
338 #define DATA1I_inctxt 1
339             /* binary data inclusion */
340 #define DATA1I_incbin 2
341         /* text data */
342 #define DATA1I_text 3 
343             /* numerical data */
344 #define DATA1I_num 4
345             /* object identifier */
346 #define DATA1I_oid 5
347             /* XML text */
348 #define DATA1I_xmltext 6
349             unsigned what:7;
350             unsigned formatted_text : 1;   /* newlines are significant */
351         } data;
352
353         struct
354         {
355             data1_vartype *type;
356             char *value;
357         } variant;
358
359         struct
360         {
361             char *target;
362             data1_xattr *attributes;
363         } preprocess;
364     } u;
365
366     void (*destroy)(struct data1_node *n);
367 #define DATA1_LOCALDATA 12
368     char lbuf[DATA1_LOCALDATA]; /* small buffer for local data */
369     struct data1_node *next;
370     struct data1_node *child;
371     struct data1_node *last_child;
372     struct data1_node *parent;
373     struct data1_node *root;
374 } data1_node;
375
376 YAZ_EXPORT data1_handle data1_create (void);
377
378 #define DATA1_FLAG_XML  1
379 YAZ_EXPORT data1_handle data1_createx (int flags);
380
381 YAZ_EXPORT void data1_destroy(data1_handle dh);
382 YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
383 YAZ_EXPORT data1_node *data1_read_node(data1_handle dh, const char **buf,
384                                        NMEM m);
385 YAZ_EXPORT data1_node *data1_read_nodex (data1_handle dh, NMEM m,
386                                          int (*get_byte)(void *fh), void *fh,
387                                          WRBUF wrbuf);
388 YAZ_EXPORT data1_node *data1_read_record(data1_handle dh, 
389                                          int (*rf)(void *, char *, size_t),
390                                          void *fh, NMEM m);
391 YAZ_EXPORT data1_absyn *data1_read_absyn(data1_handle dh, const char *file,
392                                          int file_must_exist);
393 YAZ_EXPORT data1_tag *data1_gettagbynum(data1_handle dh,
394                                         data1_tagset *s,
395                                         int type, int value);
396 YAZ_EXPORT data1_tagset *data1_empty_tagset (data1_handle dh);
397 YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh, 
398                                            const char *file,
399                                            int type);
400 YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh, 
401                                                     data1_absyn *abs,
402                                                     data1_element *parent,
403                                                     const char *tagname);
404 YAZ_EXPORT Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n,
405                                            int select, ODR o,
406                                            int *len);
407 YAZ_EXPORT data1_tag *data1_gettagbyname(data1_handle dh, data1_tagset *s,
408                                          const char *name);
409 YAZ_EXPORT void data1_free_tree(data1_handle dh, data1_node *t);
410 YAZ_EXPORT char *data1_nodetobuf(data1_handle dh, data1_node *n,
411                                  int select, int *len);
412 YAZ_EXPORT data1_node *data1_mk_tag_data_wd(data1_handle dh,
413                                             data1_node *at,
414                                             const char *tagname, NMEM m);
415 YAZ_EXPORT data1_node *data1_mk_tag_data(data1_handle dh, data1_node *at,
416                                          const char *tagname, NMEM m);
417 YAZ_EXPORT data1_datatype data1_maptype(data1_handle dh, char *t);
418 YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
419 YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
420                                                data1_varset *set,
421                                                char *zclass, char *type);
422 YAZ_EXPORT data1_vartype *data1_getvartypeby_absyn(data1_handle dh,
423                                                    data1_absyn *absyn,
424                                                    char *zclass, char *type);
425 YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
426 YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
427 YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh, 
428                                                data1_absyn *a,
429                                                const char *name);
430 YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
431                                                  data1_absyn *absyn,
432                                                  const char *name);
433 YAZ_EXPORT data1_node *data1_mk_node2(data1_handle dh, NMEM m,
434                                       int type, data1_node *parent);
435
436 YAZ_EXPORT data1_node *data1_mk_tag (data1_handle dh, NMEM nmem, 
437                                      const char *tag, const char **attr,
438                                      data1_node *at);
439 YAZ_EXPORT data1_node *data1_mk_tag_n (data1_handle dh, NMEM nmem,
440                                        const char *tag, size_t len,
441                                        const char **attr,
442                                        data1_node *at);
443 YAZ_EXPORT void data1_tag_add_attr (data1_handle dh, NMEM nmem,
444                                     data1_node *res, const char **attr);
445
446 YAZ_EXPORT data1_node *data1_mk_text_n (data1_handle dh, NMEM mem,
447                                         const char *buf, size_t len,
448                                         data1_node *parent);
449 YAZ_EXPORT data1_node *data1_mk_text_nf (data1_handle dh, NMEM mem,
450                                          const char *buf, size_t len,
451                                          data1_node *parent);
452 YAZ_EXPORT data1_node *data1_mk_text (data1_handle dh, NMEM mem,
453                                       const char *buf, data1_node *parent);
454
455 YAZ_EXPORT data1_node *data1_mk_comment_n (data1_handle dh, NMEM mem,
456                                            const char *buf, size_t len,
457                                            data1_node *parent);
458
459 YAZ_EXPORT data1_node *data1_mk_comment (data1_handle dh, NMEM mem,
460                                          const char *buf, data1_node *parent);
461
462 YAZ_EXPORT data1_node *data1_mk_preprocess_n (data1_handle dh, NMEM nmem,
463                                               const char *target, size_t len,
464                                               const char **attr,
465                                               data1_node *at);
466
467 YAZ_EXPORT data1_node *data1_mk_preprocess (data1_handle dh, NMEM nmem,
468                                             const char *target,
469                                             const char **attr,
470                                             data1_node *at);
471
472 YAZ_EXPORT data1_node *data1_insert_preprocess_n (data1_handle dh, NMEM nmem,
473                                                   const char *target,
474                                                   size_t len,
475                                                   const char **attr,
476                                                   data1_node *at);
477
478 YAZ_EXPORT data1_node *data1_insert_preprocess (data1_handle dh, NMEM nmem,
479                                                 const char *target,
480                                                 const char **attr,
481                                                 data1_node *at);
482
483 YAZ_EXPORT data1_node *data1_mk_root (data1_handle dh, NMEM nmem,
484                                       const char *name);
485 YAZ_EXPORT void data1_set_root(data1_handle dh, data1_node *res,
486                                NMEM nmem, const char *name);
487
488 YAZ_EXPORT data1_node *data1_mk_tag_data_zint (data1_handle dh, data1_node *at,
489                                                const char *tag, zint num,
490                                                NMEM nmem);
491 YAZ_EXPORT data1_node *data1_mk_tag_data_int (data1_handle dh, data1_node *at,
492                                               const char *tag, int num,
493                                               NMEM nmem);
494 YAZ_EXPORT data1_node *data1_mk_tag_data_oid (data1_handle dh, data1_node *at,
495                                               const char *tag, Odr_oid *oid,
496                                               NMEM nmem);
497 YAZ_EXPORT data1_node *data1_mk_tag_data_text (data1_handle dh, data1_node *at,
498                                                const char *tag,
499                                                const char *str,
500                                                NMEM nmem);
501 YAZ_EXPORT data1_node *data1_mk_tag_data_text_uni (data1_handle dh,
502                                                    data1_node *at,
503                                                    const char *tag,
504                                                    const char *str,
505                                                    NMEM nmem);
506
507 YAZ_EXPORT data1_absyn *data1_get_absyn (data1_handle dh, const char *name);
508
509 YAZ_EXPORT data1_node *data1_search_tag (data1_handle dh, data1_node *n,
510                                          const char *tag);
511 YAZ_EXPORT data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem, 
512                                          const char *tag, data1_node *at);
513 YAZ_EXPORT data1_attset *data1_get_attset (data1_handle dh, const char *name);
514 YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
515 YAZ_EXPORT data1_node *data1_map_record(data1_handle dh, data1_node *n,
516                                         data1_maptab *map, NMEM m);
517 YAZ_EXPORT data1_marctab *data1_read_marctab (data1_handle dh,
518                                               const char *file);
519 YAZ_EXPORT data1_marctab *data1_absyn_getmarctab(data1_handle dh,
520                                                  data1_absyn *absyn);
521 YAZ_EXPORT data1_element *data1_absyn_getelements(data1_handle dh,
522                                                  data1_absyn *absyn);
523 YAZ_EXPORT char *data1_nodetomarc(data1_handle dh, data1_marctab *p,
524                                   data1_node *n, int selected, int *len);
525 YAZ_EXPORT char *data1_nodetoidsgml(data1_handle dh, data1_node *n,
526                                     int select, int *len);
527 YAZ_EXPORT Z_ExplainRecord *data1_nodetoexplain(data1_handle dh,
528                                                 data1_node *n, int select,
529                                                 ODR o);
530 YAZ_EXPORT Z_BriefBib *data1_nodetosummary(data1_handle dh, 
531                                            data1_node *n, int select,
532                                            ODR o);
533 YAZ_EXPORT char *data1_nodetosoif(data1_handle dh, data1_node *n, int select,
534                                   int *len);
535 YAZ_EXPORT void data1_set_tabpath(data1_handle dh, const char *path);
536 YAZ_EXPORT void data1_set_tabroot (data1_handle dp, const char *p);
537 YAZ_EXPORT const char *data1_get_tabpath(data1_handle dh);
538 YAZ_EXPORT const char *data1_get_tabroot(data1_handle dh);
539
540 YAZ_EXPORT WRBUF data1_get_wrbuf (data1_handle dp);
541 YAZ_EXPORT char **data1_get_read_buf (data1_handle dp, int **lenp);
542 YAZ_EXPORT char **data1_get_map_buf (data1_handle dp, int **lenp);
543 YAZ_EXPORT data1_absyn_cache *data1_absyn_cache_get (data1_handle dh);
544 YAZ_EXPORT data1_attset_cache *data1_attset_cache_get (data1_handle dh);
545 YAZ_EXPORT NMEM data1_nmem_get (data1_handle dh);
546 YAZ_EXPORT void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out);
547 YAZ_EXPORT char *data1_insert_string (data1_handle dh, data1_node *res,
548                                       NMEM m, const char *str);
549 YAZ_EXPORT char *data1_insert_string_n (data1_handle dh, data1_node *res,
550                                         NMEM m, const char *str, size_t len);
551 YAZ_EXPORT data1_node *data1_read_sgml (data1_handle dh, NMEM m,
552                                         const char *buf);
553 YAZ_EXPORT data1_node *data1_read_xml (data1_handle dh,
554                                        int (*rf)(void *, char *, size_t),
555                                        void *fh, NMEM m);
556 YAZ_EXPORT void data1_absyn_trav (data1_handle dh, void *handle,
557                                   void (*fh)(data1_handle dh,
558                                              void *h, data1_absyn *a));
559
560 YAZ_EXPORT data1_attset *data1_attset_search_id (data1_handle dh, int id);
561
562 YAZ_EXPORT char *data1_getNodeValue(data1_node* node, char* pTagPath);
563 YAZ_EXPORT data1_node *data1_LookupNode(data1_node* node, char* pTagPath);
564 YAZ_EXPORT int data1_CountOccurences(data1_node* node, char* pTagPath);
565
566 YAZ_EXPORT FILE *data1_path_fopen (data1_handle dh, const char *file,
567                                    const char *mode);
568
569 /* obsolete functions ... */
570
571 YAZ_EXPORT data1_node *data1_mk_node (data1_handle dh, NMEM m);
572 YAZ_EXPORT data1_node *data1_insert_taggeddata (data1_handle dh,
573                                                 data1_node *root,
574                                                 data1_node *at,
575                                                 const char *tagname, NMEM m);
576 YAZ_EXPORT data1_node *data1_mk_node_type (data1_handle dh, NMEM m, int type);
577 YAZ_EXPORT data1_node *data1_add_taggeddata (data1_handle dh, data1_node *root,
578                                              data1_node *at,
579                                              const char *tagname,
580                                              NMEM m);
581
582 YAZ_EXPORT data1_node *data1_get_root_tag (data1_handle dh, data1_node *n);
583
584 YAZ_EXPORT int data1_iconv (data1_handle dh, NMEM m, data1_node *n,
585                             const char *tocode, 
586                             const char *fromcode);
587
588 YAZ_EXPORT const char *data1_get_encoding (data1_handle dh, data1_node *n);
589
590 YAZ_EXPORT int data1_is_xmlmode(data1_handle dh);
591
592 YAZ_EXPORT const char *data1_systag_lookup(data1_absyn *absyn, const char *tag,
593                                            const char *default_value);
594
595 YAZ_EXPORT void data1_concat_text(data1_handle dh, NMEM m, data1_node *n);
596
597 YAZ_EXPORT void data1_absyn_destroy(data1_handle dh);
598
599 YAZ_END_CDECL
600
601 #endif