+/**/
+
+#include "chiark_tcl_cdb.h"
+
+int cht_cdb_dosomelookup(Tcl_Interp *ip, void *db_v,
+ const char *key, Tcl_Obj *def,
+ Tcl_Obj **result,
+ int (*somelookup)(Tcl_Interp *ip, void *db_v,
+ const char *key,
+ const Byte **data_r, int *len_r),
+ int (*storeanswer)(Tcl_Interp *ip, Tcl_Obj **result,
+ const Byte *data, int len)) {
+ int r, len;
+ const Byte *data;
+
+ r= somelookup(ip, db_v, key, &data, &len);
+ if (r) return r;
+ if (len>0) return storeanswer(ip, result, data, len);
+ if (def) { *result= def; return TCL_OK; }
+ return cht_staticerr(ip, "cdbwr lookup key not found", "CDB NOTFOUND");
+}
+
+int cht_cdb_storeanswer_string(Tcl_Interp *ip, Tcl_Obj **result,
+ const Byte *data, int len) {
+ *result= Tcl_NewStringObj(data, len);
+ if (!*result) return cht_staticerr(ip, "Tcl_NewStringObj failed for"
+ " lookup (utf-8 encoding problem?)", "CDB BADSTRING");
+ return TCL_OK;
+}
+
+int cht_cdb_storeanswer_hb(Tcl_Interp *ip, Tcl_Obj **result,
+ const Byte *data, int len) {
+ HBytes_Value val;
+ cht_hb_array(&val, data, len);
+ *result= cht_ret_hb(ip, val);
+ return TCL_OK;
+}