annotate lib/read-file.c @ 6848:2a11dd9faacd

2006-06-19 Paul Eggert <eggert@cs.ucla.edu> * read-file.c (fread_file): Start with buffer allocation of 0 bytes rather than 1 byte; this simplifies the code. Don't invoke feof; it's not needed. Refactor to avoid duplicate code to free buffer and save/restore errno. (internal_read_file): Remove unused local.
author Simon Josefsson <simon@josefsson.org>
date Wed, 21 Jun 2006 08:02:40 +0000
parents 19c37b3f23b1
children a88f85e4728f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
1 /* read-file.c -- read file contents into a string
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
2 Copyright (C) 2006 Free Software Foundation, Inc.
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
3 Written by Simon Josefsson and Bruno Haible.
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
4
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
8 any later version.
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
9
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
13 GNU General Public License for more details.
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
14
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
18
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
19 #ifdef HAVE_CONFIG_H
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
20 # include <config.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
21 #endif
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
22
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
23 #include "read-file.h"
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
24
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
25 /* Get realloc, free. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
26 #include <stdlib.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
27
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
28 /* Get errno. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
29 #include <errno.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
30
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
31 /* Read a STREAM and return a newly allocated string with the content,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
32 and set *LENGTH to the length of the string. The string is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
33 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
34 *LENGTH. On errors, *LENGTH is undefined, errno preserves the
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
35 values set by system functions (if any), and NULL is returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
36 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
37 fread_file (FILE * stream, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
38 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
39 char *buf = NULL;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
40 size_t alloc = 0;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
41 size_t size = 0;
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
42 int save_errno;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
43
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
44 for (;;)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
45 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
46 size_t count;
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
47 size_t requested;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
48
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
49 if (size + BUFSIZ + 1 > alloc)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
50 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
51 char *new_buf;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
52
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
53 alloc += alloc / 2;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
54 if (alloc < size + BUFSIZ + 1)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
55 alloc = size + BUFSIZ + 1;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
56
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
57 new_buf = realloc (buf, alloc);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
58 if (!new_buf)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
59 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
60 save_errno = errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
61 break;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
62 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
63
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
64 buf = new_buf;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
65 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
66
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
67 requested = alloc - size - 1;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
68 count = fread (buf + size, 1, requested, stream);
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
69 size += count;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
70
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
71 if (count != requested)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
72 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
73 save_errno = errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
74 if (ferror (stream))
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
75 break;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
76 buf[size] = '\0';
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
77 *length = size;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
78 return buf;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
79 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
80 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
81
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
82 free (buf);
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
83 errno = save_errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
84 return NULL;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
85 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
86
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
87 static char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
88 internal_read_file (const char *filename, size_t * length, const char *mode)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
89 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
90 FILE *stream = fopen (filename, mode);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
91 char *out;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
92 int save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
93
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
94 if (!stream)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
95 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
96
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
97 out = fread_file (stream, length);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
98
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
99 save_errno = errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
100
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
101 if (fclose (stream) != 0)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
102 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
103 if (out)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
104 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
105 save_errno = errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
106 free (out);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
107 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
108 errno = save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
109 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
110 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
111
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
112 return out;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
113 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
114
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
115 /* Open and read the contents of FILENAME, and return a newly
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
116 allocated string with the content, and set *LENGTH to the length of
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
117 the string. The string is zero-terminated, but the terminating
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
118 zero byte is not counted in *LENGTH. On errors, *LENGTH is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
119 undefined, errno preserves the values set by system functions (if
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
120 any), and NULL is returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
121 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
122 read_file (const char *filename, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
123 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
124 return internal_read_file (filename, length, "r");
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
125 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
126
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
127 /* Open (on non-POSIX systems, in binary mode) and read the contents
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
128 of FILENAME, and return a newly allocated string with the content,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
129 and set LENGTH to the length of the string. The string is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
130 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
131 the LENGTH variable. On errors, *LENGTH is undefined, errno
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
132 preserves the values set by system functions (if any), and NULL is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
133 returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
134 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
135 read_binary_file (const char *filename, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
136 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
137 return internal_read_file (filename, length, "rb");
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
138 }