mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 05:55:48 +00:00
modified nls/3rdparty/icu4ros.rbuild
- Build fixes added nls/3rdparty/stubs.cpp - Stub out unused ICU dependencies added nls/dll/idndl added nls/dll/idndl/idndl.cpp added nls/dll/idndl/idndl.def added nls/dll/idndl/idndl.rbuild - Implemented idndl.dll forwarder added nls/dll/idndl_redist added nls/dll/idndl_redist/data added nls/dll/idndl_redist/data/genidldndata.cpp added nls/dll/idndl_redist/data/idldata.cpp added nls/dll/idndl_redist/idndl.cpp added nls/dll/idndl_redist/idndl.def added nls/dll/idndl_redist/idndl_redist.rbuild added nls/dll/idndl_redist/stubs.cpp - Implemented stand-alone idndl.dll - Implemented DownlevelGetLocaleScripts, DownlevelGetStringScripts, DownlevelVerifyScripts added nls/dll/normaliz added nls/dll/normaliz/dummy.c added nls/dll/normaliz/normaliz.def added nls/dll/normaliz/normaliz.rbuild - Implemented forwarder normaliz.dll added nls/dll/normaliz_redist/data added nls/dll/normaliz_redist/data/icudt38.c added nls/dll/normaliz_redist/data/icudt38.lst modified nls/dll/normaliz_redist/normaliz.cpp modified nls/dll/normaliz_redist/normaliz.def modified nls/dll/normaliz_redist/normaliz_redist.rbuild - Implemented stand-alone normaliz.dll added nls/lib/idna added nls/lib/idna/idna.cpp added nls/lib/idna/idna.rbuild added nls/lib/idna/nameprep.cpp - Implemented IdnToAscii, IdnToUnicode, IdnToNameprepUnicode modified nls/lib/normalize/normalize.cpp - Implemented NormalizeString, IsNormalizedString added nls/lib/scripts added nls/lib/scripts/scripts.cpp added nls/lib/scripts/scripts.h added nls/lib/scripts/scripts.rbuild - Implemented GetStringScripts, VerifyScripts added nls/media - Added directory for future data files modified nls/nls.rbuild - Build all NLS modules added nls/tests added nls/tests/normalization added nls/tests/normalization/normalizationTest.c added nls/tests/normalization/normalizationTest.h added nls/tests/normalization/normalizationTest.l added nls/tests/normalization/normalizationTest.rbuild added nls/tests/normalization/normalizationTest.sln added nls/tests/normalization/normalizationTest.tab.c added nls/tests/normalization/normalizationTest.tab.h added nls/tests/normalization/NormalizationTest.txt added nls/tests/normalization/normalizationTest.vcproj added nls/tests/normalization/normalizationTest.y added nls/tests/normalization/normalizationTest.yy.c - Test harness for NormalizeString based on official Unicode 5.0 test suite. Our implementation passes all tests. Will become an actual regression test suite in the future. svn path=/trunk/; revision=34402
This commit is contained in:
parent
bb5038fc75
commit
ffd2740ec2
39 changed files with 26385 additions and 7 deletions
14
reactos/nls/3rdparty/icu4ros.rbuild
vendored
14
reactos/nls/3rdparty/icu4ros.rbuild
vendored
|
@ -3,14 +3,19 @@
|
||||||
<module name="icu4ros" type="staticlibrary" allowwarnings="true">
|
<module name="icu4ros" type="staticlibrary" allowwarnings="true">
|
||||||
<define name="U_STATIC_IMPLEMENTATION" />
|
<define name="U_STATIC_IMPLEMENTATION" />
|
||||||
<define name="U_HAVE_INTTYPES_H" />
|
<define name="U_HAVE_INTTYPES_H" />
|
||||||
|
<define name="UCONFIG_NO_FILE_IO">1</define>
|
||||||
|
<define name="ICU_NO_USER_DATA_OVERRIDE">1</define>
|
||||||
<compilerflag>-fno-exceptions</compilerflag>
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
<compilerflag>-fno-rtti</compilerflag>
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
<include base="icu4ros">icu/source/common</include>
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<include base="icu4ros">icu/source/i18n</include>
|
||||||
|
<file>stubs.cpp</file>
|
||||||
<directory name="icu">
|
<directory name="icu">
|
||||||
<directory name="source">
|
<directory name="source">
|
||||||
<directory name="common">
|
<directory name="common">
|
||||||
<file>bmpset.cpp</file>
|
<file>bmpset.cpp</file>
|
||||||
<file>uhash_us.cpp</file>
|
<file>uhash_us.cpp</file>
|
||||||
|
<file>uidna.cpp</file>
|
||||||
<file>uiter.cpp</file>
|
<file>uiter.cpp</file>
|
||||||
<file>unifilt.cpp</file>
|
<file>unifilt.cpp</file>
|
||||||
<file>unifunct.cpp</file>
|
<file>unifunct.cpp</file>
|
||||||
|
@ -20,15 +25,24 @@
|
||||||
<file>unorm.cpp</file>
|
<file>unorm.cpp</file>
|
||||||
<file>uobject.cpp</file>
|
<file>uobject.cpp</file>
|
||||||
<file>uset.cpp</file>
|
<file>uset.cpp</file>
|
||||||
|
<file>usprep.cpp</file>
|
||||||
<file>util.cpp</file>
|
<file>util.cpp</file>
|
||||||
<file>uvector.cpp</file>
|
<file>uvector.cpp</file>
|
||||||
<file>cmemory.c</file>
|
<file>cmemory.c</file>
|
||||||
<file>cstring.c</file>
|
<file>cstring.c</file>
|
||||||
|
<file>locmap.c</file>
|
||||||
|
<file>punycode.c</file>
|
||||||
<file>ucln_cmn.c</file>
|
<file>ucln_cmn.c</file>
|
||||||
|
<file>ucmndata.c</file>
|
||||||
|
<file>ucol_swp.c</file>
|
||||||
|
<file>ubidi_props.c</file>
|
||||||
<file>udata.c</file>
|
<file>udata.c</file>
|
||||||
|
<file>udatamem.c</file>
|
||||||
<file>udataswp.c</file>
|
<file>udataswp.c</file>
|
||||||
<file>uhash.c</file>
|
<file>uhash.c</file>
|
||||||
|
<file>uinit.c</file>
|
||||||
<file>uinvchar.c</file>
|
<file>uinvchar.c</file>
|
||||||
|
<file>umapfile.c</file>
|
||||||
<file>umath.c</file>
|
<file>umath.c</file>
|
||||||
<file>umutex.c</file>
|
<file>umutex.c</file>
|
||||||
<file>ustring.c</file>
|
<file>ustring.c</file>
|
||||||
|
|
60
reactos/nls/3rdparty/stubs.cpp
vendored
Normal file
60
reactos/nls/3rdparty/stubs.cpp
vendored
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "unicode/utypes.h"
|
||||||
|
#include "unicode/putil.h"
|
||||||
|
#include "unicode/utrace.h"
|
||||||
|
#include "ucnv_io.h"
|
||||||
|
|
||||||
|
// TODO: do a better job of ensuring these internal functions really can be stubbed away
|
||||||
|
|
||||||
|
/* Unused dependencies of udata.c */
|
||||||
|
U_CAPI UBool U_EXPORT2
|
||||||
|
uprv_pathIsAbsolute(const char *) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_CAPI const char * U_EXPORT2
|
||||||
|
u_getDataDirectory() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unused dependencies of uinit.c */
|
||||||
|
U_CFUNC UBool
|
||||||
|
utrace_cleanup() {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_CFUNC uint16_t
|
||||||
|
ucnv_io_countKnownConverters(UErrorCode *) {
|
||||||
|
return 0;
|
||||||
|
}
|
25
reactos/nls/dll/idndl/idndl.cpp
Normal file
25
reactos/nls/dll/idndl/idndl.cpp
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include <idndl.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
DownlevelGetLocaleScripts
|
||||||
|
(
|
||||||
|
LPCWSTR lpLocaleName,
|
||||||
|
LPWSTR lpScripts,
|
||||||
|
int cchScripts
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return GetLocaleInfoEx(lpLocaleName, LOCALE_SSCRIPTS, lpScripts, cchScripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
6
reactos/nls/dll/idndl/idndl.def
Normal file
6
reactos/nls/dll/idndl/idndl.def
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
LIBRARY "idndl"
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
DownlevelGetLocaleScripts = DownlevelGetLocaleScripts@12 @1
|
||||||
|
DownlevelGetStringScripts@20 = kernel32.GetStringScripts @2
|
||||||
|
DownlevelVerifyScripts@20 = kernel32.VerifyScripts @3
|
10
reactos/nls/dll/idndl/idndl.rbuild
Normal file
10
reactos/nls/dll/idndl/idndl.rbuild
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="idndl" type="win32dll" installname="idndl.dll">
|
||||||
|
<library>kernel32</library>
|
||||||
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
|
<linkerflag>-Wl,--entry,0</linkerflag>
|
||||||
|
<file>idndl.cpp</file>
|
||||||
|
<importlibrary definition="idndl.def" />
|
||||||
|
</module>
|
322
reactos/nls/dll/idndl_redist/data/genidldndata.cpp
Normal file
322
reactos/nls/dll/idndl_redist/data/genidldndata.cpp
Normal file
|
@ -0,0 +1,322 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unicode/putil.h>
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
#include <unicode/uloc.h>
|
||||||
|
#include <unicode/ures.h>
|
||||||
|
#include <unicode/uscript.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct script_name
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
void normalize()
|
||||||
|
{
|
||||||
|
chars[0] = toupper(chars[0]);
|
||||||
|
chars[1] = tolower(chars[1]);
|
||||||
|
chars[2] = tolower(chars[2]);
|
||||||
|
chars[3] = tolower(chars[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
char chars[4];
|
||||||
|
|
||||||
|
bool operator<(const script_name& Y) const { return strncmp(chars, Y.chars, 4) < 0; }
|
||||||
|
bool operator>(const script_name& Y) const { return strncmp(chars, Y.chars, 4) > 0; }
|
||||||
|
bool operator==(const script_name& Y) const { return strncmp(chars, Y.chars, 4) == 0; }
|
||||||
|
bool operator!=(const script_name& Y) const { return strncmp(chars, Y.chars, 4) != 0; }
|
||||||
|
bool operator<=(const script_name& Y) const { return strncmp(chars, Y.chars, 4) <= 0; }
|
||||||
|
bool operator>=(const script_name& Y) const { return strncmp(chars, Y.chars, 4) >= 0; }
|
||||||
|
|
||||||
|
script_name(): chars() { }
|
||||||
|
script_name(const script_name& Y) { memcpy(chars, Y.chars, sizeof(chars)); }
|
||||||
|
|
||||||
|
const script_name& operator=(const script_name& Y)
|
||||||
|
{
|
||||||
|
memcpy(chars, Y.chars, sizeof(chars));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit script_name(const char * pChars)
|
||||||
|
{
|
||||||
|
assert(pChars);
|
||||||
|
assert(strlen(pChars) == 4);
|
||||||
|
chars[0] = pChars[0];
|
||||||
|
chars[1] = pChars[1];
|
||||||
|
chars[2] = pChars[2];
|
||||||
|
chars[3] = pChars[3];
|
||||||
|
normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit script_name(const UChar * pChars)
|
||||||
|
{
|
||||||
|
assert(pChars);
|
||||||
|
assert(u_strlen(pChars) == 4);
|
||||||
|
u_UCharsToChars(pChars, chars, 4);
|
||||||
|
normalize();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lessLocaleId: public std::binary_function<std::string, std::string, bool>
|
||||||
|
{
|
||||||
|
result_type operator()(const first_argument_type& x, const second_argument_type& y) const
|
||||||
|
{
|
||||||
|
return stricmp(x.c_str(), y.c_str()) < 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string convertLocale(const char * locale)
|
||||||
|
{
|
||||||
|
std::string s(locale); // FIXME!!!
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool validId(const std::string& id)
|
||||||
|
{
|
||||||
|
std::string::const_iterator p = id.begin();
|
||||||
|
|
||||||
|
if(p == id.end() || !u_isIDStart(*p))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
++ p;
|
||||||
|
|
||||||
|
for(; p != id.end(); ++ p)
|
||||||
|
if(!u_isIDPart(*p))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getLocaleLiteral(const std::string& locale)
|
||||||
|
{
|
||||||
|
std::string lit;
|
||||||
|
lit += '"';
|
||||||
|
lit += locale; // FIXME!!! escapes
|
||||||
|
lit += '"';
|
||||||
|
return lit;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getScriptLiteral(const script_name& s)
|
||||||
|
{
|
||||||
|
std::string lit;
|
||||||
|
lit += '"';
|
||||||
|
lit += s.chars[0];
|
||||||
|
lit += s.chars[1];
|
||||||
|
lit += s.chars[2];
|
||||||
|
lit += s.chars[3];
|
||||||
|
lit += '"';
|
||||||
|
return lit;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getScriptId(const script_name& s)
|
||||||
|
{
|
||||||
|
std::string id("IDNDL_Script_");
|
||||||
|
id += s.chars[0];
|
||||||
|
id += s.chars[1];
|
||||||
|
id += s.chars[2];
|
||||||
|
id += s.chars[3];
|
||||||
|
assert(validId(id));
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getScriptSetId(const std::set<script_name>& s)
|
||||||
|
{
|
||||||
|
std::string id("IDNDL_ScriptSet_");
|
||||||
|
|
||||||
|
for(std::set<script_name>::const_iterator p = s.begin(); p != s.end(); ++ p)
|
||||||
|
{
|
||||||
|
id += p->chars[0];
|
||||||
|
id += p->chars[1];
|
||||||
|
id += p->chars[2];
|
||||||
|
id += p->chars[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(validId(id));
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
UErrorCode status = U_ZERO_ERROR;
|
||||||
|
|
||||||
|
/* Locale -> scripts table */
|
||||||
|
int32_t localeCount = uloc_countAvailable();
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::set<script_name>, lessLocaleId> LocalesScripts;
|
||||||
|
LocalesScripts localesScripts;
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < localeCount; ++ i)
|
||||||
|
{
|
||||||
|
const char * locale = uloc_getAvailable(i);
|
||||||
|
UResourceBundle * localeRes = ures_open(NULL, locale, &status);
|
||||||
|
|
||||||
|
if(U_SUCCESS(status))
|
||||||
|
{
|
||||||
|
UErrorCode localStatus = U_ZERO_ERROR;
|
||||||
|
UResourceBundle * scriptsRes = ures_getByKey(localeRes, "LocaleScript", NULL, &status);
|
||||||
|
|
||||||
|
if(U_SUCCESS(status))
|
||||||
|
{
|
||||||
|
std::set<script_name> localeScripts;
|
||||||
|
|
||||||
|
while(ures_hasNext(scriptsRes))
|
||||||
|
{
|
||||||
|
int32_t scriptLen = 0;
|
||||||
|
const UChar * script = ures_getNextString(scriptsRes, &scriptLen, NULL, &localStatus);
|
||||||
|
|
||||||
|
if(U_SUCCESS(localStatus))
|
||||||
|
localeScripts.insert(script_name(script));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "warning: failed reading scripts for locale %s: %s\n", locale, u_errorName(localStatus));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(localeScripts.size())
|
||||||
|
localesScripts[convertLocale(locale)].insert(localeScripts.begin(), localeScripts.end());
|
||||||
|
|
||||||
|
ures_close(scriptsRes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf(stderr, "warning: failed reading scripts for locale %s: %s\n", locale, u_errorName(localStatus));
|
||||||
|
|
||||||
|
ures_close(localeRes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!U_SUCCESS(status))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "error: failed enumerating locale scripts: %s\n", u_errorName(status));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef std::set<std::set<script_name> > UniqueScriptSets;
|
||||||
|
UniqueScriptSets uniqueScriptSets;
|
||||||
|
|
||||||
|
for(LocalesScripts::const_iterator p = localesScripts.begin(); p != localesScripts.end(); ++ p)
|
||||||
|
uniqueScriptSets.insert(p->second);
|
||||||
|
|
||||||
|
typedef std::map<std::string, UniqueScriptSets::const_iterator> LocalesScriptsFolded;
|
||||||
|
LocalesScriptsFolded localesScriptsFolded;
|
||||||
|
|
||||||
|
for(LocalesScripts::const_iterator p = localesScripts.begin(); p != localesScripts.end(); ++ p)
|
||||||
|
localesScriptsFolded.insert(std::make_pair(p->first, uniqueScriptSets.find(p->second)));
|
||||||
|
|
||||||
|
// Unique script sets
|
||||||
|
printf("struct %s { wchar_t const * scripts; int length; };\n", "IDNDL_ScriptSet");
|
||||||
|
|
||||||
|
for(UniqueScriptSets::const_iterator p = uniqueScriptSets.begin(); p != uniqueScriptSets.end(); ++ p)
|
||||||
|
{
|
||||||
|
printf("static const %s %s = {", "IDNDL_ScriptSet", getScriptSetId(*p).c_str());
|
||||||
|
|
||||||
|
for(std::set<script_name>::const_iterator pScript = p->begin(); pScript != p->end(); ++ pScript)
|
||||||
|
printf(" L%s L\";\"", getScriptLiteral(*pScript).c_str());
|
||||||
|
|
||||||
|
printf(", %d };\n", static_cast<int>(p->size() * (4 + 1) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sorted table of locale ids
|
||||||
|
printf("static wchar_t const * const %s [] = {\n", "IDNDL_Locales");
|
||||||
|
|
||||||
|
for(LocalesScriptsFolded::const_iterator p = localesScriptsFolded.begin(); p != localesScriptsFolded.end(); ++ p)
|
||||||
|
printf("L%s,\n", getLocaleLiteral(p->first).c_str());
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
|
||||||
|
// Locale id index -> script set
|
||||||
|
printf("static %s const * const %s [] = {\n", "IDNDL_ScriptSet", "IDNDL_ScriptSets");
|
||||||
|
|
||||||
|
for(LocalesScriptsFolded::const_iterator p = localesScriptsFolded.begin(); p != localesScriptsFolded.end(); ++ p)
|
||||||
|
printf("&%s,\n", getScriptSetId(*p->second).c_str());
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
|
||||||
|
/* Codepoint -> script table */
|
||||||
|
// Script code -> script name table
|
||||||
|
printf("static const wchar_t * const %s[] = {\n", "IDNDL_ScriptNames");
|
||||||
|
|
||||||
|
for(int script = 0; script < USCRIPT_CODE_LIMIT; ++ script)
|
||||||
|
printf("L%s,\n", getScriptLiteral(script_name(uscript_getShortName(static_cast<UScriptCode>(script)))).c_str());
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
|
||||||
|
// Codepoint range -> script code
|
||||||
|
printf("struct %s { int lbound; int ubound; int code; };\n", "IDNDL_CharRangeScript");
|
||||||
|
printf("static const %s %s[] = {\n", "IDNDL_CharRangeScript", "IDNDL_CharRangeScripts");
|
||||||
|
|
||||||
|
int lbound = UCHAR_MIN_VALUE;
|
||||||
|
UScriptCode lastScript = uscript_getScript(UCHAR_MIN_VALUE, &status);
|
||||||
|
|
||||||
|
if(!U_SUCCESS(status) || lastScript < 0)
|
||||||
|
lastScript = USCRIPT_UNKNOWN;
|
||||||
|
|
||||||
|
for(UChar32 c = UCHAR_MIN_VALUE + 1; c <= UCHAR_MAX_VALUE; ++ c)
|
||||||
|
{
|
||||||
|
UScriptCode script = uscript_getScript(c, &status);
|
||||||
|
|
||||||
|
if(!U_SUCCESS(status) || script < 0)
|
||||||
|
script = USCRIPT_UNKNOWN;
|
||||||
|
|
||||||
|
assert(script >= 0 && script < USCRIPT_CODE_LIMIT);
|
||||||
|
|
||||||
|
if(script != lastScript)
|
||||||
|
{
|
||||||
|
if(lastScript != USCRIPT_UNKNOWN)
|
||||||
|
printf("{ %d, %d, %d },\n", lbound, c - 1, static_cast<int>(lastScript));
|
||||||
|
|
||||||
|
lbound = c;
|
||||||
|
lastScript = script;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lastScript != USCRIPT_UNKNOWN)
|
||||||
|
printf("{ %d, %d, %d },\n", lbound, UCHAR_MAX_VALUE, static_cast<int>(lastScript));
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
1236
reactos/nls/dll/idndl_redist/data/idldata.cpp
Normal file
1236
reactos/nls/dll/idndl_redist/data/idldata.cpp
Normal file
File diff suppressed because it is too large
Load diff
174
reactos/nls/dll/idndl_redist/idndl.cpp
Normal file
174
reactos/nls/dll/idndl_redist/idndl.cpp
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
#include <unicode/uclean.h>
|
||||||
|
#include <unicode/umachine.h>
|
||||||
|
#include <unicode/uscript.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include <idndl.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "scripts.h"
|
||||||
|
#include "data/idldata.cpp"
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
DownlevelGetLocaleScripts
|
||||||
|
(
|
||||||
|
LPCWSTR lpLocaleName,
|
||||||
|
LPWSTR lpScripts,
|
||||||
|
int cchScripts
|
||||||
|
)
|
||||||
|
{
|
||||||
|
void * lpFoundLocale = bsearch
|
||||||
|
(
|
||||||
|
lpLocaleName,
|
||||||
|
IDNDL_Locales,
|
||||||
|
//~ ARRAYSIZE(IDNDL_Locales),
|
||||||
|
sizeof(IDNDL_Locales) / sizeof(IDNDL_Locales[0]),
|
||||||
|
sizeof(IDNDL_Locales[0]),
|
||||||
|
(int (*)(const void *, const void *))_stricmp
|
||||||
|
);
|
||||||
|
|
||||||
|
if(lpFoundLocale == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const IDNDL_ScriptSet * pScriptSet = IDNDL_ScriptSets[static_cast<const wchar_t **>(lpFoundLocale) - IDNDL_Locales];
|
||||||
|
|
||||||
|
if(pScriptSet->length > cchScripts)
|
||||||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
else
|
||||||
|
memcpy(lpScripts, pScriptSet->scripts, pScriptSet->length * sizeof(WCHAR));
|
||||||
|
|
||||||
|
return pScriptSet->length;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int IDNDL_CompareCharRange(const void * x, const void * y)
|
||||||
|
{
|
||||||
|
const IDNDL_CharRangeScript * pRangeX = static_cast<const IDNDL_CharRangeScript *>(x);
|
||||||
|
const IDNDL_CharRangeScript * pRangeY = static_cast<const IDNDL_CharRangeScript *>(y);
|
||||||
|
|
||||||
|
assert(pRangeX->lbound <= pRangeX->ubound);
|
||||||
|
assert(pRangeY->lbound <= pRangeY->ubound);
|
||||||
|
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
cmp = pRangeX->ubound - pRangeY->lbound;
|
||||||
|
|
||||||
|
if(cmp < 0)
|
||||||
|
return cmp;
|
||||||
|
|
||||||
|
cmp = pRangeX->lbound - pRangeY->ubound;
|
||||||
|
|
||||||
|
if(cmp > 0)
|
||||||
|
return cmp;
|
||||||
|
|
||||||
|
assert((pRangeX->lbound >= pRangeY->lbound && pRangeX->ubound <= pRangeY->ubound) || (pRangeY->lbound >= pRangeX->lbound && pRangeY->ubound <= pRangeX->ubound));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool SCRIPTS_GetCharScriptCode(UChar32 c, int32_t * code)
|
||||||
|
{
|
||||||
|
assert(c >= UCHAR_MIN_VALUE && c <= UCHAR_MAX_VALUE);
|
||||||
|
|
||||||
|
IDNDL_CharRangeScript character;
|
||||||
|
character.lbound = c;
|
||||||
|
character.ubound = c;
|
||||||
|
|
||||||
|
void * pRange = bsearch
|
||||||
|
(
|
||||||
|
&character,
|
||||||
|
IDNDL_CharRangeScripts,
|
||||||
|
//~ ARRAYSIZE(IDNDL_CharRangeScripts),
|
||||||
|
sizeof(IDNDL_CharRangeScripts) / sizeof(IDNDL_CharRangeScripts[0]),
|
||||||
|
sizeof(IDNDL_CharRangeScripts[0]),
|
||||||
|
&IDNDL_CompareCharRange
|
||||||
|
);
|
||||||
|
|
||||||
|
if(pRange == NULL)
|
||||||
|
*code = USCRIPT_UNKNOWN;
|
||||||
|
else
|
||||||
|
*code = static_cast<IDNDL_CharRangeScript *>(pRange)->code;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool SCRIPTS_GetScriptCode(const SCRIPTS_Script * pScript, int32_t * code)
|
||||||
|
{
|
||||||
|
void * ppScript = bsearch
|
||||||
|
(
|
||||||
|
pScript,
|
||||||
|
IDNDL_ScriptNames,
|
||||||
|
//~ ARRAYSIZE(IDNDL_ScriptNames),
|
||||||
|
sizeof(IDNDL_ScriptNames) / sizeof(IDNDL_ScriptNames[0]),
|
||||||
|
sizeof(IDNDL_ScriptNames[0]),
|
||||||
|
(int (*)(const void *, const void *))_stricmp
|
||||||
|
);
|
||||||
|
|
||||||
|
bool retval;
|
||||||
|
|
||||||
|
retval = !!ppScript;
|
||||||
|
|
||||||
|
if(!retval)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
*code = static_cast<int32_t>(static_cast<const wchar_t **>(ppScript) - IDNDL_ScriptNames);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void SCRIPTS_GetScriptName(int32_t code, SCRIPTS_Script * pScript)
|
||||||
|
{
|
||||||
|
//~ assert(code >= 0 && static_cast<uint32_t>(code) < ARRAYSIZE(IDNDL_ScriptNames));
|
||||||
|
assert(code >= 0 && static_cast<uint32_t>(code) < (sizeof(IDNDL_ScriptNames) / sizeof(IDNDL_ScriptNames[0])));
|
||||||
|
memcpy(pScript->ScriptName, IDNDL_ScriptNames[code], sizeof(pScript->ScriptName));
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
35
reactos/nls/dll/idndl_redist/idndl.def
Normal file
35
reactos/nls/dll/idndl_redist/idndl.def
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
; Copyright (c) 2008, KJK::Hyperion
|
||||||
|
; All rights reserved.
|
||||||
|
;
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are met:
|
||||||
|
;
|
||||||
|
; - Redistributions of source code must retain the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer.
|
||||||
|
;
|
||||||
|
; - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer in the documentation
|
||||||
|
; and/or other materials provided with the distribution.
|
||||||
|
;
|
||||||
|
; - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
; contributors may be used to endorse or promote products derived from this
|
||||||
|
; software without specific prior written permission.
|
||||||
|
;
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
; POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
LIBRARY "idndl"
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
DownlevelGetLocaleScripts = DownlevelGetLocaleScripts@12 @1
|
||||||
|
DownlevelGetStringScripts = GetStringScripts@20 @2
|
||||||
|
DownlevelVerifyScripts = VerifyScripts@20 @3
|
15
reactos/nls/dll/idndl_redist/idndl_redist.rbuild
Normal file
15
reactos/nls/dll/idndl_redist/idndl_redist.rbuild
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="idndl_redist" type="win32dll" installname="idndl.dll">
|
||||||
|
<library>kernel32</library>
|
||||||
|
<library>scripts</library>
|
||||||
|
<library>libcntpr</library>
|
||||||
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
|
<linkerflag>--entry=0</linkerflag>
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<include base="scripts">.</include>
|
||||||
|
<importlibrary definition="idndl.def" />
|
||||||
|
<file>idndl.cpp</file>
|
||||||
|
<file>stubs.cpp</file>
|
||||||
|
</module>
|
75
reactos/nls/dll/idndl_redist/stubs.cpp
Normal file
75
reactos/nls/dll/idndl_redist/stubs.cpp
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// FIXME: move stubs elsewhere
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
void free(void * memory)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void * malloc(size_t size)
|
||||||
|
{
|
||||||
|
return HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void * realloc(void * memory, size_t size)
|
||||||
|
{
|
||||||
|
return HeapReAlloc(GetProcessHeap(), 0, memory, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void * memory)
|
||||||
|
{
|
||||||
|
free(memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int __cdecl _purecall()
|
||||||
|
{
|
||||||
|
FatalAppExitW(0, L"pure virtual call");
|
||||||
|
FatalExit(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void __cxa_pure_virtual() { _purecall(); }
|
||||||
|
|
||||||
|
extern "C" void _assert()
|
||||||
|
{
|
||||||
|
FatalAppExitW(0, L"assertion failed");
|
||||||
|
FatalExit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
1
reactos/nls/dll/normaliz/dummy.c
Normal file
1
reactos/nls/dll/normaliz/dummy.c
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/* Leave empty */
|
37
reactos/nls/dll/normaliz/normaliz.def
Normal file
37
reactos/nls/dll/normaliz/normaliz.def
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
; Copyright (c) 2008, KJK::Hyperion
|
||||||
|
; All rights reserved.
|
||||||
|
;
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are met:
|
||||||
|
;
|
||||||
|
; - Redistributions of source code must retain the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer.
|
||||||
|
;
|
||||||
|
; - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer in the documentation
|
||||||
|
; and/or other materials provided with the distribution.
|
||||||
|
;
|
||||||
|
; - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
; contributors may be used to endorse or promote products derived from this
|
||||||
|
; software without specific prior written permission.
|
||||||
|
;
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
; POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
LIBRARY "normaliz"
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
IdnToAscii@20 = kernel32.IdnToAscii @1
|
||||||
|
IdnToNameprepUnicode@20 = kernel32.IdnToNameprepUnicode @2
|
||||||
|
IdnToUnicode@20 = kernel32.IdnToUnicode @3
|
||||||
|
IsNormalizedString@12 = kernel32.IsNormalizedString @4
|
||||||
|
NormalizeString@20 = kernel32.NormalizeString @5
|
7
reactos/nls/dll/normaliz/normaliz.rbuild
Normal file
7
reactos/nls/dll/normaliz/normaliz.rbuild
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="normaliz" type="win32dll">
|
||||||
|
<library>kernel32</library>
|
||||||
|
<importlibrary definition="normaliz.def" />
|
||||||
|
<file>dummy.c</file>
|
||||||
|
</module>
|
1297
reactos/nls/dll/normaliz_redist/data/icudt38.c
Normal file
1297
reactos/nls/dll/normaliz_redist/data/icudt38.c
Normal file
File diff suppressed because it is too large
Load diff
1
reactos/nls/dll/normaliz_redist/data/icudt38.lst
Normal file
1
reactos/nls/dll/normaliz_redist/data/icudt38.lst
Normal file
|
@ -0,0 +1 @@
|
||||||
|
uidna.spp
|
|
@ -1,7 +1,39 @@
|
||||||
// FIXME: clean up this mess
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// FIXME: move stubs elsewhere
|
||||||
|
|
||||||
#ifndef _DEBUG
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unicode/uclean.h>
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -35,6 +67,21 @@ extern "C" int __cdecl _purecall()
|
||||||
|
|
||||||
extern "C" void __cxa_pure_virtual() { _purecall(); }
|
extern "C" void __cxa_pure_virtual() { _purecall(); }
|
||||||
|
|
||||||
#endif
|
extern "C" void _assert()
|
||||||
|
{
|
||||||
|
FatalAppExitW(0, L"assertion failed");
|
||||||
|
FatalExit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
|
{
|
||||||
|
if(fdwReason == DLL_PROCESS_ATTACH)
|
||||||
|
DisableThreadLibraryCalls(hinstDll);
|
||||||
|
|
||||||
|
if(fdwReason == DLL_PROCESS_DETACH && lpvReserved == NULL)
|
||||||
|
u_cleanup();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
// EOF
|
// EOF
|
||||||
|
|
|
@ -1,5 +1,37 @@
|
||||||
|
; Copyright (c) 2008, KJK::Hyperion
|
||||||
|
; All rights reserved.
|
||||||
|
;
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are met:
|
||||||
|
;
|
||||||
|
; - Redistributions of source code must retain the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer.
|
||||||
|
;
|
||||||
|
; - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer in the documentation
|
||||||
|
; and/or other materials provided with the distribution.
|
||||||
|
;
|
||||||
|
; - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
; contributors may be used to endorse or promote products derived from this
|
||||||
|
; software without specific prior written permission.
|
||||||
|
;
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
; POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
LIBRARY "normaliz"
|
LIBRARY "normaliz"
|
||||||
|
|
||||||
EXPORTS
|
EXPORTS
|
||||||
NormalizeString=NormalizeString@20
|
IdnToAscii = IdnToAscii@20 @1
|
||||||
IsNormalizedString=IsNormalizedString@12
|
IdnToNameprepUnicode = IdnToNameprepUnicode@20 @2
|
||||||
|
IdnToUnicode = IdnToUnicode@20 @3
|
||||||
|
IsNormalizedString = IsNormalizedString@12 @4
|
||||||
|
NormalizeString = NormalizeString@20 @5
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="normaliz_redist_data" type="staticlibrary">
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<directory name="data"><file>icudt38.c</file></directory>
|
||||||
|
</module>
|
||||||
<module name="normaliz_redist" type="win32dll" installname="normaliz.dll">
|
<module name="normaliz_redist" type="win32dll" installname="normaliz.dll">
|
||||||
<library>normalize</library>
|
<library>normalize</library>
|
||||||
|
<library>idna</library>
|
||||||
<library>icu4ros</library>
|
<library>icu4ros</library>
|
||||||
|
<library>normaliz_redist_data</library>
|
||||||
|
<library>libcntpr</library>
|
||||||
<library>kernel32</library>
|
<library>kernel32</library>
|
||||||
<compilerflag>-fno-exceptions</compilerflag>
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
<compilerflag>-fno-rtti</compilerflag>
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
<importlibrary definition="normaliz.def" />
|
<importlibrary definition="normaliz.def" />
|
||||||
<file>normaliz.cpp</file>
|
<file>normaliz.cpp</file>
|
||||||
</module>
|
</module>
|
||||||
|
|
124
reactos/nls/lib/idna/idna.cpp
Normal file
124
reactos/nls/lib/idna/idna.cpp
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winnls.h>
|
||||||
|
|
||||||
|
#include <unicode/uidna.h>
|
||||||
|
|
||||||
|
static
|
||||||
|
int32_t
|
||||||
|
IDNA_FlagsToICU
|
||||||
|
(
|
||||||
|
DWORD dwFlags
|
||||||
|
)
|
||||||
|
{
|
||||||
|
C_ASSERT(IDN_ALLOW_UNASSIGNED == UIDNA_ALLOW_UNASSIGNED);
|
||||||
|
C_ASSERT(IDN_USE_STD3_ASCII_RULES == UIDNA_USE_STD3_RULES);
|
||||||
|
return dwFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
DWORD
|
||||||
|
NLS_ErrorFromICU
|
||||||
|
(
|
||||||
|
UErrorCode ErrorCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return ERROR_GEN_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
IdnToAscii
|
||||||
|
(
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPCWSTR lpUnicodeCharStr,
|
||||||
|
int cchUnicodeChar,
|
||||||
|
LPWSTR lpASCIICharStr,
|
||||||
|
int cchASCIIChar
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UErrorCode status;
|
||||||
|
int32_t retval = uidna_IDNToASCII
|
||||||
|
(
|
||||||
|
lpUnicodeCharStr,
|
||||||
|
cchUnicodeChar,
|
||||||
|
lpASCIICharStr,
|
||||||
|
cchASCIIChar,
|
||||||
|
IDNA_FlagsToICU(dwFlags),
|
||||||
|
NULL,
|
||||||
|
&status
|
||||||
|
);
|
||||||
|
|
||||||
|
if(U_FAILURE(status))
|
||||||
|
SetLastError(NLS_ErrorFromICU(status));
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
IdnToUnicode
|
||||||
|
(
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPCWSTR lpASCIICharStr,
|
||||||
|
int cchASCIIChar,
|
||||||
|
LPWSTR lpUnicodeCharStr,
|
||||||
|
int cchUnicodeChar
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UErrorCode status;
|
||||||
|
int32_t retval = uidna_IDNToUnicode
|
||||||
|
(
|
||||||
|
lpASCIICharStr,
|
||||||
|
cchASCIIChar,
|
||||||
|
lpUnicodeCharStr,
|
||||||
|
cchUnicodeChar,
|
||||||
|
IDNA_FlagsToICU(dwFlags),
|
||||||
|
NULL,
|
||||||
|
&status
|
||||||
|
);
|
||||||
|
|
||||||
|
if(U_FAILURE(status))
|
||||||
|
SetLastError(NLS_ErrorFromICU(status));
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
10
reactos/nls/lib/idna/idna.rbuild
Normal file
10
reactos/nls/lib/idna/idna.rbuild
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="idna" type="staticlibrary">
|
||||||
|
<library>icu4ros</library>
|
||||||
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<file>idna.cpp</file>
|
||||||
|
<file>nameprep.cpp</file>
|
||||||
|
</module>
|
100
reactos/nls/lib/idna/nameprep.cpp
Normal file
100
reactos/nls/lib/idna/nameprep.cpp
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winnls.h>
|
||||||
|
|
||||||
|
#include <unicode/usprep.h>
|
||||||
|
|
||||||
|
static
|
||||||
|
int32_t
|
||||||
|
NAMEPREP_FlagsToICU
|
||||||
|
(
|
||||||
|
DWORD dwFlags
|
||||||
|
)
|
||||||
|
{
|
||||||
|
C_ASSERT(IDN_ALLOW_UNASSIGNED == USPREP_ALLOW_UNASSIGNED);
|
||||||
|
return dwFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
DWORD
|
||||||
|
NLS_ErrorFromICU
|
||||||
|
(
|
||||||
|
UErrorCode ErrorCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return ERROR_GEN_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
IdnToNameprepUnicode
|
||||||
|
(
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPCWSTR lpUnicodeCharStr,
|
||||||
|
int cchUnicodeChar,
|
||||||
|
LPWSTR lpNameprepCharStr,
|
||||||
|
int cchNameprepChar
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UErrorCode status;
|
||||||
|
|
||||||
|
UStringPrepProfile * nameprep = usprep_open(NULL, "uidna", &status);
|
||||||
|
|
||||||
|
int32_t retval = usprep_prepare
|
||||||
|
(
|
||||||
|
nameprep,
|
||||||
|
lpUnicodeCharStr,
|
||||||
|
cchUnicodeChar,
|
||||||
|
lpNameprepCharStr,
|
||||||
|
cchNameprepChar,
|
||||||
|
NAMEPREP_FlagsToICU(dwFlags),
|
||||||
|
NULL,
|
||||||
|
&status
|
||||||
|
);
|
||||||
|
|
||||||
|
usprep_close(nameprep);
|
||||||
|
|
||||||
|
if(U_FAILURE(status))
|
||||||
|
SetLastError(NLS_ErrorFromICU(status));
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
|
@ -1,3 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unicode/unorm.h>
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define STRICT
|
#define STRICT
|
||||||
|
|
||||||
|
@ -6,8 +40,6 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winnls.h>
|
#include <winnls.h>
|
||||||
|
|
||||||
#include <unicode/unorm.h>
|
|
||||||
|
|
||||||
static
|
static
|
||||||
UNormalizationMode
|
UNormalizationMode
|
||||||
NORMALIZE_ModeToICU
|
NORMALIZE_ModeToICU
|
||||||
|
@ -65,6 +97,9 @@ NormalizeString
|
||||||
if(U_FAILURE(ErrorCode))
|
if(U_FAILURE(ErrorCode))
|
||||||
SetLastError(NLS_ErrorFromICU(ErrorCode));
|
SetLastError(NLS_ErrorFromICU(ErrorCode));
|
||||||
|
|
||||||
|
if(cwDstLength == 0 || ErrorCode == U_BUFFER_OVERFLOW_ERROR)
|
||||||
|
retval += 1;
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
288
reactos/nls/lib/scripts/scripts.cpp
Normal file
288
reactos/nls/lib/scripts/scripts.cpp
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
#include <unicode/utf.h>
|
||||||
|
#include <unicode/uscript.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winnls.h>
|
||||||
|
|
||||||
|
#include "scripts.h"
|
||||||
|
|
||||||
|
struct SCRIPTS_ScriptsSet
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint32_t m_bits[USCRIPT_CODE_LIMIT / 32 + !!(USCRIPT_CODE_LIMIT % 32)];
|
||||||
|
|
||||||
|
public:
|
||||||
|
SCRIPTS_ScriptsSet(): m_bits() { }
|
||||||
|
|
||||||
|
void set(int index)
|
||||||
|
{
|
||||||
|
assert(index >= 0 && index < USCRIPT_CODE_LIMIT);
|
||||||
|
m_bits[index / 32] |= 1 << (index % 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset(int index)
|
||||||
|
{
|
||||||
|
assert(index >= 0 && index < USCRIPT_CODE_LIMIT);
|
||||||
|
m_bits[index / 32] &= ~(1 << (index % 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get(int index) const
|
||||||
|
{
|
||||||
|
assert(index >= 0 && index < USCRIPT_CODE_LIMIT);
|
||||||
|
return ((m_bits[index / 32] >> (index % 32)) % 2) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processCharacter(UChar32 c)
|
||||||
|
{
|
||||||
|
int32_t code;
|
||||||
|
bool retval = SCRIPTS_GetCharScriptCode(c, &code);
|
||||||
|
|
||||||
|
if(retval)
|
||||||
|
set(code);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processScript(const SCRIPTS_Script * pScript)
|
||||||
|
{
|
||||||
|
assert(pScript);
|
||||||
|
|
||||||
|
bool retval;
|
||||||
|
|
||||||
|
retval = pScript->Separator == L';';
|
||||||
|
|
||||||
|
if(!retval)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t script;
|
||||||
|
retval = SCRIPTS_GetScriptCode(pScript, &script);
|
||||||
|
|
||||||
|
if(retval)
|
||||||
|
set(script);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processScripts(LPCWSTR lpScripts, int cchScripts)
|
||||||
|
{
|
||||||
|
bool retval;
|
||||||
|
const SCRIPTS_Script * pScripts = reinterpret_cast<const SCRIPTS_Script *>(lpScripts);
|
||||||
|
|
||||||
|
if(cchScripts < 0)
|
||||||
|
cchScripts = wcslen(lpScripts);
|
||||||
|
|
||||||
|
div_t divmod = div(cchScripts, (sizeof(SCRIPTS_Script) / sizeof(WCHAR)));
|
||||||
|
retval = !divmod.rem;
|
||||||
|
|
||||||
|
if(!retval)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int iScript = 0, ccScripts = divmod.quot; retval && iScript < ccScripts; ++ iScript)
|
||||||
|
retval = processScript(pScripts + iScript);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<=(const SCRIPTS_ScriptsSet& Y) const
|
||||||
|
{
|
||||||
|
bool retval;
|
||||||
|
|
||||||
|
//~ for(int i = 0; i < ARRAYSIZE(m_bits); ++ i)
|
||||||
|
for(unsigned i = 0; i < (sizeof(m_bits) / sizeof(m_bits[0])); ++ i)
|
||||||
|
{
|
||||||
|
retval = (~m_bits[i] | Y.m_bits[i]) != 0;
|
||||||
|
|
||||||
|
if(!retval)
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
GetStringScripts
|
||||||
|
(
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPCWSTR lpString,
|
||||||
|
int cchString,
|
||||||
|
LPWSTR lpScripts,
|
||||||
|
int cchScripts
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if((dwFlags | GSS_ALLOW_INHERITED_COMMON) != GSS_ALLOW_INHERITED_COMMON)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((lpString == NULL) != (cchString == 0) || (cchScripts > 0 && lpScripts == NULL) || cchScripts < 0)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCRIPTS_ScriptsSet StringScripts;
|
||||||
|
|
||||||
|
if(cchString < 0)
|
||||||
|
{
|
||||||
|
for(int i = 0; lpString[i];)
|
||||||
|
{
|
||||||
|
UChar32 c = lpString[i ++];
|
||||||
|
|
||||||
|
if(U16_IS_LEAD(c) && U16_IS_TRAIL(lpString[i]))
|
||||||
|
{
|
||||||
|
assert(lpString[i]);
|
||||||
|
c = U16_GET_SUPPLEMENTARY(c, lpString[i ++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!StringScripts.processCharacter(c))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i = 0; i < cchString;)
|
||||||
|
{
|
||||||
|
UChar32 c;
|
||||||
|
U16_NEXT(lpString, i, cchString, c);
|
||||||
|
|
||||||
|
if(!StringScripts.processCharacter(c))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!(dwFlags & GSS_ALLOW_INHERITED_COMMON))
|
||||||
|
{
|
||||||
|
StringScripts.reset(USCRIPT_COMMON);
|
||||||
|
StringScripts.reset(USCRIPT_INHERITED);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cchScripts)
|
||||||
|
{
|
||||||
|
int ccScripts = 0;
|
||||||
|
int ccScriptsCapacity = (cchScripts - 1) / (sizeof(SCRIPTS_Script) / sizeof(WCHAR));
|
||||||
|
SCRIPTS_Script * pScripts = reinterpret_cast<SCRIPTS_Script *>(lpScripts);
|
||||||
|
|
||||||
|
for(int iScript = 0; iScript < USCRIPT_CODE_LIMIT; ++ iScript)
|
||||||
|
{
|
||||||
|
if(StringScripts.get(iScript))
|
||||||
|
{
|
||||||
|
if(ccScripts == ccScriptsCapacity)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCRIPTS_GetScriptName(iScript, &pScripts[ccScripts]);
|
||||||
|
pScripts[ccScripts].Separator = L';';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort(pScripts, ccScripts, sizeof(SCRIPTS_Script), &SCRIPTS_Script::Compare);
|
||||||
|
|
||||||
|
cchScripts = ccScripts * (sizeof(SCRIPTS_Script) / sizeof(WCHAR));
|
||||||
|
|
||||||
|
if(cchScripts)
|
||||||
|
lpScripts[cchScripts - 1] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int iScript = 0; iScript < USCRIPT_CODE_LIMIT; ++ iScript)
|
||||||
|
cchScripts += !!StringScripts.get(iScript);
|
||||||
|
|
||||||
|
cchScripts *= (sizeof(SCRIPTS_Script) / sizeof(WCHAR));
|
||||||
|
cchScripts += 1;
|
||||||
|
assert(cchScripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cchScripts;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
VerifyScripts
|
||||||
|
(
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPCWSTR lpLocaleScripts,
|
||||||
|
int cchLocaleScripts,
|
||||||
|
LPCWSTR lpTestScripts,
|
||||||
|
int cchTestScripts
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if((dwFlags | VS_ALLOW_LATIN) != VS_ALLOW_LATIN)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((lpLocaleScripts == NULL) != (cchLocaleScripts == 0) || (lpTestScripts == NULL) != (cchTestScripts == 0) )
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCRIPTS_ScriptsSet LocaleScripts;
|
||||||
|
SCRIPTS_ScriptsSet TestScripts;
|
||||||
|
|
||||||
|
if(!LocaleScripts.processScripts(lpLocaleScripts, cchLocaleScripts))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(!TestScripts.processScripts(lpTestScripts, cchTestScripts))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(dwFlags & VS_ALLOW_LATIN)
|
||||||
|
LocaleScripts.set(USCRIPT_LATIN);
|
||||||
|
|
||||||
|
return !!(TestScripts <= LocaleScripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
74
reactos/nls/lib/scripts/scripts.h
Normal file
74
reactos/nls/lib/scripts/scripts.h
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef REACTOS_SCRIPTS_H_
|
||||||
|
#define REACTOS_SCRIPTS_H_
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
struct SCRIPTS_Script
|
||||||
|
{
|
||||||
|
WCHAR ScriptName[4];
|
||||||
|
WCHAR Separator;
|
||||||
|
|
||||||
|
static int Compare(const SCRIPTS_Script * x, const SCRIPTS_Script * y)
|
||||||
|
{
|
||||||
|
for(unsigned i = 0; i < 4; ++ i)
|
||||||
|
{
|
||||||
|
int comparison = (int)x->ScriptName[i] - (int)y->ScriptName[i];
|
||||||
|
|
||||||
|
if(comparison)
|
||||||
|
return comparison;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Compare(const void * x, const void * y)
|
||||||
|
{
|
||||||
|
return Compare(static_cast<const SCRIPTS_Script *>(x), static_cast<const SCRIPTS_Script *>(y));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
C_ASSERT(sizeof(SCRIPTS_Script) == 5 * sizeof(WCHAR));
|
||||||
|
|
||||||
|
extern "C" bool SCRIPTS_GetCharScriptCode(UChar32 c, int32_t * code);
|
||||||
|
extern "C" bool SCRIPTS_GetScriptCode(const SCRIPTS_Script * pScript, int32_t * code);
|
||||||
|
extern "C" void SCRIPTS_GetScriptName(int32_t code, SCRIPTS_Script * pScript);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* EOF */
|
9
reactos/nls/lib/scripts/scripts.rbuild
Normal file
9
reactos/nls/lib/scripts/scripts.rbuild
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="scripts" type="staticlibrary">
|
||||||
|
<library>icu4ros</library>
|
||||||
|
<compilerflag>-fno-exceptions</compilerflag>
|
||||||
|
<compilerflag>-fno-rtti</compilerflag>
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<file>scripts.cpp</file>
|
||||||
|
</module>
|
0
reactos/nls/media/.gitignore
vendored
Normal file
0
reactos/nls/media/.gitignore
vendored
Normal file
|
@ -4,10 +4,19 @@
|
||||||
<directory name="3rdparty"><xi:include href="3rdparty/icu4ros.rbuild" /></directory>
|
<directory name="3rdparty"><xi:include href="3rdparty/icu4ros.rbuild" /></directory>
|
||||||
|
|
||||||
<directory name="lib">
|
<directory name="lib">
|
||||||
|
<directory name="idna"><xi:include href="lib/idna/idna.rbuild" /></directory>
|
||||||
<directory name="normalize"><xi:include href="lib/normalize/normalize.rbuild" /></directory>
|
<directory name="normalize"><xi:include href="lib/normalize/normalize.rbuild" /></directory>
|
||||||
|
<directory name="scripts"><xi:include href="lib/scripts/scripts.rbuild" /></directory>
|
||||||
</directory>
|
</directory>
|
||||||
|
|
||||||
<directory name="dll">
|
<directory name="dll">
|
||||||
|
<directory name="idndl"><xi:include href="dll/idndl/idndl.rbuild" /></directory>
|
||||||
|
<directory name="idndl_redist"><xi:include href="dll/idndl_redist/idndl_redist.rbuild" /></directory>
|
||||||
|
<directory name="normaliz"><xi:include href="dll/normaliz/normaliz.rbuild" /></directory>
|
||||||
<directory name="normaliz_redist"><xi:include href="dll/normaliz_redist/normaliz_redist.rbuild" /></directory>
|
<directory name="normaliz_redist"><xi:include href="dll/normaliz_redist/normaliz_redist.rbuild" /></directory>
|
||||||
</directory>
|
</directory>
|
||||||
|
|
||||||
|
<directory name="tests">
|
||||||
|
<directory name="normalization"><xi:include href="tests/normalization/normalizationTest.rbuild" /></directory>
|
||||||
|
</directory>
|
||||||
</group>
|
</group>
|
||||||
|
|
17650
reactos/nls/tests/normalization/NormalizationTest.txt
Normal file
17650
reactos/nls/tests/normalization/NormalizationTest.txt
Normal file
File diff suppressed because it is too large
Load diff
391
reactos/nls/tests/normalization/normalizationTest.c
Normal file
391
reactos/nls/tests/normalization/normalizationTest.c
Normal file
|
@ -0,0 +1,391 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
#include <unicode/utf.h>
|
||||||
|
|
||||||
|
#define WINVER 0x0600
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "normalizationTest.h"
|
||||||
|
|
||||||
|
static int (WINAPI * pfnNormalizeString)(NORM_FORM, LPCWSTR, int, LPWSTR, int);
|
||||||
|
|
||||||
|
char * FormatString(const struct TestSuite * test, const WCHAR * str)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
int codepoints = 0;
|
||||||
|
int formattedLength = 0;
|
||||||
|
char * formattedPos;
|
||||||
|
int formattedRemaining;
|
||||||
|
char * formattedString;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(str == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
length = wcslen(str);
|
||||||
|
|
||||||
|
for(i = 0; i < length; )
|
||||||
|
{
|
||||||
|
UChar32 c;
|
||||||
|
U16_NEXT(str, i, length, c);
|
||||||
|
|
||||||
|
++ codepoints;
|
||||||
|
|
||||||
|
assert(c <= 0x10ffff);
|
||||||
|
|
||||||
|
if(c < 0x10000)
|
||||||
|
formattedLength += sizeof("U+ffff") - 1;
|
||||||
|
else if(c < 0x100000)
|
||||||
|
formattedLength += sizeof("U+fffff") - 1;
|
||||||
|
else
|
||||||
|
formattedLength += sizeof("U+10ffff") - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(codepoints)
|
||||||
|
formattedLength += (sizeof(" ") - 1) * (codepoints - 1);
|
||||||
|
|
||||||
|
formattedLength += sizeof("");
|
||||||
|
|
||||||
|
formattedString = malloc(formattedLength);
|
||||||
|
|
||||||
|
if(formattedString == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: %s:%d: @Part%d: out of memory\n", test->filename, test->line, test->part);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
formattedPos = formattedString;
|
||||||
|
formattedRemaining = formattedLength;
|
||||||
|
|
||||||
|
for(i = 0; i < length; )
|
||||||
|
{
|
||||||
|
int unitLength;
|
||||||
|
UChar32 c;
|
||||||
|
|
||||||
|
U16_NEXT(str, i, length, c);
|
||||||
|
|
||||||
|
assert(formattedRemaining == (formattedLength - (formattedPos - formattedString)));
|
||||||
|
|
||||||
|
if(c < 0x10000)
|
||||||
|
{
|
||||||
|
unitLength = _snprintf(formattedPos, formattedRemaining, "U+%04x", c);
|
||||||
|
assert(unitLength == (sizeof("U+ffff") - 1));
|
||||||
|
}
|
||||||
|
else if(c < 0x100000)
|
||||||
|
{
|
||||||
|
unitLength = _snprintf(formattedPos, formattedRemaining, "U+%05x", c);
|
||||||
|
assert(unitLength == (sizeof("U+fffff") - 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(c <= 0x10ffff);
|
||||||
|
unitLength = _snprintf(formattedPos, formattedRemaining, "U+%06x", c);
|
||||||
|
assert(unitLength == (sizeof("U+10ffff") - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(unitLength >= 0);
|
||||||
|
|
||||||
|
if(unitLength < 0)
|
||||||
|
{
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"ERROR: %s:%d: @Part%d: couldn't format codepoint %x\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
c
|
||||||
|
);
|
||||||
|
|
||||||
|
free(formattedString);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
formattedPos += unitLength;
|
||||||
|
formattedRemaining -= unitLength;
|
||||||
|
|
||||||
|
assert(formattedRemaining >= 0);
|
||||||
|
|
||||||
|
if(i < length)
|
||||||
|
{
|
||||||
|
*formattedPos = ' ';
|
||||||
|
formattedPos += sizeof(" ") - 1;
|
||||||
|
formattedRemaining -= sizeof(" ") - 1;
|
||||||
|
assert(formattedRemaining > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
formattedString[formattedLength - 1] = 0;
|
||||||
|
return formattedString;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WCHAR * Normalize(const struct TestSuite * test, const WCHAR * str, NORM_FORM NormForm)
|
||||||
|
{
|
||||||
|
LPWSTR lpDstString = NULL;
|
||||||
|
int cwDstLength = 0;
|
||||||
|
int cwRet;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if(cwDstLength)
|
||||||
|
{
|
||||||
|
lpDstString = malloc(cwDstLength * sizeof(WCHAR));
|
||||||
|
|
||||||
|
if(lpDstString == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: %s:%d: @Part%d: out of memory\n", test->filename, test->line, test->part);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cwRet = pfnNormalizeString(NormForm, str, -1, lpDstString, cwDstLength);
|
||||||
|
|
||||||
|
if(cwRet > 0)
|
||||||
|
{
|
||||||
|
if(cwDstLength)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cwDstLength = cwRet;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(lpDstString);
|
||||||
|
lpDstString = NULL;
|
||||||
|
|
||||||
|
switch(GetLastError())
|
||||||
|
{
|
||||||
|
case ERROR_SUCCESS:
|
||||||
|
/* Should never happen (length of the buffer must be at least 1) */
|
||||||
|
assert(0);
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
case ERROR_INSUFFICIENT_BUFFER:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ERROR_NO_UNICODE_TRANSLATION:
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int invalid;
|
||||||
|
WCHAR invalidChar[U16_MAX_LENGTH + 1];
|
||||||
|
char * invalidCharFormatted;
|
||||||
|
UChar32 c;
|
||||||
|
size_t strLen;
|
||||||
|
|
||||||
|
strLen = wcslen(str);
|
||||||
|
invalid = -cwRet;
|
||||||
|
|
||||||
|
if(str[invalid] == 0 && invalid > 0 && U_IS_SURROGATE(str[invalid - 1]))
|
||||||
|
-- invalid;
|
||||||
|
else if(U_IS_TRAIL(str[invalid]) && invalid > 0 && U_IS_LEAD(str[invalid - 1]))
|
||||||
|
-- invalid;
|
||||||
|
|
||||||
|
i = invalid;
|
||||||
|
U16_NEXT(str, i, strLen, c);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
U16_APPEND_UNSAFE(invalidChar, i, c);
|
||||||
|
invalidChar[i] = 0;
|
||||||
|
|
||||||
|
invalidCharFormatted = FormatString(test, invalidChar);
|
||||||
|
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"ERROR: %s:%d: @Part%d: invalid Unicode character <%s>\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
invalidCharFormatted
|
||||||
|
);
|
||||||
|
|
||||||
|
free(invalidCharFormatted);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"ERROR: %s:%d: @Part%d: couldn't normalize: system error %lu\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
GetLastError()
|
||||||
|
);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cwDstLength = -cwRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(lpDstString);
|
||||||
|
return lpDstString;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Test
|
||||||
|
(
|
||||||
|
const struct TestSuite * test,
|
||||||
|
NORM_FORM NormForm,
|
||||||
|
const WCHAR * data,
|
||||||
|
const WCHAR * expected
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const char * normForm = "???";
|
||||||
|
WCHAR * actual = NULL;
|
||||||
|
char * dataFormatted = NULL;
|
||||||
|
char * expectedFormatted = NULL;
|
||||||
|
char * actualFormatted = NULL;
|
||||||
|
|
||||||
|
assert(data);
|
||||||
|
assert(expected);
|
||||||
|
|
||||||
|
switch(NormForm)
|
||||||
|
{
|
||||||
|
case NormalizationC: normForm = "NFC"; break;
|
||||||
|
case NormalizationD: normForm = "NFD"; break;
|
||||||
|
case NormalizationKC: normForm = "NFKC"; break;
|
||||||
|
case NormalizationKD: normForm = "NFKD"; break;
|
||||||
|
default: assert(0); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataFormatted = FormatString(test, data);
|
||||||
|
expectedFormatted = FormatString(test, expected);
|
||||||
|
|
||||||
|
actual = Normalize(test, data, NormForm);
|
||||||
|
|
||||||
|
if(!expected || !actual)
|
||||||
|
{
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"SKIP: %s:%d @Part%d: %s(<%s>): earlier errors\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
normForm,
|
||||||
|
dataFormatted
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
actualFormatted = FormatString(test, actual);
|
||||||
|
|
||||||
|
if(wcscmp(expected, actual))
|
||||||
|
{
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"FAIL: %s:%d: @Part%d: %s(<%s>): expected <%s>, got <%s>\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
normForm,
|
||||||
|
dataFormatted, expectedFormatted, actualFormatted
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*fprintf
|
||||||
|
(
|
||||||
|
stdout,
|
||||||
|
"PASS: %s:%d @Part%d: %s(<%s>): <%s>\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
normForm,
|
||||||
|
dataFormatted, expectedFormatted
|
||||||
|
);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(dataFormatted);
|
||||||
|
free(expectedFormatted);
|
||||||
|
free(actualFormatted);
|
||||||
|
free(actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NORMTEST_testInvariant(const struct TestSuite * test, const WCHAR * c)
|
||||||
|
{
|
||||||
|
Test(test, NormalizationC, c, c);
|
||||||
|
Test(test, NormalizationD, c, c);
|
||||||
|
Test(test, NormalizationKC, c, c);
|
||||||
|
Test(test, NormalizationKD, c, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NORMTEST_test(const struct TestSuite * test, const WCHAR * c1, const WCHAR * c2, const WCHAR * c3, const WCHAR * c4, const WCHAR * c5)
|
||||||
|
{
|
||||||
|
Test(test, NormalizationC, c1, c2);
|
||||||
|
Test(test, NormalizationC, c2, c2);
|
||||||
|
Test(test, NormalizationC, c3, c2);
|
||||||
|
Test(test, NormalizationC, c4, c4);
|
||||||
|
Test(test, NormalizationC, c5, c4);
|
||||||
|
Test(test, NormalizationD, c1, c3);
|
||||||
|
Test(test, NormalizationD, c2, c3);
|
||||||
|
Test(test, NormalizationD, c3, c3);
|
||||||
|
Test(test, NormalizationD, c4, c5);
|
||||||
|
Test(test, NormalizationD, c5, c5);
|
||||||
|
Test(test, NormalizationKC, c1, c4);
|
||||||
|
Test(test, NormalizationKC, c2, c4);
|
||||||
|
Test(test, NormalizationKC, c3, c4);
|
||||||
|
Test(test, NormalizationKC, c4, c4);
|
||||||
|
Test(test, NormalizationKC, c5, c4);
|
||||||
|
Test(test, NormalizationKD, c1, c5);
|
||||||
|
Test(test, NormalizationKD, c2, c5);
|
||||||
|
Test(test, NormalizationKD, c3, c5);
|
||||||
|
Test(test, NormalizationKD, c4, c5);
|
||||||
|
Test(test, NormalizationKD, c5, c5);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char * const * argv)
|
||||||
|
{
|
||||||
|
struct TestSuite testSuite;
|
||||||
|
HMODULE hmNormaliz;
|
||||||
|
|
||||||
|
hmNormaliz = LoadLibrary(TEXT("normaliz")); /* TODO: error handling */
|
||||||
|
pfnNormalizeString = (void *)GetProcAddress(hmNormaliz, "NormalizeString");
|
||||||
|
|
||||||
|
testSuite.filename = "NormalizationTest.txt";
|
||||||
|
testSuite.part = -1;
|
||||||
|
|
||||||
|
if(argc > 1)
|
||||||
|
testSuite.filename = argv[1];
|
||||||
|
|
||||||
|
testSuite.file = fopen(testSuite.filename, "rb"); /* TODO: error handling */
|
||||||
|
|
||||||
|
NORMTEST_runTests(&testSuite);
|
||||||
|
|
||||||
|
fclose(testSuite.file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
50
reactos/nls/tests/normalization/normalizationTest.h
Normal file
50
reactos/nls/tests/normalization/normalizationTest.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct TestSuite
|
||||||
|
{
|
||||||
|
const char * filename;
|
||||||
|
int line;
|
||||||
|
int part;
|
||||||
|
|
||||||
|
FILE * file;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void * NORMTEST_createScanner(struct TestSuite * test);
|
||||||
|
extern void NORMTEST_deleteScanner(void * scanner);
|
||||||
|
|
||||||
|
extern void NORMTEST_runTests(struct TestSuite * test);
|
||||||
|
|
||||||
|
extern void NORMTEST_test(const struct TestSuite * test, const WCHAR * c1, const WCHAR * c2, const WCHAR * c3, const WCHAR * c4, const WCHAR * c5);
|
||||||
|
extern void NORMTEST_testInvariant(const struct TestSuite * test, const WCHAR * c);
|
||||||
|
|
||||||
|
/* EOF */
|
108
reactos/nls/tests/normalization/normalizationTest.l
Normal file
108
reactos/nls/tests/normalization/normalizationTest.l
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "normalizationTest.h"
|
||||||
|
|
||||||
|
#define YY_EXTRA_TYPE struct TestSuite *
|
||||||
|
#define YY_DECL int yylex (YYSTYPE * pyylval, int * pyylloc, yyscan_t yyscanner)
|
||||||
|
|
||||||
|
#include "normalizationTest.tab.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%option batch
|
||||||
|
%option reentrant
|
||||||
|
%option nounistd
|
||||||
|
%option nodefault
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
"#"[^\r\n]* /* Ignore comments */
|
||||||
|
[\t\f\v ]+ /* Ignore whitespace */
|
||||||
|
|
||||||
|
; return TOKEN_COLUMN_SEPARATOR;
|
||||||
|
|
||||||
|
\r\n { ++ *pyylloc; return TOKEN_EOL; }
|
||||||
|
\r { ++ *pyylloc; return TOKEN_EOL; }
|
||||||
|
\n { ++ *pyylloc; return TOKEN_EOL; }
|
||||||
|
|
||||||
|
@Part[0-9]+ {
|
||||||
|
pyylval->part = strtoul(yytext + 5, NULL, 10);
|
||||||
|
return TOKEN_PART_HEADER;
|
||||||
|
}
|
||||||
|
|
||||||
|
[0-9A-Fa-f]+ {
|
||||||
|
pyylval->codepoint = strtoul(yytext, NULL, 16);
|
||||||
|
return TOKEN_CODEPOINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
. {
|
||||||
|
struct TestSuite * test = yyextra;
|
||||||
|
|
||||||
|
test->line = *pyylloc;
|
||||||
|
|
||||||
|
fprintf
|
||||||
|
(
|
||||||
|
stderr,
|
||||||
|
"FATAL: %s:%d: @Part%d: invalid character \"%s\"\n",
|
||||||
|
test->filename, test->line, test->part,
|
||||||
|
yytext
|
||||||
|
);
|
||||||
|
|
||||||
|
yyterminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
%%
|
||||||
|
void * NORMTEST_createScanner(struct TestSuite * test)
|
||||||
|
{
|
||||||
|
yyscan_t scanner;
|
||||||
|
(void)yyunput;
|
||||||
|
yylex_init(&scanner);
|
||||||
|
yyset_in(test->file, scanner);
|
||||||
|
yyset_extra(test, scanner);
|
||||||
|
return (void *)scanner;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NORMTEST_deleteScanner(void * scanner)
|
||||||
|
{
|
||||||
|
yylex_destroy((yyscan_t)scanner);
|
||||||
|
}
|
||||||
|
|
||||||
|
int yywrap(yyscan_t scanner) { return 1; }
|
||||||
|
|
||||||
|
/* EOF */
|
10
reactos/nls/tests/normalization/normalizationTest.rbuild
Normal file
10
reactos/nls/tests/normalization/normalizationTest.rbuild
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<module name="normalizationTest" type="win32cui">
|
||||||
|
<define name="U_HAVE_INTTYPES_H" />
|
||||||
|
<include base="icu4ros">icu/source/common</include>
|
||||||
|
<library>kernel32</library>
|
||||||
|
<library>normaliz</library>
|
||||||
|
<file>normalizationTest.c</file>
|
||||||
|
<file>normalizationTest.tab.c</file>
|
||||||
|
<file>normalizationTest.yy.c</file>
|
||||||
|
</module>
|
20
reactos/nls/tests/normalization/normalizationTest.sln
Normal file
20
reactos/nls/tests/normalization/normalizationTest.sln
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "normalizationTest", "normalizationTest.vcproj", "{F316D362-6B02-469F-8C47-9E28E472DC58}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{F316D362-6B02-469F-8C47-9E28E472DC58}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{F316D362-6B02-469F-8C47-9E28E472DC58}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{F316D362-6B02-469F-8C47-9E28E472DC58}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{F316D362-6B02-469F-8C47-9E28E472DC58}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
1566
reactos/nls/tests/normalization/normalizationTest.tab.c
Normal file
1566
reactos/nls/tests/normalization/normalizationTest.tab.c
Normal file
File diff suppressed because it is too large
Load diff
78
reactos/nls/tests/normalization/normalizationTest.tab.h
Normal file
78
reactos/nls/tests/normalization/normalizationTest.tab.h
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/* A Bison parser, made by GNU Bison 2.1. */
|
||||||
|
|
||||||
|
/* Skeleton parser for Yacc-like parsing with Bison,
|
||||||
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, when this file is copied by Bison into a
|
||||||
|
Bison output file, you may use that output file without restriction.
|
||||||
|
This special exception was added by the Free Software Foundation
|
||||||
|
in version 1.24 of Bison. */
|
||||||
|
|
||||||
|
/* Tokens. */
|
||||||
|
#ifndef YYTOKENTYPE
|
||||||
|
# define YYTOKENTYPE
|
||||||
|
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||||
|
know about them. */
|
||||||
|
enum yytokentype {
|
||||||
|
TOKEN_COLUMN_SEPARATOR = 258,
|
||||||
|
TOKEN_EOL = 259,
|
||||||
|
TOKEN_PART_HEADER = 260,
|
||||||
|
TOKEN_CODEPOINT = 261
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
/* Tokens. */
|
||||||
|
#define TOKEN_COLUMN_SEPARATOR 258
|
||||||
|
#define TOKEN_EOL 259
|
||||||
|
#define TOKEN_PART_HEADER 260
|
||||||
|
#define TOKEN_CODEPOINT 261
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
|
||||||
|
#line 87 "normalizationTest.y"
|
||||||
|
typedef union YYSTYPE {
|
||||||
|
long part;
|
||||||
|
long codepoint;
|
||||||
|
WCHAR * str;
|
||||||
|
} YYSTYPE;
|
||||||
|
/* Line 1447 of yacc.c. */
|
||||||
|
#line 56 "normalizationTest.tab.h"
|
||||||
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED)
|
||||||
|
typedef struct YYLTYPE
|
||||||
|
{
|
||||||
|
int first_line;
|
||||||
|
int first_column;
|
||||||
|
int last_line;
|
||||||
|
int last_column;
|
||||||
|
} YYLTYPE;
|
||||||
|
# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
|
||||||
|
# define YYLTYPE_IS_DECLARED 1
|
||||||
|
# define YYLTYPE_IS_TRIVIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
222
reactos/nls/tests/normalization/normalizationTest.vcproj
Normal file
222
reactos/nls/tests/normalization/normalizationTest.vcproj
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8,00"
|
||||||
|
Name="normalizationTest"
|
||||||
|
ProjectGUID="{F316D362-6B02-469F-8C47-9E28E472DC58}"
|
||||||
|
RootNamespace="normalizationTest"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="../../3rdparty/icu/source/common"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
SmallerTypeCheck="true"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="kernel32.lib $(NOINHERIT)"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="../../3rdparty/icu/source/common"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="kernel32.lib $(NOINHERIT)"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\normalizationTest.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\normalizationTest.tab.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\normalizationTest.yy.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\normalizationTest.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\normalizationTest.tab.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NormalizationTest.txt"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
189
reactos/nls/tests/normalization/normalizationTest.y
Normal file
189
reactos/nls/tests/normalization/normalizationTest.y
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, KJK::Hyperion
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the ReactOS Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
#include <unicode/utf.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "normalizationTest.h"
|
||||||
|
|
||||||
|
static void part1TestInvariants(const struct TestSuite * test, UChar32 from, UChar32 to)
|
||||||
|
{
|
||||||
|
for(; from < to; ++ from)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
WCHAR szInvariant[U16_MAX_LENGTH + 1];
|
||||||
|
|
||||||
|
if(U_IS_SURROGATE(from))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
U16_APPEND_UNSAFE(szInvariant, i, from);
|
||||||
|
szInvariant[i] = 0;
|
||||||
|
|
||||||
|
NORMTEST_testInvariant(test, szInvariant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct parserState
|
||||||
|
{
|
||||||
|
void * scanner;
|
||||||
|
UChar32 lastCodepoint;
|
||||||
|
struct TestSuite * test;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define YYLTYPE int
|
||||||
|
#define YYLLOC_DEFAULT(Current, Rhs, N) for(;;) { (Current) = YYRHSLOC (Rhs, (N)); break; }
|
||||||
|
#define YY_LOCATION_PRINT(File, Loc) fprintf((File), "%d", (Loc))
|
||||||
|
|
||||||
|
#define YYLEX_PARAM state->scanner
|
||||||
|
|
||||||
|
#include "normalizationTest.tab.h"
|
||||||
|
|
||||||
|
extern int yylex(void *, int *, void *);
|
||||||
|
|
||||||
|
static void yyerror(const YYLTYPE *, struct parserState *, const char *);
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
%pure-parser
|
||||||
|
%defines
|
||||||
|
|
||||||
|
%union {
|
||||||
|
long part;
|
||||||
|
long codepoint;
|
||||||
|
WCHAR * str;
|
||||||
|
}
|
||||||
|
|
||||||
|
%token TOKEN_COLUMN_SEPARATOR
|
||||||
|
%token TOKEN_EOL
|
||||||
|
%token <part> TOKEN_PART_HEADER
|
||||||
|
%token <codepoint> TOKEN_CODEPOINT
|
||||||
|
|
||||||
|
%type <str> string
|
||||||
|
%type <str> column
|
||||||
|
|
||||||
|
%destructor { free($$); } string column
|
||||||
|
|
||||||
|
%parse-param { struct parserState * state }
|
||||||
|
|
||||||
|
%initial-action {
|
||||||
|
@$ = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
testSuite : eol parts
|
||||||
|
|
||||||
|
parts :
|
||||||
|
| parts part
|
||||||
|
|
||||||
|
part : part_header tests {
|
||||||
|
if(state->test->part == 1)
|
||||||
|
part1TestInvariants(state->test, state->lastCodepoint + 1, UCHAR_MAX_VALUE + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
part_header : TOKEN_PART_HEADER eol {
|
||||||
|
state->test->part = $1;
|
||||||
|
state->lastCodepoint = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tests : test
|
||||||
|
| tests test
|
||||||
|
|
||||||
|
test : column column column column column eol {
|
||||||
|
@$ = @1;
|
||||||
|
state->test->line = @$;
|
||||||
|
|
||||||
|
if(state->test->part == 1)
|
||||||
|
{
|
||||||
|
UChar32 codepoint;
|
||||||
|
U16_GET_UNSAFE($1, 0, codepoint);
|
||||||
|
assert(codepoint > state->lastCodepoint);
|
||||||
|
part1TestInvariants(state->test, state->lastCodepoint + 1, codepoint);
|
||||||
|
state->lastCodepoint = codepoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
NORMTEST_test(state->test, $1, $2, $3, $4, $5);
|
||||||
|
|
||||||
|
free($1);
|
||||||
|
free($2);
|
||||||
|
free($3);
|
||||||
|
free($4);
|
||||||
|
free($5);
|
||||||
|
}
|
||||||
|
|
||||||
|
column : string TOKEN_COLUMN_SEPARATOR
|
||||||
|
|
||||||
|
string : { $$ = NULL; }
|
||||||
|
| string TOKEN_CODEPOINT {
|
||||||
|
size_t cchString = 0;
|
||||||
|
|
||||||
|
if($1)
|
||||||
|
cchString = wcslen($1);
|
||||||
|
|
||||||
|
$$ = malloc((cchString + U16_LENGTH($2) + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
|
memcpy($$, $1, cchString * sizeof(WCHAR));
|
||||||
|
U16_APPEND_UNSAFE($$, cchString, $2);
|
||||||
|
$$[cchString] = 0;
|
||||||
|
|
||||||
|
free($1);
|
||||||
|
}
|
||||||
|
|
||||||
|
eol :
|
||||||
|
| eol TOKEN_EOL
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
void NORMTEST_runTests(struct TestSuite * test)
|
||||||
|
{
|
||||||
|
struct parserState parser;
|
||||||
|
parser.test = test;
|
||||||
|
parser.scanner = NORMTEST_createScanner(test);
|
||||||
|
yyparse(&parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void yyerror(const YYLTYPE * loc, struct parserState * state, const char * message)
|
||||||
|
{
|
||||||
|
struct TestSuite * test = state->test;
|
||||||
|
test->line = *loc;
|
||||||
|
fprintf(stderr, "FATAL: %s:%d: @Part%d: %s\n", test->filename, test->line, test->part, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
2043
reactos/nls/tests/normalization/normalizationTest.yy.c
Normal file
2043
reactos/nls/tests/normalization/normalizationTest.yy.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue