Inform the NEWS that we have smarter mnemonics.
[gliv.git] / lib / getline.c
blobceb7856448cc2de3ebc4625e980f946d4a6d3fe8
1 /*
2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License
4 * as published by the Free Software Foundation; either version 2
5 * of the License, or (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * See the COPYING file for license information.
18 * Guillaume Chazarain <guichaz@yahoo.fr>
21 /**************************************************************
22 * getline() is a GNU extension so here is an implementation. *
23 **************************************************************/
25 #include <stdlib.h> /* malloc(), realloc() */
26 #include <string.h> /* strchr() */
27 #include "./getline.h"
29 /* We don't handle errno. */
31 ssize_t getline(char **lineptr, size_t * n, FILE * stream)
33 size_t buf_size, real_size = 0;
34 char *buf;
35 int c;
37 if (!n || !lineptr || !stream)
38 return -1;
40 /* Initialize the buffer. */
41 if (*lineptr == NULL || *n == 0) {
42 buf_size = 128;
43 buf = malloc(buf_size);
44 } else {
45 buf_size = *n;
46 buf = *lineptr;
49 do {
50 if (real_size == buf_size) {
51 /* Buffer too small, enlarge it. */
52 buf_size *= 2;
53 buf = realloc(buf, buf_size);
56 c = getc(stream);
58 buf[real_size] = (char) c;
59 real_size++;
61 } while (c != '\n' && c != EOF);
63 if (c == '\n')
64 /* We keep the '\n'. */
65 real_size++;
67 buf = realloc(buf, real_size + 1);
68 buf[real_size] = '\0';
70 *lineptr = buf;
71 *n = real_size + 1;
73 return (ssize_t) real_size;