3 #include "chiark_tcl_cdb.h"
5 int cht_cdb_donesomelookup(Tcl_Interp *ip, void *db_v,
6 Tcl_Obj *def, Tcl_Obj **result,
7 const Byte *data, int dlen,
8 int (*storeanswer)(Tcl_Interp *ip, Tcl_Obj **result,
9 const Byte *data, int len)) {
10 if (dlen>0) return storeanswer(ip, result, data, dlen);
11 if (def) { *result= def; return TCL_OK; }
12 return cht_staticerr(ip, "cdbwr lookup key not found", "CDB NOTFOUND");
15 int cht_cdb_storeanswer_string(Tcl_Interp *ip, Tcl_Obj **result,
16 const Byte *data, int len) {
17 *result= Tcl_NewStringObj(data, len);
18 if (!*result) return cht_staticerr(ip, "Tcl_NewStringObj failed for"
19 " lookup (utf-8 encoding problem?)", "CDB BADSTRING");
23 int cht_cdb_storeanswer_hb(Tcl_Interp *ip, Tcl_Obj **result,
24 const Byte *data, int len) {
26 cht_hb_array(&val, data, len);
27 *result= cht_ret_hb(ip, val);
31 int cht_cdb_lookup_cdb(Tcl_Interp *ip, struct cdb *cdb,
32 const Byte *key, int klen,
33 const Byte **data_r, int *len_r) {
36 r= cdb_find(cdb, key, klen);
37 if (!r) { *data_r= 0; *len_r= -1; return TCL_OK; }
38 if (r<0) return cht_posixerr(ip, errno, "cdb_find failed");
40 *len_r= cdb_datalen(cdb);
42 *data_r= cdb_getdata(cdb);
43 if (!*data_r) return cht_posixerr(ip, errno, "cdb_getdata failed");