I was inserting strings of length 2 which was why it worked for me.
Yours were larger. It turns out that you can't cross the end boundary
when using modify. So if you are inserting a string of length 10, you
can't insert it into a string of length 9. Also, if you are inserting
it into a string of length 12, you can only insert at 0 or 1!
Using this, I wrote a safe modify function that handles this boundary
case. Let me know if it works for you:
import Mk4py
import random
s = Mk4py.storage()
v = s.getas("v[b:B]")
p = Mk4py.property("B", "b")
v.append()
#
# view.modify(byteprop, rownum, string, offset, diff)
# Store (partial) byte property contents. A non-zero value of diff
removes (<0) or inserts (>0) bytes.
def modify(v, property, rownum, string, offset, diff):
# safe modify
val = getattr(v[rownum], property.name)
l = len(val)
ls = len(string)
if l > ls and offset < l-ls:
return v.modify(property, rownum, string, offset, diff)
while string:
chunksize = max(l-offset, 1)
s1, string = string[:chunksize], string[chunksize:]
v.modify(property, rownum, s1, offset, len(s1))
offset += chunksize
pystring = v[0].b = "test"
for i in range(2000):
# Create a random range string
x = random.randrange(10)
randstring = str(x)*x
# insert it at a random position in the text
pos = max(1, random.randrange(len(v[0].b)) - len(randstring) + 2)
#v.modify(p, 0, randstring, pos, len(randstring))
modify(v, p, 0, randstring, pos, len(randstring))
# Keep a matching python string
pystring = pystring[:pos] + randstring + pystring[pos:]
if pystring != v[0].b:
print v[0].b
print pystring
print len(randstring)
raise "ERROR: string mismatch"
_____________________________________________
Metakit mailing list - [EMAIL PROTECTED]
http://www.equi4.com/mailman/listinfo/metakit