Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
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);
}
Exemplo n.º 5
0
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;
}