annotate lib/read-file.c @ 11505:a051fb724013

vc-list-files: fix another quoting bug * build-aux/vc-list-files: Avoid sed backslash expansion of pathological directory names.
author Jim Meyering <meyering@redhat.com>
date Sat, 25 Apr 2009 15:32:33 +0200
parents a88f85e4728f
children e8d2c6fc33ad
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
7584
a88f85e4728f * lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents: 6848
diff changeset
19 #include <config.h>
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
20
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
21 #include "read-file.h"
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 /* Get realloc, free. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
24 #include <stdlib.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
25
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
26 /* Get errno. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
27 #include <errno.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
28
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
29 /* 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
30 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
31 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
32 *LENGTH. On errors, *LENGTH is undefined, errno preserves the
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
33 values set by system functions (if any), and NULL is returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
34 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
35 fread_file (FILE * stream, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
36 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
37 char *buf = NULL;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
38 size_t alloc = 0;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
39 size_t size = 0;
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
40 int save_errno;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
41
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
42 for (;;)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
43 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
44 size_t count;
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
45 size_t requested;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
46
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
47 if (size + BUFSIZ + 1 > alloc)
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 char *new_buf;
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 alloc += alloc / 2;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
52 if (alloc < size + BUFSIZ + 1)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
53 alloc = size + BUFSIZ + 1;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
54
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
55 new_buf = realloc (buf, alloc);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
56 if (!new_buf)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
57 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
58 save_errno = errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
59 break;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
60 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
61
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
62 buf = new_buf;
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
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
65 requested = alloc - size - 1;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
66 count = fread (buf + size, 1, requested, stream);
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
67 size += count;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
68
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
69 if (count != requested)
6829
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 save_errno = errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
72 if (ferror (stream))
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
73 break;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
74 buf[size] = '\0';
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
75 *length = size;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
76 return buf;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
77 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
78 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
79
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
80 free (buf);
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
81 errno = save_errno;
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
82 return NULL;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
83 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
84
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
85 static char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
86 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
87 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
88 FILE *stream = fopen (filename, mode);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
89 char *out;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
90 int save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
91
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
92 if (!stream)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
93 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
94
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
95 out = fread_file (stream, length);
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 save_errno = errno;
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 if (fclose (stream) != 0)
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 (out)
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 save_errno = errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
104 free (out);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
105 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
106 errno = save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
107 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
108 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
109
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
110 return out;
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
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
113 /* Open and read the contents of FILENAME, and return a newly
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
114 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
115 the string. The string is zero-terminated, but the terminating
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
116 zero byte is not counted in *LENGTH. On errors, *LENGTH is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
117 undefined, errno preserves the values set by system functions (if
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
118 any), and NULL is returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
119 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
120 read_file (const char *filename, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
121 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
122 return internal_read_file (filename, length, "r");
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
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
125 /* 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
126 of FILENAME, and return a newly allocated string with the content,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
127 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
128 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
129 the LENGTH variable. On errors, *LENGTH is undefined, errno
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
130 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
131 returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
132 char *
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
133 read_binary_file (const char *filename, size_t * length)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
134 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
135 return internal_read_file (filename, length, "rb");
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
136 }