X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=hbytes%2Fhook.c;h=f364978c200db68dde9b2ba53c0a3e8faa898533;hb=29d695bbfb0f42019af456fc8a7a3137e9745806;hp=7f889fbdc6077632ada45be5e5a6adca703df142;hpb=74f92ed9563e6fd9e3b7a871e73f73e1ca7cd145;p=chiark-tcl.git diff --git a/hbytes/hook.c b/hbytes/hook.c index 7f889fb..f364978 100644 --- a/hbytes/hook.c +++ b/hbytes/hook.c @@ -197,6 +197,38 @@ int do_hbytes_random(ClientData cd, Tcl_Interp *ip, return TCL_OK; } +int do_hbytes_overwrite(ClientData cd, Tcl_Interp *ip, + HBytes_Var v, int start, HBytes_Value sub) { + int sub_l; + + sub_l= hbytes_len(&sub); + if (start < 0) + return staticerr(ip, "hbytes overwrite start -ve"); + if (start + sub_l > hbytes_len(v.hb)) + return staticerr(ip, "hbytes overwrite out of range"); + memcpy(hbytes_data(v.hb) + start, hbytes_data(&sub), sub_l); + return TCL_OK; +} + +int do_hbytes_repeat(ClientData cd, Tcl_Interp *ip, + HBytes_Value sub, int count, HBytes_Value *result) { + int sub_l; + Byte *data; + const Byte *sub_d; + + sub_l= hbytes_len(&sub); + if (count < 0) return staticerr(ip, "hbytes repeat count -ve"); + if (count > INT_MAX/sub_l) return staticerr(ip, "hbytes repeat too long"); + + data= hbytes_arrayspace(result, sub_l*count); + sub_d= hbytes_data(&sub); + while (count) { + memcpy(data, sub_d, sub_l); + count--; data += sub_l; + } + return TCL_OK; +} + int do_hbytes_zeroes(ClientData cd, Tcl_Interp *ip, int length, HBytes_Value *result) { Byte *space;