summaryrefslogtreecommitdiff
path: root/userland/libc/stdio/getdelim.c
blob: 3a6f23ec1317c5500bfd2fa3d428e5dd9fffa053 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>

size_t getdelim(char **lineptr, size_t *n, int delimiter, FILE *stream) {
  if (NULL == *lineptr) {
    *lineptr = malloc(256);
    *n = 256;
  }
  size_t s = 0;
  for (;;) {
    char c;
    if (0 == fread(&c, 1, 1, stream)) {
      s++;
      break;
    }
    if (c == delimiter) {
      break;
    }
    if (s + 1 >= *n) {
      *n += 256;
      *lineptr = realloc(*lineptr, *n);
    }
    (*lineptr)[s] = c;
    s++;
  }
  (*lineptr)[s] = '\0';
  return s;
}