1 /* word_io.c -- word oriented I/O
2 Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 /* config.h must be included first. */
24 #include <stdbool.h> /* for bool */
40 # define _(Text) gettext (Text)
43 #define textdomain(Domain)
44 #define bindtextdomain(Package, Directory)
47 # define N_(String) gettext_noop (String)
49 /* We used to use (String) instead of just String, but apparently ISO C
50 * doesn't allow this (at least, that's what HP said when someone reported
51 * this as a compiler bug). This is HP case number 1205608192. See
52 * also http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11250 (which references
53 * ANSI 3.5.7p14-15). The Intel icc compiler also rejects constructs
54 * like: static const char buf[] = ("string");
56 # define N_(String) String
63 decode_value (const unsigned char data[],
65 GetwordEndianState *endian_state_flag,
71 int ival; /* native representation */
72 unsigned char data[WORDBYTES];
75 memcpy (&u.data, data, WORDBYTES);
76 swapped = bswap_32(u.ival); /* byteswapped */
78 if (*endian_state_flag == GetwordEndianStateInitial)
84 /* the native value is inside the limit and the
85 * swapped value is not. We take this as proof
86 * that we should be using the ative byte order.
88 *endian_state_flag = GetwordEndianStateNative;
96 /* Aha, now we know we have to byte-swap. */
98 _("WARNING: locate database %s was "
99 "built with a different byte order"),
100 quotearg_n_style (0, locale_quoting_style, filename));
101 *endian_state_flag = GetwordEndianStateSwab;
106 /* u.ival > limit and swapped > limit. For the moment, assume
115 /* We already know the byte order. */
116 if (*endian_state_flag == GetwordEndianStateSwab)
127 const char *filename,
130 GetwordEndianState *endian_state_flag)
132 unsigned char data[4];
136 bytes_read = fread (data, WORDBYTES, 1, fp);
139 const char * quoted_name = quotearg_n_style (0, locale_quoting_style,
141 /* Distinguish between a truncated database and an I/O error.
142 * Either condition is fatal.
145 error (EXIT_FAILURE, 0, _("unexpected EOF in %s"), quoted_name);
147 error (EXIT_FAILURE, errno,
148 _("error reading a word from %s"), quoted_name);
153 return decode_value (data, maxvalue, endian_state_flag, filename);
159 putword (FILE *fp, int word,
160 GetwordEndianState endian_state_flag)
162 size_t items_written;
164 /* You must decide before calling this function which
165 * endianness you want to use.
167 assert (endian_state_flag != GetwordEndianStateInitial);
168 if (GetwordEndianStateSwab == endian_state_flag)
170 word = bswap_32(word);
173 items_written = fwrite (&word, sizeof (word), 1, fp);
174 if (1 == items_written)