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