on master help sign in
Null terminate the returned string on eof without delimiter.
9610578Niklas Larsson
rts/getline.c+32−31
@@ -38,40 +38,41 @@
38ssize_t
38ssize_t
39getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
39getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
40{
40{
41− char *ptr, *eptr;
41+ char *ptr, *eptr;
42
42
43−
44− if (*buf == NULL || *bufsiz == 0) {
43+ if (*buf == NULL || *bufsiz == 0) {
45− *bufsiz = BUFSIZ;
44+ *bufsiz = BUFSIZ;
46− if ((*buf = malloc(*bufsiz)) == NULL)
45+ if ((*buf = malloc(*bufsiz)) == NULL)
47− return -1;
48− }
49−
50− for (ptr = *buf, eptr = *buf + *bufsiz;;) {
51− int c = fgetc(fp);
52− if (c == -1) {
53− if (feof(fp))
54− return ptr == *buf ? -1 : ptr - *buf;
55− else
56− return -1;
46+ return -1;
57 }
47 }
48+
49+ for (ptr = *buf, eptr = *buf + *bufsiz;;) {
50+ int c = fgetc(fp);
51+ if (c == -1) {
52+ if (feof(fp)) {
53+ *ptr = '\0';
54+ return ptr - *buf;
55+ } else {
56+ return -1;
57+ }
58+ }
58− *ptr++ = c;
59+ *ptr++ = c;
59− if (c == delimiter) {
60+ if (c == delimiter) {
60− *ptr = '\0';
61+ *ptr = '\0';
61− return ptr - *buf;
62+ return ptr - *buf;
62− }
63+ }
63− if (ptr + 2 >= eptr) {
64+ if (ptr + 2 >= eptr) {
64− char *nbuf;
65+ char *nbuf;
65− size_t nbufsiz = *bufsiz * 2;
66+ size_t nbufsiz = *bufsiz * 2;
66− ssize_t d = ptr - *buf;
67+ ssize_t d = ptr - *buf;
67− if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
68+ if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
68− return -1;
69+ return -1;
69− *buf = nbuf;
70+ *buf = nbuf;
70− *bufsiz = nbufsiz;
71+ *bufsiz = nbufsiz;
71− eptr = nbuf + nbufsiz;
72+ eptr = nbuf + nbufsiz;
72− ptr = nbuf + d;
73+ ptr = nbuf + d;
74+ }
73 }
75 }
74− }
75}
76}
76
77
77ssize_t
78ssize_t