Teach get_rawline() to continue until a configurable char, and xstrndup()
authorRob Landley <rob@landley.net>
Sun, 13 Apr 2008 05:29:00 +0000 (00:29 -0500)
committerRob Landley <rob@landley.net>
Sun, 13 Apr 2008 05:29:00 +0000 (00:29 -0500)
shouldn't die when it's told to chop out a subsection of a string.

lib/lib.c
lib/lib.h

index 1f5d797..6102e1b 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -108,8 +108,9 @@ void *xrealloc(void *ptr, size_t size)
 // Die unless we can allocate a copy of this many bytes of string.
 void *xstrndup(char *s, size_t n)
 {
-       void *ret = xmalloc(++n);
-       xstrcpy(ret, s, n);
+       char *ret = xmalloc(++n);
+       strncpy(ret, s, n);
+       ret[--n]=0;
 
        return ret;
 }
@@ -612,7 +613,7 @@ void loopfiles(char **argv, void (*function)(int fd, char *name))
 
 // Slow, but small.
 
-char *get_rawline(int fd, long *plen)
+char *get_rawline(int fd, long *plen, char end)
 {
        char c, *buf = NULL;
        long len = 0;
@@ -620,7 +621,7 @@ char *get_rawline(int fd, long *plen)
        for (;;) {
                if (1>read(fd, &c, 1)) break;
                if (!(len & 63)) buf=xrealloc(buf, len+64);
-               if ((buf[len++]=c) == '\n') break;
+               if ((buf[len++]=c) == end) break;
        }
        if (buf) buf[len]=0;
        if (plen) *plen = len;
@@ -631,7 +632,7 @@ char *get_rawline(int fd, long *plen)
 char *get_line(int fd)
 {
        long len;
-       char *buf = get_rawline(fd, &len);
+       char *buf = get_rawline(fd, &len, '\n');
 
        if (buf && buf[--len]=='\n') buf[len]=0;
 
index 39b21e4..8ffd103 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -85,7 +85,7 @@ long atolx(char *c);
 off_t fdlength(int fd);
 char *xreadlink(char *name);
 void loopfiles(char **argv, void (*function)(int fd, char *name));
-char *get_rawline(int fd, long *plen);
+char *get_rawline(int fd, long *plen, char end);
 char *get_line(int fd);
 void xsendfile(int in, int out);
 int copy_tempfile(int fdin, char *name, char **tempname);