From 2037b8396427ab82edd1912357e9177a2800b01a Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 15 Jul 2012 16:56:20 -0500 Subject: New infrastructure for od (oops). --- lib/lib.c | 35 +++++++++++++++++++++++++++++++++-- lib/lib.h | 4 +++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index 6cb82e24..2b321099 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -286,6 +286,27 @@ off_t xlseek(int fd, off_t offset, int whence) return offset; } +off_t lskip(int fd, off_t offset) +{ + off_t and = lseek(fd, offset, SEEK_CUR); + + if (and != -1 && offset >= lseek(fd, offset, SEEK_END) + && offset+and == lseek(fd, offset+and, SEEK_SET)) return 0; + else { + char buf[4096]; + while (offset>0) { + int try = offset>sizeof(buf) ? sizeof(buf) : offset, or; + + or = readall(fd, buf, try); + if (or < 0) perror_msg("lskip to %lld", (long long)offset); + else offset -= try; + if (or < try) break; + } + + return offset; + } +} + char *xgetcwd(void) { char *buf = getcwd(NULL, 0); @@ -503,8 +524,7 @@ long atolx(char *numstr) long val = strtol(numstr, &c, 0); if (*c) { - end = strchr(suffixes, tolower(*c)); - if (end) { + if (c != numstr && (end = strchr(suffixes, tolower(*c)))) { int shift = end-suffixes; if (shift--) val *= 1024L<<(shift*10); } else { @@ -526,6 +546,17 @@ int numlen(long l) return len; } +int stridx(char *haystack, char needle) +{ + char *off; + + if (!needle) return -1; + off = strchr(haystack, needle); + if (!off) return -1; + + return off-haystack; +} + // Return how long the file at fd is, if there's any way to determine it. off_t fdlength(int fd) { diff --git a/lib/lib.h b/lib/lib.h index 5ed06035..4c230092 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -65,9 +65,9 @@ void get_optflags(void); struct dirtree { struct dirtree *next, *parent, *child; long extra; // place for user to store their stuff (can be pointer) - long data; // dirfd for directory, linklen for symlink, -1 = comeagain struct stat st; char *symlink; + int data; // dirfd for directory, linklen for symlink, -1 = comeagain char name[]; }; @@ -112,6 +112,7 @@ size_t xread(int fd, void *buf, size_t len); void xreadall(int fd, void *buf, size_t len); void xwrite(int fd, void *buf, size_t len); off_t xlseek(int fd, off_t offset, int whence); +off_t lskip(int fd, off_t offset); char *readfile(char *name); char *xreadfile(char *name); char *xgetcwd(void); @@ -128,6 +129,7 @@ char *utoa(unsigned n); char *itoa(int n); long atolx(char *c); int numlen(long l); +int stridx(char *haystack, char needle); off_t fdlength(int fd); char *xreadlink(char *name); void loopfiles_rw(char **argv, int flags, int permissions, int failok, -- cgit v1.2.3