9 static int strs1(Tcl_Interp *ip, int strc, Tcl_Obj *const *strv, int *l_r) {
13 for (i=1; i<strc; i++) {
14 rc= Tcl_ConvertToType(ip,strv[i],&hbytes_type);
16 l += hbytes_len(OBJ_HBYTES(strv[i]));
22 static void strs2(Byte *dest, int strc, Tcl_Obj *const *strv) {
25 for (i=1; i<strc; i++) {
26 tl= hbytes_len(OBJ_HBYTES(strv[i]));
27 memcpy(dest, hbytes_data(OBJ_HBYTES(strv[i])), tl);
32 int do_hbytes_prepend(ClientData cd, Tcl_Interp *ip,
33 HBytes_Var v, int strc, Tcl_Obj *const *strv) {
37 rc= strs1(ip,strc,strv,&el); if (rc) return rc;
38 dest= hbytes_prepend(v.hb, el);
39 strs2(dest, strc,strv);
43 int do_hbytes_append(ClientData cd, Tcl_Interp *ip,
44 HBytes_Var v, int strc, Tcl_Obj *const *strv) {
48 rc= strs1(ip,strc,strv,&el); if (rc) return rc;
49 dest= hbytes_append(v.hb, el);
50 strs2(dest, strc,strv);
54 int do_hbytes_concat(ClientData cd, Tcl_Interp *ip,
55 int strc, Tcl_Obj *const *strv, HBytes_Value *result) {
59 rc= strs1(ip,strc,strv,&l); if (rc) return rc;
60 dest= hbytes_arrayspace(result,l);
61 strs2(dest, strc,strv);
65 static int underrun(Tcl_Interp *ip) {
66 return staticerr(ip,"data underrun","HBYTES LENGTH UNDERRUN");
69 int do_hbytes_unprepend(ClientData cd, Tcl_Interp *ip,
70 HBytes_Var v, int preflength, HBytes_Value *result) {
71 const Byte *rdata= hbytes_unprepend(v.hb, preflength);
72 if (!rdata) return underrun(ip);
73 hbytes_array(result, rdata, preflength);
77 int do_hbytes_unappend(ClientData cd, Tcl_Interp *ip,
78 HBytes_Var v, int suflength, HBytes_Value *result) {
79 const Byte *rdata= hbytes_unappend(v.hb, suflength);
80 if (!rdata) return underrun(ip);
81 hbytes_array(result, rdata, suflength);
85 int do_hbytes_chopto(ClientData cd, Tcl_Interp *ip,
86 HBytes_Var v, int newlength, HBytes_Value *result) {
87 int suflength= hbytes_len(v.hb) - newlength;
88 return do_hbytes_unappend(0,ip,v, suflength, result);