X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=base%2Fchiark-tcl.h;h=ee69928237e7202581091154da3bbe9e41d3cfb4;hb=2cf1bfc63e73a424f9f3899c204025a8346b38e0;hp=83469d561452a45fea7d9621da212e38605cb3d5;hpb=503f816f2157f764c7c93c873047aad4ca63e10d;p=chiark-tcl.git diff --git a/base/chiark-tcl.h b/base/chiark-tcl.h index 83469d5..ee69928 100644 --- a/base/chiark-tcl.h +++ b/base/chiark-tcl.h @@ -34,18 +34,64 @@ typedef unsigned char Byte; /* from hbytes.c */ +/* Internal representation details: */ +#define HBYTES_ISEMPTY(hb) (!(hb)->begin_complex && !(hb)->end_0) +#define HBYTES_ISSENTINEL(hb) (!(hb)->begin_complex && (hb)->end_0) +#define HBYTES_ISSIMPLE(hb) ((hb)->begin_complex && (hb)->end_0) +#define HBYTES_ISCOMPLEX(hb) ((hb)->begin_complex && !(hb)->end_0) + typedef struct { - Byte *start, *end; /* always allocated dynamically */ + void *begin_complex, *end_0; } HBytes_Value; /* overlays internalRep */ +typedef struct { + Byte *dstart; /* always allocated dynamically */ + int prespace, len, avail; + /* + * | SPARE | USED | SPARE | + * |<-prespace->|<-len->| | + * | |<----avail---->| + * ^start + */ +} HBytes_ComplexValue; /* pointed to from internalRep.otherValuePtr */ + +/* Public interfaces: */ + extern Tcl_ObjType 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); + +Byte *hbytes_prepend(HBytes_Value *upd, int el); +Byte *hbytes_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); + /* 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(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 hook.c */ + int staticerr(Tcl_Interp *ip, const char *m); void objfreeir(Tcl_Obj *o); -void hbytes_set(HBytes_Value *upd, const Byte *array, int l); -Tcl_Obj *hbytes_set_obj(Tcl_Obj *overwrite, const Byte *array, int l); - /* from parse.c */ typedef struct { @@ -55,6 +101,8 @@ typedef struct { void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg); +/* from chop.c */ + /* from enum.c */ extern Tcl_ObjType enum_nearlytype; @@ -94,8 +142,7 @@ typedef struct { /* useful macros */ -#define HBYTES(o) (*(HBytes_Value*)&(o)->internalRep.twoPtrValue) -#define HBYTES_LEN(hb) ((hb).end - (hb).start) +#define OBJ_HBYTES(o) ((HBytes_Value*)&(o)->internalRep.twoPtrValue) #define TALLOC(s) ((void*)Tcl_Alloc((s))) #define TFREE(f) (Tcl_Free((void*)(f)))