/* The original code is public domain -- Will Hartung 4/9/09 */ /* Modifications, public domain as well, by Antti Haapala, 11/10/17 */ #include #include #include #include #include ssize_t _getline(char **lineptr, size_t *n, FILE *stream, int (*fgetc_impl)(FILE*)) { size_t pos; int c; if (lineptr == NULL || stream == NULL || n == NULL) { errno = EINVAL; return -1; } c = fgetc_impl(stream); if (c == EOF) { return -1; } if (*lineptr == NULL) { *lineptr = malloc(128); if (*lineptr == NULL) { return -1; } *n = 128; } pos = 0; while(c != EOF) { if (pos + 1 >= *n) { char *new_ptr; size_t new_size = *n + (*n >> 2); if (new_size < 128) { new_size = 128; } new_ptr = realloc(*lineptr, new_size); if (new_ptr == NULL) { return -1; } *n = new_size; *lineptr = new_ptr; } ((unsigned char *)(*lineptr))[pos ++] = c; if (c == '\n') { break; } c = fgetc_impl(stream); } (*lineptr)[pos] = '\0'; return pos; }