| <?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> |