version 1.7, 2003/06/03 02:56:17 |
version 1.8, 2006/03/22 19:43:29 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <sys/stat.h> |
|
#include <sys/limits.h> |
|
|
#include <err.h> |
#include <err.h> |
#include <errno.h> |
#include <errno.h> |
|
|
FILE *fp; |
FILE *fp; |
off_t off; |
off_t off; |
{ |
{ |
int ch, len, tlen; |
int ch; |
|
size_t len, tlen; |
char *ep, *p, *t; |
char *ep, *p, *t; |
int wrap; |
int wrap; |
char *sp; |
char *sp; |
|
|
|
if (off > SIZE_T_MAX) |
|
errx(1, "offset too large"); |
|
|
if ((sp = p = malloc(off)) == NULL) |
if ((sp = p = malloc(off)) == NULL) |
err(1, NULL); |
err(1, NULL); |
|
|
|
|
off_t off; |
off_t off; |
{ |
{ |
struct { |
struct { |
u_int blen; |
size_t blen; |
u_int len; |
size_t len; |
char *l; |
char *l; |
} *lines; |
} *lines; |
int ch; |
int ch; |
char *p = NULL; |
char *p = NULL; |
int blen, cnt, recno, wrap; |
int wrap; |
char *sp = NULL; |
size_t cnt, recno, blen, newsize; |
|
char *sp = NULL, *newp = NULL; |
|
|
|
if (off > SIZE_T_MAX) |
|
errx(1, "offset too large"); |
|
|
if ((lines = calloc(off, sizeof(*lines))) == NULL) |
if ((lines = calloc(off, sizeof(*lines))) == NULL) |
err(1, NULL); |
err(1, NULL); |
|
|
|
|
|
|
while ((ch = getc(fp)) != EOF) { |
while ((ch = getc(fp)) != EOF) { |
if (++cnt > blen) { |
if (++cnt > blen) { |
if ((sp = realloc(sp, blen += 1024)) == NULL) |
newsize = blen + 1024; |
|
if ((newp = realloc(sp, newsize)) == NULL) |
err(1, NULL); |
err(1, NULL); |
|
sp = newp; |
|
blen = newsize; |
p = sp + cnt - 1; |
p = sp + cnt - 1; |
} |
} |
*p++ = ch; |
*p++ = ch; |
if (ch == '\n') { |
if (ch == '\n') { |
if (lines[recno].blen < cnt) { |
if (lines[recno].blen < cnt) { |
lines[recno].blen = cnt + 256; |
newsize = cnt + 256; |
if ((lines[recno].l = realloc(lines[recno].l, |
if ((newp = realloc(lines[recno].l, |
lines[recno].blen)) == NULL) |
newsize)) == NULL) |
err(1, NULL); |
err(1, NULL); |
|
lines[recno].l = newp; |
|
lines[recno].blen = newsize; |
} |
} |
memcpy(lines[recno].l, sp, (lines[recno].len = cnt)); |
memcpy(lines[recno].l, sp, (lines[recno].len = cnt)); |
cnt = 0; |
cnt = 0; |
|
|
} |
} |
|
|
if (rflag) { |
if (rflag) { |
for (cnt = recno - 1; cnt >= 0; --cnt) |
for (cnt = recno; cnt > 0; --cnt) |
WR(lines[cnt].l, lines[cnt].len); |
WR(lines[cnt - 1].l, lines[cnt - 1].len); |
if (wrap) |
if (wrap) |
for (cnt = off - 1; cnt >= recno; --cnt) |
for (cnt = off; cnt > recno; --cnt) |
WR(lines[cnt].l, lines[cnt].len); |
WR(lines[cnt - 1].l, lines[cnt - 1].len); |
} else { |
} else { |
if (wrap) |
if (wrap) |
for (cnt = recno; cnt < off; ++cnt) |
for (cnt = recno; cnt < off; ++cnt) |