bio.readto and EOF
[Thread Prev] | [Thread Next]
- Subject: bio.readto and EOF
- From: Carlin Bingham <cb@xxxxxxxxxxxx>
- Reply-to: myrddin-dev@xxxxxxxxxxxxxx
- Date: Sat, 16 Mar 2019 10:58:26 +1300
- To: myrddin-dev@xxxxxxxxxxxxxx
Hi, When using bio.readto I often want to be able to tell if the delimeter was found, or if the file was truncated, but there doesn't appear to be a way to tell if readto stopped searching because it found what it was looking for or if it reached EOF, other than to do another read. A simple solution to this would be a new function that reads to and includes the delimeter in the returned slice if it was found, which can be used intead when you care. I've tentatively included a patch for this. Is this something that would be wanted? Is there a better solution? Or a better name? -- Carlin NB. I've stolen the `Keep tag that was already there but apparently never used. Not sure if it was intended for a higher purpose. From c230b380fbf0e7ba2c24aae332e4ce8016843d66 Mon Sep 17 00:00:00 2001 From: Carlin Bingham <cb@xxxxxxxxxxx> Date: Sat, 16 Mar 2019 10:20:23 +1300 Subject: [PATCH] Add bio.readtoinc - read to including delimiter Similar to bio.readto except it includes the delimeter in the returned slice if it was found, making the absence of the delimiter indicate EOF --- lib/bio/bio.myr | 21 ++++++++++++----- lib/bio/test/bio-readtoinc.myr | 30 ++++++++++++++++++++++++ lib/bio/test/data/bio-readtoinc | 2 ++ lib/bio/test/data/bio-readtoinc-expected | 9 +++++++ lib/bio/test/tests | 1 + 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 lib/bio/test/bio-readtoinc.myr create mode 100644 lib/bio/test/data/bio-readtoinc create mode 100644 lib/bio/test/data/bio-readtoinc-expected diff --git a/lib/bio/bio.myr b/lib/bio/bio.myr index 2b4d5b18..58f6a929 100644 --- a/lib/bio/bio.myr +++ b/lib/bio/bio.myr @@ -28,6 +28,7 @@ pkg bio = /* delimited read; returns freshly allocated buffer. */ const readln : (f : file# -> std.result(byte[:], err)) const readto : (f : file#, delim : byte[:] -> std.result(byte[:], err)) + const readtoinc : (f: file#, delim : byte[:] -> std.result(byte[:], err)) const skipto : (f : file#, delim : byte[:] -> bool) const skipspace : (f : file# -> bool) @@ -327,6 +328,11 @@ const readto = {f, delim -> readdelim(f, delim, `Read) } +/* same as readto, but includes the delimiter if it was found */ +const readtoinc = {f, delim + -> readdelim(f, delim, `Keep) +} + /* same as readto, but drops the read data. */ const skipto = {f, delim match readdelim(f, delim, `Drop) @@ -413,7 +419,7 @@ const readdelim = {f, delim, mode match mode | `Drop: f.rstart += f.rend - f.rstart | `Read: readinto(f, &ret, f.rend - f.rstart) - | `Keep: + | `Keep: readinto(f, &ret, f.rend - f.rstart) ;; match ret.len | 0: -> `std.Err `Eof @@ -432,18 +438,21 @@ const readdelim = {f, delim, mode ;; /* If we found it, return that information */ match mode - | `Drop: f.rstart = i - | `Read: readinto(f, &ret, i - f.rstart) - | `Keep: + | `Drop: + f.rstart = i + delim.len + | `Read: + readinto(f, &ret, i - f.rstart) + f.rstart += delim.len + | `Keep: + readinto(f, &ret, i + delim.len - f.rstart) ;; - f.rstart += delim.len -> `std.Ok ret :nextiter ;; match mode | `Drop: f.rstart = i | `Read: readinto(f, &ret, i - f.rstart) - | `Keep: + | `Keep: readinto(f, &ret, i - f.rstart) ;; ;; std.die("unreachable") diff --git a/lib/bio/test/bio-readtoinc.myr b/lib/bio/test/bio-readtoinc.myr new file mode 100644 index 00000000..a856a925 --- /dev/null +++ b/lib/bio/test/bio-readtoinc.myr @@ -0,0 +1,30 @@ +use std +use bio + +const main = { + var f + + f = std.try(bio.open("data/bio-readtoinc", bio.Rd)) + + readtoinc(f, ";") + readtoinc(f, "]]]") + readtoinc(f, "\n") + readtoinc(f, ",") + readtoinc(f, ",") + readtoinc(f, ",") + readtoinc(f, "the end") + + bio.close(f) +} + +const readtoinc = {f, d + match bio.readtoinc(f, d) + | `std.Ok s: + std.put("{}\n", s) + std.slfree(s) + | `std.Err `bio.Eof: + std.put("eof\n") + | `std.Err _: + std.put("err\n") + ;; +} diff --git a/lib/bio/test/data/bio-readtoinc b/lib/bio/test/data/bio-readtoinc new file mode 100644 index 00000000..b0a2d25d --- /dev/null +++ b/lib/bio/test/data/bio-readtoinc @@ -0,0 +1,2 @@ +data with semicolon;multiple delims]]]a new line +data separated,with commas until,no more diff --git a/lib/bio/test/data/bio-readtoinc-expected b/lib/bio/test/data/bio-readtoinc-expected new file mode 100644 index 00000000..ce637804 --- /dev/null +++ b/lib/bio/test/data/bio-readtoinc-expected @@ -0,0 +1,9 @@ +data with semicolon; +multiple delims]]] +a new line + +data separated, +with commas until, +no more + +eof diff --git a/lib/bio/test/tests b/lib/bio/test/tests index 81c10876..659e3a7f 100644 --- a/lib/bio/test/tests +++ b/lib/bio/test/tests @@ -24,6 +24,7 @@ B bio-create F tmpout/test-create B bio-read C B bio-write F tmpout/test-write B bio-delim C +B bio-readtoinc C B bio-endianwr F tmpout/test-endianwr B bio-endianrd C B bio-unitwr F tmpout/test-unitwr -- 2.20.1
Re: bio.readto and EOF | Ori Bernstein <ori@xxxxxxxxxxxxxx> |
- Prev by Date: Re: [PATCH] Fix use-after-free in futex-based semaphore implementations.
- Next by Date: Re: bio.readto and EOF
- Previous by thread: Re: [PATCH] Fix use-after-free in futex-based semaphore implementations.
- Next by thread: Re: bio.readto and EOF
- Index(es):