ref: b583c0bdc775e71a87b60f54ea6b1c19a32d2eae
parent: efc139e255850d6300d5ef750cfe92d593efc4e8
parent: 9a778738a652738ed3877477a37359d7d490c853
author: Ori Bernstein <[email protected]>
date: Tue Jan 28 16:23:53 EST 2014
Merge https://github.com/oridb/libbio
--- a/bio.myr
+++ b/bio.myr
@@ -391,7 +391,7 @@
if f.rbuf[i] == delim[0]
for j = 0; j < delim.len; j++
if f.rbuf[i + j] != delim[j]
- goto nextiter
+ goto nextiterread
;;
;;
if !drop
@@ -400,7 +400,7 @@
f.rstart += delim.len
-> `std.Some ret
;;
-:nextiter
+:nextiterread
;;
if !drop
ret = readinto(f, ret, f.rend - f.rstart)
@@ -413,6 +413,32 @@
const readln = {f
-> readto(f, "\n")
}
+
+const skipto = {f, delim
+ var ret : byte[:]
+ var i, j
+
+ ret = [][:]
+ while true
+ if !ensureread(f, delim.len)
+ -> ret.len > 0
+ ;;
+ for i = f.rstart; i < f.rend; i++
+ if f.rbuf[i] == delim[0]
+ for j = 0; j < delim.len; j++
+ if f.rbuf[i + j] != delim[j]
+ goto nextiterskip
+ ;;
+ ;;
+ f.rstart += delim.len
+ -> true
+ ;;
+:nextiterskip
+ ;;
+ ;;
+ std.die("unreachable")
+}
+
/*
Same as std.put, but buffered. Returns the number of bytes written.