+/** rset_default_read implements a generic read */
+int rset_default_read(RSFD rfd, void *buf, TERMID *term);
+
+/** rset_get_no_terms is a getterms function for those that don't have any */
+void rset_get_no_terms(RSET ct, TERMID *terms, int maxterms, int *curterm);
+
+/**
+ * rset_get_one_term is a getterms function for those rsets that have
+ * exactly one term, like all rsisamX types.
+ */
+void rset_get_one_term(RSET ct,TERMID *terms,int maxterms,int *curterm);
+
+/**
+ * key_control contains all there is to know about the keys stored in
+ * an isam, and therefore operated by the rsets. Other than this info,
+ * all we assume is that all keys are the same size, and they can be
+ * memcpy'd around
+ */
+struct rset_key_control {
+ void *context;
+ int key_size;
+ int scope; /* default for what level we operate (book/chapter/verse) on*/
+ /* usual sysno/seqno is 2 */
+ int (*cmp)(const void *p1, const void *p2);
+ void (*key_logdump_txt) (int logmask, const void *p, const char *txt);
+ zint (*getseq)(const void *p);
+ int (*filter_func)(const void *p, void *data);
+ void *filter_data;
+ void (*inc)(struct rset_key_control *kc);
+ void (*dec)(struct rset_key_control *kc);
+ /* FIXME - Should not need a getseq, it won't make much sense with */
+ /* higher-order keys. Use a (generalized) cmp instead, or something */
+ /* FIXME - decode and encode, and lots of other stuff */