idn_result_t idn_nameinit(int load_file) { idn_result_t r; TRACE(("idn_nameinit()\n")); if (initialized) { r = idn_success; goto ret; } idn_resconf_initialize(); r = idn_resconf_create(&default_conf); if (r != idn_success) goto ret; if (load_file) r = idn_resconf_loadfile(default_conf, conf_file); else r = idn_resconf_setdefaults(default_conf); if (r != idn_success) goto ret; initialized = 1; ret: if (r != idn_success && default_conf != NULL) { idn_resconf_destroy(default_conf); default_conf = NULL; } TRACE(("idn_nameinit(): %s\n", idn_result_tostring(r))); return (r); }
idn_resconf_t idnConvInit(void) { char encoding[256]; idn_resconf_t ctx; idn_result_t r; idnLogReset(); idnLogPrintf(idn_log_level_info, "idnkit version: %-.20s\n", idn_version_getstring()); /* * Initialize. */ if ((r = idn_resconf_initialize()) != idn_success) { idnPrintf("idnConvInit: cannot initialize idn library: %s\n", idn_result_tostring(r)); return NULL; } if ((r = idn_resconf_create(&ctx)) != idn_success) { idnPrintf("idnConvInit: cannot create context: %s\n", idn_result_tostring(r)); return NULL; } /* * load configuration file. */ if ((r = idn_resconf_loadfile(ctx, NULL)) != idn_success) { idnPrintf("idnConvInit: cannot read configuration file: %s\n", idn_result_tostring(r)); if ((r = idn_resconf_setdefaults(ctx)) != idn_success) { idnPrintf("idnConvInit: setting default configuration" " failed: %s\n", idn_result_tostring(r)); idnConvDone(ctx); return (NULL); } idnPrintf("idnConvInit: using default configuration\n"); } /* * Set local codeset. */ if (idnGetPrgEncoding(encoding, sizeof(encoding)) == TRUE) { idnPrintf("Encoding PRG <%-.100s>\n", encoding); r = idn_resconf_setlocalconvertername(ctx, encoding, IDN_CONVERTER_RTCHECK); if (r != idn_success) { idnPrintf("idnConvInit: invalid local codeset " "\"%-.100s\": %s\n", encoding, idn_result_tostring(r)); idnConvDone(ctx); return NULL; } } return ctx; }
int main(void) { idn_result_t r = idn_success; idn_resconf_t ctx = NULL; char to[1024]; #ifdef HAVE_SETLOCALE setlocale(LC_ALL, ""); #endif /* * Call idn_res_enable(0). * In case of idnkit-1.0, all IDN conversions are disabled. * idnkit-2.0 doesn't support this feature. Nothing will happen. */ idn_res_enable(0); r = idn_resconf_initialize(); if (r != idn_success) { printf("idn_resconf_initialize() ERROR: %s\n", idn_result_tostring(r)); return (1); } r = idn_resconf_create(&ctx); if (r != idn_success) { printf("idn_resconf_create() ERROR: %s\n", idn_result_tostring(r)); return (1); } /* * Convert a sample string. */ r = idn_res_encodename(ctx, IDN_ENCODE_LOOKUP, SAMPLE_UTF8_U_LABEL, to, sizeof(to)); if (r != idn_success) { printf("idn_res_encodename() ERROR: %s\n", idn_result_tostring(r)); return (1); } if (strcmp(to, SAMPLE_UTF8_U_LABEL) == 0) { printf("idn_res_enable() still work?\n"); return (1); } return (0); }
static int create_resconf(idn_resconf_t *resconf, int no_conf, const char *conf_file, const char *localencoding, const char *localcheck_file) { idn_result_t r; r = idn_resconf_create(resconf); if (r != idn_success) { errormsg("failed to initialize configuration " "contexts, %s\n", idn_result_tostring(r)); return (0); } if (!no_conf) { r = idn_resconf_loadfile(*resconf, conf_file); if (r != idn_success && (r != idn_nofile || conf_file != NULL)) { errormsg("failed to read a configuration file, " "%s\n", idn_result_tostring(r)); return (0); } } /* * For backward compatibility to idnkit-1.0, 'Punycode' specified * as local encoding, we assumes it as UTF-8. */ if (localencoding != NULL && strcmp(localencoding, IDN__PUNYCODE_ACENAME) == 0) localencoding = IDN__UTF8_ENCODINGNAME; r = idn_resconf_setlocalencoding(*resconf, localencoding); if (r != idn_success) { errormsg("failed to set the local encoding, %s\n", idn_result_tostring(r)); return (0); } r = idn_resconf_setlocalcheckfile(*resconf, localcheck_file); if (r != idn_success) { errormsg("failed to set the localcheck file, %s\n", idn_result_tostring(r)); return (0); } return (1); }
int main (int ac, char **av) { char *cmd = *av; char *cname; unsigned long delimiters[MAX_DELIMITER]; char *localmappers[MAX_LOCALMAPPER]; char *nameprep_version = NULL; int ndelimiters = 0; int nlocalmappers = 0; char *in_code = NULL; char *out_code = NULL; char *resconf_file = NULL; int no_resconf = 0; char *encoding_alias = NULL; int flags = DEFAULT_FLAGS; FILE *fp; idn_result_t r; idn_resconf_t resconf1, resconf2; idn_converter_t conv; int exit_value; #ifdef HAVE_SETLOCALE (void) setlocale (LC_ALL, ""); #endif /* * If the command name begins with 'r', reverse mode is assumed. */ if ((cname = strrchr (cmd, '/')) != NULL) cname++; else cname = cmd; if (cname[0] == 'r') flags |= FLAG_REVERSE; ac--; av++; while (ac > 0 && **av == '-') { #define OPT_MATCH(opt) (strcmp(*av, opt) == 0) #define MUST_HAVE_ARG if (ac < 2) print_usage(cmd) #define APPEND_LIST(array, size, item, what) \ if (size >= (sizeof(array) / sizeof(array[0]))) { \ errormsg("too many " what "\n"); \ exit(1); \ } \ array[size++] = item; \ ac--; av++ if (OPT_MATCH ("-in") || OPT_MATCH ("-i")) { MUST_HAVE_ARG; in_code = av[1]; ac--; av++; } else if (OPT_MATCH ("-out") || OPT_MATCH ("-o")) { MUST_HAVE_ARG; out_code = av[1]; ac--; av++; } else if (OPT_MATCH ("-conf") || OPT_MATCH ("-c")) { MUST_HAVE_ARG; resconf_file = av[1]; ac--; av++; } else if (OPT_MATCH ("-nameprep") || OPT_MATCH ("-n")) { MUST_HAVE_ARG; nameprep_version = av[1]; ac--; av++; } else if (OPT_MATCH ("-noconf") || OPT_MATCH ("-C")) { no_resconf = 1; } else if (OPT_MATCH ("-reverse") || OPT_MATCH ("-r")) { flags |= FLAG_REVERSE; } else if (OPT_MATCH ("-nolocalmap") || OPT_MATCH ("-L")) { flags &= ~FLAG_LOCALMAP; } else if (OPT_MATCH ("-nonameprep") || OPT_MATCH ("-N")) { flags &= ~FLAG_NAMEPREP; } else if (OPT_MATCH ("-unassigncheck") || OPT_MATCH ("-u")) { flags |= FLAG_UNASSIGNCHECK; } else if (OPT_MATCH ("-nounassigncheck") || OPT_MATCH ("-U")) { flags &= ~FLAG_UNASSIGNCHECK; } else if (OPT_MATCH ("-nobidicheck") || OPT_MATCH ("-B")) { flags &= ~FLAG_BIDICHECK; } else if (OPT_MATCH ("-noasciicheck") || OPT_MATCH ("-A")) { flags &= ~FLAG_ASCIICHECK; } else if (OPT_MATCH ("-nolengthcheck")) { flags &= ~FLAG_LENGTHCHECK; } else if (OPT_MATCH ("-noroundtripcheck")) { flags &= ~FLAG_ROUNDTRIPCHECK; } else if (OPT_MATCH ("-whole") || OPT_MATCH ("-w")) { flags &= ~FLAG_SELECTIVE; } else if (OPT_MATCH ("-localmap")) { MUST_HAVE_ARG; APPEND_LIST (localmappers, nlocalmappers, av[1], "local maps"); } else if (OPT_MATCH ("-delimiter")) { unsigned long v; MUST_HAVE_ARG; v = get_ucs (av[1]); APPEND_LIST (delimiters, ndelimiters, v, "delimiter maps"); } else if (OPT_MATCH ("-alias") || OPT_MATCH ("-a")) { MUST_HAVE_ARG; encoding_alias = av[1]; ac--; av++; } else if (OPT_MATCH ("-flush")) { flush_every_line = 1; } else if (OPT_MATCH ("-version") || OPT_MATCH ("-v")) { print_version (); } else { print_usage (cmd); } #undef OPT_MATCH #undef MUST_HAVE_ARG #undef APPEND_LIST ac--; av++; } if (ac > 1) print_usage (cmd); /* Initialize. */ if ((r = idn_resconf_initialize ()) != idn_success) { errormsg ("error initializing library\n"); return (1); } /* * Create resource contexts. * `resconf1' and `resconf2' are almost the same but local and * IDN encodings are reversed. */ resconf1 = NULL; resconf2 = NULL; if (idn_resconf_create (&resconf1) != idn_success || idn_resconf_create (&resconf2) != idn_success) { errormsg ("error initializing configuration contexts\n"); return (1); } /* Load configuration file. */ if (no_resconf) { set_defaults (resconf1); set_defaults (resconf2); } else { load_conf_file (resconf1, resconf_file); load_conf_file (resconf2, resconf_file); } /* Set encoding alias file. */ if (encoding_alias != NULL) set_encoding_alias (encoding_alias); /* Set input codeset. */ if (flags & FLAG_REVERSE) { if (in_code == NULL) { conv = idn_resconf_getidnconverter (resconf1); if (conv == NULL) { errormsg ("cannot get the IDN encoding.\n" "please specify an appropriate one " "with `-in' option.\n"); exit (1); } idn_resconf_setlocalconverter (resconf2, conv); idn_converter_destroy (conv); } else { set_idncode (resconf1, in_code); set_localcode (resconf2, in_code); } } else { if (in_code == NULL) { conv = idn_resconf_getlocalconverter (resconf1); if (conv == NULL) { errormsg ("cannot get the local encoding.\n" "please specify an appropriate one " "with `-in' option.\n"); exit (1); } idn_resconf_setidnconverter (resconf2, conv); idn_converter_destroy (conv); } else { set_localcode (resconf1, in_code); set_idncode (resconf2, in_code); } } /* Set output codeset. */ if (flags & FLAG_REVERSE) { if (out_code == NULL) { conv = idn_resconf_getlocalconverter (resconf1); if (conv == NULL) { errormsg ("cannot get the local encoding.\n" "please specify an appropriate one " "with `-out' option.\n"); exit (1); } idn_resconf_setidnconverter (resconf2, conv); idn_converter_destroy (conv); } else { set_localcode (resconf1, out_code); set_idncode (resconf2, out_code); } } else { if (out_code == NULL) { conv = idn_resconf_getidnconverter (resconf1); if (conv == NULL) { errormsg ("cannot get the IDN encoding.\n" "please specify an appropriate one " "with `-out' option.\n"); exit (1); } idn_resconf_setlocalconverter (resconf2, conv); idn_converter_destroy (conv); } else { set_idncode (resconf1, out_code); set_localcode (resconf2, out_code); } } /* Set delimiter map(s). */ if (ndelimiters > 0) { set_delimitermapper (resconf1, delimiters, ndelimiters); set_delimitermapper (resconf2, delimiters, ndelimiters); } /* Set local map(s). */ if (nlocalmappers > 0) { set_localmapper (resconf1, localmappers, nlocalmappers); set_localmapper (resconf2, localmappers, nlocalmappers); } /* Set NAMEPREP version. */ if (nameprep_version != NULL) { set_nameprep (resconf1, nameprep_version); set_nameprep (resconf2, nameprep_version); } idn_res_enable (1); /* Open input file. */ if (ac > 0) { if ((fp = fopen (av[0], "r")) == NULL) { errormsg ("cannot open file %s: %s\n", av[0], strerror (errno)); return (1); } } else { fp = stdin; } /* Do the conversion. */ if (flags & FLAG_REVERSE) exit_value = decode_file (resconf1, resconf2, fp, flags); else exit_value = encode_file (resconf1, resconf2, fp, flags); idn_resconf_destroy (resconf1); idn_resconf_destroy (resconf2); return exit_value; }