Added oslash latin-1 identity (to fix the standard one).
[yaz-moved-to-github.git] / doc / asn.xml
1 <!-- $Id: asn.xml,v 1.4 2001-07-19 23:29:40 adam Exp $ -->
2  <chapter><title>The ASN Module</title>
3   <sect1><title>Introduction</title>
4    <para>
5     The &asn; module provides you with a set of C struct definitions for the
6     various PDUs of the protocol, as well as for the complex types
7     appearing within the PDUs. For the primitive data types, the C
8     representation often takes the form of an ordinary C language type,
9     such as <literal>int</literal>. For ASN.1 constructs that have no direct
10     representation in C, such as general octet strings and bit strings,
11     the &odr; module (see section <link linkend="odr">The ODR Module</link>)
12     provides auxiliary definitions.
13    </para>
14   </sect1>
15   <sect1><title>Preparing PDUs</title>
16
17    <para>
18     A structure representing a complex ASN.1 type doesn't in itself contain the
19     members of that type. Instead, the structure contains
20     <emphasis>pointers</emphasis> to the members of the type.
21     This is necessary, in part, to allow a mechanism for specifying which
22     of the optional structure (SEQUENCE) members are present, and which
23     are not. It follows that you will need to somehow provide space for
24     the individual members of the structure, and set the pointers to
25     refer to the members.
26    </para>
27    <para>
28     The conversion routines don't care how you allocate and maintain your
29     C structures - they just follow the pointers that you provide.
30     Depending on the complexity of your application, and your personal
31     taste, there are at least three different approaches that you may take
32     when you allocate the structures.
33    </para>
34
35    <para>
36     You can use static or automatic local variables in the function that
37     prepares the PDU. This is a simple approach, and it provides the most
38     efficient form of memory management. While it works well for flat
39     PDUs like the InitReqest, it will generally not be sufficient for say,
40     the generation of an arbitrarily complex RPN query structure.
41    </para>
42    <para>
43     You can individually create the structure and its members using the
44     <function>malloc(2)</function> function. If you want to ensure that
45     the data is freed when it is no longer needed, you will have to
46     define a function that individually releases each member of a
47     structure before freeing the structure itself.
48    </para>
49    <para>
50     You can use the <function>odr_malloc()</function> function (see section 
51     <link linkend="odr-use">Using ODR</link> for details). When you use
52     <function>odr_malloc()</function>, you can release all of the
53     allocated data in a single operation, independent of any pointers and
54     relations between the data. <function>odr_malloc()</function> is based on a
55     &quot;nibble-memory&quot;
56     scheme, in which large portions of memory are allocated, and then
57     gradually handed out with each call to <function>odr_malloc()</function>.
58     The next time you call <function>odr_reset()</function>, all of the
59     memory allocated since the last call is recycled for future use (actually,
60     it is placed on a free-list).
61    </para>
62    <para>
63     You can combine all of the methods described here. This will often be
64     the most practical approach. For instance, you might use
65     <function>odr_malloc()</function> to allocate an entire structure and
66     some of its elements, while you leave other elements pointing to global
67     or per-session default variables.
68    </para>
69
70    <para>
71     The &asn; module provides an important aid in creating new PDUs. For
72     each of the PDU types (say, <function>Z_InitRequest</function>), a
73     function is provided that allocates and initializes an instance of
74     that PDU type for you. In the case of the InitRequest, the function is
75     simply named <function>zget_InitRequest()</function>, and it sets up
76     reasonable default value for all of the mandatory members. The optional
77     members are generally initialized to null pointers. This last aspect
78     is very important: it ensures that if the PDU definitions are
79     extended after you finish your implementation (to accommodate
80     new versions of the protocol, say), you won't get into trouble with
81     uninitialized pointers in your structures. The functions use
82     <function>odr_malloc()</function> to
83     allocate the PDUs and its members, so you can free everything again with a
84     single call to <function>odr_reset()</function>. We strongly recommend
85     that you use the <literal>zget_*</literal>
86     functions whenever you are preparing a PDU (in a C++ API, the
87     <literal>zget_</literal>
88     functions would probably be promoted to constructors for the
89     individual types).
90    </para>
91    <para>
92     The prototype for the individual PDU types generally look like this:
93    </para>
94    <synopsis>
95     Z_&lt;type> *zget_&lt;type>(ODR o);
96    </synopsis>
97
98    <para>
99     eg.:
100    </para>
101
102    <synopsis>
103     Z_InitRequest *zget_InitRequest(ODR o);
104    </synopsis>
105
106    <para>
107     The &odr; handle should generally be your encoding stream, but it needn't be.
108    </para>
109    <para>
110     As well as the individual PDU functions, a function <function>
111      zget_APDU()</function> is
112     provided, which allocates a toplevel Z-APDU of the type requested:
113    </para>
114
115    <synopsis>
116     Z_APDU *zget_APDU(ODR o, int which);
117    </synopsis>
118
119    <para>
120     The <varname>which</varname> parameter is (of course) the discriminator
121     belonging to the <varname>Z_APDU</varname> <literal>CHOICE</literal> type.
122     All of the interface described here is provided by the &asn; module, and
123     you access it through the <filename>proto.h</filename> header file.
124
125    </para>
126   </sect1>
127   <sect1><title id="oid">Object Identifiers</title>
128    <para>
129     When you refer to object identifiers in your application, you need to
130     be aware that SR and Z39.50 use two different set of OIDs to refer to
131     the same objects. To handle this easily, &yaz; provides a utility module
132     to &asn; which provides an internal representation of the OIDs used in
133     both protocols. Each oid is described by a structure:
134    </para>
135
136    <screen>
137 typedef struct oident
138 {
139     enum oid_proto proto;
140     enum oid_class class;
141     enum oid_value value;
142     int oidsuffix[OID_SIZE];
143     char *desc;
144 } oident;
145    </screen>
146
147    <para>
148     The <literal>proto</literal> field can be set to either
149     <literal>PROTO_SR</literal> or <literal>PROTO_Z3950</literal>.
150     The <literal>class</literal> might be, say,
151     <literal>CLASS_RECSYN</literal>, and the <literal>value</literal> might be
152     <literal>VAL_USMARC</literal> for the USMARC record format. Functions
153    </para>
154
155    <screen>
156 int *oid_ent_to_oid(struct oident *ent, int *dst);
157 struct oident *oid_getentbyoid(int *o);
158    </screen>
159
160    <para>
161     are provided to map between object identifiers and database entries.
162     If you store a member of the <literal>oid_proto</literal> type in
163     your association state information, it's a simple matter, at runtime,
164     to generate the correct OID when you need it. For decoding, you can
165     simply ignore the proto field, or if you're strict, you can verify
166     that your peer is using the OID family from the correct protocol.
167     The <literal>desc</literal> field is a short, human-readable name
168     for the PDU, useful mainly for diagnostic output.
169    </para>
170
171    <note>
172     <para>
173      The old function <function>oid_getoidbyent</function> still exists but is
174      not thread safe. Use <function>oid_ent_to_oid</function> instead
175      and pass an array of size <literal>OID_SIZE</literal>.
176     </para>
177    </note>
178
179    <note>
180     <para>
181      Plans are underway to merge the two protocols into a single
182      definition, with one set of object identifiers. When this happens, the
183      oid module will no longer be required to support protocol
184      independence, but it should still be useful as a simple OID database.
185     </para>
186    </note>
187
188   </sect1>
189   <sect1><title>EXTERNAL Data</title>
190
191    <para>
192     In order to achieve extensibility and adaptability to different
193     application domains, the new version of the protocol defines many
194     structures outside of the main ASN.1 specification, referencing them
195     through ASN.1 EXTERNAL constructs. To simplify the construction and access
196     to the externally referenced data, the &asn; module defines a
197     specialized version of the EXTERNAL construct, called
198     <literal>Z_External</literal>.It is defined thus:
199    </para>
200
201    <screen>
202 typedef struct Z_External
203 {
204     Odr_oid *direct_reference;
205     int *indirect_reference;
206     char *descriptor;
207     enum
208     {
209         /* Generic types */
210         Z_External_single = 0,
211         Z_External_octet,
212         Z_External_arbitrary,
213
214         /* Specific types */
215         Z_External_SUTRS,
216         Z_External_explainRecord,
217         Z_External_resourceReport1,
218         Z_External_resourceReport2
219
220     ...
221
222     } which;
223     union
224     {
225         /* Generic types */
226         Odr_any *single_ASN1_type;
227         Odr_oct *octet_aligned;
228         Odr_bitmask *arbitrary;
229
230         /* Specific types */
231         Z_SUTRS *sutrs;
232         Z_ExplainRecord *explainRecord;
233         Z_ResourceReport1 *resourceReport1;
234         Z_ResourceReport2 *resourceReport2;
235
236         ...
237
238     } u;
239 } Z_External;
240    </screen>
241
242    <para>
243     When decoding, the &asn; module will attempt to determine which
244     syntax describes the data by looking at the reference fields
245     (currently only the direct-reference). For ASN.1 structured data, you
246     need only consult the <literal>which</literal> field to determine the
247     type of data. You can the access  the data directly through the union.
248     When constructing data for encoding, you set the union pointer to point
249     to the data, and set the <literal>which</literal> field accordingly.
250     Remember also to set the direct (or indirect) reference to the correct
251     OID for the data type.
252     For non-ASN.1 data such as MARC records, use the
253     <literal>octet_aligned</literal> arm of the union.
254    </para>
255
256    <para>
257     Some servers return ASN.1 structured data values (eg. database
258     records) as BER-encoded records placed in the
259     <literal>octet-aligned</literal> branch of the EXTERNAL CHOICE.
260     The ASN-module will <emphasis>not</emphasis> automatically decode
261     these records. To help you decode the records in the application, the
262     function
263    </para>
264
265    <screen>
266     Z_ext_typeent *z_ext_gettypebyref(oid_value ref);
267    </screen>
268
269    <para>
270     Can be used to retrieve information about the known, external data
271     types. The function return a pointer to a static area, or NULL, if no
272     match for the given direct reference is found. The
273     <literal>Z_ext_typeent</literal>
274     is defined as:
275    </para>
276
277    <screen>
278 typedef struct Z_ext_typeent
279 {
280     oid_value dref;    /* the direct-reference OID value. */
281     int what;          /* discriminator value for the external CHOICE */
282     Odr_fun fun;       /* decoder function */
283 } Z_ext_typeent;
284    </screen>
285
286    <para>
287     The <literal>what</literal> member contains the
288     <literal>Z_External</literal> union discriminator value for the
289     given type: For the SUTRS record syntax, the value would be
290     <literal>Z_External_sutrs</literal>.
291     The <literal>fun</literal> member contains a pointer to the
292     function which encodes/decodes the given type. Again, for the SUTRS
293     record syntax, the value of <literal>fun</literal> would be
294     <literal>z_SUTRS</literal> (a function pointer).
295    </para>
296
297    <para>
298     If you receive an EXTERNAL which contains an octet-string value that
299     you suspect of being an ASN.1-structured data value, you can use
300     <literal>z_ext_gettypebyref</literal> to look for the provided
301     direct-reference.
302     If the return value is different from NULL, you can use the provided
303     function to decode the BER string (see section <link linkend="odr-use">
304      Using ODR</link>).
305    </para>
306
307    <para>
308     If you want to <emphasis>send</emphasis> EXTERNALs containing
309     ASN.1-structured values in the occtet-aligned branch of the CHOICE, this
310     is possible too. However, on the encoding phase, it requires a somewhat
311     involved juggling around of the various buffers involved.
312    </para>
313    <para>
314     If you need to add new, externally defined data types, you must update
315     the struct above, in the source file <filename>prt-ext.h</filename>, as
316     well as the encoder/decoder in the file <filename>prt-ext.c</filename>.
317     When changing the latter, remember to update both the <literal>arm</literal>
318     arrary and the list <literal>type_table</literal>, which drives the CHOICE
319     biasing that is necessary to tell the different, structured types apart
320     on decoding.
321    </para>
322
323    <note>
324     <para>
325      Eventually, the EXTERNAL processing will most likely
326      automatically insert the correct OIDs or indirect-refs. First,
327      however, we need to determine how application-context management
328      (specifically the presentation-context-list) should fit into the
329      various modules.
330     </para>
331    </note>
332
333   </sect1>
334   <sect1><title>PDU Contents Table</title>
335
336    <para>
337     We include, for reference, a listing of the fields of each top-level
338     PDU, as well as their default settings.
339    </para>
340
341    <table frame="top"><title>Default settings for PDU Initialize Request</title>
342     <tgroup cols="3">
343      <colspec colname="field"></colspec>
344      <colspec colname="type"></colspec>
345      <colspec colname="value"></colspec>
346      <thead>
347       <row>
348        <entry>Field</entry>
349        <entry>Type</entry>
350        <entry>Default Value</entry>
351       </row>
352      </thead>
353      <tbody>
354
355       <row><entry>
356         referenceId</entry><entry>Z_ReferenceId</entry><entry>NULL
357        </entry></row>
358
359       <row><entry>
360         protocolVersion</entry><entry>Odr_bitmask</entry><entry>Empty bitmask
361        </entry></row>
362
363       <row><entry>
364         options</entry><entry>Odr_bitmask</entry><entry>Empty bitmask
365        </entry></row>
366
367       <row><entry>
368         preferredMessageSize</entry><entry>int</entry><entry>30*1024
369        </entry></row>
370
371       <row><entry>
372         maximumRecordSize</entry><entry>int</entry><entry>30*1024
373        </entry></row>
374
375       <row><entry>
376         idAuthentication</entry><entry>Z_IdAuthentication</entry><entry>NULL
377        </entry></row>
378
379       <row><entry>
380         implementationId</entry><entry>char*</entry><entry>"YAZ (id=81)"
381        </entry></row>
382
383       <row><entry>
384         implementationName</entry><entry>char*</entry><entry>"Index Data/YAZ"
385        </entry></row>
386
387       <row><entry>
388         implementationVersion</entry><entry>char*</entry><entry>YAZ_VERSION
389        </entry></row>
390
391       <row><entry>
392         userInformationField</entry><entry>Z_UserInformation</entry><entry>NULL
393        </entry></row>
394
395       <row><entry>
396         otherInfo</entry><entry>Z_OtherInformation</entry><entry>NULL
397        </entry></row>
398
399      </tbody>
400     </tgroup>
401    </table>
402
403    <table frame="top"><title>Default settings for PDU Initialize Response</title>
404     <tgroup cols="3">
405      <colspec colname="field"></colspec>
406      <colspec colname="type"></colspec>
407      <colspec colname="value"></colspec>
408      <thead>
409       <row>
410        <entry>Field</entry>
411        <entry>Type</entry>
412        <entry>Default Value</entry>
413       </row>
414      </thead>
415      <tbody>
416
417       <row><entry>
418         referenceId</entry><entry>Z_ReferenceId</entry><entry>NULL
419        </entry></row>
420
421       <row><entry>
422         protocolVersion</entry><entry>Odr_bitmask</entry><entry>Empty bitmask
423        </entry></row>
424
425       <row><entry>
426         options</entry><entry>Odr_bitmask</entry><entry>Empty bitmask
427        </entry></row>
428
429       <row><entry>
430         preferredMessageSize</entry><entry>int</entry><entry>30*1024
431        </entry></row>
432
433       <row><entry>
434         maximumRecordSize</entry><entry>int</entry><entry>30*1024
435        </entry></row>
436
437       <row><entry>
438         result</entry><entry>bool_t</entry><entry>TRUE
439        </entry></row>
440
441       <row><entry>
442         implementationId</entry><entry>char*</entry><entry>"YAZ (id=81)"
443        </entry></row>
444
445       <row><entry>
446         implementationName</entry><entry>char*</entry><entry>"Index Data/YAZ"
447        </entry></row>
448
449       <row><entry>
450         implementationVersion</entry><entry>char*</entry><entry>YAZ_VERSION
451        </entry></row>
452
453       <row><entry>
454         userInformationField</entry><entry>Z_UserInformation</entry><entry>NULL
455        </entry></row>
456
457       <row><entry>
458         otherInfo</entry><entry>Z_OtherInformation</entry><entry>NULL
459        </entry></row>
460
461      </tbody>
462     </tgroup>
463    </table>
464
465    <table frame="top"><title>Default settings for PDU Search Request</title>
466     <tgroup cols="3">
467      <colspec colname="field"></colspec>
468      <colspec colname="type"></colspec>
469      <colspec colname="value"></colspec>
470      <thead>
471       <row>
472        <entry>Field</entry>
473        <entry>Type</entry>
474        <entry>Default Value</entry>
475       </row>
476      </thead>
477      <tbody>
478
479       <row><entry>
480         referenceId</entry><entry>Z_ReferenceId</entry><entry>NULL
481        </entry></row>
482
483       <row><entry>
484         smallSetUpperBound</entry><entry>int</entry><entry>0
485        </entry></row>
486
487       <row><entry>
488         largeSetLowerBound</entry><entry>int</entry><entry>1
489        </entry></row>
490
491       <row><entry>
492         mediumSetPresentNumber</entry><entry>int</entry><entry>0
493        </entry></row>
494
495       <row><entry>
496         replaceIndicator</entry><entry>bool_t</entry><entry>TRUE
497        </entry></row>
498
499       <row><entry>
500         resultSetName</entry><entry>char *</entry><entry>"default"
501        </entry></row>
502
503       <row><entry>
504         num_databaseNames</entry><entry>int</entry><entry>0
505        </entry></row>
506
507       <row><entry>
508         databaseNames</entry><entry>char **</entry><entry>NULL
509        </entry></row>
510
511       <row><entry>
512         smallSetElementSetNames</entry><entry>Z_ElementSetNames</entry><entry>NULL
513        </entry></row>
514
515       <row><entry>
516         mediumSetElementSetNames</entry><entry>Z_ElementSetNames</entry><entry>NULL
517        </entry></row>
518
519       <row><entry>
520         preferredRecordSyntax</entry><entry>Odr_oid</entry><entry>NULL
521        </entry></row>
522
523       <row><entry>
524         query</entry><entry>Z_Query</entry><entry>NULL
525        </entry></row>
526
527       <row><entry>
528         additionalSearchInfo</entry><entry>Z_OtherInformation</entry><entry>NULL
529        </entry></row>
530
531       <row><entry>
532         otherInfo</entry><entry>Z_OtherInformation</entry><entry>NULL
533        </entry></row>
534
535      </tbody>
536     </tgroup>
537    </table>
538
539    <screen>
540     Z_SearchResponse
541     ----------------
542     Field                        Type                Default value
543
544     referenceId                  Z_ReferenceId       NULL
545     resultCount                  int                 0
546     numberOfRecordsReturned      int                 0
547     nextResultSetPosition        int                 0
548     searchStatus                 bool_t              TRUE
549     resultSetStatus              int                 NULL
550     presentStatus                int                 NULL
551     records                      Z_Records           NULL
552     additionalSearchInfo         Z_OtherInformation  NULL
553     otherInfo                    Z_OtherInformation  NULL
554    </screen>
555
556    <screen>
557     Z_PresentRequest
558     ----------------
559     Field                        Type                Default value
560
561     referenceId                  Z_ReferenceId       NULL
562     resultSetId                  char*               "default"
563     resultSetStartPoint          int                 1
564     numberOfRecordsRequested     int                 10
565     num_ranges                   int                 0
566     additionalRanges             Z_Range             NULL
567     recordComposition            Z_RecordComposition NULL
568     preferredRecordSyntax        Odr_oid             NULL
569     maxSegmentCount              int                 NULL
570     maxRecordSize                int                 NULL
571     maxSegmentSize               int                 NULL
572     otherInfo                    Z_OtherInformation  NULL
573    </screen>
574
575    <screen>
576     Z_PresentResponse
577     -----------------
578     Field                        Type                Default value
579
580     referenceId                  Z_ReferenceId       NULL
581     numberOfRecordsReturned      int                 0
582     nextResultSetPosition        int                 0
583     presentStatus                int                 Z_PRES_SUCCESS
584     records                      Z_Records           NULL
585     otherInfo                    Z_OtherInformation  NULL
586    </screen>
587
588    <screen>
589     Z_DeleteResultSetRequest
590     ------------------------
591     Field                        Type                Default value
592
593     referenceId                  Z_ReferenceId       NULL
594     deleteFunction               int                 Z_DeleteRequest_list
595     num_ids                      int                 0
596     resultSetList                char**              NULL
597     otherInfo                    Z_OtherInformation  NULL
598    </screen>
599
600    <screen>
601     Z_DeleteResultSetResponse
602     -------------------------
603     Field                        Type                Default value
604
605     referenceId                  Z_ReferenceId       NULL
606     deleteOperationStatus        int                 Z_DeleteStatus_success
607     num_statuses                 int                 0
608     deleteListStatuses           Z_ListStatus**      NULL
609     numberNotDeleted             int                 NULL
610     num_bulkStatuses             int                 0
611     bulkStatuses                 Z_ListStatus        NULL
612     deleteMessage                char*               NULL
613     otherInfo                    Z_OtherInformation  NULL
614    </screen>
615
616    <screen>
617     Z_ScanRequest
618     -------------
619     Field                        Type                Default value
620
621     referenceId                  Z_ReferenceId       NULL
622     num_databaseNames            int                 0
623     databaseNames                char**              NULL
624     attributeSet                 Odr_oid             NULL
625     termListAndStartPoint        Z_AttributesPlus... NULL
626     stepSize                     int                 NULL
627     numberOfTermsRequested       int                 20
628     preferredPositionInResponse  int                 NULL
629     otherInfo                    Z_OtherInformation  NULL
630    </screen>
631
632    <screen>
633     Z_ScanResponse
634     --------------
635     Field                        Type                Default value
636
637     referenceId                  Z_ReferenceId       NULL
638     stepSize                     int                 NULL
639     scanStatus                   int                 Z_Scan_success
640     numberOfEntriesReturned      int                 0
641     positionOfTerm               int                 NULL
642     entries                      Z_ListEntris        NULL
643     attributeSet                 Odr_oid             NULL
644     otherInfo                    Z_OtherInformation  NULL
645    </screen>
646
647    <screen>
648     Z_TriggerResourceControlRequest
649     -------------------------------
650     Field                        Type                Default value
651
652     referenceId                  Z_ReferenceId       NULL
653     requestedAction              int                 Z_TriggerResourceCtrl_resou..
654     prefResourceReportFormat     Odr_oid             NULL
655     resultSetWanted              bool_t              NULL
656     otherInfo                    Z_OtherInformation  NULL
657    </screen>
658
659    <screen>
660     Z_ResourceControlRequest
661     ------------------------
662     Field                        Type                Default value
663
664     referenceId                  Z_ReferenceId       NULL
665     suspendedFlag                bool_t              NULL
666     resourceReport               Z_External          NULL
667     partialResultsAvailable      int                 NULL
668     responseRequired             bool_t              FALSE
669     triggeredRequestFlag         bool_t              NULL
670     otherInfo                    Z_OtherInformation  NULL
671    </screen>
672
673    <screen>
674     Z_ResourceControlResponse
675     -------------------------
676     Field                        Type                Default value
677
678     referenceId                  Z_ReferenceId       NULL
679     continueFlag                 bool_t              TRUE
680     resultSetWanted              bool_t              NULL
681     otherInfo                    Z_OtherInformation  NULL
682    </screen>
683
684    <screen>
685     Z_AccessControlRequest
686     ----------------------
687     Field                        Type                Default value
688
689     referenceId                  Z_ReferenceId       NULL
690     which                        enum                Z_AccessRequest_simpleForm;
691     u                            union               NULL
692     otherInfo                    Z_OtherInformation  NULL
693    </screen>
694
695    <screen>
696     Z_AccessControlResponse
697     -----------------------
698     Field                        Type                Default value
699
700     referenceId                  Z_ReferenceId       NULL
701     which                        enum                Z_AccessResponse_simpleForm
702     u                            union               NULL
703     diagnostic                   Z_DiagRec           NULL
704     otherInfo                    Z_OtherInformation  NULL
705    </screen>
706
707    <screen>
708     Z_Segment
709     ---------
710     Field                        Type                Default value
711
712     referenceId                  Z_ReferenceId       NULL
713     numberOfRecordsReturned      int                 value=0
714     num_segmentRecords           int                 0
715     segmentRecords               Z_NamePlusRecord    NULL
716     otherInfo                    Z_OtherInformation  NULL
717    </screen>
718
719    <screen>
720     Z_Close
721     -------
722     Field                        Type                Default value
723
724     referenceId                  Z_ReferenceId       NULL
725     closeReason                  int                 Z_Close_finished
726     diagnosticInformation        char*               NULL
727     resourceReportFormat         Odr_oid             NULL
728     resourceFormat               Z_External          NULL
729     otherInfo                    Z_OtherInformation  NULL
730
731    </screen>
732
733   </sect1>
734  </chapter>
735
736  <!-- Keep this comment at the end of the file
737  Local variables:
738  mode: sgml
739  sgml-omittag:t
740  sgml-shorttag:t
741  sgml-minimize-attributes:nil
742  sgml-always-quote-attributes:t
743  sgml-indent-step:1
744  sgml-indent-data:t
745  sgml-parent-document: "yaz.xml"
746  sgml-local-catalogs: "../../docbook/docbook.cat"
747  sgml-namecase-general:t
748  End:
749  -->