00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <stdlib.h>
00019 #include <unistd.h>
00020
00021 #include "io.h"
00022 #include "str.h"
00023
00024 int io_read_eol(int fd, char **line)
00025 {
00026 size_t chunks = 1, len = 0;
00027 char *buf = malloc(chunks * CHUNKSIZE + 1);
00028 char c;
00029
00030 for (;;) {
00031 switch(read(fd, &c, 1)) {
00032 case -1:
00033 return -1;
00034
00035 case 0:
00036 goto out;
00037
00038 default:
00039 if (c == '\n' || c == '\r')
00040 goto out;
00041
00042 if (len >= chunks * CHUNKSIZE) {
00043 chunks++;
00044 buf = realloc(buf, chunks * CHUNKSIZE + 1);
00045 }
00046
00047 buf[len++] = c;
00048 break;
00049 }
00050 }
00051
00052 out:
00053 if (len > 0)
00054 *line = str_dupn(buf, len);
00055
00056 free(buf);
00057 return len;
00058 }