9483a5c47ac147153b8c44a48219491ae45cca3b
[yaz-moved-to-github.git] / doc / tools.xml
1 <!-- $Id: tools.xml,v 1.56 2007-02-08 09:03:31 adam Exp $ -->
2  <chapter id="tools"><title>Supporting Tools</title>
3   
4   <para>
5    In support of the service API - primarily the ASN module, which
6    provides the pro-grammatic interface to the Z39.50 APDUs, &yaz; contains
7    a collection of tools that support the development of applications.
8   </para>
9
10   <sect1 id="tools.query"><title>Query Syntax Parsers</title>
11
12    <para>
13     Since the type-1 (RPN) query structure has no direct, useful string
14     representation, every origin application needs to provide some form of
15     mapping from a local query notation or representation to a
16     <token>Z_RPNQuery</token> structure. Some programmers will prefer to
17     construct the query manually, perhaps using
18     <function>odr_malloc()</function> to simplify memory management.
19     The &yaz; distribution includes three separate, query-generating tools
20     that may be of use to you.
21    </para>
22
23    <sect2 id="PQF"><title>Prefix Query Format</title>
24
25     <para>
26      Since RPN or reverse polish notation is really just a fancy way of
27      describing a suffix notation format (operator follows operands), it
28      would seem that the confusion is total when we now introduce a prefix
29      notation for RPN. The reason is one of simple laziness - it's somewhat
30      simpler to interpret a prefix format, and this utility was designed
31      for maximum simplicity, to provide a baseline representation for use
32      in simple test applications and scripting environments (like Tcl). The
33      demonstration client included with YAZ uses the PQF.
34     </para>
35
36     <note>
37      <para>
38       The PQF have been adopted by other parties developing Z39.50
39       software. It is often referred to as Prefix Query Notation
40       - PQN.
41      </para>
42     </note>
43     <para>
44      The PQF is defined by the pquery module in the YAZ library. 
45      There are two sets of function that have similar behavior. First
46      set operates on a PQF parser handle, second set doesn't. First set
47      set of functions are more flexible than the second set. Second set
48      is obsolete and is only provided to ensure backwards compatibility.
49     </para>
50     <para>
51      First set of functions all operate on a PQF parser handle:
52     </para>
53     <synopsis>
54      #include &lt;yaz/pquery.h&gt;
55
56      YAZ_PQF_Parser yaz_pqf_create (void);
57
58      void yaz_pqf_destroy (YAZ_PQF_Parser p);
59
60      Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf);
61
62      Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o,
63                           Odr_oid **attributeSetId, const char *qbuf);
64
65
66      int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off);
67     </synopsis>
68     <para>
69      A PQF parser is created and destructed by functions
70      <function>yaz_pqf_create</function> and
71      <function>yaz_pqf_destroy</function> respectively.
72      Function <function>yaz_pqf_parse</function> parses query given
73      by string <literal>qbuf</literal>. If parsing was successful,
74      a Z39.50 RPN Query is returned which is created using ODR stream
75      <literal>o</literal>. If parsing failed, a NULL pointer is
76      returned.
77      Function <function>yaz_pqf_scan</function> takes a scan query in 
78      <literal>qbuf</literal>. If parsing was successful, the function
79      returns attributes plus term pointer and modifies
80      <literal>attributeSetId</literal> to hold attribute set for the
81      scan request - both allocated using ODR stream <literal>o</literal>.
82      If parsing failed, yaz_pqf_scan returns a NULL pointer.
83      Error information for bad queries can be obtained by a call to
84      <function>yaz_pqf_error</function> which returns an error code and
85      modifies <literal>*msg</literal> to point to an error description,
86      and modifies <literal>*off</literal> to the offset within last
87      query were parsing failed.
88     </para>
89     <para>
90      The second set of functions are declared as follows:
91     </para>
92     <synopsis>
93      #include &lt;yaz/pquery.h&gt;
94
95      Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
96
97      Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
98                              Odr_oid **attributeSetP, const char *qbuf);
99
100      int p_query_attset (const char *arg);
101     </synopsis>
102     <para>
103      The function <function>p_query_rpn()</function> takes as arguments an
104       &odr; stream (see section <link linkend="odr">The ODR Module</link>)
105      to provide a memory source (the structure created is released on
106      the next call to <function>odr_reset()</function> on the stream), a
107      protocol identifier (one of the constants <token>PROTO_Z3950</token> and
108      <token>PROTO_SR</token>), an attribute set reference, and
109      finally a null-terminated string holding the query string.
110     </para>
111     <para>
112      If the parse went well, <function>p_query_rpn()</function> returns a
113      pointer to a <literal>Z_RPNQuery</literal> structure which can be
114      placed directly into a <literal>Z_SearchRequest</literal>. 
115      If parsing failed, due to syntax error, a NULL pointer is returned.
116     </para>
117     <para>
118      The <literal>p_query_attset</literal> specifies which attribute set
119      to use if the query doesn't specify one by the
120      <literal>@attrset</literal> operator.
121      The <literal>p_query_attset</literal> returns 0 if the argument is a
122      valid attribute set specifier; otherwise the function returns -1.
123     </para>
124
125     <para>
126      The grammar of the PQF is as follows:
127     </para>
128
129     <literallayout>
130      query ::= top-set query-struct.
131
132      top-set ::= [ '@attrset' string ]
133
134      query-struct ::= attr-spec | simple | complex | '@term' term-type query
135
136      attr-spec ::= '@attr' [ string ] string query-struct
137
138      complex ::= operator query-struct query-struct.
139
140      operator ::= '@and' | '@or' | '@not' | '@prox' proximity.
141
142      simple ::= result-set | term.
143
144      result-set ::= '@set' string.
145
146      term ::= string.
147
148      proximity ::= exclusion distance ordered relation which-code unit-code.
149
150      exclusion ::= '1' | '0' | 'void'.
151
152      distance ::= integer.
153
154      ordered ::= '1' | '0'.
155
156      relation ::= integer.
157
158      which-code ::= 'known' | 'private' | integer.
159
160      unit-code ::= integer.
161
162      term-type ::= 'general' | 'numeric' | 'string' | 'oid' | 'datetime' | 'null'.
163     </literallayout>
164
165     <para>
166      You will note that the syntax above is a fairly faithful
167      representation of RPN, except for the Attribute, which has been
168      moved a step away from the term, allowing you to associate one or more
169      attributes with an entire query structure. The parser will
170      automatically apply the given attributes to each term as required.
171     </para>
172
173     <para>
174      The @attr operator is followed by an attribute specification 
175      (<literal>attr-spec</literal> above). The specification consists
176      of an optional attribute set, an attribute type-value pair and
177      a sub-query. The attribute type-value pair is packed in one string:
178      an attribute type, an equals sign, and an attribute value, like this:
179      <literal>@attr 1=1003</literal>.
180      The type is always an integer but the value may be either an
181      integer or a string (if it doesn't start with a digit character).
182      A string attribute-value is encoded as a Type-1 ``complex''
183      attribute with the list of values containing the single string
184      specified, and including no semantic indicators.
185     </para>
186
187     <para>
188      Version 3 of the Z39.50 specification defines various encoding of terms.
189      Use <literal>@term </literal> <replaceable>type</replaceable>
190      <replaceable>string</replaceable>,
191      where type is one of: <literal>general</literal>,
192      <literal>numeric</literal> or <literal>string</literal>
193      (for InternationalString).
194      If no term type has been given, the <literal>general</literal> form
195      is used.  This is the only encoding allowed in both versions 2 and 3
196      of the Z39.50 standard.
197     </para>
198     
199     <sect3 id="PQF-prox">
200       <title>Using Proximity Operators with PQF</title>
201       <note>
202         <para>
203           This is an advanced topic, describing how to construct
204           queries that make very specific requirements on the
205           relative location of their operands.
206           You may wish to skip this section and go straight to
207           <link linkend="pqf-examples">the example PQF queries</link>.
208         </para>
209         <para>
210           <warning>
211             <para>
212               Most Z39.50 servers do not support proximity searching, or
213               support only a small subset of the full functionality that
214               can be expressed using the PQF proximity operator.  Be
215               aware that the ability to <emphasis>express</emphasis> a
216               query in PQF is no guarantee that any given server will
217               be able to <emphasis>execute</emphasis> it.
218             </para>
219           </warning>
220         </para>
221       </note>
222       <para>
223         The proximity operator <literal>@prox</literal> is a special
224         and more restrictive version of the conjunction operator
225         <literal>@and</literal>.  Its semantics are described in 
226         section 3.7.2 (Proximity) of Z39.50 the standard itself, which
227         can be read on-line at
228         <ulink url="&url.z39.50.proximity;"/>
229       </para>
230       <para>
231         In PQF, the proximity operation is represented by a sequence
232         of the form
233         <screen>
234 @prox <replaceable>exclusion</replaceable> <replaceable>distance</replaceable> <replaceable>ordered</replaceable> <replaceable>relation</replaceable> <replaceable>which-code</replaceable> <replaceable>unit-code</replaceable>
235         </screen>
236         in which the meanings of the parameters are as described in in
237         the standard, and they can take the following values:
238         <itemizedlist>
239           <listitem><formalpara><title>exclusion</title><para>
240             0 = false (i.e. the proximity condition specified by the
241             remaining parameters must be satisfied) or
242             1 = true (the proximity condition specified by the
243             remaining parameters must <emphasis>not</emphasis> be
244             satisifed).
245           </para></formalpara></listitem>
246           <listitem><formalpara><title>distance</title><para>
247             An integer specifying the difference between the locations
248             of the operands: e.g. two adjacent words would have
249             distance=1 since their locations differ by one unit.
250           </para></formalpara></listitem>
251           <listitem><formalpara><title>ordered</title><para>
252             1 = ordered (the operands must occur in the order the
253             query specifies them) or
254             0 = unordered (they may appear in either order).
255           </para></formalpara></listitem>
256           <listitem><formalpara><title>relation</title><para>
257             Recognised values are
258             1 (lessThan),
259             2 (lessThanOrEqual),
260             3 (equal),
261             4 (greaterThanOrEqual),
262             5 (greaterThan) and
263             6 (notEqual).
264           </para></formalpara></listitem>
265           <listitem><formalpara><title>which-code</title><para>
266             <literal>known</literal>
267             or
268             <literal>k</literal>
269             (the unit-code parameter is taken from the well-known list
270             of alternatives described in below) or
271             <literal>private</literal>
272             or
273             <literal>p</literal>
274             (the unit-code paramater has semantics specific to an
275             out-of-band agreement such as a profile).
276           </para></formalpara></listitem>
277           <listitem><formalpara><title>unit-code</title><para>
278             If the which-code parameter is <literal>known</literal>
279             then the recognised values are
280             1 (character),
281             2 (word),
282             3 (sentence),
283             4 (paragraph),
284             5 (section),
285             6 (chapter),
286             7 (document),
287             8 (element),
288             9 (subelement),
289             10 (elementType) and
290             11 (byte).
291             If which-code is <literal>private</literal> then the
292             acceptable values are determined by the profile.
293           </para></formalpara></listitem>
294         </itemizedlist>
295         (The numeric values of the relation and well-known unit-code
296         parameters are taken straight from
297         <ulink url="&url.z39.50.proximity.asn1;"
298         >the ASN.1</ulink> of the proximity structure in the standard.)
299       </para>
300     </sect3>
301
302     <sect3 id="pqf-examples"><title>PQF queries</title>
303
304      <example id="example.pqf.simple.terms">
305       <title>PQF queries using simple terms</title>
306       <para>
307        <screen>
308         dylan
309
310         "bob dylan"
311        </screen>
312       </para>
313      </example>
314      <example id="pqf.example.pqf.boolean.operators">
315       <title>PQF boolean operators</title>
316       <para>
317        <screen>
318         @or "dylan" "zimmerman"
319
320         @and @or dylan zimmerman when
321
322         @and when @or dylan zimmerman
323        </screen>
324       </para>
325      </example>
326      <example id="example.pqf.result.sets">
327       <title>PQF references to result sets</title>
328       <para>
329        <screen>
330         @set Result-1
331
332         @and @set seta @set setb
333        </screen>
334       </para>
335      </example>
336      <example id="example.pqf.attributes">
337       <title>Attributes for terms</title>
338       <para>
339        <screen>
340         @attr 1=4 computer
341
342         @attr 1=4 @attr 4=1 "self portrait"
343
344         @attrset exp1 @attr 1=1 CategoryList
345
346         @attr gils 1=2008 Copenhagen
347
348         @attr 1=/book/title computer
349        </screen>
350       </para>
351      </example>
352      <example id="example.pqf.proximity">
353       <title>PQF Proximity queries</title>
354       <para>
355        <screen>
356         @prox 0 3 1 2 k 2 dylan zimmerman
357        </screen>
358        <note><para>
359          Here the parameters 0, 3, 1, 2, k and 2 represent exclusion,
360          distance, ordered, relation, which-code and unit-code, in that
361          order.  So:
362          <itemizedlist>
363           <listitem><para>
364             exclusion = 0: the proximity condition must hold
365            </para></listitem>
366           <listitem><para>
367             distance = 3: the terms must be three units apart
368            </para></listitem>
369           <listitem><para>
370             ordered = 1: they must occur in the order they are specified
371            </para></listitem>
372           <listitem><para>
373             relation = 2: lessThanOrEqual (to the distance of 3 units)
374            </para></listitem>
375           <listitem><para>
376             which-code is ``known'', so the standard unit-codes are used
377            </para></listitem>
378           <listitem><para>
379             unit-code = 2: word.
380            </para></listitem>
381          </itemizedlist>
382          So the whole proximity query means that the words
383          <literal>dylan</literal> and <literal>zimmerman</literal> must
384          both occur in the record, in that order, differing in position
385          by three or fewer words (i.e. with two or fewer words between
386          them.)  The query would find ``Bob Dylan, aka. Robert
387          Zimmerman'', but not ``Bob Dylan, born as Robert Zimmerman''
388          since the distance in this case is four.
389         </para></note>
390       </para>
391      </example>
392      <example id="example.pqf.search.term.type">
393       <title>PQF specification of search term type</title>
394       <para>
395        <screen>
396         @term string "a UTF-8 string, maybe?"
397        </screen>
398       </para>
399      </example>
400      <example id="example.pqf.mixed.queries">
401       <title>PQF mixed queries</title>
402       <para>
403        <screen>
404         @or @and bob dylan @set Result-1
405         
406         @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
407         
408         @and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109
409       </screen>
410        <note>
411         <para>
412          The last of these examples is a spatial search: in
413          <ulink url="http://www.gils.net/prof_v2.html#sec_7_4"
414           >the GILS attribute set</ulink>,
415          access point
416          2038 indicates West Bounding Coordinate and
417          2030 indicates East Bounding Coordinate,
418          so the query is for areas extending from -114 degrees
419          to no more than -109 degrees.
420         </para>
421        </note>
422       </para>
423      </example>
424     </sect3>
425    </sect2>
426    <sect2 id="CCL"><title>CCL</title>
427
428     <para>
429      Not all users enjoy typing in prefix query structures and numerical
430      attribute values, even in a minimalistic test client. In the library
431      world, the more intuitive Common Command Language - CCL (ISO 8777)
432      has enjoyed some popularity - especially before the widespread
433      availability of graphical interfaces. It is still useful in
434      applications where you for some reason or other need to provide a
435      symbolic language for expressing boolean query structures.
436     </para>
437
438     <para>
439      The EUROPAGATE research project working under the Libraries programme
440      of the European Commission's DG XIII has, amongst other useful tools,
441      implemented a general-purpose CCL parser which produces an output
442      structure that can be trivially converted to the internal RPN
443      representation of &yaz; (The <literal>Z_RPNQuery</literal> structure).
444      Since the CCL utility - along with the rest of the software
445      produced by EUROPAGATE - is made freely available on a liberal
446      license, it is included as a supplement to &yaz;.
447     </para>
448
449     <sect3 id="ccl.syntax">
450      <title>CCL Syntax</title>
451
452      <para>
453       The CCL parser obeys the following grammar for the FIND argument.
454       The syntax is annotated by in the lines prefixed by
455       <literal>--</literal>.
456      </para>
457
458      <screen>
459       CCL-Find ::= CCL-Find Op Elements
460                 | Elements.
461
462       Op ::= "and" | "or" | "not"
463       -- The above means that Elements are separated by boolean operators.
464
465       Elements ::= '(' CCL-Find ')'
466                 | Set
467                 | Terms
468                 | Qualifiers Relation Terms
469                 | Qualifiers Relation '(' CCL-Find ')'
470                 | Qualifiers '=' string '-' string
471       -- Elements is either a recursive definition, a result set reference, a
472       -- list of terms, qualifiers followed by terms, qualifiers followed
473       -- by a recursive definition or qualifiers in a range (lower - upper).
474
475       Set ::= 'set' = string
476       -- Reference to a result set
477
478       Terms ::= Terms Prox Term
479              | Term
480       -- Proximity of terms.
481
482       Term ::= Term string
483             | string
484       -- This basically means that a term may include a blank
485
486       Qualifiers ::= Qualifiers ',' string
487                   | string
488       -- Qualifiers is a list of strings separated by comma
489
490       Relation ::= '=' | '>=' | '&lt;=' | '&lt;>' | '>' | '&lt;'
491       -- Relational operators. This really doesn't follow the ISO8777
492       -- standard.
493
494       Prox ::= '%' | '!'
495       -- Proximity operator
496
497      </screen>
498      
499      <example id="example.ccl.queries">
500       <title>CCL queries</title>
501       <para>
502        The following queries are all valid:
503       </para>
504       
505       <screen>
506        dylan
507        
508        "bob dylan"
509        
510        dylan or zimmerman
511        
512        set=1
513        
514        (dylan and bob) or set=1
515        
516       </screen>
517       <para>
518        Assuming that the qualifiers <literal>ti</literal>,
519        <literal>au</literal>
520        and <literal>date</literal> are defined we may use:
521       </para>
522       
523       <screen>
524        ti=self portrait
525        
526        au=(bob dylan and slow train coming)
527
528        date>1980 and (ti=((self portrait)))
529        
530       </screen>
531      </example>
532      
533     </sect3>
534     <sect3 id="ccl.qualifiers">
535      <title>CCL Qualifiers</title>
536      
537      <para>
538       Qualifiers are used to direct the search to a particular searchable
539       index, such as title (ti) and author indexes (au). The CCL standard
540       itself doesn't specify a particular set of qualifiers, but it does
541       suggest a few short-hand notations. You can customize the CCL parser
542       to support a particular set of qualifiers to reflect the current target
543       profile. Traditionally, a qualifier would map to a particular
544       use-attribute within the BIB-1 attribute set. It is also
545       possible to set other attributes, such as the structure
546       attribute.
547      </para>
548
549      <para>
550       A  CCL profile is a set of predefined CCL qualifiers that may be
551       read from a file or set in the CCL API.
552       The YAZ client reads its CCL qualifiers from a file named
553       <filename>default.bib</filename>. There are four types of
554       lines in a CCL profile: qualifier specification,
555       qualifier alias, comments and directives.
556      </para>
557      <sect4 id="ccl.qualifier.specification">
558       <title>Qualifier specification</title>
559       <para>
560        A qualifier specification is of the form:
561       </para>
562       
563       <para>
564        <replaceable>qualifier-name</replaceable>  
565        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable>
566        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable> ...      
567       </para>
568       
569       <para>
570        where <replaceable>qualifier-name</replaceable> is the name of the
571        qualifier to be used (eg. <literal>ti</literal>),
572        <replaceable>type</replaceable> is attribute type in the attribute
573        set (Bib-1 is used if no attribute set is given) and
574        <replaceable>val</replaceable> is attribute value.
575        The <replaceable>type</replaceable> can be specified as an
576        integer or as it be specified either as a single-letter:
577        <literal>u</literal> for use, 
578        <literal>r</literal> for relation,<literal>p</literal> for position,
579        <literal>s</literal> for structure,<literal>t</literal> for truncation
580        or <literal>c</literal> for completeness.
581        The attributes for the special qualifier name <literal>term</literal>
582        are used when no CCL qualifier is given in a query.
583        <table id="ccl.common.bib1.attributes">
584         <title>Common Bib-1 attributes</title>
585         <tgroup cols="2">
586          <colspec colwidth="2*" colname="type"></colspec>
587          <colspec colwidth="9*" colname="description"></colspec>
588          <thead>
589           <row>
590            <entry>Type</entry>
591            <entry>Description</entry>
592           </row>
593          </thead>
594          <tbody>
595           <row>
596            <entry><literal>u=</literal><replaceable>value</replaceable></entry>
597            <entry>
598             Use attribute (1). Common use attributes are
599             1 Personal-name, 4 Title, 7 ISBN, 8 ISSN, 30 Date,
600             62 Subject, 1003 Author), 1016 Any. Specify value
601             as an integer.
602            </entry>
603           </row>
604
605           <row>
606            <entry><literal>r=</literal><replaceable>value</replaceable></entry>
607            <entry>
608             Relation attribute (2). Common values are
609             1 &lt;, 2 &lt;=, 3 =, 4 &gt;=, 5 &gt;, 6 &lt;&gt;,
610             100 phonetic, 101 stem, 102 relevance, 103 always matches.
611            </entry>
612           </row>
613
614           <row>
615            <entry><literal>p=</literal><replaceable>value</replaceable></entry>
616            <entry>
617             Position attribute (3). Values: 1 first in field, 2
618             first in any subfield, 3 any position in field.
619            </entry>
620           </row>
621
622           <row>
623            <entry><literal>s=</literal><replaceable>value</replaceable></entry>
624            <entry>
625             Structure attribute (4). Values: 1 phrase, 2 word,
626             3 key, 4 year, 5 date, 6 word list, 100 date (un),
627             101 name (norm), 102 name (un), 103 structure, 104 urx,
628             105 free-form-text, 106 document-text, 107 local-number,
629             108 string, 109 numeric string.
630            </entry>
631           </row>
632
633           <row>
634            <entry><literal>t=</literal><replaceable>value</replaceable></entry>
635            <entry>
636             Truncation attribute (5). Values: 1 right, 2 left,
637             3 left&amp; right, 100 none, 101 process #, 102 regular-1,
638             103 regular-2, 104 CCL.
639            </entry>
640           </row>
641
642           <row>
643            <entry><literal>c=</literal><replaceable>value</replaceable></entry>
644            <entry>
645             Completeness attribute (6). Values: 1 incomplete subfield,
646             2 complete subfield, 3 complete field.
647            </entry>
648           </row>
649
650          </tbody>
651          </tgroup>
652         </table>
653       </para>
654       <para>
655        Refer to the complete
656        <ulink url="&url.z39.50.attset.bib1;">list of Bib-1 attributes</ulink>
657       </para>
658       <para>
659        It is also possible to specify non-numeric attribute values, 
660        which are used in combination with certain types.
661        The special combinations are:
662        
663        <table id="ccl.special.attribute.combos">
664         <title>Special attribute combos</title>
665         <tgroup cols="2">
666          <colspec colwidth="2*" colname="name"></colspec>
667          <colspec colwidth="9*" colname="description"></colspec>
668          <thead>
669           <row>
670            <entry>Name</entry>
671            <entry>Description</entry>
672           </row>
673          </thead>
674          <tbody>
675           <row>
676            <entry><literal>s=pw</literal></entry><entry>
677             The structure is set to either word or phrase depending
678             on the number of tokens in a term (phrase-word).
679            </entry>
680           </row>
681           <row>
682            <entry><literal>s=al</literal></entry><entry>
683             Each token in the term is ANDed. (and-list).
684             This does not set the structure at all.
685            </entry>
686           </row>
687           
688           <row><entry><literal>s=ol</literal></entry><entry>
689             Each token in the term is ORed. (or-list).
690             This does not set the structure at all.
691            </entry>
692           </row>
693           
694           <row><entry><literal>r=o</literal></entry><entry>
695             Allows ranges and the operators greather-than, less-than, ...
696             equals.
697             This sets Bib-1 relation attribute accordingly (relation
698             ordered). A query construct is only treated as a range if
699             dash is used and that is surrounded by white-space. So
700             <literal>-1980</literal> is treated as term 
701             <literal>"-1980"</literal> not <literal>&lt;= 1980</literal>.
702             If <literal>- 1980</literal> is used, however, that is
703             treated as a range.
704            </entry>
705           </row>
706           
707           <row><entry><literal>r=r</literal></entry><entry>
708             Similar to <literal>r=o</literal> but assumes that terms
709             are non-negative (not prefixed with <literal>-</literal>).
710             Thus, a dash will always be treated as a range.
711             The construct <literal>1980-1990</literal> is
712             treated as a range with <literal>r=r</literal> but as a
713             single term <literal>"1980-1990"</literal> with
714             <literal>r=o</literal>. The special attribute
715             <literal>r=r</literal> is available in YAZ 2.0.24 or later.
716            </entry>
717           </row>
718           
719           <row><entry><literal>t=l</literal></entry><entry>
720             Allows term to be left-truncated.
721             If term is of the form <literal>?x</literal>, the resulting
722             Type-1 term is <literal>x</literal> and truncation is left.
723            </entry>
724           </row>
725           
726           <row><entry><literal>t=r</literal></entry><entry>
727             Allows term to be right-truncated.
728             If term is of the form <literal>x?</literal>, the resulting
729             Type-1 term is <literal>x</literal> and truncation is right.
730            </entry>
731           </row>
732           
733           <row><entry><literal>t=n</literal></entry><entry>
734             If term is does not include <literal>?</literal>, the
735             truncation attribute is set to none (100).
736            </entry>
737           </row>
738           
739           <row><entry><literal>t=b</literal></entry><entry>
740             Allows term to be both left&amp;right truncated.
741             If term is of the form <literal>?x?</literal>, the
742             resulting term is <literal>x</literal> and trunctation is
743             set to both left&amp;right.
744            </entry>
745           </row>
746          </tbody>
747         </tgroup>
748        </table>
749       </para>
750       <example id="example.ccl.profile"><title>CCL profile</title>
751        <para>
752         Consider the following definition:
753        </para>
754        
755        <screen>
756         ti       u=4 s=1
757         au       u=1 s=1
758         term     s=105
759         ranked   r=102
760         date     u=30 r=o
761       </screen>
762        <para>
763         <literal>ti</literal> and <literal>au</literal> both set 
764         structure attribute to phrase (s=1).
765         <literal>ti</literal>
766         sets the use-attribute to 4. <literal>au</literal> sets the
767         use-attribute to 1.
768         When no qualifiers are used in the query the structure-attribute is
769         set to free-form-text (105) (rule for <literal>term</literal>).
770         The <literal>date</literal> sets the relation attribute to
771         the relation used in the CCL query and sets the use attribute
772         to 30 (Bib-1 Date).
773        </para>
774        <para>
775         You can combine attributes. To Search for "ranked title" you
776         can do 
777         <screen>
778          ti,ranked=knuth computer
779         </screen>
780         which will set relation=ranked, use=title, structure=phrase.
781        </para>
782        <para>
783         Query
784         <screen>
785          date > 1980
786         </screen>
787         is a valid query. But
788         <screen>
789          ti > 1980
790         </screen>
791         is invalid.
792        </para>
793       </example>
794      </sect4>
795      <sect4 id="ccl.qualifier.alias">
796       <title>Qualifier alias</title>
797       <para>
798        A qualifier alias is of the form:
799       </para>
800       <para>
801        <replaceable>q</replaceable>  
802        <replaceable>q1</replaceable> <replaceable>q2</replaceable> ..
803       </para>
804       <para>
805        which declares <replaceable>q</replaceable> to
806        be an alias for <replaceable>q1</replaceable>, 
807        <replaceable>q2</replaceable>... such that the CCL
808        query <replaceable>q=x</replaceable> is equivalent to
809        <replaceable>q1=x or q2=x or ...</replaceable>.
810       </para>
811      </sect4>
812
813      <sect4 id="ccl.comments">
814       <title>Comments</title>
815       <para>
816        Lines with white space or lines that begin with
817        character <literal>#</literal> are treated as comments.
818       </para>
819      </sect4>
820
821      <sect4 id="ccl.directives">
822       <title>Directives</title>
823       <para>
824        Directive specifications takes the form
825       </para>
826       <para><literal>@</literal><replaceable>directive</replaceable> <replaceable>value</replaceable>
827       </para>
828       <table id="ccl.directives.table">
829        <title>CCL directives</title>
830        <tgroup cols="3">
831         <colspec colwidth="2*" colname="name"></colspec>
832         <colspec colwidth="8*" colname="description"></colspec>
833         <colspec colwidth="1*" colname="default"></colspec>
834         <thead>
835          <row>
836           <entry>Name</entry>
837           <entry>Description</entry>
838           <entry>Default</entry>
839          </row>
840         </thead>
841         <tbody>
842          <row>
843           <entry>truncation</entry>
844           <entry>Truncation character</entry>
845           <entry><literal>?</literal></entry>
846          </row>
847          <row>
848           <entry>field</entry>
849           <entry>Specifies how multiple fields are to be
850            combined. There are two modes: <literal>or</literal>:
851            multiple qualifier fields are ORed,
852            <literal>merge</literal>: attributes for the qualifier
853            fields are merged and assigned to one term.
854            </entry>
855           <entry><literal>merge</literal></entry>
856          </row>
857          <row>
858           <entry>case</entry>
859           <entry>Specificies if CCL operatores and qualifiers should be
860            compared with case sensitivity or not. Specify 0 for
861            case sensitive; 1 for case insensitive.</entry>
862           <entry><literal>0</literal></entry>
863          </row>
864
865          <row>
866           <entry>and</entry>
867           <entry>Specifies token for CCL operator AND.</entry>
868           <entry><literal>and</literal></entry>
869          </row>
870
871          <row>
872           <entry>or</entry>
873           <entry>Specifies token for CCL operator OR.</entry>
874           <entry><literal>or</literal></entry>
875          </row>
876
877          <row>
878           <entry>not</entry>
879           <entry>Specifies token for CCL operator NOT.</entry>
880           <entry><literal>not</literal></entry>
881          </row>
882
883          <row>
884           <entry>set</entry>
885           <entry>Specifies token for CCL operator SET.</entry>
886           <entry><literal>set</literal></entry>
887          </row>
888         </tbody>
889         </tgroup>
890       </table>
891      </sect4>
892     </sect3>
893     <sect3 id="ccl.api">
894      <title>CCL API</title>
895      <para>
896       All public definitions can be found in the header file
897       <filename>ccl.h</filename>. A profile identifier is of type
898       <literal>CCL_bibset</literal>. A profile must be created with the call
899       to the function <function>ccl_qual_mk</function> which returns a profile
900       handle of type <literal>CCL_bibset</literal>.
901      </para>
902
903      <para>
904       To read a file containing qualifier definitions the function
905       <function>ccl_qual_file</function> may be convenient. This function
906       takes an already opened <literal>FILE</literal> handle pointer as
907       argument along with a <literal>CCL_bibset</literal> handle.
908      </para>
909
910      <para>
911       To parse a simple string with a FIND query use the function
912      </para>
913      <screen>
914 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
915                                    int *error, int *pos);
916      </screen>
917      <para>
918       which takes the CCL profile (<literal>bibset</literal>) and query
919       (<literal>str</literal>) as input. Upon successful completion the RPN
920       tree is returned. If an error occur, such as a syntax error, the integer
921       pointed to by <literal>error</literal> holds the error code and
922       <literal>pos</literal> holds the offset inside query string in which
923       the parsing failed.
924      </para>
925
926      <para>
927       An English representation of the error may be obtained by calling
928       the <literal>ccl_err_msg</literal> function. The error codes are
929       listed in <filename>ccl.h</filename>.
930      </para>
931
932      <para>
933       To convert the CCL RPN tree (type
934       <literal>struct ccl_rpn_node *</literal>)
935       to the Z_RPNQuery of YAZ the function <function>ccl_rpn_query</function>
936       must be used. This function which is part of YAZ is implemented in
937       <filename>yaz-ccl.c</filename>.
938       After calling this function the CCL RPN tree is probably no longer
939       needed. The <literal>ccl_rpn_delete</literal> destroys the CCL RPN tree.
940      </para>
941
942      <para>
943       A CCL profile may be destroyed by calling the
944       <function>ccl_qual_rm</function> function.
945      </para>
946
947      <para>
948       The token names for the CCL operators may be changed by setting the
949       globals (all type <literal>char *</literal>)
950       <literal>ccl_token_and</literal>, <literal>ccl_token_or</literal>,
951       <literal>ccl_token_not</literal> and <literal>ccl_token_set</literal>.
952       An operator may have aliases, i.e. there may be more than one name for
953       the operator. To do this, separate each alias with a space character.
954      </para>
955     </sect3>
956    </sect2>
957    <sect2 id="cql"><title>CQL</title>
958     <para>
959      <ulink url="&url.cql;">CQL</ulink>
960       - Common Query Language - was defined for the
961      <ulink url="&url.sru;">SRU</ulink> protocol.
962      In many ways CQL has a similar syntax to CCL.
963      The objective of CQL is different. Where CCL aims to be
964      an end-user language, CQL is <emphasis>the</emphasis> protocol
965      query language for SRU.
966     </para>
967     <tip>
968      <para>
969       If you are new to CQL, read the 
970       <ulink url="&url.cql.intro;">Gentle Introduction</ulink>.
971      </para>
972     </tip>
973     <para>
974      The CQL parser in &yaz; provides the following:
975      <itemizedlist>
976       <listitem>
977        <para>
978         It parses and validates a CQL query.
979        </para>
980       </listitem>
981       <listitem>
982        <para>
983         It generates a C structure that allows you to convert
984         a CQL query to some other query language, such as SQL.
985        </para>
986       </listitem>
987       <listitem>
988        <para>
989         The parser converts a valid CQL query to PQF, thus providing a
990         way to use CQL for both SRU servers and Z39.50 targets at the
991         same time.
992        </para>
993       </listitem>
994       <listitem>
995        <para>
996         The parser converts CQL to
997         <ulink url="&url.xcql;">XCQL</ulink>.
998         XCQL is an XML representation of CQL.
999         XCQL is part of the SRU specification. However, since SRU
1000         supports CQL only, we don't expect XCQL to be widely used.
1001         Furthermore, CQL has the advantage over XCQL that it is
1002         easy to read.
1003        </para>
1004       </listitem>
1005      </itemizedlist>
1006     </para>
1007     <sect3 id="cql.parsing"><title>CQL parsing</title>
1008      <para>
1009       A CQL parser is represented by the <literal>CQL_parser</literal>
1010       handle. Its contents should be considered &yaz; internal (private).
1011       <synopsis>
1012 #include &lt;yaz/cql.h&gt;
1013
1014 typedef struct cql_parser *CQL_parser;
1015
1016 CQL_parser cql_parser_create(void);
1017 void cql_parser_destroy(CQL_parser cp);
1018       </synopsis>
1019      A parser is created by <function>cql_parser_create</function> and
1020      is destroyed by <function>cql_parser_destroy</function>.
1021      </para>
1022      <para>
1023       To parse a CQL query string, the following function
1024       is provided:
1025       <synopsis>
1026 int cql_parser_string(CQL_parser cp, const char *str);
1027       </synopsis>
1028       A CQL query is parsed by the <function>cql_parser_string</function>
1029       which takes a query <parameter>str</parameter>.
1030       If the query was valid (no syntax errors), then zero is returned;
1031       otherwise -1 is returned to indicate a syntax error.
1032      </para>
1033      <para>
1034       <synopsis>
1035 int cql_parser_stream(CQL_parser cp,
1036                       int (*getbyte)(void *client_data),
1037                       void (*ungetbyte)(int b, void *client_data),
1038                       void *client_data);
1039
1040 int cql_parser_stdio(CQL_parser cp, FILE *f);
1041       </synopsis>
1042       The functions <function>cql_parser_stream</function> and
1043       <function>cql_parser_stdio</function> parses a CQL query
1044       - just like <function>cql_parser_string</function>.
1045       The only difference is that the CQL query can be
1046       fed to the parser in different ways.
1047       The <function>cql_parser_stream</function> uses a generic
1048       byte stream as input. The <function>cql_parser_stdio</function>
1049       uses a <literal>FILE</literal> handle which is opened for reading.
1050      </para>
1051     </sect3>
1052     
1053     <sect3 id="cql.tree"><title>CQL tree</title>
1054      <para>
1055       The the query string is valid, the CQL parser
1056       generates a tree representing the structure of the
1057       CQL query.
1058      </para>
1059      <para>
1060       <synopsis>
1061 struct cql_node *cql_parser_result(CQL_parser cp);
1062       </synopsis>
1063       <function>cql_parser_result</function> returns the
1064       a pointer to the root node of the resulting tree.
1065      </para>
1066      <para>
1067       Each node in a CQL tree is represented by a 
1068       <literal>struct cql_node</literal>.
1069       It is defined as follows:
1070       <synopsis>
1071 #define CQL_NODE_ST 1
1072 #define CQL_NODE_BOOL 2
1073 struct cql_node {
1074     int which;
1075     union {
1076         struct {
1077             char *index;
1078             char *index_uri;
1079             char *term;
1080             char *relation;
1081             char *relation_uri;
1082             struct cql_node *modifiers;
1083         } st;
1084         struct {
1085             char *value;
1086             struct cql_node *left;
1087             struct cql_node *right;
1088             struct cql_node *modifiers;
1089         } boolean;
1090     } u;
1091 };
1092       </synopsis>
1093       There are two node types: search term (ST) and boolean (BOOL).
1094       A modifier is treated as a search term too.
1095      </para>
1096      <para>
1097       The search term node has five members:
1098       <itemizedlist>
1099        <listitem>
1100         <para>
1101          <literal>index</literal>: index for search term.
1102          If an index is unspecified for a search term,
1103          <literal>index</literal> will be NULL.
1104         </para>
1105        </listitem>
1106        <listitem>
1107         <para>
1108          <literal>index_uri</literal>: index URi for search term
1109          or NULL if none could be resolved for the index.
1110         </para>
1111        </listitem>
1112        <listitem>
1113         <para>
1114          <literal>term</literal>: the search term itself.
1115         </para>
1116        </listitem>
1117        <listitem>
1118         <para>
1119          <literal>relation</literal>: relation for search term.
1120         </para>
1121        </listitem>
1122        <listitem>
1123         <para>
1124          <literal>relation_uri</literal>: relation URI for search term.
1125         </para>
1126        </listitem>
1127        <listitem>
1128         <para>
1129          <literal>modifiers</literal>: relation modifiers for search
1130          term. The <literal>modifiers</literal> list itself of cql_nodes
1131          each of type <literal>ST</literal>.
1132         </para>
1133        </listitem>
1134       </itemizedlist>
1135      </para>
1136
1137      <para>
1138       The boolean node represents both <literal>and</literal>,
1139       <literal>or</literal>, not as well as
1140       proximity.
1141       <itemizedlist>
1142        <listitem>
1143         <para>
1144          <literal>left</literal> and <literal>right</literal>: left
1145          - and right operand respectively.
1146         </para>
1147        </listitem>
1148        <listitem>
1149         <para>
1150          <literal>modifiers</literal>: proximity arguments.
1151         </para>
1152        </listitem>
1153       </itemizedlist>
1154      </para>
1155
1156     </sect3>
1157     <sect3 id="cql.to.pqf"><title>CQL to PQF conversion</title>
1158      <para>
1159       Conversion to PQF (and Z39.50 RPN) is tricky by the fact
1160       that the resulting RPN depends on the Z39.50 target
1161       capabilities (combinations of supported attributes). 
1162       In addition, the CQL and SRU operates on index prefixes
1163       (URI or strings), whereas the RPN uses Object Identifiers
1164       for attribute sets.
1165      </para>
1166      <para>
1167       The CQL library of &yaz; defines a <literal>cql_transform_t</literal>
1168       type. It represents a particular mapping between CQL and RPN.
1169       This handle is created and destroyed by the functions:
1170      <synopsis>
1171 cql_transform_t cql_transform_open_FILE (FILE *f);
1172 cql_transform_t cql_transform_open_fname(const char *fname);
1173 void cql_transform_close(cql_transform_t ct);
1174       </synopsis>
1175       The first two functions create a tranformation handle from
1176       either an already open FILE or from a filename respectively.
1177      </para>
1178      <para>
1179       The handle is destroyed by <function>cql_transform_close</function> 
1180       in which case no further reference of the handle is allowed.
1181      </para>
1182      <para>
1183       When a <literal>cql_transform_t</literal> handle has been created
1184       you can convert to RPN.
1185       <synopsis>
1186 int cql_transform_buf(cql_transform_t ct,
1187                       struct cql_node *cn, char *out, int max);
1188       </synopsis>
1189       This function converts the CQL tree <literal>cn</literal> 
1190       using handle <literal>ct</literal>.
1191       For the resulting PQF, you supply a buffer <literal>out</literal>
1192       which must be able to hold at at least <literal>max</literal>
1193       characters.
1194      </para>
1195      <para>
1196       If conversion failed, <function>cql_transform_buf</function>
1197       returns a non-zero SRU error code; otherwise zero is returned
1198       (conversion successful).  The meanings of the numeric error
1199       codes are listed in the SRU specifications at
1200       <ulink url="&url.sru.diagnostics.list;"/>
1201      </para>
1202      <para>
1203       If conversion fails, more information can be obtained by calling
1204       <synopsis>
1205 int cql_transform_error(cql_transform_t ct, char **addinfop);
1206       </synopsis>
1207       This function returns the most recently returned numeric
1208       error-code and sets the string-pointer at
1209       <literal>*addinfop</literal> to point to a string containing
1210       additional information about the error that occurred: for
1211       example, if the error code is 15 (``Illegal or unsupported context
1212       set''), the additional information is the name of the requested
1213       context set that was not recognised.
1214      </para>
1215      <para>
1216       The SRU error-codes may be translated into brief human-readable
1217       error messages using
1218       <synopsis>
1219 const char *cql_strerror(int code);
1220       </synopsis>
1221      </para>
1222      <para>
1223       If you wish to be able to produce a PQF result in a different
1224       way, there are two alternatives.
1225       <synopsis>
1226 void cql_transform_pr(cql_transform_t ct,
1227                       struct cql_node *cn,
1228                       void (*pr)(const char *buf, void *client_data),
1229                       void *client_data);
1230
1231 int cql_transform_FILE(cql_transform_t ct,
1232                        struct cql_node *cn, FILE *f);
1233       </synopsis>
1234       The former function produces output to a user-defined
1235       output stream. The latter writes the result to an already
1236       open <literal>FILE</literal>.
1237      </para>
1238     </sect3>
1239     <sect3 id="cql.to.rpn">
1240      <title>Specification of CQL to RPN mappings</title>
1241      <para>
1242       The file supplied to functions 
1243       <function>cql_transform_open_FILE</function>,
1244       <function>cql_transform_open_fname</function> follows
1245       a structure found in many Unix utilities.
1246       It consists of mapping specifications - one per line.
1247       Lines starting with <literal>#</literal> are ignored (comments).
1248      </para>
1249      <para>
1250       Each line is of the form
1251       <literallayout>
1252        <replaceable>CQL pattern</replaceable><literal> = </literal> <replaceable> RPN equivalent</replaceable>
1253       </literallayout>
1254      </para>
1255      <para>
1256       An RPN pattern is a simple attribute list. Each attribute pair
1257       takes the form:
1258       <literallayout>
1259        [<replaceable>set</replaceable>] <replaceable>type</replaceable><literal>=</literal><replaceable>value</replaceable>
1260       </literallayout>
1261       The attribute <replaceable>set</replaceable> is optional.
1262       The <replaceable>type</replaceable> is the attribute type,
1263       <replaceable>value</replaceable> the attribute value.
1264      </para>
1265      <para>
1266       The character <literal>*</literal> (asterisk) has special meaning
1267       when used in the RPN pattern.
1268       Each occurrence of <literal>*</literal> is substituted with the
1269       CQL matching name (index, relation, qualifier etc).
1270       This facility can be used to copy a CQL name verbatim to the RPN result.
1271      </para>
1272      <para>
1273       The following CQL patterns are recognized:
1274       <variablelist>
1275        <varlistentry><term>
1276          <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1277         </term>
1278         <listitem>
1279          <para>
1280           This pattern is invoked when a CQL index, such as 
1281           dc.title is converted. <replaceable>set</replaceable>
1282           and <replaceable>name</replaceable> are the context set and index
1283           name respectively.
1284           Typically, the RPN specifies an equivalent use attribute.
1285          </para>
1286          <para>
1287           For terms not bound by an index the pattern
1288           <literal>index.cql.serverChoice</literal> is used.
1289           Here, the prefix <literal>cql</literal> is defined as
1290           <literal>http://www.loc.gov/zing/cql/cql-indexes/v1.0/</literal>.
1291           If this pattern is not defined, the mapping will fail.
1292          </para>
1293          <para>
1294           The pattern, 
1295           <literal>index.</literal><replaceable>set</replaceable><literal>.*</literal>
1296           is used when no other index pattern is matched.
1297         </para>
1298         </listitem>
1299        </varlistentry>
1300        <varlistentry><term>
1301          <literal>qualifier.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1302          (DEPRECATED)
1303         </term>
1304         <listitem>
1305          <para>
1306           For backwards compatibility, this is recognised as a synonym of
1307           <literal>index.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1308          </para>
1309         </listitem>
1310        </varlistentry>
1311        <varlistentry><term>
1312          <literal>relation.</literal><replaceable>relation</replaceable>
1313         </term>
1314         <listitem>
1315          <para>
1316           This pattern specifies how a CQL relation is mapped to RPN.
1317           <replaceable>pattern</replaceable> is name of relation
1318           operator. Since <literal>=</literal> is used as
1319           separator between CQL pattern and RPN, CQL relations
1320           including <literal>=</literal> cannot be
1321           used directly. To avoid a conflict, the names
1322           <literal>ge</literal>,
1323           <literal>eq</literal>,
1324           <literal>le</literal>,
1325           must be used for CQL operators, greater-than-or-equal,
1326           equal, less-than-or-equal respectively.
1327           The RPN pattern is supposed to include a relation attribute.
1328          </para>
1329          <para>
1330           For terms not bound by a relation, the pattern
1331           <literal>relation.scr</literal> is used. If the pattern
1332           is not defined, the mapping will fail.
1333          </para>
1334          <para>
1335           The special pattern, <literal>relation.*</literal> is used
1336           when no other relation pattern is matched.
1337          </para>
1338         </listitem>
1339        </varlistentry>
1340
1341        <varlistentry><term>
1342          <literal>relationModifier.</literal><replaceable>mod</replaceable>
1343         </term>
1344         <listitem>
1345          <para>
1346           This pattern specifies how a CQL relation modifier is mapped to RPN.
1347           The RPN pattern is usually a relation attribute.
1348          </para>
1349         </listitem>
1350        </varlistentry>
1351
1352        <varlistentry><term>
1353          <literal>structure.</literal><replaceable>type</replaceable>
1354         </term>
1355         <listitem>
1356          <para>
1357           This pattern specifies how a CQL structure is mapped to RPN.
1358           Note that this CQL pattern is somewhat to similar to
1359           CQL pattern <literal>relation</literal>. 
1360           The <replaceable>type</replaceable> is a CQL relation.
1361          </para>
1362          <para>
1363           The pattern, <literal>structure.*</literal> is used
1364           when no other structure pattern is matched.
1365           Usually, the RPN equivalent specifies a structure attribute.
1366          </para>
1367         </listitem>
1368        </varlistentry>
1369
1370        <varlistentry><term>
1371          <literal>position.</literal><replaceable>type</replaceable>
1372         </term>
1373         <listitem>
1374          <para>
1375           This pattern specifies how the anchor (position) of
1376           CQL is mapped to RPN.
1377           The <replaceable>type</replaceable> is one
1378           of <literal>first</literal>, <literal>any</literal>,
1379           <literal>last</literal>, <literal>firstAndLast</literal>.
1380          </para>
1381          <para>
1382           The pattern, <literal>position.*</literal> is used
1383           when no other position pattern is matched.
1384          </para>
1385         </listitem>
1386        </varlistentry>
1387
1388        <varlistentry><term>
1389          <literal>set.</literal><replaceable>prefix</replaceable>
1390         </term>
1391         <listitem>
1392          <para>
1393           This specification defines a CQL context set for a given prefix.
1394           The value on the right hand side is the URI for the set - 
1395           <emphasis>not</emphasis> RPN. All prefixes used in
1396           index patterns must be defined this way.
1397          </para>
1398         </listitem>
1399        </varlistentry>
1400
1401        <varlistentry><term>
1402          <literal>set</literal>
1403         </term>
1404         <listitem>
1405          <para>
1406           This specification defines a default CQL context set for index names.
1407           The value on the right hand side is the URI for the set.
1408          </para>
1409         </listitem>
1410        </varlistentry>
1411
1412       </variablelist>
1413      </para>
1414      <example id="example.cql.to.rpn.mapping">
1415       <title>CQL to RPN mapping file</title>
1416       <para>
1417        This simple file defines two context sets, three indexes and three
1418        relations, a position pattern and a default structure.
1419       </para>
1420       <programlisting><![CDATA[
1421        set.cql  = http://www.loc.gov/zing/cql/context-sets/cql/v1.1/
1422        set.dc   = http://www.loc.gov/zing/cql/dc-indexes/v1.0/
1423
1424        index.cql.serverChoice = 1=1016
1425        index.dc.title         = 1=4
1426        index.dc.subject       = 1=21
1427   
1428        relation.<             = 2=1
1429        relation.eq            = 2=3
1430        relation.scr           = 2=3
1431
1432        position.any           = 3=3 6=1
1433
1434        structure.*            = 4=1
1435 ]]>
1436       </programlisting>
1437       <para>
1438        With the mappings above, the CQL query
1439        <screen>
1440         computer
1441        </screen>
1442        is converted to the PQF:
1443        <screen>
1444         @attr 1=1016 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "computer"
1445        </screen>
1446        by rules <literal>index.cql.serverChoice</literal>,
1447        <literal>relation.scr</literal>, <literal>structure.*</literal>,
1448        <literal>position.any</literal>.
1449       </para>
1450       <para>
1451        CQL query
1452        <screen>
1453         computer^
1454        </screen>
1455        is rejected, since <literal>position.right</literal> is
1456        undefined.
1457       </para>
1458       <para>
1459        CQL query
1460        <screen>
1461         >my = "http://www.loc.gov/zing/cql/dc-indexes/v1.0/" my.title = x
1462        </screen>
1463        is converted to
1464        <screen>
1465         @attr 1=4 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "x"
1466        </screen>
1467       </para>
1468      </example>
1469      <example id="example.cql.to.rpn.string">
1470       <title>CQL to RPN string attributes</title>
1471       <para>
1472        In this example we allow any index to be passed to RPN as
1473        a use attribute.
1474       </para>
1475       <programlisting><![CDATA[
1476        # Identifiers for prefixes used in this file. (index.*)
1477        set.cql  = info:srw/cql-context-set/1/cql-v1.1
1478        set.rpn  = http://bogus/rpn
1479        set      = http://bogus/rpn
1480
1481        # The default index when none is specified by the query
1482        index.cql.serverChoice     = 1=any
1483
1484        index.rpn.*                = 1=*
1485        relation.eq                = 2=3
1486        structure.*                = 4=1
1487        position.any               = 3=3
1488 ]]>
1489       </programlisting>
1490       <para>
1491        The <literal>http://bogus/rpn</literal> context set is also the default
1492        so we can make queries such as
1493        <screen>
1494         title = a
1495        </screen>
1496        which is converted to
1497        <screen>
1498         @attr 2=3 @attr 4=1 @attr 3=3 @attr 1=title "a"
1499        </screen>
1500       </para>
1501      </example>
1502      <example id="example.cql.to.rpn.bathprofile">
1503       <title>CQL to RPN using Bath Profile</title>
1504       <para>
1505        The file <filename>etc/pqf.properties</filename> has mappings from
1506        the Bath Profile and Dublin Core to RPN.
1507        If YAZ is installed as a package it's usually located
1508        in <filename>/usr/share/yaz/etc</filename> and part of the
1509        development package, such as <literal>libyaz-dev</literal>.
1510       </para>
1511      </example>
1512     </sect3>
1513     <sect3 id="cql.xcql"><title>CQL to XCQL conversion</title>
1514      <para>
1515       Conversion from CQL to XCQL is trivial and does not
1516       require a mapping to be defined.
1517       There three functions to choose from depending on the
1518       way you wish to store the resulting output (XML buffer
1519       containing XCQL).
1520       <synopsis>
1521 int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
1522 void cql_to_xml(struct cql_node *cn, 
1523                 void (*pr)(const char *buf, void *client_data),
1524                 void *client_data);
1525 void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
1526       </synopsis>
1527       Function <function>cql_to_xml_buf</function> converts
1528       to XCQL and stores result in a user supplied buffer of a given
1529       max size.
1530      </para>
1531      <para>
1532       <function>cql_to_xml</function> writes the result in
1533       a user defined output stream.
1534       <function>cql_to_xml_stdio</function> writes to a
1535       a file.
1536      </para>
1537     </sect3>
1538    </sect2>
1539   </sect1>
1540   <sect1 id="tools.oid"><title>Object Identifiers</title>
1541
1542    <para>
1543     The basic YAZ representation of an OID is an array of integers,
1544     terminated with the value -1. The &odr; module provides two
1545     utility-functions to create and copy this type of data elements:
1546    </para>
1547
1548    <screen>
1549     Odr_oid *odr_getoidbystr(ODR o, char *str);
1550    </screen>
1551
1552    <para>
1553     Creates an OID based on a string-based representation using dots (.)
1554     to separate elements in the OID.
1555    </para>
1556
1557    <screen>
1558     Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
1559    </screen>
1560
1561    <para>
1562     Creates a copy of the OID referenced by the <emphasis>o</emphasis>
1563     parameter.
1564     Both functions take an &odr; stream as parameter. This stream is used to
1565     allocate memory for the data elements, which is released on a
1566     subsequent call to <function>odr_reset()</function> on that stream.
1567    </para>
1568
1569    <para>
1570     The OID module provides a higher-level representation of the
1571     family of object identifiers which describe the Z39.50 protocol and its
1572     related objects. The definition of the module interface is given in
1573     the <filename>oid.h</filename> file.
1574    </para>
1575
1576    <para>
1577     The interface is mainly based on the <literal>oident</literal> structure.
1578     The definition of this structure looks like this:
1579    </para>
1580
1581    <screen>
1582 typedef struct oident
1583 {
1584     oid_proto proto;
1585     oid_class oclass;
1586     oid_value value;
1587     int oidsuffix[OID_SIZE];
1588     char *desc;
1589 } oident;
1590    </screen>
1591
1592    <para>
1593     The proto field takes one of the values
1594    </para>
1595
1596    <screen>
1597     PROTO_Z3950
1598     PROTO_GENERAL
1599    </screen>
1600
1601    <para>
1602     Use <literal>PROTO_Z3950</literal> for Z39.50 Object Identifers,
1603     <literal>PROTO_GENERAL</literal> for other types (such as
1604     those associated with ILL).
1605    </para>
1606    <para>
1607
1608     The oclass field takes one of the values
1609    </para>
1610
1611    <screen>
1612     CLASS_APPCTX
1613     CLASS_ABSYN
1614     CLASS_ATTSET
1615     CLASS_TRANSYN
1616     CLASS_DIAGSET
1617     CLASS_RECSYN
1618     CLASS_RESFORM
1619     CLASS_ACCFORM
1620     CLASS_EXTSERV
1621     CLASS_USERINFO
1622     CLASS_ELEMSPEC
1623     CLASS_VARSET
1624     CLASS_SCHEMA
1625     CLASS_TAGSET
1626     CLASS_GENERAL
1627    </screen>
1628
1629    <para>
1630     corresponding to the OID classes defined by the Z39.50 standard.
1631
1632     Finally, the value field takes one of the values
1633    </para>
1634
1635    <screen>
1636     VAL_APDU
1637     VAL_BER
1638     VAL_BASIC_CTX
1639     VAL_BIB1
1640     VAL_EXP1
1641     VAL_EXT1
1642     VAL_CCL1
1643     VAL_GILS
1644     VAL_WAIS
1645     VAL_STAS
1646     VAL_DIAG1
1647     VAL_ISO2709
1648     VAL_UNIMARC
1649     VAL_INTERMARC
1650     VAL_CCF
1651     VAL_USMARC
1652     VAL_UKMARC
1653     VAL_NORMARC
1654     VAL_LIBRISMARC
1655     VAL_DANMARC
1656     VAL_FINMARC
1657     VAL_MAB
1658     VAL_CANMARC
1659     VAL_SBN
1660     VAL_PICAMARC
1661     VAL_AUSMARC
1662     VAL_IBERMARC
1663     VAL_EXPLAIN
1664     VAL_SUTRS
1665     VAL_OPAC
1666     VAL_SUMMARY
1667     VAL_GRS0
1668     VAL_GRS1
1669     VAL_EXTENDED
1670     VAL_RESOURCE1
1671     VAL_RESOURCE2
1672     VAL_PROMPT1
1673     VAL_DES1
1674     VAL_KRB1
1675     VAL_PRESSET
1676     VAL_PQUERY
1677     VAL_PCQUERY
1678     VAL_ITEMORDER
1679     VAL_DBUPDATE
1680     VAL_EXPORTSPEC
1681     VAL_EXPORTINV
1682     VAL_NONE
1683     VAL_SETM
1684     VAL_SETG
1685     VAL_VAR1
1686     VAL_ESPEC1
1687    </screen>
1688
1689    <para>
1690     again, corresponding to the specific OIDs defined by the standard.
1691     Refer to the
1692     <ulink url="&url.z39.50.oids;">
1693      Registry of Z39.50 Object Identifiers</ulink> for the
1694      whole list.
1695    </para>
1696
1697    <para>
1698     The desc field contains a brief, mnemonic name for the OID in question.
1699    </para>
1700
1701    <para>
1702     The function
1703    </para>
1704
1705    <screen>
1706     struct oident *oid_getentbyoid(int *o);
1707    </screen>
1708
1709    <para>
1710     takes as argument an OID, and returns a pointer to a static area
1711     containing an <literal>oident</literal> structure. You typically use
1712     this function when you receive a PDU containing an OID, and you wish
1713     to branch out depending on the specific OID value.
1714    </para>
1715
1716    <para>
1717     The function
1718    </para>
1719
1720    <screen>
1721     int *oid_ent_to_oid(struct oident *ent, int *dst);
1722    </screen>
1723
1724    <para>
1725     Takes as argument an <literal>oident</literal> structure - in which
1726     the <literal>proto</literal>, <literal>oclass</literal>/, and
1727     <literal>value</literal> fields are assumed to be set correctly -
1728     and returns a pointer to a the buffer as given by <literal>dst</literal>
1729     containing the base
1730     representation of the corresponding OID. The function returns
1731     NULL and the array dst is unchanged if a mapping couldn't place.
1732     The array <literal>dst</literal> should be at least of size
1733     <literal>OID_SIZE</literal>.
1734    </para>
1735    <para>
1736
1737     The <function>oid_ent_to_oid()</function> function can be used whenever
1738     you need to prepare a PDU containing one or more OIDs. The separation of
1739     the <literal>protocol</literal> element from the remainder of the
1740     OID-description makes it simple to write applications that can
1741     communicate with either Z39.50 or OSI SR-based applications.
1742    </para>
1743
1744    <para>
1745     The function
1746    </para>
1747
1748    <screen>
1749     oid_value oid_getvalbyname(const char *name);
1750    </screen>
1751
1752    <para>
1753     takes as argument a mnemonic OID name, and returns the
1754     <literal>/value</literal> field of the first entry in the database that 
1755     contains the given name in its <literal>desc</literal> field.
1756    </para>
1757
1758    <para>
1759     Three utility functions are provided for translating OIDs'
1760     symbolic names (e.g. <literal>Usmarc</literal> into OID structures
1761     (int arrays) and strings containing the OID in dotted notation
1762     (e.g. <literal>1.2.840.10003.9.5.1</literal>).  They are:
1763    </para>
1764
1765    <screen>
1766     int *oid_name_to_oid(oid_class oclass, const char *name, int *oid);
1767     char *oid_to_dotstring(const int *oid, char *oidbuf);
1768     char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oidbuf);
1769    </screen>
1770
1771    <para>
1772     <literal>oid_name_to_oid()</literal>
1773      translates the specified symbolic <literal>name</literal>,
1774      interpreted as being of class <literal>oclass</literal>.  (The
1775      class must be specified as many symbolic names exist within
1776      multiple classes - for example, <literal>Zthes</literal> is the
1777      symbolic name of an attribute set, a schema and a tag-set.)  The
1778      sequence of integers representing the OID is written into the
1779      area <literal>oid</literal> provided by the caller; it is the
1780      caller's responsibility to ensure that this area is large enough
1781      to contain the translated OID.  As a convenience, the address of
1782      the buffer (i.e. the value of <literal>oid</literal>) is
1783      returned.
1784    </para>
1785    <para>
1786     <literal>oid_to_dotstring()</literal>
1787     Translates the int-array <literal>oid</literal> into a dotted
1788     string which is written into the area <literal>oidbuf</literal>
1789     supplied by the caller; it is the caller's responsibility to
1790     ensure that this area is large enough.  The address of the buffer
1791     is returned.
1792    </para>
1793    <para>
1794     <literal>oid_name_to_dotstring()</literal>
1795     combines the previous two functions to derive a dotted string
1796     representing the OID specified by <literal>oclass</literal> and
1797     <literal>name</literal>, writing it into the buffer passed as
1798     <literal>oidbuf</literal> and returning its address.
1799    </para>
1800
1801    <para>
1802     Finally, the module provides the following utility functions, whose
1803     meaning should be obvious:
1804    </para>
1805
1806    <screen>
1807     void oid_oidcpy(int *t, int *s);
1808     void oid_oidcat(int *t, int *s);
1809     int oid_oidcmp(int *o1, int *o2);
1810     int oid_oidlen(int *o);
1811    </screen>
1812
1813    <note>
1814     <para>
1815      The OID module has been criticized - and perhaps rightly so
1816      - for needlessly abstracting the
1817      representation of OIDs. Other toolkits use a simple
1818      string-representation of OIDs with good results. In practice, we have
1819      found the interface comfortable and quick to work with, and it is a
1820      simple matter (for what it's worth) to create applications compatible
1821      with both ISO SR and Z39.50. Finally, the use of the
1822      <literal>/oident</literal> database is by no means mandatory.
1823      You can easily create your own system for representing OIDs, as long
1824      as it is compatible with the low-level integer-array representation
1825      of the ODR module.
1826     </para>
1827    </note>
1828
1829   </sect1>
1830
1831   <sect1 id="tools.nmem"><title>Nibble Memory</title>
1832
1833    <para>
1834     Sometimes when you need to allocate and construct a large,
1835     interconnected complex of structures, it can be a bit of a pain to
1836     release the associated memory again. For the structures describing the
1837     Z39.50 PDUs and related structures, it is convenient to use the
1838     memory-management system of the &odr; subsystem (see
1839     <xref linkend="odr.use"/>). However, in some circumstances
1840     where you might otherwise benefit from using a simple nibble memory
1841     management system, it may be impractical to use
1842     <function>odr_malloc()</function> and <function>odr_reset()</function>.
1843     For this purpose, the memory manager which also supports the &odr;
1844     streams is made available in the NMEM module. The external interface
1845     to this module is given in the <filename>nmem.h</filename> file.
1846    </para>
1847
1848    <para>
1849     The following prototypes are given:
1850    </para>
1851
1852    <screen>
1853     NMEM nmem_create(void);
1854     void nmem_destroy(NMEM n);
1855     void *nmem_malloc(NMEM n, int size);
1856     void nmem_reset(NMEM n);
1857     int nmem_total(NMEM n);
1858     void nmem_init(void);
1859     void nmem_exit(void);
1860    </screen>
1861
1862    <para>
1863     The <function>nmem_create()</function> function returns a pointer to a
1864     memory control handle, which can be released again by
1865     <function>nmem_destroy()</function> when no longer needed.
1866     The function <function>nmem_malloc()</function> allocates a block of
1867     memory of the requested size. A call to <function>nmem_reset()</function>
1868     or <function>nmem_destroy()</function> will release all memory allocated
1869     on the handle since it was created (or since the last call to
1870     <function>nmem_reset()</function>. The function
1871     <function>nmem_total()</function> returns the number of bytes currently
1872     allocated on the handle.
1873    </para>
1874
1875    <para>
1876     The nibble memory pool is shared amongst threads. POSIX
1877     mutex'es and WIN32 Critical sections are introduced to keep the
1878     module thread safe. Function <function>nmem_init()</function>
1879     initializes the nibble memory library and it is called automatically
1880     the first time the <literal>YAZ.DLL</literal> is loaded. &yaz; uses
1881     function <function>DllMain</function> to achieve this. You should
1882     <emphasis>not</emphasis> call <function>nmem_init</function> or
1883     <function>nmem_exit</function> unless you're absolute sure what
1884     you're doing. Note that in previous &yaz; versions you'd have to call
1885     <function>nmem_init</function> yourself. 
1886    </para>
1887
1888   </sect1>
1889
1890   <sect1 id="tools.log"><title>Log</title>
1891   <para>
1892    &yaz; has evolved a fairly complex log system which should be useful both 
1893    for debugging &yaz; itself, debugging applications that use &yaz;, and for
1894    production use of those applications.  
1895   </para>
1896   <para>
1897    The log functions are declared in header <filename>yaz/log.h</filename>
1898     and implemented in <filename>src/log.c</filename>.
1899     Due to name clash with syslog and some math utilities the logging
1900     interface has been modified as of YAZ 2.0.29. The obsolete interface
1901     is still available if in header file <filename>yaz/log.h</filename>.
1902     The key points of the interface are:
1903   </para>
1904   <screen>
1905    void yaz_log(int level, const char *fmt, ...)
1906
1907    void yaz_log_init(int level, const char *prefix, const char *name);
1908    void yaz_log_init_file(const char *fname);
1909    void yaz_log_init_level(int level);
1910    void yaz_log_init_prefix(const char *prefix);
1911    void yaz_log_time_format(const char *fmt);
1912    void yaz_log_init_max_size(int mx);
1913
1914    int yaz_log_mask_str(const char *str);
1915    int yaz_log_module_level(const char *name);
1916   </screen>
1917
1918   <para>
1919    The reason for the whole log module is the <function>yaz_log</function>
1920    function. It takes a bitmask indicating the log levels, a
1921    <literal>printf</literal>-like format string, and a variable number of
1922    arguments to log.
1923   </para>
1924
1925   <para>
1926    The <literal>log level</literal> is a bit mask, that says on which level(s)
1927    the log entry should be made, and optionally set some behaviour of the
1928    logging. In the most simple cases, it can be one of <literal>YLOG_FATAL,
1929    YLOG_DEBUG, YLOG_WARN, YLOG_LOG</literal>. Those can be combined with bits
1930    that modify the way the log entry is written:<literal>YLOG_ERRNO,
1931    YLOG_NOTIME, YLOG_FLUSH</literal>.
1932    Most of the rest of the bits are deprecated, and should not be used. Use
1933    the dynamic log levels instead.
1934   </para>
1935
1936   <para>
1937    Applications that use &yaz;, should not use the LOG_LOG for ordinary
1938    messages, but should make use of the dynamic loglevel system. This consists
1939    of two parts, defining the loglevel and checking it.
1940   </para>
1941
1942   <para>
1943    To define the log levels, the (main) program should pass a string to
1944    <function>yaz_log_mask_str</function> to define which log levels are to be
1945    logged. This string should be a comma-separated list of log level names,
1946    and can contain both hard-coded names and dynamic ones. The log level
1947    calculation starts with <literal>YLOG_DEFAULT_LEVEL</literal> and adds a bit
1948    for each word it meets, unless the word starts with a '-', in which case it 
1949    clears the bit. If the string <literal>'none'</literal> is found,
1950    all bits are cleared. Typically this string comes from the command-line,
1951    often identified by <literal>-v</literal>. The
1952    <function>yaz_log_mask_str</function> returns a log level that should be
1953    passed to <function>yaz_log_init_level</function> for it to take effect.
1954   </para>
1955
1956   <para>
1957    Each module should check what log bits it should be used, by calling 
1958    <function>yaz_log_module_level</function> with a suitable name for the
1959    module. The name is cleared from a preceding path and an extension, if any,
1960    so it is quite possible to use <literal>__FILE__</literal> for it. If the
1961    name has been passed to <function>yaz_log_mask_str</function>, the routine
1962    returns a non-zero bitmask, which should then be used in consequent calls
1963    to yaz_log. (It can also be tested, so as to avoid unnecessary calls to
1964    yaz_log, in time-critical places, or when the log entry would take time 
1965    to construct.) 
1966   </para>
1967
1968   <para>
1969    Yaz uses the following dynamic log levels:
1970    <literal>server, session, request, requestdetail</literal> for the server
1971    functionality.
1972    <literal>zoom</literal> for the zoom client api.
1973    <literal>ztest</literal> for the simple test server.
1974    <literal>malloc, nmem, odr, eventl</literal> for internal debugging of yaz itself.
1975    Of course, any program using yaz is welcome to define as many new ones, as
1976    it needs.
1977   </para>
1978
1979   <para>
1980    By default the log is written to stderr, but this can be changed by a call
1981    to <function>yaz_log_init_file</function> or
1982    <function>yaz_log_init</function>. If the log is directed to a file, the
1983    file size is checked at every write, and if it exceeds the limit given in
1984    <function>yaz_log_init_max_size</function>, the log is rotated. The
1985    rotation keeps one old version (with a <literal>.1</literal> appended to
1986    the name). The size defaults to 1GB. Setting it to zero will disable the
1987    rotation feature.
1988   </para>
1989
1990   <screen>
1991   A typical yaz-log looks like this
1992   13:23:14-23/11 yaz-ztest(1) [session] Starting session from tcp:127.0.0.1 (pid=30968)
1993   13:23:14-23/11 yaz-ztest(1) [request] Init from 'YAZ' (81) (ver 2.0.28) OK
1994   13:23:17-23/11 yaz-ztest(1) [request] Search Z: @attrset Bib-1 foo  OK:7 hits
1995   13:23:22-23/11 yaz-ztest(1) [request] Present: [1] 2+2  OK 2 records returned
1996   13:24:13-23/11 yaz-ztest(1) [request] Close OK
1997   </screen>
1998
1999   <para>
2000    The log entries start with a time stamp. This can be omitted by setting the
2001    <literal>YLOG_NOTIME</literal> bit in the loglevel. This way automatic tests
2002    can be hoped to produce identical log files, that are easy to diff. The
2003    format of the time stamp can be set with
2004    <function>yaz_log_time_format</function>, which takes a format string just
2005    like <function>strftime</function>.
2006   </para>
2007
2008   <para>
2009    Next in a log line comes the prefix, often the name of the program. For
2010    yaz-based servers, it can also contain the session number. Then
2011    comes one or more logbits in square brackets, depending on the logging
2012    level set by <function>yaz_log_init_level</function> and the loglevel
2013    passed to <function>yaz_log_init_level</function>. Finally comes the format
2014    string and additional values passed to <function>yaz_log</function>
2015   </para>
2016
2017   <para>
2018    The log level <literal>YLOG_LOGLVL</literal>, enabled by the string
2019    <literal>loglevel</literal>, will log all the log-level affecting
2020    operations. This can come in handy if you need to know what other log
2021    levels would be useful. Grep the logfile for <literal>[loglevel]</literal>.
2022   </para>
2023
2024   <para>
2025    The log system is almost independent of the rest of &yaz;, the only
2026    important dependence is of <filename>nmem</filename>, and that only for
2027    using the semaphore definition there. 
2028   </para>
2029
2030   <para>
2031    The dynamic log levels and log rotation were introduced in &yaz; 2.0.28. At
2032    the same time, the log bit names were changed from
2033    <literal>LOG_something</literal> to <literal>YLOG_something</literal>, 
2034    to avoid collision with <filename>syslog.h</filename>.
2035   </para>
2036
2037   </sect1>
2038   
2039   <sect1 id="marc"><title>MARC</title>
2040    
2041    <para>
2042     YAZ provides a fast utility that decodes MARC records and
2043     encodes to a varity of output formats. The MARC records must
2044     be encoded in ISO2709.
2045    </para>
2046    <synopsis><![CDATA[
2047     #include <yaz/marcdisp.h>
2048
2049     /* create handler */
2050     yaz_marc_t yaz_marc_create(void);
2051     /* destroy */
2052     void yaz_marc_destroy(yaz_marc_t mt);
2053
2054     /* set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ... */
2055     void yaz_marc_xml(yaz_marc_t mt, int xmlmode);
2056     #define YAZ_MARC_LINE      0
2057     #define YAZ_MARC_SIMPLEXML 1
2058     #define YAZ_MARC_OAIMARC   2
2059     #define YAZ_MARC_MARCXML   3
2060     #define YAZ_MARC_ISO2709   4
2061     #define YAZ_MARC_XCHANGE   5
2062
2063     /* supply iconv handle for character set conversion .. */
2064     void yaz_marc_iconv(yaz_marc_t mt, yaz_iconv_t cd);
2065
2066     /* set debug level, 0=none, 1=more, 2=even more, .. */
2067     void yaz_marc_debug(yaz_marc_t mt, int level);
2068
2069     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
2070     On success, result in *result with size *rsize. */
2071     int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize,
2072                              char **result, int *rsize);
2073
2074     /* decode MARC in buf of size bsize. Returns >0 on success; <=0 on failure.
2075        On success, result in WRBUF */
2076     int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf,
2077                                int bsize, WRBUF wrbuf);
2078 ]]>
2079    </synopsis>
2080    <para>
2081     A MARC conversion handle must be created by using
2082     <function>yaz_marc_create</function> and destroyed
2083     by calling <function>yaz_marc_destroy</function>.
2084   </para>
2085    <para>
2086     All other function operate on a <literal>yaz_marc_t</literal> handle.
2087     The output is specified by a call to <function>yaz_marc_xml</function>.
2088     The <literal>xmlmode</literal> must be one of
2089     <variablelist>
2090      <varlistentry>
2091       <term>YAZ_MARC_LINE</term>
2092       <listitem>
2093        <para>
2094         A simple line-by-line format suitable for display but not
2095         recommend for further (machine) processing.
2096        </para>
2097       </listitem>
2098      </varlistentry>
2099
2100      <varlistentry>
2101       <term>YAZ_MARC_MARCXML</term>
2102       <listitem>
2103        <para>
2104         The resulting record is converted to MARCXML.
2105        </para>
2106       </listitem>
2107      </varlistentry>
2108
2109      <varlistentry>
2110       <term>YAZ_MARC_ISO2709</term>
2111       <listitem>
2112        <para>
2113         The resulting record is converted to ISO2709 (MARC).
2114        </para>
2115       </listitem>
2116      </varlistentry>
2117     </variablelist>
2118    </para>
2119    <para>
2120     The actual conversion functions are 
2121     <function>yaz_marc_decode_buf</function> and
2122     <function>yaz_marc_decode_wrbuf</function> which decodes and encodes
2123     a MARC record. The former function operates on simple buffers, the
2124     stores the resulting record in a WRBUF handle (WRBUF is a simple string
2125     type).
2126    </para>
2127    <example id="example.marc.display">
2128     <title>Display of MARC record</title>
2129     <para>
2130      The followint program snippet illustrates how the MARC API may
2131      be used to convert a MARC record to the line-by-line format:
2132      <programlisting><![CDATA[
2133       void print_marc(const char *marc_buf, int marc_buf_size)
2134       {
2135          char *result;      /* for result buf */
2136          int result_len;    /* for size of result */
2137          yaz_marc_t mt = yaz_marc_create();
2138          yaz_marc_xml(mt, YAZ_MARC_LINE);
2139          yaz_marc_decode_buf(mt, marc_buf, marc_buf_size,
2140                              &result, &result_len);
2141          fwrite(result, result_len, 1, stdout);
2142          yaz_marc_destroy(mt);  /* note that result is now freed... */
2143       }
2144 ]]>
2145       </programlisting>
2146     </para>
2147    </example>
2148   </sect1>
2149
2150  </chapter>
2151  
2152  <!-- Keep this comment at the end of the file
2153  Local variables:
2154  mode: sgml
2155  sgml-omittag:t
2156  sgml-shorttag:t
2157  sgml-minimize-attributes:nil
2158  sgml-always-quote-attributes:t
2159  sgml-indent-step:1
2160  sgml-indent-data:t
2161  sgml-parent-document: "yaz.xml"
2162  sgml-local-catalogs: nil
2163  sgml-namecase-general:t
2164  End:
2165  -->