1 /* read-file.c -- read file contents into a string
2 Copyright (C) 2006 Free Software Foundation, Inc.
3 Written by Simon Josefsson and Bruno Haible.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 This program 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
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21 #include "read-file.h"
23 /* Get realloc, free. */
29 /* Read a STREAM and return a newly allocated string with the content,
30 and set *LENGTH to the length of the string. The string is
31 zero-terminated, but the terminating zero byte is not counted in
32 *LENGTH. On errors, *LENGTH is undefined, errno preserves the
33 values set by system functions (if any), and NULL is returned. */
35 fread_file (FILE * stream
, size_t * length
)
47 if (size
+ BUFSIZ
+ 1 > alloc
)
52 if (alloc
< size
+ BUFSIZ
+ 1)
53 alloc
= size
+ BUFSIZ
+ 1;
55 new_buf
= realloc (buf
, alloc
);
65 requested
= alloc
- size
- 1;
66 count
= fread (buf
+ size
, 1, requested
, stream
);
69 if (count
!= requested
)
86 internal_read_file (const char *filename
, size_t * length
, const char *mode
)
88 FILE *stream
= fopen (filename
, mode
);
95 out
= fread_file (stream
, length
);
99 if (fclose (stream
) != 0)
113 /* Open and read the contents of FILENAME, and return a newly
114 allocated string with the content, and set *LENGTH to the length of
115 the string. The string is zero-terminated, but the terminating
116 zero byte is not counted in *LENGTH. On errors, *LENGTH is
117 undefined, errno preserves the values set by system functions (if
118 any), and NULL is returned. */
120 read_file (const char *filename
, size_t * length
)
122 return internal_read_file (filename
, length
, "r");
125 /* Open (on non-POSIX systems, in binary mode) and read the contents
126 of FILENAME, and return a newly allocated string with the content,
127 and set LENGTH to the length of the string. The string is
128 zero-terminated, but the terminating zero byte is not counted in
129 the LENGTH variable. On errors, *LENGTH is undefined, errno
130 preserves the values set by system functions (if any), and NULL is
133 read_binary_file (const char *filename
, size_t * length
)
135 return internal_read_file (filename
, length
, "rb");