chiark / gitweb /
hbytes overwrite; hbytes repeat
[chiark-tcl.git] / base / hook.c
index 7f889fbdc6077632ada45be5e5a6adca703df142..f364978c200db68dde9b2ba53c0a3e8faa898533 100644 (file)
@@ -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;