+ if (!adns__vbuf_append(vb,"\"",1)) return 0;
+ return 1;
+}
+
+static int csp_qstring(vbuf *vb, const char *dp) {
+ return csp_textdata(vb, dp, strlen(dp));
+}
+
+static adns_status cs_str(vbuf *vb, const void *datap) {
+ const char *const *rrp= datap;
+
+ return csp_qstring(vb,*rrp) ? adns_s_ok : adns_s_nolocalmem;
+}
+
+static adns_status cs_intstr(vbuf *vb, const void *datap) {
+ const adns_rr_intstr *rrp= datap;
+ char buf[10];
+
+ sprintf(buf,"%u ",rrp->i);
+ return (adns__vbuf_appendstr(vb,buf) &&
+ csp_qstring(vb,rrp->str)) ? adns_s_ok : adns_s_nolocalmem;
+}
+
+static adns_status cs_manyistr(vbuf *vb, const void *datap) {
+ const adns_rr_intstr *const *rrp= datap;
+ const adns_rr_intstr *current;
+ int spc;
+
+ for (spc=0, current= *rrp; current->i >= 0; current++) {
+ if (spc)
+ if (!adns__vbuf_append(vb," ",1)) goto x_nomem;
+ if (!csp_textdata(vb,current->str,current->i)) goto x_nomem;
+ }
+ return adns_s_ok;
+
+ x_nomem:
+ return adns_s_nolocalmem;
+}
+
+static void mf_str(adns_query qu, void *datap) {
+ char **rrp= datap;
+
+ adns__makefinal_str(qu,rrp);
+}
+
+static void mf_intstr(adns_query qu, void *datap) {
+ adns_rr_intstr *rrp= datap;
+
+ adns__makefinal_str(qu,&rrp->str);
+}
+
+static void mf_manyistr(adns_query qu, void *datap) {
+ adns_rr_intstr **rrp= datap;
+ adns_rr_intstr *te, *table;
+ void *tablev;
+ int tc;
+
+ for (tc=0, te= *rrp; te->i >= 0; te++, tc++);
+ tablev= *rrp;
+ adns__makefinal_block(qu,&tablev,sizeof(*te)*(tc+1));
+ *rrp= table= tablev;
+ for (te= *rrp; te->i >= 0; te++)
+ adns__makefinal_str(qu,&te->str);