annotate lib/read-file.c @ 17363:5a51fb7777a9

sys_select, sys_time: port 2013-01-30 Solaris 2.6 fix to Cygwin Problem reported by Marco Atzeri in <http://lists.gnu.org/archive/html/bug-gnulib/2013-03/msg00000.html>. * lib/sys_select.in.h [HAVE_SYS_SELECT_H && _CYGWIN_SYS_TIME_H]: Simply delegate to the system <sys/select.h> in this case too. Also, pay attention to _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H only if OSF/1, since otherwise Cygwin breaks, and it doesn't seem to be needed on Solaris either. * lib/sys_time.in.h [_CYGWIN_SYS_TIME_H]: Simply delgate to the system <sys/time.h> in this case.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 19 Mar 2013 09:08:47 -0700
parents e542fd46ad6f
children 344018b6e5d7
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
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16366
diff changeset
2 Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc.
6829
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
16366
bb182ee4a09d maint: replace FSF snail-mail addresses with URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
16 along with this program; if not, see <http://www.gnu.org/licenses/>. */
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
17
7584
a88f85e4728f * lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents: 6848
diff changeset
18 #include <config.h>
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
19
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
20 #include "read-file.h"
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
21
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
22 /* Get fstat. */
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
23 #include <sys/stat.h>
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
24
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
25 /* Get ftello. */
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
26 #include <stdio.h>
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
27
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
28 /* Get SIZE_MAX. */
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
29 #include <stdint.h>
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
30
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
31 /* Get malloc, realloc, free. */
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
32 #include <stdlib.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
33
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
34 /* Get errno. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
35 #include <errno.h>
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
36
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
37 /* 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
38 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
39 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
40 *LENGTH. On errors, *LENGTH is undefined, errno preserves the
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
41 values set by system functions (if any), and NULL is returned. */
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
42 char *
14041
1bc2888f2fcb read-file.c: tweak syntax
Jim Meyering <meyering@redhat.com>
parents: 13931
diff changeset
43 fread_file (FILE *stream, size_t *length)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
44 {
6848
2a11dd9faacd 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
Simon Josefsson <simon@josefsson.org>
parents: 6829
diff changeset
45 char *buf = NULL;
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
46 size_t alloc = BUFSIZ;
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
47
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
48 /* For a regular file, allocate a buffer that has exactly the right
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
49 size. This avoids the need to do dynamic reallocations later. */
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
50 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
51 struct stat st;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
52
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
53 if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode))
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
54 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
55 off_t pos = ftello (stream);
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
56
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
57 if (pos >= 0 && pos < st.st_size)
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
58 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
59 off_t alloc_off = st.st_size - pos;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
60
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
61 /* '1' below, accounts for the trailing NUL. */
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
62 if (SIZE_MAX - 1 < alloc_off)
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
63 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
64 errno = ENOMEM;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
65 return NULL;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
66 }
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
67
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
68 alloc = alloc_off + 1;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
69 }
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
70 }
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
71 }
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
72
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
73 if (!(buf = malloc (alloc)))
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
74 return NULL; /* errno is ENOMEM. */
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
75
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
76 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
77 size_t size = 0; /* number of bytes read so far */
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
78 int save_errno;
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
79
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
80 for (;;)
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
81 {
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
82 /* This reads 1 more than the size of a regular file
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
83 so that we get eof immediately. */
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
84 size_t requested = alloc - size;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
85 size_t count = fread (buf + size, 1, requested, stream);
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
86 size += count;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
87
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
88 if (count != requested)
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
89 {
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
90 save_errno = errno;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
91 if (ferror (stream))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7584
diff changeset
92 break;
13594
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
93
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
94 /* Shrink the allocated memory if possible. */
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
95 if (size < alloc - 1)
13594
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
96 {
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
97 char *smaller_buf = realloc (buf, size + 1);
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
98 if (smaller_buf != NULL)
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
99 buf = smaller_buf;
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
100 }
4cd1a9ea04e8 read-file: Don't occupy too much unused memory.
Bruno Haible <bruno@clisp.org>
parents: 13593
diff changeset
101
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
102 buf[size] = '\0';
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
103 *length = size;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
104 return buf;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
105 }
13931
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
106
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
107 {
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
108 char *new_buf;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
109
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
110 if (alloc == SIZE_MAX)
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
111 {
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
112 save_errno = ENOMEM;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
113 break;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
114 }
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
115
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
116 if (alloc < SIZE_MAX - alloc / 2)
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
117 alloc = alloc + alloc / 2;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
118 else
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
119 alloc = SIZE_MAX;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
120
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
121 if (!(new_buf = realloc (buf, alloc)))
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
122 {
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
123 save_errno = errno;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
124 break;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
125 }
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
126
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
127 buf = new_buf;
2a046f95cb50 read-file: reorganize to avoid various issues
Pádraig Brady <P@draigBrady.com>
parents: 13594
diff changeset
128 }
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
129 }
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
130
13593
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
131 free (buf);
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
132 errno = save_errno;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
133 return NULL;
9134588a0ed4 read-file: Avoid memory reallocations with regular files.
Giuseppe Scrivano <gscrivano@gnu.org>
parents: 12559
diff changeset
134 }
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
135 }
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 static char *
14041
1bc2888f2fcb read-file.c: tweak syntax
Jim Meyering <meyering@redhat.com>
parents: 13931
diff changeset
138 internal_read_file (const char *filename, size_t *length, const char *mode)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
139 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
140 FILE *stream = fopen (filename, mode);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
141 char *out;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
142 int save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
143
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
144 if (!stream)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
145 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
146
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
147 out = fread_file (stream, length);
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
148
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
149 save_errno = errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
150
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
151 if (fclose (stream) != 0)
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
152 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
153 if (out)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7584
diff changeset
154 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7584
diff changeset
155 save_errno = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7584
diff changeset
156 free (out);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7584
diff changeset
157 }
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
158 errno = save_errno;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
159 return NULL;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
160 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
161
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
162 return out;
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
163 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
164
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
165 /* Open and read the contents of FILENAME, and return a newly
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
166 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
167 the string. The string is zero-terminated, but the terminating
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
168 zero byte is not counted in *LENGTH. On errors, *LENGTH is
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
169 undefined, errno preserves the values set by system functions (if
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
170 any), and NULL is returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
171 char *
14041
1bc2888f2fcb read-file.c: tweak syntax
Jim Meyering <meyering@redhat.com>
parents: 13931
diff changeset
172 read_file (const char *filename, size_t *length)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
173 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
174 return internal_read_file (filename, length, "r");
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
175 }
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
176
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
177 /* 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
178 of FILENAME, and return a newly allocated string with the content,
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
179 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
180 zero-terminated, but the terminating zero byte is not counted in
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
181 the LENGTH variable. On errors, *LENGTH is undefined, errno
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
182 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
183 returned. */
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
184 char *
14041
1bc2888f2fcb read-file.c: tweak syntax
Jim Meyering <meyering@redhat.com>
parents: 13931
diff changeset
185 read_binary_file (const char *filename, size_t *length)
6829
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
186 {
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
187 return internal_read_file (filename, length, "rb");
19c37b3f23b1 Add read-file module.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
188 }