16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2003-2012, International Business Machines
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   file name:  gensprep.c
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   encoding:   US-ASCII
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   tab size:   8 (not used)
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   indentation:4
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created on: 2003-02-06
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created by: Ram Viswanadha
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   This program reads the Profile.txt files,
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   parses them, and extracts the data for StringPrep profile.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   It then preprocesses it and writes a binary file for efficient use
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   in various StringPrep conversion processes.
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define USPREP_TYPE_NAMES_ARRAY 1
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unewdata.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uoptions.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uparse.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "sprpimpl.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uclean.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "gensprep.h"
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool beVerbose=FALSE, haveCopyright=TRUE;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NORM_CORRECTIONS_FILE_NAME "NormalizationCorrections.txt"
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NORMALIZE_DIRECTIVE "normalize"
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NORMALIZE_DIRECTIVE_LEN 9
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHECK_BIDI_DIRECTIVE "check-bidi"
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHECK_BIDI_DIRECTIVE_LEN 10
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prototypes --------------------------------------------------------------- */
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgparseMappings(const char *filename, UBool reportError, UErrorCode *pErrorCode);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgparseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* -------------------------------------------------------------------------- */
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UOption options[]={
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_HELP_H,
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_HELP_QUESTION_MARK,
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_VERBOSE,
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_COPYRIGHT,
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DESTDIR,
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_SOURCEDIR,
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_ICUDATADIR,
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_BUNDLE_NAME,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "normalization", NULL, NULL, NULL, 'n', UOPT_REQUIRES_ARG, 0 },
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "norm-correction", NULL, NULL, NULL, 'm', UOPT_REQUIRES_ARG, 0 },
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "check-bidi", NULL, NULL, NULL,  'k', UOPT_NO_ARG, 0},
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 },
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum{
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HELP,
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HELP_QUESTION_MARK,
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    VERBOSE,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    COPYRIGHT,
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DESTDIR,
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SOURCEDIR,
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ICUDATADIR,
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BUNDLE_NAME,
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    NORMALIZE,
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    NORM_CORRECTION_DIR,
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BIDI,
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UNICODE_VERSION
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int printHelp(int argc, char* argv[]){
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Broken into chucks because the C89 standard says the minimum
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * required supported string length is 509 bytes.
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "Usage: %s [-options] [file_name]\n"
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\n"
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "Read the files specified and\n"
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "create a binary file [package-name]_[bundle-name]." DATA_TYPE " with the StringPrep profile data\n"
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\n",
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        argv[0]);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "Options:\n"
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-h or -? or --help       print this usage text\n"
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-v or --verbose          verbose output\n"
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-c or --copyright        include a copyright notice\n");
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-d or --destdir          destination directory, followed by the path\n"
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-s or --sourcedir        source directory of ICU data, followed by the path\n"
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-b or --bundle-name      generate the ouput data file with the name specified\n"
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-i or --icudatadir       directory for locating any needed intermediate data files,\n"
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         followed by path, defaults to %s\n",
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getDataDirectory());
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-n or --normalize        turn on the option for normalization and include mappings\n"
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         from NormalizationCorrections.txt from the given path,\n"
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         e.g: /test/icu/source/data/unidata\n");
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-m or --norm-correction  use NormalizationCorrections.txt from the given path\n"
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         when the input file contains a normalization directive.\n"
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         unlike -n/--normalize, this option does not force the\n"
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t                         normalization.\n");
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-k or --check-bidi       turn on the option for checking for BiDi in the profile\n"
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\t-u or --unicode          version of Unicode to be used with this profile followed by the version\n"
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        );
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern int
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgmain(int argc, char* argv[]) {
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_IDNA
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char* filename = NULL;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *srcDir=NULL, *destDir=NULL, *icuUniDataDir=NULL;
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *bundleName=NULL, *inputFileName = NULL;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *basename=NULL;
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t sprepOptions = 0;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_MAIN_INIT_ARGS(argc, argv);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* preset then read command line options */
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    options[DESTDIR].value=u_getDataDirectory();
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    options[SOURCEDIR].value="";
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    options[UNICODE_VERSION].value="0"; /* don't assume the unicode version */
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    options[BUNDLE_NAME].value = DATA_NAME;
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    options[NORMALIZE].value = "";
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* error handling, printing usage message */
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(argc<0) {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr,
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "error in command line argument \"%s\"\n",
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            argv[-argc]);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(argc<0 || options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return printHelp(argc, argv);
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the options values */
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    beVerbose=options[VERBOSE].doesOccur;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    haveCopyright=options[COPYRIGHT].doesOccur;
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcDir=options[SOURCEDIR].value;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destDir=options[DESTDIR].value;
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bundleName = options[BUNDLE_NAME].value;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[NORMALIZE].doesOccur) {
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        icuUniDataDir = options[NORMALIZE].value;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        icuUniDataDir = options[NORM_CORRECTION_DIR].value;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(argc<2) {
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* print the help message */
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return printHelp(argc, argv);
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        inputFileName = argv[1];
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!options[UNICODE_VERSION].doesOccur){
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return printHelp(argc, argv);
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[ICUDATADIR].doesOccur) {
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_setDataDirectory(options[ICUDATADIR].value);
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UCONFIG_NO_IDNA
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "gensprep writes dummy " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        " because UCONFIG_NO_IDNA is set, \n"
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "see icu/source/common/unicode/uconfig.h\n");
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    generateData(destDir, bundleName);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setUnicodeVersion(options[UNICODE_VERSION].value);
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    filename = (char* ) uprv_malloc(uprv_strlen(srcDir) + 300); /* hopefully this should be enough */
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* prepare the filename beginning with the source dir */
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uprv_strchr(srcDir,U_FILE_SEP_CHAR) == NULL && uprv_strchr(srcDir,U_FILE_ALT_SEP_CHAR) == NULL){
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        filename[0] = '.';
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        filename[1] = U_FILE_SEP_CHAR;
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(filename+2,srcDir);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else{
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(filename, srcDir);
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    basename=filename+uprv_strlen(filename);
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *basename++=U_FILE_SEP_CHAR;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize */
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    init();
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* process the file */
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strcpy(basename,inputFileName);
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    parseMappings(filename,FALSE, &errorCode);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "Could not open file %s for reading. Error: %s \n", filename, u_errorName(errorCode));
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return errorCode;
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[NORMALIZE].doesOccur){ /* this option might be set by @normalize;; in the source file */
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* set up directory for NormalizationCorrections.txt */
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(filename,icuUniDataDir);
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        basename=filename+uprv_strlen(filename);
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *basename++=U_FILE_SEP_CHAR;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *basename++=U_FILE_SEP_CHAR;
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_strcpy(basename,NORM_CORRECTIONS_FILE_NAME);
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        parseNormalizationCorrections(filename,&errorCode);
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)){
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr,"Could not open file %s for reading \n", filename);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return errorCode;
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprepOptions |= _SPREP_NORMALIZATION_ON;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[CHECK_BIDI].doesOccur){ /* this option might be set by @check-bidi;; in the source file */
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprepOptions |= _SPREP_CHECK_BIDI_ON;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setOptions(sprepOptions);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* process parsed data */
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* write the data file */
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        generateData(destDir, bundleName);
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cleanUpData();
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_free(filename);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_cleanup();
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return errorCode;
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_IDNA
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnormalizationCorrectionsLineFn(void *context,
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    char *fields[][2], int32_t fieldCount,
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UErrorCode *pErrorCode) {
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t mapping[40];
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *end, *s;
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t code;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo version;
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo thisVersion;
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the character code, field 0 */
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16);
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "gensprep: error parsing NormalizationCorrections.txt mapping at %s\n", fields[0][0]);
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(*pErrorCode);
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Original (erroneous) decomposition */
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    s = fields[1][0];
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* parse the mapping string */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_parseCodePoints(s, mapping, sizeof(mapping)/4, pErrorCode);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* ignore corrected decomposition */
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(version,fields[3][0] );
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(thisVersion, "3.2.0");
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "gensprep error parsing NormalizationCorrections.txt of U+%04lx - %s\n",
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)code, u_errorName(*pErrorCode));
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(*pErrorCode);
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* store the mapping */
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( version[0] > thisVersion[0] ||
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((version[0]==thisVersion[0]) && (version[1] > thisVersion[1]))
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ){
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        storeMapping(code,mapping, length, USPREP_MAP, pErrorCode);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setUnicodeVersionNC(version);
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgparseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode) {
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *fields[4][2];
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_parseDelimitedFile(filename, ';', fields, 4, normalizationCorrectionsLineFn, NULL, pErrorCode);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* fprintf(stdout,"Number of code points that have NormalizationCorrections mapping with length >1 : %i\n",len); */
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode) && ( *pErrorCode!=U_FILE_ACCESS_ERROR)) {
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "gensprep error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode));
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(*pErrorCode);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstrprepProfileLineFn(void *context,
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              char *fields[][2], int32_t fieldCount,
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UErrorCode *pErrorCode) {
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t mapping[40];
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *end, *map;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t code;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   /*UBool* mapWithNorm = (UBool*) context;*/
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* typeName;
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t rangeStart=0,rangeEnd =0;
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* filename = (const char*) context;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *s;
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    s = u_skipWhitespace(fields[0][0]);
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*s == '@') {
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* special directive */
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s++;
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length = fields[0][1] - s;
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (length >= NORMALIZE_DIRECTIVE_LEN
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            && uprv_strncmp(s, NORMALIZE_DIRECTIVE, NORMALIZE_DIRECTIVE_LEN) == 0) {
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            options[NORMALIZE].doesOccur = TRUE;
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (length >= CHECK_BIDI_DIRECTIVE_LEN
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            && uprv_strncmp(s, CHECK_BIDI_DIRECTIVE, CHECK_BIDI_DIRECTIVE_LEN) == 0) {
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            options[CHECK_BIDI].doesOccur = TRUE;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr, "gensprep error parsing a directive %s.", fields[0][0]);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    typeName = fields[2][0];
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    map = fields[1][0];
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uprv_strstr(typeName, usprepTypeNames[USPREP_UNASSIGNED])!=NULL){
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_parseCodePointRange(s, &rangeStart,&rangeEnd, pErrorCode);
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(*pErrorCode)){
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr, "Could not parse code point range. Error: %s\n",u_errorName(*pErrorCode));
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* store the range */
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        storeRange(rangeStart,rangeEnd,USPREP_UNASSIGNED, pErrorCode);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_PROHIBITED])!=NULL){
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_parseCodePointRange(s, &rangeStart,&rangeEnd, pErrorCode);
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(*pErrorCode)){
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr, "Could not parse code point range. Error: %s\n",u_errorName(*pErrorCode));
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* store the range */
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        storeRange(rangeStart,rangeEnd,USPREP_PROHIBITED, pErrorCode);
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_MAP])!=NULL){
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* get the character code, field 0 */
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        code=(uint32_t)uprv_strtoul(s, &end, 16);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(end<=s || end!=fields[0][1]) {
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr, "gensprep: syntax error in field 0 at %s\n", fields[0][0]);
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *pErrorCode=U_PARSE_ERROR;
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            exit(U_PARSE_ERROR);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* parse the mapping string */
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=u_parseCodePoints(map, mapping, sizeof(mapping)/4, pErrorCode);
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* store the mapping */
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        storeMapping(code,mapping, length,USPREP_MAP, pErrorCode);
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else{
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode = U_INVALID_FORMAT_ERROR;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "gensprep error parsing  %s line %s at %s. Error: %s\n",filename,
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               fields[0][0],fields[2][0],u_errorName(*pErrorCode));
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(*pErrorCode);
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgparseMappings(const char *filename, UBool reportError, UErrorCode *pErrorCode) {
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *fields[3][2];
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_parseDelimitedFile(filename, ';', fields, 3, strprepProfileLineFn, (void*)filename, pErrorCode);
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len);*/
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) {
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "gensprep error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode));
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        exit(*pErrorCode);
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_IDNA */
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Hey, Emacs, please set the following:
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Local Variables:
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * indent-tabs-mode: nil
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * End:
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
454