Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/yaz
[yaz-moved-to-github.git] / doc / zoom.xml
index 2075f34..8a6bb92 100644 (file)
@@ -17,10 +17,9 @@ ZOOM_options_setl(opt, name, value, len)
 ZOOM_options_get_bool(opt, name, defa)
 ZOOM_options_get_int(opt, name, defa)
 ZOOM_options_set_int(opt, name, value)
-ZOOM_connection_scan1 (ZOOM_connection c, ZOOM_query startterm)
+ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query startterm)
 ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
 -->
-<!-- $Id: zoom.xml,v 1.60 2007-06-21 09:00:53 adam Exp $ -->
  <chapter id="zoom"><title>ZOOM</title>
   <para>
     &zoom; is an acronym for 'Z39.50 Object-Orientation Model' and is
@@ -30,22 +29,25 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
    programming language or toolkit.
   </para>
 
-  <note>
-   <para>
-    A recent addition to &yaz; is SRU support. You can now make
-    SRU ZOOM connections by specifying scheme <literal>http://</literal>
-    for the hostname for a connection.  The dialect of SRU used is
-    specified by the value of the connection's <literal>sru</literal>
-    option, which may be SRU over HTTP GET (<literal>get</literal>),
-    SRU over HTTP POST (<literal>post</literal>) or SRW (SRU over
-    SOAP) (<literal>soap</literal>).  Using the facility for embedding
-    options in target strings, a connection can be forced to use SRU
-    rather the SRW (the default) by prefixing the target string with
-    <literal>sru=get,</literal>, like this:
+  <para>
+    From YAZ version 2.1.12, <ulink url="&url.sru;">SRU</ulink> is supported.
+    You can make SRU ZOOM connections by specifying scheme
+    <literal>http://</literal> for the hostname for a connection.
+    The dialect of SRU used is specified by the value of the
+    connection's <literal>sru</literal> option, which may be SRU over
+    HTTP GET (<literal>get</literal>),
+    SRU over HTTP POST (<literal>post</literal>), (SRU over
+    SOAP) (<literal>soap</literal>) or <literal>SOLR</literal>
+    (<ulink url="&url.solr;">SOLR</ulink> Web Service).
+    Using the facility for embedding options in target strings, a
+    connection can be forced to use SRU rather the SRW (the default) by
+    prefixing the target string with <literal>sru=get,</literal>, like this:
     <literal>sru=get,http://sru.miketaylor.org.uk:80/sru.pl</literal>
-   </para>
-  </note>
-
+  </para>
+  <para>
+    <ulink url="&url.solr;">SOLR</ulink>  protocol support was added to YAZ in version 4.1.0, 
+    as a dialect of a SRU protocol, since both are HTTP based protocols. 
+  </para>
   <para>
    The lack of a simple Z39.50 client API for &yaz; has become more
    and more apparent over time. So when the first &zoom; specification
@@ -96,7 +98,7 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     
     void ZOOM_connection_connect(ZOOM_connection c, const char *host,
                                  int portnum);
-    void ZOOM_connection_destroy (ZOOM_connection c);
+    void ZOOM_connection_destroy(ZOOM_connection c);
    </synopsis>
    <para>
     Connection objects are created with either function
@@ -116,7 +118,8 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
    <para>
     You can prefix the host with a scheme followed by colon. The
     default scheme is <literal>tcp</literal> (Z39.50 protocol).
-    The scheme <literal>http</literal> selects SRU over HTTP.
+    The scheme <literal>http</literal> selects SRU/get over HTTP by default, 
+    but can overridded to use SRU/post, SRW and the SOLR protocol. 
    </para>
    <para>
     You can prefix the scheme-qualified host-string with one or more
@@ -193,7 +196,15 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
         It's automatically set internally when connecting to a target.
        </entry><entry>none</entry></row>
       <row><entry>
-        proxy</entry><entry>Proxy host
+        proxy</entry><entry>Proxy host. If set, the logical host
+       is encoded in the otherInfo area of the Z39.50 Init PDU
+       with OID 1.2.840.10003.10.1000.81.1.
+       </entry><entry>none</entry></row>
+      <row><entry>
+        clientIP</entry><entry>Client IP. If set, is
+       encoded in the otherInfo area of a Z39.50 PDU with OID
+       1.2.840.10003.10.1000.81.3. Holds the original IP addreses
+       of a client. Is used of ZOOM is used in a gateway of some sort.
        </entry><entry>none</entry></row>
       <row><entry>
         async</entry><entry>If true (1) the connection operates in 
@@ -267,6 +278,28 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
        discover whether the server claims to support the specified
        operations.
        </entry><entry>none</entry></row>
+      <row>
+       <entry>sru</entry><entry>
+       SRU/SOLR transport type. Must be either <literal>soap</literal>,
+       <literal>get</literal>, <literal>post</literal>, or
+       <literal>solr</literal>.
+        </entry><entry>soap</entry></row>
+      <row><entry>
+        sru_version</entry><entry>
+       SRU/SRW version. Should be <literal>1.1</literal>, or
+       <literal>1.2</literal>. This is , prior to connect, the version
+       to offer (highest version). And following connect (in fact
+       first operation), holds the negotiated version with the server
+       (same or lower version).
+       </entry><entry>1.2</entry></row>
+      <row><entry>
+        facets</entry><entry>
+       A FacetList is comma-separated list of facet, which is defined
+       as <literal>AttributeList</literal>  and a optional FacetTerm
+       (a Term and a frequency). On request the terms is missing. 
+       On response the the list contains the terms that the target
+       could collect. 
+       </entry><entry>none</entry></row>
      </tbody>
     </tgroup>
    </table>
@@ -277,10 +310,10 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
      Character Set and Language Negotiation</ulink> is in effect.
    </para>
    <synopsis>
-     int ZOOM_connection_error (ZOOM_connection c, const char **cp,
-                                const char **addinfo);
-     int ZOOM_connection_error_x (ZOOM_connection c, const char **cp,
-                                  const char **addinfo, const char **dset);
+     int ZOOM_connection_error(ZOOM_connection c, const char **cp,
+                               const char **addinfo);
+     int ZOOM_connection_error_x(ZOOM_connection c, const char **cp,
+                                 const char **addinfo, const char **dset);
    </synopsis>
    <para>
     Function <function>ZOOM_connection_error</function> checks for
@@ -333,14 +366,14 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     </para>
     </sect2>
    <sect2 id="zoom.sru.init.behavior">
-    <title>SRU Protocol behavior</title>
+    <title>SRU/SOLR Protocol behavior</title>
     <para>
-     The SRU protocol doesn't feature an Inititialize Request, so
+     The HTTP based protocols (SRU, SRW, SOLR) doesn't feature an Inititialize Request, so
      the connection phase merely establishes a TCP/IP connection
      with the SOAP service.
     </para>
     <para>Most of the ZOOM connection options do not
-     affect SRU and they are ignored. However, future versions
+     affect SRU/SOLR and they are ignored. However, future versions
      of &yaz; might honor <literal>implementationName</literal> and
      put that as part of User-Agent header for HTTP requests.
      </para>
@@ -394,17 +427,15 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     a target.
    </para>
    <synopsis>
-     ZOOM_resultset ZOOM_connection_search(ZOOM_connection,
-                                           ZOOM_query q);
+     ZOOM_resultset ZOOM_connection_search(ZOOM_connection, ZOOM_query q);
 
      ZOOM_resultset ZOOM_connection_search_pqf(ZOOM_connection c,
                                                const char *q);
-
      void ZOOM_resultset_destroy(ZOOM_resultset r);
    </synopsis>
    <para>
     Function <function>ZOOM_connection_search</function> creates
-     a result set given a connection and query.
+    a result set given a connection and query.
     Destroy a result set by calling
     <function>ZOOM_resultset_destroy</function>.
     Simple clients may using PQF only may use function
@@ -412,14 +443,12 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     creating query objects is not necessary.
    </para>
    <synopsis>
-     void ZOOM_resultset_option_set (ZOOM_resultset r,
-                                      const char *key,
-                                      const char *val);
+     void ZOOM_resultset_option_set(ZOOM_resultset r,
+                                    const char *key, const char *val);
 
-     const char *ZOOM_resultset_option_get (ZOOM_resultset r,
-                                             const char *key);
+     const char *ZOOM_resultset_option_get(ZOOM_resultset r, const char *key);
 
-     size_t ZOOM_resultset_size (ZOOM_resultset r);
+     size_t ZOOM_resultset_size(ZOOM_resultset r);
    </synopsis>
    <para>
     Functions <function>ZOOM_resultset_options_set</function> and
@@ -449,13 +478,21 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
         start</entry><entry>Offset of first record to be 
         retrieved from target. First record has offset 0 unlike the
         protocol specifications where first record has position 1.
+       This option affects ZOOM_resultset_search and
+       ZOOM_resultset_search_pqf and must be set before any of
+       these functions are invoked. If a range of
+       records must be fetched manually after search,
+       function ZOOM_resultset_records should be used.
        </entry><entry>0</entry></row>
       <row><entry>
-        count</entry><entry>Number of records to be retrieved.
+        count</entry><entry>Number of records to be retrieved. 
+       This option affects ZOOM_resultset_search and
+       ZOOM_resultset_search_pqf and must be set before any of
+       these functions are invoked.
        </entry><entry>0</entry></row>
       <row><entry>
        presentChunk</entry><entry>The number of records to be
-       requested from the server in each chunk (present requst).  The
+       requested from the server in each chunk (present request). The
        value 0 means to request all the records in a single chunk.
        (The old <literal>step</literal>
        option is also supported for the benefit of old applications.)
@@ -634,7 +671,10 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
      SRU SearchRetrieveRequest.
     </para>
     <para>
-     Unfortunately, SRU does not define a database setting. Hence,
+     SOLR queries has to be done in SOLR query format.
+    </para>
+    <para>
+     Unfortunately, SRU or SOLR does not define a database setting. Hence,
      <literal>databaseName</literal> is unsupported and ignored.
      However, the path part in host parameter for functions 
      <function>ZOOM_connecton_new</function> and
@@ -660,9 +700,9 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
      int ZOOM_record_error(ZOOM_record rec, const char **msg,
                            const char **addinfo, const char **diagset);
 
-     ZOOM_record ZOOM_record_clone (ZOOM_record rec);
+     ZOOM_record ZOOM_record_clone(ZOOM_record rec);
 
-     void ZOOM_record_destroy (ZOOM_record rec);
+     void ZOOM_record_destroy(ZOOM_record rec);
    </synopsis>
    <para>
     References to temporary records are returned by functions 
@@ -710,17 +750,34 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     The <parameter>type</parameter> is a string of the format:
    </para>
    <para>
-    <replaceable>form</replaceable>[; charset=<replaceable>from</replaceable>[,<replaceable>to</replaceable>]]
+    <replaceable>format</replaceable>[;charset=<replaceable>from</replaceable>[/<replaceable>opacfrom</replaceable>][,<replaceable>to</replaceable>]][;format=<replaceable>v</replaceable>]
    </para>
    <para>
-    where <replaceable>form</replaceable> specifies the format of the
+    where <replaceable>format</replaceable> specifies the format of the
     returned record, <replaceable>from</replaceable>
     specifies the character set of the record in its original form
     (as returned by the server), <replaceable>to</replaceable> specifies
     the output (returned)
     character set encoding.
-    If charset is not given, then no character set conversion takes place.
     If <replaceable>to</replaceable> is omitted UTF-8 is assumed.
+    If charset is not given, then no character set conversion takes place.
+   </para>
+   
+   <para>OPAC records may be returned in a different
+     set from the bibliographic MARC record. If this is this the case,
+    <replaceable>opacfrom</replaceable> should be set to the character set
+    of the OPAC record part.
+   </para>
+   <note>
+     <para>
+       Specifying the OPAC record character set requires YAZ 4.1.5 or later.
+     </para>
+   </note>
+   <para>
+    The format argument controls whether record data should be XML
+    pretty-printed (post process operation).
+    It is enabled only if format value <replaceable>v</replaceable> is 
+    <literal>1</literal> and the record content is XML well-formed.
    </para>
    <para>
     In addition, for certain types, the length
@@ -744,6 +801,12 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
         <literal>const char *</literal>. 
        </para></listitem>
      </varlistentry>
+     <varlistentry><term><literal>schema</literal></term>
+      <listitem><para>The schema of the record is returned
+        as a C null-terminated string. Return type is
+        <literal>const char *</literal>. 
+       </para></listitem>
+     </varlistentry>
      <varlistentry><term><literal>render</literal></term>
       <listitem><para>The record is returned in a display friendly
         format. Upon completion buffer is returned
@@ -764,20 +827,37 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
      </varlistentry>
      <varlistentry><term><literal>xml</literal></term>
       <listitem><para>The record is returned in XML if possible.
-       SRU and Z39.50 records with transfer syntax XML are
+       SRU, SOLR and Z39.50 records with transfer syntax XML are
        returned verbatim. MARC records are returned in
        <ulink url="&url.marcxml;">
         MARCXML
         </ulink> 
        (converted from ISO2709 to MARCXML by YAZ).
-       GRS-1 and OPAC records are not supported for this form.
+       OPAC records are also converted to XML and the 
+       bibliographic record is converted to MARCXML (when possible).
+       GRS-1 records are not supported for this form.
         Upon completion, the XML buffer is returned
        (type <literal>const char *</literal>) and length is stored in
         <literal>*len</literal>.
        </para></listitem>
      </varlistentry>
      <varlistentry><term><literal>opac</literal></term>
-      <listitem><para>OPAC for record is returned in XML.
+      <listitem><para>OPAC information for record is returned in XML
+       if an OPAC record is present at the position given. If no
+       OPAC record is present, a NULL pointer is returned.
+       </para></listitem>
+     </varlistentry>
+     <varlistentry><term><literal>txml</literal></term>
+      <listitem><para>The record is returned in TurboMARC if possible.
+       SRU and Z39.50 records with transfer syntax XML are
+       returned verbatim. MARC records are returned in
+       <link linkend="tools.turbomarc">
+        TurboMARC
+       </link> 
+       (converted from ISO2709 to TurboMARC by YAZ).
+       Upon completion, the XML buffer is returned
+       (type <literal>const char *</literal>) and length is stored in
+        <literal>*len</literal>.
        </para></listitem>
      </varlistentry>
     </variablelist>
@@ -814,14 +894,68 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     </para>
    </sect2>
    <sect2 id="zoom.sru.record.behavior">
-    <title>SRU Protocol behavior</title>
+    <title>SRU/SOLR Protocol behavior</title>
     <para>
-     The ZOOM driver for SRU treats records returned by a SRU server
+     The ZOOM driver for SRU/SOLR treats records returned by a SRU/SOLR server
      as if they where Z39.50 records with transfer syntax XML and
      no element set name or database name.
     </para>
    </sect2>
   </sect1>
+  <sect1 id="zoom.facets"><title>Facets</title>
+   <para>
+    Facets operations is not part of the official ZOOM specification, but is an Index Data extension 
+    for YAZ-based Z39.50 targets or <ulink url="&url.solr;">SOLR</ulink> targets. 
+    In case the target can and is requested to return facets, using a result set the ZOOM client 
+    can request one or all facet fields. Using a facet field the client can request the term count and 
+    then interate over the terms.
+   </para>
+   <synopsis>
+    ZOOM_facet_field *ZOOM_resultset_facets(ZOOM_resultset r);
+    const char ** ZOOM_resultset_facets_names(ZOOM_resultset r);
+    ZOOM_facet_field ZOOM_resultset_get_facet_field(ZOOM_resultset r, const char *facet_name);
+    ZOOM_facet_field ZOOM_resultset_get_facet_field_by_index(ZOOM_resultset r, int pos);
+    size_t ZOOM_resultset_facets_size(ZOOM_resultset r);
+
+    const char *ZOOM_facet_field_name(ZOOM_facet_field facet_field);
+    size_t ZOOM_facet_field_term_count(ZOOM_facet_field facet_field);
+    const char *ZOOM_facet_field_get_term(ZOOM_facet_field facet_field, size_t idx, int *freq);
+   </synopsis>
+   <para>
+    References to temporary structures are returned by all functions. They are only valid as long the Result set is valid.  
+    <function>ZOOM_resultset_get_facet_field</function> or
+    <function>ZOOM_resultset_get_facet_field_by_index</function>.
+    <function>ZOOM_resultset_facets</function>.
+    <function>ZOOM_resultset_facets_names</function>.
+    <function>ZOOM_facet_field_name</function>.
+    <function>ZOOM_facet_field_get_term</function>.
+    </para>
+   <para id="zoom.resultset.get_facet_field">
+    A single Facet field  is returned by function
+    <function>ZOOM_resultset_get_facet_field</function> or <function>ZOOM_resultset_get_facet_field_by_index</function> that takes a 
+    result set and facet name or positive index respectively. First facet has position zero.
+    If no facet could be obtained (invalid name or index out of bounds) <literal>NULL</literal> is returned.
+   </para>
+   <para id="zoom.resultset.facets">
+    An array of facets field can be returned by <function>ZOOM_resultset_facets</function>. The length of the array is 
+    given by <function>ZOOM_resultset_facets_size</function>. The array is zero-based and last entry will be at 
+    <function>ZOOM_resultset_facets_size(result_set)</function>-1. 
+   </para>
+   <para id="zoom.resultset.facets_names">
+    It is possible to interate over facets by name, by calling <function>ZOOM_resultset_facets_names</function>. 
+    This will return an const array of char * where each string can be used as parameter for 
+    <function>ZOOM_resultset_get_facet_field</function>. 
+   </para>
+   <para>
+   Function <function>ZOOM_facet_field_name</function> gets the request facet name from a returned facet field. 
+   </para>
+   <para>
+   Function <function>ZOOM_facet_field_get_term</function> returns the idx'th term and term count for a facet field. 
+   Idx must between 0 and <function>ZOOM_facet_field_term_count</function>-1, otherwise the returned reference will be 
+   <literal>NULL</literal>. On a valid idx, the value of the freq reference will be the term count. 
+   The *freq parameter must be valid pointer to integer.   
+   </para>
+   </sect1>
   <sect1 id="zoom.scan"><title>Scan</title>
    <para>
     This section describes an interface for Scan. Scan is not an
@@ -831,26 +965,28 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
    </para>
 
    <para>
-    The Scan interface is Z39.50 only. SRW version 1.0 does not
-    support this.
+    The Scan interface is supported for both Z39.50, SRU (and SOLR?).
    </para>
 
    <synopsis>
     ZOOM_scanset ZOOM_connection_scan(ZOOM_connection c,
                                       const char *startpqf);
 
+    ZOOM_scanset ZOOM_connection_scan1(ZOOM_connection c,
+                                       ZOOM_query q);
+
     size_t ZOOM_scanset_size(ZOOM_scanset scan);
 
-    const char * ZOOM_scanset_term(ZOOM_scanset scan, size_t pos,
-                                   int *occ, size_t *len);
+    const char *ZOOM_scanset_term(ZOOM_scanset scan, size_t pos,
+                                  size_t *occ, size_t *len);
 
-    const char * ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos,
-                                           int *occ, size_t *len);
+    const char *ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos,
+                                          size_t *occ, size_t *len);
 
-    void ZOOM_scanset_destroy (ZOOM_scanset scan);
+    void ZOOM_scanset_destroy(ZOOM_scanset scan);
 
     const char *ZOOM_scanset_option_get(ZOOM_scanset scan,
-                                         const char *key);
+                                        const char *key);
 
     void ZOOM_scanset_option_set(ZOOM_scanset scan, const char *key,
                                  const char *val);
@@ -894,6 +1030,12 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
      @attr 1=4 @attr 6=2 "science o"
     </literallayout>
    </para>
+
+   <para>
+    The <function>ZOOM_connecton_scan1</function> is a newer and
+    more generic alternative to <function>ZOOM_connection_scan</function>
+    which allows to use both CQL and PQF for Scan.
+   </para>
    
    <table frame="top" id="zoom.scanset.options">
     <title>ZOOM Scan Set Options</title>
@@ -912,7 +1054,7 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
       <row><entry>
         number</entry><entry>Number of Scan Terms requested in next scan.
         After scan it holds the actual number of terms returned.
-       </entry><entry>10</entry></row>
+       </entry><entry>20</entry></row>
       <row><entry>
         position</entry><entry>Preferred Position of term in response
         in next scan; actual position after completion of scan.
@@ -1145,7 +1287,7 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
         <literal>recordDelete</literal>,
         <literal>elementUpdate</literal>.
        </entry>
-       <entry><literal>specialUpdate</literal></entry>
+       <entry><literal>specialUpdate (recordInsert for updateVersion=1 which does not support specialUpdate)</literal></entry>
        </row>
        <row>
        <entry>recordIdOpaque</entry>
@@ -1163,6 +1305,19 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
        <entry>none</entry>
        </row>
        <row>
+       <entry>recordOpaque</entry>
+       <entry>Specifies an opaque record which is
+         encoded as an ASN.1 ANY type with the OID as tiven by option
+         <literal>syntax</literal> (see below).
+         Option <literal>recordOpaque</literal> is an alternative
+         to record - and <literal>record</literal> option (above) is
+         ignored if recordOpaque is set. This option is only available in 
+         YAZ 3.0.35 and later and is meant to facilitate Updates with
+         servers from OCLC.
+       </entry>
+       <entry>none</entry>
+       </row>
+       <row>
        <entry>syntax</entry>
        <entry>The record syntax (transfer syntax). Is a string that
         is a known record syntax.
@@ -1189,6 +1344,20 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
        <entry>Element Set for Record</entry>
        <entry>none</entry>
        </row>
+       <row>
+       <entry>updateVersion</entry>
+       <entry>Record Update version which holds one of the values
+        1, 2 or 3. Each version has a distinct OID:
+        1.2.840.10003.9.5
+        (<ulink url="&url.z39.50.extupdate1;">first version</ulink>) ,
+        1.2.840.10003.9.5.1 
+        (second version) and 
+        1.2.840.10003.9.5.1.1 
+        (<ulink url="&url.z39.50.extupdate3;">third and
+         newest version</ulink>).
+       </entry>
+       <entry>3</entry>
+       </row>
       </tbody>
      </tgroup>
     </table>
@@ -1285,26 +1454,26 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     an associative array / hash.
    </para>
    <synopsis>
-     ZOOM_options ZOOM_options_create (void);
+     ZOOM_options ZOOM_options_create(void);
 
-     ZOOM_options ZOOM_options_create_with_parent (ZOOM_options parent);
+     ZOOM_options ZOOM_options_create_with_parent(ZOOM_options parent);
 
-     void ZOOM_options_destroy (ZOOM_options opt);
+     void ZOOM_options_destroy(ZOOM_options opt);
    </synopsis>
    <synopsis>
-     const char *ZOOM_options_get (ZOOM_options opt, const char *name);
+     const char *ZOOM_options_get(ZOOM_options opt, const char *name);
 
-     void ZOOM_options_set (ZOOM_options opt, const char *name,
-                            const char *v);
+     void ZOOM_options_set(ZOOM_options opt, const char *name,
+                           const char *v);
    </synopsis>
    <synopsis>
      typedef const char *(*ZOOM_options_callback)
-                                     (void *handle, const char *name);
+                            (void *handle, const char *name);
 
      ZOOM_options_callback
-             ZOOM_options_set_callback (ZOOM_options opt,
-                                        ZOOM_options_callback c,
-                                        void *handle);
+             ZOOM_options_set_callback(ZOOM_options opt,
+                                       ZOOM_options_callback c,
+                                       void *handle);
    </synopsis>
   </sect1>
   <sect1 id="zoom.events"><title>Events</title>
@@ -1313,7 +1482,7 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
     with events.
    </para>
    <synopsis>
-    int ZOOM_event (int no, ZOOM_connection *cs);
+    int ZOOM_event(int no, ZOOM_connection *cs);
    </synopsis>
    <para>
     The <function>ZOOM_event</function> executes pending events for