enum Z3950_recordSyntax {
    Z3950_recordSyntax_GRS1,
    Z3950_recordSyntax_SUTRS,
    Z3950_recordSyntax_USMARC,
    Z3950_recordSyntax_XML,
};

class Z3950 {
    static void *option(char *key, void *val = 0);
    static int errcode();
    static char *errmsg();
    static char *addinfo();
};

  class Z3950_connection {
    Z3950_connection(char *hostname, int portnum);
    void *option(char *key, void *val = 0);
      Z3950_resultSet *search(Z3950_search *search);
    int errcode();
    char *errmsg();
    char *addinfo();
};

class Z3950_search {
    // pure virtual class: derive concrete subclasses from it
};

class Z3950_prefix_search: public Z3950_search {
    Z3950_prefix_search(char *query);
};

// ### Also need CCL search, build-by-hand tree, etc.

class Z3950_resultSet {
    // No public constructor: these are created by Z3950_connection
    void *option(char *key, void *val = 0);
    size_t size();
    Z3950_record *record(size_t i);
    Z3950_record **records(size_t *np);
    int errcode();
    char *errmsg();
    char *addinfo();
};

class Z3950_record {
    // No public constructor: these are created by Z3950_resultSet
    Z3950_recordSyntax recsyn();
    size_t nfields();
    char *field(char *spec);
    char *render();
    char *rawdata(size_t *sizep);
};

class Z3950_error {
    // pure virtual class: derive concrete subclasses from it
};

class Z3950_system_error: public Z3950_error {
    Z3950_system_error();
    int errcode();
};

class Z3950_bib1_error: public Z3950_error {
    Z3950_bib1_error(int errcode, char *addinfo);
    int errcode() { return code; }
    char *addinfo() { return info; }
};
