diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2008-11-16 18:28:39 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2008-11-16 18:28:39 +0000 |
commit | 9f24707d5c4c18a831eaea848df5a996eb978e05 (patch) | |
tree | 8f0913da4ea0bfd49278e2e87e8956d7533aefc8 /module/module.c | |
parent | a444f5710e03cab983c8725940d6e4b3dca4d270 (diff) | |
download | iconv-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.c | 67 |
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; +} + |