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