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