<?xml version="1.0" ?><!-- -*- SGML -*- -->
<package>
    <comment>
        Licensed to the Apache Software Foundation (ASF) under one
        or more contributor license agreements.  See the NOTICE file
        distributed with this work for additional information
        regarding copyright ownership.  The ASF licenses this file
        to you under the Apache License, Version 2.0 (the
        "License"); you may not use this file except in compliance
        with the License.  You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

        Unless required by applicable law or agreed to in writing,
        software distributed under the License is distributed on an
        "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
        KIND, either express or implied.  See the License for the
        specific language governing permissions and limitations
        under the License.
    </comment>
    <job id="run_locale_utils" prompt="no">
        <?job error="false" debug="false" ?>
        <runtime>
            <description>
Checks locale utilities:
    1. Locale utilities sanity: location, output, etc;
    2. Functionality:
        - (re)generation  of databases;
            </description>
            <named helpstring="Debug output" name="d"/>
            <named helpstring="Perform sanity check" name="s"/>
            <named helpstring="Perform functionality check" name="f"/>
            <named helpstring="Path to the locale source files"
                name="i" type="string"/>
            <named helpstring="Locale name" name="l" type="string"/>
            <named helpstring="Output file" name="O" type="string"/>
            <example>cscript run_locale_utils.wsf /s /b:..\..\..\bin\11s"
            </example>
            <usage>
Usage: cscript run_locale_utils.wsf [/d] [/n] [/s] [/f [/i:@NlsDir /l:@LocaleName]] [/b:@BinDir] [/O:@Out],
where
- "/d" debug;
- "/n" no cleanup;
- "/s" tests location, output;
- "/f" tests functionality; is followed by:
    - "/i:@NlsDir>"
    - "/l:@LocaleName>";
- "/b:@BinDir";
- "/O:@OutFile"
            </usage>
        </runtime>
        <object id="fso" progid="Scripting.FileSystemObject"/>
        <object id="WshShell" progid="WScript.Shell"/>
        <script id="run_locale_utils" language="JScript">
<![CDATA[
//
// run_locale_utils script for Stdcxx library
//

var dbgout     = false;
var chk_sanity = false;
var chk_func   = false;
var nlsdir     = "";
var locale_db  = "";
var bindir     = "";
var outstrm    = WScript.StdOut;
var no_clean   = false;

var locale     = "locale.exe";
var localedef  = "localedef.exe";

var TemporaryFolder = 2;
var tmpdir = fso.GetSpecialFolder(TemporaryFolder) + "\\" + fso.GetTempName();

// assertions
var assertions       = 0;
var failedassertions = 0;

var run_stdout;
var run_stderr;

var WEnv = WshShell.Environment("PROCESS");

// printf the message line to the stderr
function DebugOutLine(msg)
{
    if (dbgout)
        WScript.StdErr.WriteLine(msg);
}

// printf the message to the stderr
function DebugOut(msg)
{
    if (dbgout)
        WScript.StdErr.Write(msg);
}

// execute command and set run_stdout to the cmd stdout content;
// set run_stderr to the cmd stderr content
function Run(cmd)
{
    var exec = WshShell.Exec(cmd);
    run_stdout = "";
    run_stderr = "";
    while (0 == exec.Status) {
        WScript.Sleep(100);
        run_stdout += exec.StdOut.ReadAll();
        run_stderr += exec.StdErr.ReadAll();
    }

    run_stdout += exec.StdOut.ReadAll();
    run_stderr += exec.StdErr.ReadAll();

    return exec;
}

function Cleanup()
{
    if (!no_clean && fso.FolderExists(tmpdir))
        fso.DeleteFolder(tmpdir, true);
}

function Exit(code)
{
    Cleanup();
    WScript.Quit(code);
}

// convert number num to string with specified width
function FormatNumber(num, width)
{
    var s = num.toString();
    var spaces = width - s.length;
    for (var i = 0; i < spaces; ++i)
        s = " " + s;
    return s;
}

// create folder with intermediate folders, if needed
function CreateFolder(path)
{
    var res = true;

    if (!fso.FolderExists(path))
    {
        var parent = fso.GetParentFolderName(path);
        if (0 == parent.length)
            return false;
        res = CreateFolder(parent);
        if (res)
        {
            try
            {
                fso.CreateFolder(path);
            }
            catch (e)
            {
                res = false;
            }
        }
    }

    return res;
}

var description = new run_locale_utils; // run

//////////////////////////////////////////////////////////////////////////////
//	Function definitions - checking sanity
//////////////////////////////////////////////////////////////////////////////

function check_locale_help()
{
    DebugOut("Checking \"locale --help\" output...");

    var cmd = locale + " --help";
    var exec = Run(cmd);

    var xout = new Array("NAME", "SYNOPSIS", "DESCRIPTION");

    for (var i = 0; i < xout.length; ++i)
    {
        ++assertions;

        if (0 > run_stdout.search(xout[i]))
        {
            DebugOutLine(" incorrect.");
            DebugOutLine("ERROR: \"locale --help\" gives wrong output ("
                   + xout[i] + ").");

            ++failedassertions;

            return;
        }
    }

    DebugOutLine(" correct.");
}

function check_locale_all()
{
    DebugOut("Checking \"locale -a\" output...");

    var cmd = locale + " -a";
    var exec = Run(cmd);
    var aout = run_stdout.split("\n");

    for (var i = 0; i < aout.length; ++i)
    {
        ++assertions;

        var line = aout[i].replace("\r", "").replace("\n", "");
        
        if (0 == line.length || "C" == line)
            continue;

        if (0 > line.search(new RegExp("[a-z]\{2\}_[A-Z]\{2\}")))
        {
            DebugOutLine(" incorrect.");
            DebugOutLine("    Warning: Locale name " + line
                   + " not matching pattern.");

            ++failedassertions;

            return;
        }
    }

    DebugOutLine("check completed.");
}

function check_locale_m()
{
    DebugOut("Checking \"locale -m\" output...");

    var cmd = locale + " -m";
    var exec = Run(cmd);
    var aout = run_stdout.split("\n");

    for (var i = 0; i < aout.length; ++i)
    {
        ++assertions;

        var line = aout[i].replace("\r", "").replace("\n", "");
        
        if (0 > line.search(new RegExp(".cm")))
        {
            DebugOutLine(" incorrect.");
            DebugOutLine("ERROR: \"locale -m\" failed.");

            ++failedassertions;

            return;
        }
    }

    DebugOutLine(" correct.");
}

function check_locale_k()
{
    DebugOut("Checking \"locale -k LC_ALL\" output...")

    var cmd = locale + " -k LC_ALL";
    var exec = Run(cmd);

    var xout = new Array("upper", "lower", "space", "print", "cntrl",
        "alpha", "digit", "punct", "graph", "xdigit", "toupper",
        "tolower", "abday", "day", "abmon", "", "mon", "am_pm",
        "d_t_fmt", "d_fmt", "t_fmt", "t_fmt_ampm", "int_curr_symbol",
        "currency_symbol", "mon_decimal_point", "mon_thousands_sep",
        "mon_grouping", "positive_sign", "negative_sign", "int_frac_digits",
        "frac_digits", "p_cs_precedes", "p_sep_by_space", "n_cs_precedes",
        "n_sep_by_space", "p_sign_posn", "n_sign_posn", "decimal_point",
        "thousands_sep", "grouping");

    var any_failed = false;

    for (var i = 0; i < xout.length; ++i)
    {
        ++assertions;

        if (0 > run_stdout.search(xout[i]))
        {
            // output text only for the first failure
            if (!any_failed)
                DebugOutLine(" incorrect.");

            DebugOutLine("ERROR: \"locale -k\" gives wrong output (" +
                         + xout[i] +").");

            ++failedassertions;

            any_failed = true;

        }
    }

    if (!any_failed)
        DebugOutLine(" correct.");
}

function check_localedef_help()
{
    DebugOut("Checking \"localedef --help\" output...");

    var cmd = localedef + " --help";
    var exec = Run(cmd);

    var xout = new Array("NAME", "SYNOPSIS", "DESCRIPTION");

    for (var i = 0; i < xout.length; ++i)
    {
        ++assertions;

        if (0 > run_stdout.search(xout[i]))
        {
            DebugOutLine(" incorrect.");
            DebugOutLine("ERROR: \"localedef --help\" gives wrong output ("
                   + xout[i] + ").");

            ++failedassertions;

            return;
        }
    }

    DebugOutLine(" correct.");
}

//////////////////////////////////////////////////////////////////////////////
//	Function definitions - checking functionality
//////////////////////////////////////////////////////////////////////////////


//
// Generates one specified locale
//
function generate_locale(charmap, src, locname)
{
    var err = "Cannot generate locale database - ";

    // charmap - character map file used in generating the locale database
    // src     - source/locale definition file
    // locname - locale database name

    if (charmap == "")
    {
        outstrm.WriteLine(err + "character maps file not specified.");
        Exit(1);
    }

    if (src == "")
    {
        outstrm.WriteLine(err  + "source input file not specified.");
        Exit(1);
    }

    if (locname == "")
    {
        outstrm.WriteLine(err + "output locale name not specified.");
        Exit(1);
    }

    ++assertions;

    // Generating the database
    var cmd = localedef + " -w -c -f " + charmap
            + " -i " + src + " " + locname;
    DebugOutLine(cmd);

    var exec = Run(cmd);
    DebugOut(run_stdout);

    var retcode = exec.ExitCode;
    if (retcode)
    {
        // exit with the same status as the tool
        Exit(retcode);
    }
}

//
//
//
function dump_charmap(locname, outfile)
{
    err="Cannot create characater set description file - "

    // locname: LC_ALL value
    // outfile: output file name

    if (outfile == "")
    {
        outstrm.WriteLine(err + " - no output file specified.");
        Exit(1);
    }

    ++assertions;

    // dumping charmap
    var cmd = locale + " --charmap -l";
    DebugOutLine("LC_ALL=" + locname + " " + cmd + " > " + outfile);

    WEnv("LC_ALL") = locname;
    var exec = Run(cmd);

    DebugOut(run_stderr);

    var dmpfile = fso.CreateTextFile(outfile, true);
    if (dmpfile)
    {
        dmpfile.Write(run_stdout);
        dmpfile.Close();
    }

    var retcode = exec.ExitCode;
    if (retcode)
    {
        // exit with the same status as the tool
        Exit(retcode);
    }
}

//
// Dumps one locale database
//
function dump_locale(locname, dumpfile)
{
    var err = "Cannot dump locale database - ";

    // locname:  LC_ALL value
    // dumpfile: current locale dump file

    if (dumpfile == "")
    {
        outstrm.WriteLine(err + " - no output file specified.");
        Exit(1);
    }

    ++assertions;

    // Dumping locale database
    var cmd = locale + " -ck -h -l LC_ALL";
    DebugOutLine("LC_ALL=" + locname + " " + cmd + " > " + dumpfile);

    WEnv("LC_ALL") = locname;
    var exec = Run(cmd);

    DebugOut(run_stderr);

    var dmpfile = fso.CreateTextFile(dumpfile, true);
    if (dmpfile)
    {
        dmpfile.Write(run_stdout);
        dmpfile.Close();
    }

    var retcode = exec.ExitCode;
    if (retcode)
    {
        // exit with the same status as the tool
        Exit(retcode);
    }
}

//
// Test one locale
//
function test_locale(nlsdir, tmpdir, fname)
{
    var err = "Cannot test locale - ";

    // nlsdir  - nls subdirectory of the source directory tree
    // tmpdir  - the test (sandbox) directory
    // locname - name of the locale database
    
    if (nlsdir == "")
    {
        outstrm.WriteLine(err+ " - nls directory not specified.");
        Exit(1);
    }

    if (tmpdir == "")
    {
        outstrm.WriteLine(err + " - temporary directory not specified.");
        Exit(1);
    }

    if (fname == "")
    {
        outstrm.WriteLine(err+ " - locale database name not specified.");
        Exit(1);
    }

    // get locale's name and encoding
    var rx = new RegExp("\([^.]*\)\.\([^@]*\)\(.*\)");
    var source = fname.replace(rx, "$1$3").replace("@", ".");
    var charmap = fname.replace(rx, "$2");

    var src_path = nlsdir + "\\src\\" + source;
    var cm_path = nlsdir + "\\charmaps\\" + charmap;

    var stage_1 = tmpdir + "\\stage.1";
    var stage_2 = tmpdir + "\\stage.2";
    var stage_3 = tmpdir + "\\stage.3";

    source += ".src";

    // point locale at the original source directory
    DebugOutLine("RWSTD_SRC_ROOT=" + nlsdir);
    WEnv("RWSTD_SRC_ROOT") = nlsdir;

    // create a directory for stage 1 charmap source files
    var cm_dir1 = stage_1 + "\\charmaps";
    DebugOutLine("mkdir " + cm_dir1);
    CreateFolder(cm_dir1);

    ++assertions;

    var locname1 = stage_1 + "\\" + fname;
    var cm_path1 = cm_dir1 + "\\" + charmap;
    var src_path1 = stage_1 + "\\" + source;

    // generate stage 1 locale database from the orignal sources
    generate_locale(cm_path, src_path, locname1);

    ++assertions;

    // dump the charmap and the locale data from the database
    // to a pair of charmap and locale source files
    dump_charmap(locname1, cm_path1);
    dump_locale(locname1, src_path1);

    // create a directory for stage 2 charmap source files
    var cm_dir2 = stage_2 + "\\charmaps";
    DebugOutLine("mkdir " + cm_dir2);
    CreateFolder(cm_dir2);

    ++assertions;

    var locname2 = stage_2 + "\\" + fname;
    var cm_path2 = cm_dir2 + "\\" + charmap;
    var src_path2 = stage_2 + "\\" + source;

    // generate stage 2 locale database from the charmap and locale
    // source files produced by locale from the stage 1 database
    generate_locale(cm_path1, src_path1, locname2);

    // point locale at the stage 1 directory
    DebugOutLine("RWSTD_SRC_ROOT=" + stage_1);
    WEnv("RWSTD_SRC_ROOT") = stage_1;

    ++assertions;

    // dump the charmap and the locale data from the database
    //to a pair of charmap and locale source files
    dump_charmap(locname2, cm_path2);
    dump_locale(locname2, src_path2);

    ++assertions;

    // create a directory for stage 2 charmap source files
    var cm_dir3 = stage_3 + "\\charmaps";
    DebugOutLine("mkdir " + cm_dir3);
    CreateFolder(cm_dir3);

    ++assertions;

    var locname3 = stage_3 + "\\" + fname;
    var cm_path3 = cm_dir3 + "\\" + charmap;
    var src_path3 = stage_3 + "\\" + source;

    // generate stage 3 locale database from the charmap and locale
    // source files produced by locale from the stage 2 database
    generate_locale(cm_path2, src_path2, locname3);

    // point locale at the stage 2 directory
    DebugOutLine("RWSTD_SRC_ROOT=" + stage_2);
    WEnv("RWSTD_SRC_ROOT") = stage_2;

    ++assertions;

    // dump the charmap and the locale data from the database
    // to a pair of charmap and locale source files
    dump_charmap(locname3, cm_path3);
    dump_locale(locname3, src_path3);

    ++assertions;

    // verify that stage 1 and stage 2 charmaps are the same
    var cmd = "fc " + cm_path1 + " " + cm_path2;
    DebugOutLine(cmd);
    var retcode = Run(cmd).ExitCode;
    if (retcode)
    {
        DebugOutLine("## AssertionFailed: " + cm_path1 +
                     " and " + cm_path2 + " differ.");
        ++failedassertions;
    }

    // verify that stage 2 and stage 3 charmaps are the same
    var cmd = "fc " + cm_path2 + " " + cm_path3;
    DebugOutLine(cmd);
    var retcode = Run(cmd).ExitCode;
    if (retcode)
    {
        DebugOutLine("## AssertionFailed: " + cm_path2 +
                     " and " + cm_path3 + " differ.");
        ++failedassertions;
    }

    // verify that stage 2 and stage 3 locale sources are the same
    var cmd = "fc " + src_path2 + " " + src_path3;
    DebugOutLine(cmd);
    var retcode = Run(cmd).ExitCode;
    if (retcode)
    {
        DebugOutLine("## AssertionFailed: " + src_path2 +
                     " and " + src_path3 + " differ.");
        ++failedassertions;
    }

    if (!no_clean)
    {
        // clean up
        DebugOutLine("rm -rf " + stage_1 + " " + stage_2 + " " + stage_3);
        if (fso.FolderExists(stage_1))
            fso.DeleteFolder(stage_1, true);
        if (fso.FolderExists(stage_2))
            fso.DeleteFolder(stage_2, true);
        if (fso.FolderExists(stage_3))
            fso.DeleteFolder(stage_3, true);
    }
}

//////////////////////////////////////////////////////////////////////////////
//  Main code
//////////////////////////////////////////////////////////////////////////////

function run_locale_utils()
{
    if (WScript.Arguments.Named.Exists("d"))
        dbgout = true;

    if (WScript.Arguments.Named.Exists("s"))
        chk_sanity = true;

    if (WScript.Arguments.Named.Exists("f"))
        chk_func = true;

    if (WScript.Arguments.Named.Exists("i"))
        nlsdir = WScript.Arguments.Named("i");

    if (WScript.Arguments.Named.Exists("l"))
        locale_db = WScript.Arguments.Named("l");

    if (WScript.Arguments.Named.Exists("n"))
        no_clean = true;

    if (WScript.Arguments.Named.Exists("b"))
    {
        bindir = WScript.Arguments.Named("b");
        locale = bindir + "\\" + locale;
        localedef = bindir + "\\" + localedef;
    }

    if (WScript.Arguments.Named.Exists("O"))
    {
        var outfile = WScript.Arguments.Named("O");
        outstrm = fso.CreateTextFile(outfile, true);
        if (!outstrm)
        {
            WScript.StdErr.WriteLine("Unable to create " + outfile + ", aborting");
            WScript.Quit(2);
        }
    }

    if (chk_sanity)
    {
        // checking locale sanity
        check_locale_help();
        check_locale_all();
        check_locale_m();
        check_locale_k();
        check_localedef_help();
    
    }
    else if (chk_func)
    {
        // create the temp dir
        if (!CreateFolder(tmpdir))
        {
            WScript.StdErr.WriteLine("Unable to create " + tmpdir + ", aborting");
            WScript.Quit(1);
        }
    
        // test only one locale
        test_locale(nlsdir, tmpdir, locale_db);

        Cleanup();
    }
    else
    {
        // Invocation is wrong
        WScript.Arguments.ShowUsage();
        WScript.Quit(2);
    }

    if (assertions)
    {
        var pcnt = 100 * (assertions - failedassertions) / assertions;
        pcnt = Math.floor(pcnt + 0.5);
        outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
        outstrm.WriteLine("# | DIAGNOSTIC            | ACTIVE |  TOTAL |INACTIVE|");
        outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
        outstrm.WriteLine("# | (S7) ASSERTION        | " + FormatNumber(failedassertions, 6)
            + " | " + FormatNumber(assertions, 6) + " | " + FormatNumber(pcnt, 5) + "% |");
        outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
        outstrm.WriteLine();
    }
    outstrm.WriteLine("## Assertions = " + assertions);
    outstrm.WriteLine("## FailedAssertions = " + failedassertions);
    outstrm.WriteLine();
}

]]>
        </script>
    </job>
</package>
