From: ian Date: Sat, 11 Feb 2006 19:25:36 +0000 (+0000) Subject: writeable lookups now compile X-Git-Tag: debian/1.1.1~68 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=commitdiff_plain;h=9eb8c5c8a5caa7264d7d3464cf650baffb42a05c writeable lookups now compile --- diff --git a/cdb/Makefile b/cdb/Makefile index 58fa5aa..07082e9 100644 --- a/cdb/Makefile +++ b/cdb/Makefile @@ -1,6 +1,6 @@ BASE_DIR = ../base EXTBASE = cdb -CFILES = readonly writeable +CFILES = readonly writeable lookup OTHER_TCTS = ../hbytes/hbytes-base.tct CPPFLAGS += -I../hbytes LDLIBS += ../hbytes/chiark_tcl_hbytes.so -lcdb diff --git a/cdb/cdb.tct b/cdb/cdb.tct index 29325f1..4df47f3 100644 --- a/cdb/cdb.tct +++ b/cdb/cdb.tct @@ -89,8 +89,8 @@ Table cdbwr Cdbwr_SubCommand lookup-hb 0 db iddata(&cdbtcl_rwdatabases) key string - ?def hb - => hb + ?def obj + => obj delete 0 db iddata(&cdbtcl_rwdatabases) key string diff --git a/cdb/chiark_tcl_cdb.h b/cdb/chiark_tcl_cdb.h index 99bcc03..63259a8 100644 --- a/cdb/chiark_tcl_cdb.h +++ b/cdb/chiark_tcl_cdb.h @@ -21,4 +21,19 @@ extern const IdDataSpec cdbtcl_databases, cdbtcl_rwdatabases; +/*---------- from lookup.c ----------*/ + +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 cht_cdb_storeanswer_string(Tcl_Interp *ip, Tcl_Obj **result, + const Byte *data, int len); +int cht_cdb_storeanswer_hb(Tcl_Interp *ip, Tcl_Obj **result, + const Byte *data, int len); + #endif /*CHIARK_TCL_CDB_H*/ diff --git a/cdb/lookup.c b/cdb/lookup.c new file mode 100644 index 0000000..52598ef --- /dev/null +++ b/cdb/lookup.c @@ -0,0 +1,37 @@ +/**/ + +#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; +} diff --git a/cdb/writeable.c b/cdb/writeable.c index fb7a67f..1059a10 100644 --- a/cdb/writeable.c +++ b/cdb/writeable.c @@ -94,9 +94,8 @@ static void ht_maybeupdate(HashTable *ht, const char *key, static const HashValue *ht_lookup(HashTable *ht, const char *key) { Tcl_HashEntry *he; - const HashValue *htv; - he= Tcl_FindHashEntry(ht, key); + he= Tcl_FindHashEntry(&ht->t, key); if (!he) return 0; return Tcl_GetHashValue(he); @@ -847,11 +846,11 @@ int cht_do_cdbwr_delete(ClientData cd, Tcl_Interp *ip, void *rw_v, /*---------- Lookups ----------*/ -static int wrlookup(Tcl_Interp *ip, void *rw_v, const char *key, +static int lookup_rw(Tcl_Interp *ip, void *rw_v, const char *key, const Byte **data_r, int *len_r /* -1 => notfound */) { Rw *rw= rw_v; const HashValue *val; - int r, l; + int r; val= ht_lookup(&rw->logincore, key); if (val) { @@ -870,50 +869,16 @@ static int wrlookup(Tcl_Interp *ip, void *rw_v, const char *key, return TCL_OK; } -int cht_cdb_dosomelookup(ClientData cd, Tcl_Interp *ip, void *db_v, - int (*somelookup)(Tcl_Interp *ip, void *db_v, - const char *key, - const Byte **data_r, int *len_r), - const char *key, Tcl_Obj *def, - Tcl_Obj **result) { - int r, len; - const Byte *data; - - r= somelookup(ip, db_v, key, &data, &len); - if (r) return r; - if (len>0) { - r= storeanswer(); - } - if (def) { - *result= def; - return TCL_OK; - } - return cht_staticerr(ip, "cdbwr lookup key not found", "CDB NOTFOUND"); - - if (len<0) *result= def; - else *result= Tcl_NewStringObj( +int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *rw_v, + const char *key, Tcl_Obj *def, + Tcl_Obj **result) { + return cht_cdb_dosomelookup(ip, rw_v, key, def, result, + lookup_rw, cht_cdb_storeanswer_string); } - -static int storeanswer -int cht_do_cdbwr_lookup(ClientData cd, Tcl_Interp *ip, void *rw_v, - const char *key, HBytes_Value def, - HBytes_Value *result) { - *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_do_cdbwr_lookup_hb(ClientData cd, Tcl_Interp *ip, void *rw_v, - const char *key, HBytes_Value def, - HBytes_Value *result) { - Rw *rw= rw_v; - int r; - - r= lookup(ip, rw, key, &data, &len); - if (r) return r; - if (len>0) { - cht_hb_array(result, data, len); - return TCL_OK; - } - if (!HBYTES_ISSENTINEL(def)) { - cht_hb_array(result, cht_hb_data(&def), cht_hb + const char *key, Tcl_Obj *def, + Tcl_Obj **result) { + return cht_cdb_dosomelookup(ip, rw_v, key, def, result, + lookup_rw, cht_cdb_storeanswer_hb); +}