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;
37 if (!n
|| !lineptr
|| !stream
)
40 /* Initialize the buffer. */
41 if (*lineptr
== NULL
|| *n
== 0) {
43 buf
= malloc(buf_size
);
50 if (real_size
== buf_size
) {
51 /* Buffer too small, enlarge it. */
53 buf
= realloc(buf
, buf_size
);
58 buf
[real_size
] = (char) c
;
61 } while (c
!= '\n' && c
!= EOF
);
64 /* We keep the '\n'. */
67 buf
= realloc(buf
, real_size
+ 1);
68 buf
[real_size
] = '\0';
73 return (ssize_t
) real_size
;