1 /*
2  * Check: a unit test framework for C
3  * Copyright (C) 2001, 2002 Arien Malec
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
18  * MA 02110-1301, USA.
19  */
20 
21 #include "libcompat.h"
22 #include <stdio.h>
23 
24 #define INITIAL_SIZE 16
25 #define DELIMITER '\n'
26 
27 ssize_t
getline(char ** lineptr,size_t * n,FILE * stream)28 getline (char **lineptr, size_t * n, FILE * stream)
29 {
30   ssize_t written = 0;
31   int character;
32 
33   if (*lineptr == NULL || *n < INITIAL_SIZE) {
34     free (*lineptr);
35     *lineptr = (char *) malloc (INITIAL_SIZE);
36     *n = INITIAL_SIZE;
37   }
38 
39   while ((character = fgetc (stream)) != EOF) {
40     written += 1;
41     if (written >= *n) {
42       *n = *n * 2;
43       *lineptr = realloc (*lineptr, *n);
44     }
45 
46     (*lineptr)[written - 1] = character;
47 
48     if (character == DELIMITER) {
49       break;
50     }
51   }
52 
53   (*lineptr)[written] = '\0';
54 
55   return written;
56 }
57