about summary refs log tree commit diff
path: root/locale/programs/locfile.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-09-24 22:07:47 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-09-24 22:07:47 +0000
commit6055173a0f2733ea4fc2825afd295156143fca79 (patch)
tree11dac563ce23c6e0e95d2146dfaef2a1a7faa459 /locale/programs/locfile.h
parent39bf0bb44c07ab2cae5b813fc7c196abfdf411b3 (diff)
downloadglibc-6055173a0f2733ea4fc2825afd295156143fca79.tar.gz
glibc-6055173a0f2733ea4fc2825afd295156143fca79.tar.xz
glibc-6055173a0f2733ea4fc2825afd295156143fca79.zip
Add localedef --big-endian and --little-endian options.
Diffstat (limited to 'locale/programs/locfile.h')
-rw-r--r--locale/programs/locfile.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h
index bdd87cc426..cb3e22fd87 100644
--- a/locale/programs/locfile.h
+++ b/locale/programs/locfile.h
@@ -18,6 +18,8 @@
 #ifndef _LOCFILE_H
 #define _LOCFILE_H	1
 
+#include <byteswap.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <sys/uio.h>
 
@@ -67,6 +69,41 @@ extern void write_all_categories (struct localedef_t *definitions,
 				  const char *locname,
 				  const char *output_path);
 
+extern bool swap_endianness_p;
+
+/* Change the output to be big-endian if BIG_ENDIAN is true and
+   little-endian otherwise.  */
+static inline void
+set_big_endian (bool big_endian)
+{
+  swap_endianness_p = (big_endian != (__BYTE_ORDER == __BIG_ENDIAN));
+}
+
+/* Munge VALUE so that, when stored, it has the correct byte order
+   for the output files.  */
+static inline uint32_t
+maybe_swap_uint32 (uint32_t value)
+{
+  return swap_endianness_p ? bswap_32 (value) : value;
+}
+
+/* Likewise, but munge an array of N uint32_ts starting at ARRAY.  */
+static inline void
+maybe_swap_uint32_array (uint32_t *array, size_t n)
+{
+  if (swap_endianness_p)
+    while (n-- > 0)
+      array[n] = bswap_32 (array[n]);
+}
+
+/* Like maybe_swap_uint32_array, but the array of N elements is at
+   the end of OBSTACK's current object.  */
+static inline void
+maybe_swap_uint32_obstack (struct obstack *obstack, size_t n)
+{
+  maybe_swap_uint32_array ((uint32_t *) obstack_next_free (obstack) - n, n);
+}
+
 /* Write out the data.  */
 extern void init_locale_data (struct locale_file *file, size_t n_elements);
 extern void align_locale_data (struct locale_file *file, size_t boundary);