summaryrefslogtreecommitdiff
path: root/module/module.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-11-16 18:28:39 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-11-16 18:28:39 +0000
commit9f24707d5c4c18a831eaea848df5a996eb978e05 (patch)
tree8f0913da4ea0bfd49278e2e87e8956d7533aefc8 /module/module.c
parenta444f5710e03cab983c8725940d6e4b3dca4d270 (diff)
downloadiconv-9f24707d5c4c18a831eaea848df5a996eb978e05.tar.gz
iconv-9f24707d5c4c18a831eaea848df5a996eb978e05.tar.bz2
Factor out acquisition of paths to files in the Unicode resource.
This fixes *ReadAliases on <> RISC OS, and Iconv's eightbit codec. Fix iconv_eightbit_read to ensure that it treats the input as unsigned bytes. svn path=/trunk/iconv/; revision=5705
Diffstat (limited to 'module/module.c')
-rw-r--r--module/module.c67
1 files changed, 47 insertions, 20 deletions
diff --git a/module/module.c b/module/module.c
index de9b6af..2ef2326 100644
--- a/module/module.c
+++ b/module/module.c
@@ -12,24 +12,18 @@
#include "header.h"
#include "module.h"
-#ifdef __riscos__
-#define ALIASES_FILE "Files.Aliases"
-#else
-#define ALIASES_FILE "Files/Aliases"
-#endif
-
static _kernel_oserror ErrorGeneric = { 0x0, "" };
static size_t iconv_convert(_kernel_swi_regs *r);
static _kernel_oserror *do_iconv(int argc, const char *args);
static int errno_to_iconv_error(int num);
+static const char *get_aliases_path(void);
/* Module initialisation */
_kernel_oserror *mod_init(const char *tail, int podule_base, void *pw)
{
char *ucpath;
- int alen;
- char aliases[4096];
+ const char *aliases;
UNUSED(tail);
UNUSED(podule_base);
@@ -48,16 +42,7 @@ _kernel_oserror *mod_init(const char *tail, int podule_base, void *pw)
return &ErrorGeneric;
}
- strncpy(aliases, ucpath, sizeof(aliases));
- alen = strlen(ucpath);
-#ifndef __riscos__
- if (aliases[alen - 1] != '/') {
- strncat(aliases, "/", sizeof(aliases) - alen - 1);
- alen += 1;
- }
-#endif
- strncat(aliases, ALIASES_FILE, sizeof(aliases) - alen - 1);
- aliases[sizeof(aliases) - 1] = '\0';
+ aliases = get_aliases_path();
if (iconv_initialise(aliases) == false) {
strncpy(ErrorGeneric.errmess, "Unicode:Files.Aliases not "
@@ -169,13 +154,19 @@ _kernel_oserror *command_handler(const char *arg_string, int argc,
return do_iconv(argc, arg_string);
break;
case CMD_ReadAliases:
- /** \todo this is rather nasty, and hard-coded for RISC OS */
+ {
+ const char *aliases = get_aliases_path();
+
+ if (aliases == NULL)
+ return NULL;
+
free_alias_data();
- if (!create_alias_data("Unicode:Files.Aliases")) {
+ if (!create_alias_data(aliases)) {
strcpy(ErrorGeneric.errmess,
"Failed reading Aliases file.");
return &ErrorGeneric;
}
+ }
break;
default:
break;
@@ -408,3 +399,39 @@ int errno_to_iconv_error(int num)
return ICONV_INVAL;
}
+const char *get_aliases_path(void)
+{
+ char *ucpath;
+ int alen;
+ static char aliases[4096];
+
+#ifdef __riscos__
+#define ALIASES_FILE "Files.Aliases"
+#else
+#define ALIASES_FILE "Files/Aliases"
+#endif
+
+ /* Get !Unicode resource path */
+#ifdef __riscos__
+ ucpath = getenv("Unicode$Path");
+#else
+ ucpath = getenv("UNICODE_DIR");
+#endif
+
+ if (ucpath == NULL)
+ return NULL;
+
+ strncpy(aliases, ucpath, sizeof(aliases));
+ alen = strlen(ucpath);
+#ifndef __riscos__
+ if (aliases[alen - 1] != '/') {
+ strncat(aliases, "/", sizeof(aliases) - alen - 1);
+ alen += 1;
+ }
+#endif
+ strncat(aliases, ALIASES_FILE, sizeof(aliases) - alen - 1);
+ aliases[sizeof(aliases) - 1] = '\0';
+
+ return aliases;
+}
+