X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d4f15663c34447bed92582e01f96ae8ba5841fcd..aa1c2a3c58f59790b6bf2d45908d0e731d68a6c9:/src/xbt/xbt_str.c diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index 2fad5bf71b..9247f2dd35 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -539,39 +539,32 @@ char *xbt_str_join_array(const char *const *strs, const char *sep) * In either case, on a successful call, *buf and *n will be updated to reflect * the buffer address and allocated size respectively. */ -ssize_t xbt_getline(char **buf, size_t * n, FILE * stream) +ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) { - size_t i; + ssize_t i; int ch; + ch = getc(stream); + if (ferror(stream) || feof(stream)) + return -1; + if (!*buf) { - *buf = xbt_malloc(512); *n = 512; + *buf = xbt_malloc(*n); } - if (feof(stream)) - return (ssize_t) - 1; - - for (i = 0; (ch = fgetc(stream)) != EOF; i++) { - - if (i >= (*n) + 1) + i = 0; + do { + if (i == *n) *buf = xbt_realloc(*buf, *n += 512); - - (*buf)[i] = ch; - - if ((*buf)[i] == '\n') { - i++; - (*buf)[i] = '\0'; - break; - } - } + (*buf)[i++] = ch; + } while (ch != '\n' && (ch = getc(stream)) != EOF); if (i == *n) *buf = xbt_realloc(*buf, *n += 1); - (*buf)[i] = '\0'; - return (ssize_t) i; + return i; } /*