capture the offset at the start of a string and use that for printing.
previous code was incorrect for a string with any multibyte runes in
its first min-length characters.
---
strings.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/strings.c b/strings.c
index 8f5a154..da25f9f 100644
--- a/strings.c
+++ b/strings.c
@@ -14,17 +14,18 @@ strings(FILE *fp, const char *fname, size_t min)
{
Rune r, *rbuf;
size_t i, bread;
- off_t off;
+ off_t off, start;
rbuf = ereallocarray(NULL, min, sizeof(*rbuf));
- for (off = 0, i = 0; (bread = efgetrune(&r, fp, fname)); ) {
+ for (off = 0, start = 0, i = 0; (bread = efgetrune(&r, fp, fname)); ) {
off += bread;
if (r == Runeerror)
continue;
if (!isprintrune(r)) {
if (i == min)
putchar('\n');
+ start = off;
i = 0;
continue;
}
@@ -35,7 +36,7 @@ strings(FILE *fp, const char *fname, size_t min)
rbuf[i++] = r;
if (i < min)
continue;
- printf(format, (long)off - i);
+ printf(format, (long)start);
for (i = 0; i < min; i++)
efputrune(rbuf + i, stdout, "<stdout>");
}
--
2.31.1