r1996: Cope slightly better with invalid filenames in various places (reported by
[rox-filer.git] / ROX-Filer / src / rox_gettext.c
blobdcdc90d49c70968ef7b72a1a4033013b53fc3bce
1 /*
2 * $Id$
4 * ROX-Filer, filer for the ROX desktop project
5 * Copyright (C) 2002, the ROX-Filer team.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 * Place, Suite 330, Boston, MA 02111-1307 USA
22 /* This is a reimplementation of the GNU gettext function, because not everyone
23 * has GNU gettext.
26 #include "config.h"
28 #include <string.h>
30 #include "global.h"
32 #include "gui_support.h"
34 static GHashTable *translate = NULL;
36 /* Returns the 32 bit number at 'addr'.
37 * Reverse the byte order of 'number' iff 'swap' is TRUE.
39 #define WORD(addr) word(addr, swap)
41 /* Static prototypes */
42 static guint32 word(char *addr, gboolean swap);
45 /****************************************************************
46 * EXTERNAL INTERFACE *
47 ****************************************************************/
49 /* Returns a pointer to a static, nul-terminated, string which
50 * is the translation of 'from' (or 'from' itself if there is
51 * no translation).
53 const char *rox_gettext(const char *from)
55 char *retval;
57 if (!translate || !from || !*from)
58 return from;
60 retval = g_hash_table_lookup(translate, from);
62 return retval ? retval : from;
65 void rox_clear_translation(void)
67 if (translate)
69 g_hash_table_destroy(translate);
70 translate = NULL;
74 /* Read in this .gmo format file; all translations found override
75 * any existing translations for future calls to rox_gettext().
77 void rox_add_translations(const char *path)
79 guint32 magic;
80 char *data, *from_base, *to_base;
81 long size;
82 gboolean swap; /* TRUE => reverse byte-order of ints */
83 int n, n_total;
85 if (load_file(path, &data, &size) == FALSE)
86 goto out;
88 if (size < 20)
90 delayed_error(_("Invalid .gmo translation file "
91 "(too short): %s"), path);
92 goto out;
95 magic = *((guint *) data);
97 if (magic == 0x950412de)
98 swap = FALSE;
99 else if (magic == 0xde120495)
100 swap = TRUE;
101 else
103 delayed_error(_("Invalid .gmo translation file "
104 "(GNU magic number not found): %s"),
105 path);
106 goto out;
109 if (WORD(data + 4) != 0)
110 g_warning("rox_add_translations: expected format revision 0");
112 if (!translate)
114 translate = g_hash_table_new_full(g_str_hash, g_str_equal,
115 g_free, g_free);
118 n_total = WORD(data + 8);
119 from_base = data + WORD(data + 12);
120 to_base = data + WORD(data + 16);
122 for (n = 0; n < n_total; n++)
124 char *from = data + WORD(from_base + (n << 3) + 4);
125 char *to = data + WORD(to_base + (n << 3) + 4);
127 g_hash_table_insert(translate, g_strdup(from), g_strdup(to));
130 out:
131 g_free(data);
134 /****************************************************************
135 * INTERNAL FUNCTIONS *
136 ****************************************************************/
138 static guint32 word(char *addr, gboolean swap)
140 guint32 val = *((guint32 *) addr);
142 if (swap)
143 return GUINT32_SWAP_LE_BE(val);
144 else
145 return val;