X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=hbytes%2Fhbytes.h;h=4a2f394862eb5eb31e5f618738e96d811f84e092;hp=55a22867ab71cf28aac06e2e7b2d99fc5570a0bc;hb=82f88c53ddb84e42c770c23feb9bb0ee18341188;hpb=3340221c68f8c948db9d2d3b553692fe642dd0f8 diff --git a/hbytes/hbytes.h b/hbytes/hbytes.h index 55a2286..4a2f394 100644 --- a/hbytes/hbytes.h +++ b/hbytes/hbytes.h @@ -135,12 +135,9 @@ #include #include #include +#include -#include - -#include - -typedef unsigned char Byte; +#include "chiark-tcl.h" /* from hbytes.c */ @@ -167,132 +164,48 @@ typedef struct { */ } HBytes_ComplexValue; /* pointed to from internalRep.otherValuePtr */ +void memxor(Byte *dest, const Byte *src, int l); + /* Public interfaces: */ -extern Tcl_ObjType hbytes_type; +extern Tcl_ObjType cht_hbytes_type; -int hbytes_len(const HBytes_Value *v); -Byte *hbytes_data(const HBytes_Value *v); /* caller may then modify data! */ -int hbytes_issentinel(const HBytes_Value *v); +int cht_hb_len(const HBytes_Value *v); +Byte *cht_hb_data(const HBytes_Value *v); /* caller may then modify data! */ +int cht_hb_issentinel(const HBytes_Value *v); -Byte *hbytes_prepend(HBytes_Value *upd, int el); -Byte *hbytes_append(HBytes_Value *upd, int el); +Byte *cht_hb_prepend(HBytes_Value *upd, int el); +Byte *cht_hb_append(HBytes_Value *upd, int el); /* return value is where to put the data */ -const Byte *hbytes_unprepend(HBytes_Value *upd, int rl); -const Byte *hbytes_unappend(HBytes_Value *upd, int rl); +const Byte *cht_hb_unprepend(HBytes_Value *upd, int rl); +const Byte *cht_hb_unappend(HBytes_Value *upd, int rl); /* return value points to the removed data, which remains valid * until next op on the HBytes_Value. If original value is * shorter than rl or negative, returns 0 and does nothing. */ -void hbytes_empty(HBytes_Value *returns); -void hbytes_sentinel(HBytes_Value *returns); -void hbytes_array(HBytes_Value *returns, const Byte *array, int l); -Byte *hbytes_arrayspace(HBytes_Value *returns, int l); -void hbytes_free(const HBytes_Value *frees); +void cht_hb_empty(HBytes_Value *returns); +void cht_hb_sentinel(HBytes_Value *returns); +void cht_hb_array(HBytes_Value *returns, const Byte *array, int l); +Byte *cht_hb_arrayspace(HBytes_Value *returns, int l); +void cht_hb_free(const HBytes_Value *frees); /* _empty, _sentinel and _array do not free or read the old value; * _free it first if needed. _free leaves it garbage, so you * have to call _empty to reuse it. _arrayspace doesn't fill * the array; you get a pointer and must fill it with data * yourself. */ -/* The value made by hbytes_sentinel should not be passed to - * anything except HBYTES_IS..., and hbytes_free. */ - -/* from sockaddr.c */ - -typedef struct { - Byte *begin, *end; -} SockAddr_Value; - -extern Tcl_ObjType sockaddr_type; - -void sockaddr_clear(SockAddr_Value*); -void sockaddr_create(SockAddr_Value*, const struct sockaddr *addr, int len); -int sockaddr_len(const SockAddr_Value*); -const struct sockaddr *sockaddr_addr(const SockAddr_Value*); -void sockaddr_free(const SockAddr_Value*); - -/* from scriptinv.c */ - -typedef struct { /* semi-opaque - read only, and then only where commented */ - Tcl_Interp *ip; /* valid, non-0 and useable if set */ - Tcl_Obj *obj; /* non-0 iff set (but only test for 0/non-0) */ - Tcl_Obj *xargs; - int llength; -} ScriptToInvoke; - -void scriptinv_init(ScriptToInvoke *si); -int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, - Tcl_Obj *newscript, Tcl_Obj *xargs); -void scriptinv_cancel(ScriptToInvoke *si); /* then don't invoke */ - /* no separate free function - just cancel */ - -void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv); - -/* from idtable.c */ - -typedef struct { - const char *valprefix, *assockey; - void (*destroyitem)(Tcl_Interp *ip, void *val); -} IdDataSpec; - -/* 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, const IdDataSpec *idds); -void tabledataid_disposing(Tcl_Interp *ip, void *val, const IdDataSpec *idds); - /* 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 const IdDataSpec adnstcl_queries, adnstcl_resolvers; - -/* from dgram.c */ - -extern const IdDataSpec dgram_socks; - -/* from tuntap.c */ - -extern const IdDataSpec tuntap_socks; +/* The value made by cht_hb_sentinel should not be passed to + * anything except HBYTES_IS..., and cht_hb_free. */ /* from hook.c */ -int staticerr(Tcl_Interp *ip, const char *m, const char *ec); -int posixerr(Tcl_Interp *ip, int errnoval, const char *m); -void objfreeir(Tcl_Obj *o); -int get_urandom(Tcl_Interp *ip, Byte *buffer, int l); - void obj_updatestr_array(Tcl_Obj *o, const Byte *array, int l); void obj_updatestr_array_prefix(Tcl_Obj *o, const Byte *byte, int l, const char *prefix); -void obj_updatestr_vstringls(Tcl_Obj *o, ...); - /* const char*, int, const char*, int, ..., (const char*)0 */ -void obj_updatestr_string_len(Tcl_Obj *o, const char *str, int l); -void obj_updatestr_string(Tcl_Obj *o, const char *str); - /* from parse.c */ -typedef struct { - 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; @@ -307,126 +220,18 @@ typedef struct { Something_Var sth; } AddrMap_Var; -extern Tcl_ObjType addrmap_type; +extern Tcl_ObjType cht_addrmap_type; /* from chop.c */ /* only do_... functions declared in tables.h */ /* from ulong.c */ -Tcl_ObjType ulong_type; - -/* from enum.c */ - -extern Tcl_ObjType enum_nearlytype; -extern Tcl_ObjType enum1_nearlytype; - -const void *enum_lookup_cached_func(Tcl_Interp *ip, Tcl_Obj *o, - const void *firstentry, size_t entrysize, - const char *what); -#define enum_lookup_cached(ip,o,table,what) \ - (enum_lookup_cached_func((ip),(o), \ - &(table)[0],sizeof((table)[0]), \ - (what))) - /* table should be a pointer to an array of structs of size - * entrysize, the first member of which should be a const char*. - * The table should finish with a null const char *. - * On error, 0 is returned and the ip->result will have been - * set to the error message. - */ - -int enum1_lookup_cached_func(Tcl_Interp *ip, Tcl_Obj *o, - const char *opts, const char *what); - /* -1 => error */ - -/* from crypto.c */ - -void memxor(Byte *dest, const Byte *src, int l); - -typedef struct { - const char *name; - int pad, use_algname; -} PadOp; - -extern Tcl_ObjType blockcipherkey_type; - -/* from algtables.c */ - -typedef struct { - const char *name; - int int_offset; -} BlockCipherPropInfo, HashAlgPropInfo; - -typedef struct { - const char *name; - int hashsize, blocksize, statesize; - void (*init)(void *state); - void (*update)(void *state, const void *data, int len); - void (*final)(void *state, void *digest); - void (*oneshot)(void *digest, const void *data, int len); -} HashAlgInfo; - -extern const HashAlgInfo hashalginfos[]; - -typedef struct { - void (*make_schedule)(void *schedule, const void *key, int keylen); - void (*crypt)(const void *schedule, const void *in, void *out); - /* in and out may be the same, but if they aren't they may not overlap */ - /* in and out for crypt will have been through block_byteswap */ -} BlockCipherPerDirectionInfo; - -typedef struct { - const char *name; - int blocksize, schedule_size, key_min, key_max; - BlockCipherPerDirectionInfo encrypt, decrypt; -} BlockCipherAlgInfo; - -extern const BlockCipherAlgInfo blockcipheralginfos[]; - -/* from bcmode.c */ - -typedef struct { - const char *name; - int iv_blocks, buf_blocks, mac_blocks; - - /* Each function is allowed to use up to buf_blocks * blocksize - * bytes of space in buf. data is blocks * blocksize bytes - * long. data should be modified in place by encrypt and decrypt; - * modes may not change the size of data. iv is always provided and - * is always of length iv_blocks * blocksize; encrypt and - * decrypt may modify the iv value (in which case the Tcl caller - * will get the modified IV) but this is not recommended. mac - * should leave the mac, which must be mac_blocks * blocksize - * bytes, in buf. (Therefore mac_blocks must be at least - * buf_blocks.) - */ - const char *(*encrypt)(Byte *data, int nblocks, - const Byte *iv, Byte *buf, - const BlockCipherAlgInfo *alg, int encr, - const void *sch); - const char *(*decrypt)(Byte *data, int nblocks, - const Byte *iv, Byte *buf, - const BlockCipherAlgInfo *alg, int encr, - const void *sch); - const char *(*mac)(const Byte *data, int nblocks, - const Byte *iv, Byte *buf, - const BlockCipherAlgInfo *alg, - const void *sch); -} BlockCipherModeInfo; - -extern const BlockCipherModeInfo blockciphermodeinfos[]; - -/* from misc.c */ - -int setnonblock(int fd, int isnonblock); +Tcl_ObjType cht_ulong_type; /* useful macros */ #define OBJ_HBYTES(o) ((HBytes_Value*)&(o)->internalRep.twoPtrValue) #define OBJ_SOCKADDR(o) ((SockAddr_Value*)&(o)->internalRep.twoPtrValue) -#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*/