1/* safe-fgets.c --- like fgets, but allocates its own static buffer. 2 3Copyright (C) 2005, 2007 Free Software Foundation, Inc. 4Contributed by Red Hat, Inc. 5 6This file is part of the GNU simulators. 7 8This program is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 3 of the License, or 11(at your option) any later version. 12 13This program is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21 22#include <stdio.h> 23#include <stdlib.h> 24 25#include "safe-fgets.h" 26 27static char *line_buf = 0; 28static int line_buf_size = 0; 29 30#define LBUFINCR 100 31 32char * 33safe_fgets (FILE *f) 34{ 35 char *line_ptr; 36 37 if (line_buf == 0) 38 { 39 line_buf = (char *) malloc (LBUFINCR); 40 line_buf_size = LBUFINCR; 41 } 42 43 /* points to last byte */ 44 line_ptr = line_buf + line_buf_size - 1; 45 46 /* so we can see if fgets put a 0 there */ 47 *line_ptr = 1; 48 if (fgets (line_buf, line_buf_size, f) == 0) 49 return 0; 50 51 /* we filled the buffer? */ 52 while (line_ptr[0] == 0 && line_ptr[-1] != '\n') 53 { 54 /* Make the buffer bigger and read more of the line */ 55 line_buf_size += LBUFINCR; 56 line_buf = (char *) realloc (line_buf, line_buf_size); 57 58 /* points to last byte again */ 59 line_ptr = line_buf + line_buf_size - 1; 60 /* so we can see if fgets put a 0 there */ 61 *line_ptr = 1; 62 63 if (fgets (line_buf + line_buf_size - LBUFINCR - 1, LBUFINCR + 1, f) == 64 0) 65 return 0; 66 } 67 68 return line_buf; 69} 70