chiark / gitweb /
writeable lookups now compile
[chiark-tcl.git] / cdb / lookup.c
1 /**/
2
3 #include "chiark_tcl_cdb.h"
4
5 int cht_cdb_dosomelookup(Tcl_Interp *ip, void *db_v,
6                          const char *key, Tcl_Obj *def,
7                          Tcl_Obj **result,
8                          int (*somelookup)(Tcl_Interp *ip, void *db_v,
9                                            const char *key,
10                                            const Byte **data_r, int *len_r),
11                          int (*storeanswer)(Tcl_Interp *ip, Tcl_Obj **result,
12                                             const Byte *data, int len)) {
13   int r, len;
14   const Byte *data;
15   
16   r= somelookup(ip, db_v, key, &data, &len);
17   if (r) return r;
18   if (len>0) return storeanswer(ip, result, data, len);
19   if (def) { *result= def; return TCL_OK; }
20   return cht_staticerr(ip, "cdbwr lookup key not found", "CDB NOTFOUND");
21 }
22
23 int cht_cdb_storeanswer_string(Tcl_Interp *ip, Tcl_Obj **result,
24                                const Byte *data, int len) {
25   *result= Tcl_NewStringObj(data, len);
26   if (!*result) return cht_staticerr(ip, "Tcl_NewStringObj failed for"
27        " lookup (utf-8 encoding problem?)", "CDB BADSTRING");
28   return TCL_OK;
29 }
30   
31 int cht_cdb_storeanswer_hb(Tcl_Interp *ip, Tcl_Obj **result,
32                            const Byte *data, int len) {
33   HBytes_Value val;
34   cht_hb_array(&val, data, len);
35   *result= cht_ret_hb(ip, val);
36   return TCL_OK;
37 }