X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=hbytes%2Fhbytes.h;h=2b032877587cebcf815a987fd8883edcc2da9293;hb=9e72d3c3d91b86842aa947297e0d30bbc741c7b1;hp=10141825f3f3d1f35fd052014e8e7436edba378c;hpb=2fbe5a5eee8d5d28af55ea9e161d89543a9d8565;p=chiark-tcl.git diff --git a/hbytes/hbytes.h b/hbytes/hbytes.h index 1014182..2b03287 100644 --- a/hbytes/hbytes.h +++ b/hbytes/hbytes.h @@ -65,6 +65,14 @@ * uint VARNAME/VALUE (VARNAME if ul2bitfields; * ulong VARNAME/VALUE VALUE if bitfields2ul) * + * hbytes mask-map lookup MAP-VAR ADDRESS [DEFAULT] => DATA + * error on missing default or if any prefix longer than address + * hbytes mask-map amend MAP-VAR PREFIX PREFIX-LENGTH DATA + * a maskmap MAP is [list [list PREFIX PREFIX-LENGTH DATA]] sorted + * first by descending PREFIX-LENGTH and then by ascending PREFIX + * each PREFIX _in the map_ is truncated to the shortest number of + * pairs of hex digits which can represent it + * * Error codes * * HBYTES BLOCKCIPHER CRYPTFAIL CRYPT block cipher mode failed somehow (!) @@ -78,6 +86,13 @@ * HBYTES LENGTH MISMATCH when blocks must be exactly same length * HBYTES SYNTAX supposed hex block had wrong syntax * HBYTES VALUE OVERFLOW value to be conv'd to hex too big/long + * HBYTES MASKMAP NOMATCH no addr/mask matches address for lookup + * HBYTES MASKMAP UNDERRUN addr value for lookup is too short + * HBYTES MASKMAP SYNTAX LLENGTH value for mask-map entry not llength==3 + * HBYTES MASKMAP SYNTAX UNDERRUN value for mask-map entry hex too short + * HBYTES MASKMAP SYNTAX OVERRUN actual mask-map entry hex too short + * HBYTES MASKMAP SYNTAX ORDER actual mask-map is disordered + * HBYTES MASKMAP SYNTAX EXCLBITS mask-map has 1-bits outside prefix len * SOCKADDR AFUNIX LENGTH path for AF_UNIX socket too long * SOCKADDR SYNTAX IPV4 bad IPv4 socket address &/or port * SOCKADDR SYNTAX OTHER bad socket addr, couldn't tell what kind @@ -105,7 +120,9 @@ #include #include -#include +#include + +#include typedef unsigned char Byte; @@ -203,8 +220,25 @@ typedef struct { void **a; } IdDataTable; +/* The stored struct must start with a single int, conventionally + * named `ix'. When the struct is returned for the first time ix must + * be -1; on subsequent occasions it must be >=0. ix will be -1 iff + * the struct is registered by the iddatatable machinery. */ + extern Tcl_ObjType tabledataid_nearlytype; int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab); +void tabledataid_disposing(void *val, IdDataTable *tab); + /* call this when you destroy the struct, to remove its name; + * _disposing is idempotent*/ + +/* from adns.c */ + +typedef struct { + const char *name; + adns_rrtype number; +} AdnsTclRRTypeInfo; + +extern IdDataTable adnstcl_queries, adnstcl_resolvers; /* from dgram.c */ @@ -234,12 +268,30 @@ void obj_updatestr_string(Tcl_Obj *o, const char *str); /* from parse.c */ typedef struct { - HBytes_Value *hb; Tcl_Obj *obj, *var; int copied; +} Something_Var; + +void init_somethingv(Something_Var *sth); +void fini_somethingv(Tcl_Interp *ip, int rc, Something_Var *sth); +int pat_somethingv(Tcl_Interp *ip, Tcl_Obj *var, + Something_Var *sth, Tcl_ObjType *type); + +typedef struct { + HBytes_Value *hb; + Something_Var sth; } HBytes_Var; -void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg); +/* from maskmap.c */ + +typedef struct MaskMap_Value MaskMap_Value; + +typedef struct { + MaskMap_Value *mm; + Something_Var sth; +} MaskMap_Var; + +extern Tcl_ObjType maskmap_type; /* from chop.c */ /* only do_... functions declared in tables.h */ @@ -359,5 +411,6 @@ int setnonblock(int fd, int isnonblock); #define TALLOC(s) ((void*)Tcl_Alloc((s))) #define TFREE(f) (Tcl_Free((void*)(f))) +#define TREALLOC(p,l) ((void*)Tcl_Realloc((void*)(p),(l))) #endif /*HBYTES_H*/