annotate lib/read-file.c @ 16366:bb182ee4a09d

maint: replace FSF snail-mail addresses with URLs * config/argz.mk, lib/accept4.c, lib/alignof.h, lib/alloca.in.h: * lib/alphasort.c, lib/arcfour.c, lib/arcfour.h, lib/arctwo.c: * lib/arctwo.h, lib/argz.c, lib/arpa_inet.in.h, lib/asnprintf.c: * lib/asprintf.c, lib/assert.in.h, lib/base32.c, lib/base32.h: * lib/base64.c, lib/base64.h, lib/c-ctype.c, lib/c-ctype.h: * lib/c-strcase.h, lib/c-strcasecmp.c, lib/c-strncasecmp.c: * lib/check-version.c, lib/check-version.h, lib/config.charset: * lib/ctype.in.h, lib/des.c, lib/des.h, lib/dup3.c, lib/errno.in.h: * lib/float+.h, lib/fnmatch.c, lib/fnmatch.in.h, lib/fnmatch_loop.c: * lib/fseeko.c, lib/gai_strerror.c, lib/gc-gnulib.c: * lib/gc-libgcrypt.c, lib/gc-pbkdf2-sha1.c, lib/gc.h: * lib/getaddrinfo.c, lib/getdelim.c, lib/getfilecon.c, lib/getline.c: * lib/getlogin_r.c, lib/getpass.c, lib/getpass.h, lib/gettext.h: * lib/gettimeofday.c, lib/glob.in.h, lib/glthread/cond.c: * lib/glthread/cond.h, lib/glthread/lock.c, lib/glthread/lock.h: * lib/glthread/thread.c, lib/glthread/thread.h: * lib/glthread/threadlib.c, lib/glthread/yield.h, lib/hmac-md5.c: * lib/hmac-sha1.c, lib/hmac.h, lib/iconv.c, lib/iconv.in.h: * lib/iconv_close.c, lib/iconv_open.c, lib/inet_ntop.c, lib/isfinite.c: * lib/isinf.c, lib/iswblank.c, lib/langinfo.in.h, lib/link.c: * lib/localcharset.c, lib/localcharset.h, lib/lseek.c, lib/malloc.c: * lib/malloca.c, lib/malloca.h, lib/md2.c, lib/md2.h, lib/md4.c: * lib/md4.h, lib/md5.c, lib/md5.h, lib/memmem.c, lib/mempcpy.c: * lib/memset.c, lib/memxor.c, lib/memxor.h, lib/minmax.h, lib/mktime.c: * lib/msvc-inval.c, lib/msvc-inval.h, lib/msvc-nothrow.c: * lib/msvc-nothrow.h, lib/netdb.in.h, lib/netinet_in.in.h, lib/nproc.c: * lib/nproc.h, lib/obstack_printf.c, lib/pathmax.h, lib/pipe.c: * lib/pipe2.c, lib/poll.c, lib/poll.in.h, lib/printf-args.c: * lib/printf-args.h, lib/printf-parse.c, lib/printf-parse.h: * lib/pselect.c, lib/pthread.in.h, lib/pty-private.h, lib/pty.in.h: * lib/read-file.c, lib/read-file.h, lib/ref-add.sin, lib/ref-del.sin: * lib/regcomp.c, lib/regex.c, lib/regex.h, lib/regex_internal.c: * lib/regex_internal.h, lib/regexec.c, lib/rijndael-alg-fst.c: * lib/rijndael-alg-fst.h, lib/rijndael-api-fst.c: * lib/rijndael-api-fst.h, lib/rint.c, lib/rintf.c, lib/rintl.c: * lib/round.c, lib/roundf.c, lib/roundl.c, lib/scandir.c, lib/select.c: * lib/sha1.c, lib/sha1.h, lib/size_max.h, lib/snprintf.c: * lib/stdalign.in.h, lib/stdarg.in.h, lib/stdbool.in.h: * lib/stddef.in.h, lib/stdint.in.h, lib/stdio.in.h, lib/str-kmp.h: * lib/str-two-way.h, lib/strcasecmp.c, lib/strcasestr.c, lib/strdup.c: * lib/striconv.c, lib/striconv.h, lib/string.in.h, lib/strings.in.h: * lib/strncasecmp.c, lib/strndup.c, lib/strnlen.c, lib/strpbrk.c: * lib/strptime.c, lib/strsep.c, lib/strstr.c, lib/strverscmp.c: * lib/sys_file.in.h, lib/sys_ioctl.in.h, lib/sys_select.in.h: * lib/sys_socket.in.h, lib/sys_stat.in.h, lib/sys_time.in.h: * lib/sys_times.in.h, lib/sys_types.in.h, lib/sys_uio.in.h: * lib/sys_utsname.in.h, lib/sys_wait.in.h, lib/tcgetsid.c: * lib/termios.in.h, lib/time.in.h, lib/time_r.c, lib/timegm.c: * lib/times.c, lib/unictype/3level.h, lib/unictype/3levelbit.h: * lib/unistd.in.h, lib/vasnprintf.c, lib/vasnprintf.h, lib/vasprintf.c: * lib/vsnprintf.c, lib/waitpid.c, lib/wchar.in.h, lib/wctype.in.h: * lib/xsize.h, tests/test-closein.c, tests/test-des.c: * tests/test-fclose.c, tests/test-fgetc.c, tests/test-filevercmp.c: * tests/test-fputc.c, tests/test-fread.c, tests/test-fwrite.c: * tests/test-gc-arcfour.c, tests/test-gc-arctwo.c, tests/test-gc-des.c: * tests/test-gc-hmac-md5.c, tests/test-gc-hmac-sha1.c: * tests/test-gc-md2.c, tests/test-gc-md4.c, tests/test-gc-md5.c: * tests/test-gc-pbkdf2-sha1.c, tests/test-gc-rijndael.c: * tests/test-gc-sha1.c, tests/test-gc.c, tests/test-getdelim.c: * tests/test-getline.c, tests/test-getndelim2.c, tests/test-md2.c: * tests/test-md4.c, tests/test-parse-datetime.c, tests/test-perror.c: * tests/test-perror2.c, tests/test-pipe.c, tests/test-pipe2.c: * tests/test-poll.c, tests/test-quotearg-simple.c: * tests/test-quotearg.c, tests/test-quotearg.h: * tests/test-round-ieee.c, tests/test-round1.c: * tests/test-roundf-ieee.c, tests/test-roundf1.c: * tests/test-roundl-ieee.c, tests/test-roundl.c: * tests/test-safe-alloc.c, tests/test-sigpipe.c: * tests/test-spawn-pipe-child.c, tests/test-spawn-pipe-main.c: * tests/test-strerror.c, tests/test-strerror_r.c: * tests/test-strsignal.c, tests/test-strverscmp.c: * tests/test-xmemdup0.c: Replace FSF snail mail addresses with URLs, as per GNU coding standards. See glibc bug <http://sourceware.org/bugzilla/show_bug.cgi?id=13673>.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 09 Feb 2012 21:39:05 -0800
parents 8250f2777afc
children e542fd46ad6f
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
16201
8250f2777afc maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents: 14079
diff changeset
2 Copyright (C) 2006, 2009-2012 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 }