Merge pull request #7385 from Fusxfaranto/develop

Use ICU for UTF-8 conversion and add support for unicode uppercasing
This commit is contained in:
Aaron van Geffen 2018-05-23 10:08:27 +02:00 committed by GitHub
commit 77b09b3daf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 835 additions and 46250 deletions

View File

@ -47,7 +47,7 @@ matrix:
services:
- docker
env:
- OPENRCT2_CMAKE_OPTS="-G Ninja -DFORCE32=ON -DBUILD_SHARED_LIBS=off -DCMAKE_INSTALL_PREFIX=OpenRCT2 -DCMAKE_BUILD_TYPE=debug -DCMAKE_CXX_FLAGS=\"-coverage -gz\"" TARGET=ubuntu_i686
- OPENRCT2_CMAKE_OPTS="-G Ninja -DFORCE32=ON -DBUILD_SHARED_LIBS=off -DCMAKE_INSTALL_PREFIX=OpenRCT2 -DCMAKE_BUILD_TYPE=debug -DCMAKE_CXX_FLAGS=\"-coverage -m32 -gz\"" TARGET=ubuntu_i686
- secure: "S3u2VCE2Vy8KNXoeh+DhnzjCmgTX0r95uEZrXDU+IKANOOCKn7Dg4OFDZE3LY/i1y2/EUDpnR5yLC38Ks795EUP/sv/OoMl4tjQ20yERjqWh+gcIRrgx7SdVabuAh3t4aBdaLD4Pfnj5avxeCt6rL7yGnj0wdbrbJSBZPsgSnuQ="
- secure: "JGMzQHmDgpnVzP2uYP5KL7h6SzzGmL4kH7vJmGQRpudKAEzhzB0n7lzjrJOU82hxwmuQQ+RKlE/uxdI32Xbgl+wzZMdfQoZGMWHZfl8Le0Ft5gfZncPuE3poCbiSyPSXok9zU12JHKpEjV/sgqXv/HwhL3jAC68GPGpmxb6xWj8="
after_success:

View File

@ -43,6 +43,10 @@
9346F9DB208A191900C77D91 /* GuestPathfinding.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9346F9D7208A191900C77D91 /* GuestPathfinding.cpp */; };
9346F9DC208A191900C77D91 /* GuestPathfinding.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9346F9D7208A191900C77D91 /* GuestPathfinding.cpp */; };
9346F9DD208A191900C77D91 /* GuestPathfinding.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9346F9D7208A191900C77D91 /* GuestPathfinding.cpp */; };
93AF4A6520B462F8006489A5 /* libicuuc.61.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 93AF4A6220B462F7006489A5 /* libicuuc.61.1.dylib */; };
93AF4A6720B462F8006489A5 /* libicudata.61.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 93AF4A6320B462F7006489A5 /* libicudata.61.1.dylib */; };
93AF4A6820B46400006489A5 /* libicudata.61.1.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 93AF4A6320B462F7006489A5 /* libicudata.61.1.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
93AF4A6920B46400006489A5 /* libicuuc.61.1.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 93AF4A6220B462F7006489A5 /* libicuuc.61.1.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
93CBA4C020A74FF200867D56 /* BitmapReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93CBA4BF20A74FF200867D56 /* BitmapReader.cpp */; };
93CBA4C320A7502E00867D56 /* Imaging.h in Headers */ = {isa = PBXBuildFile; fileRef = 93CBA4C120A7502D00867D56 /* Imaging.h */; };
93CBA4C420A7502E00867D56 /* Imaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93CBA4C220A7502E00867D56 /* Imaging.cpp */; };
@ -374,7 +378,6 @@
D45A39591CF300AF00659A24 /* libcrypto.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B31CF3006400659A24 /* libcrypto.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D45A395A1CF300AF00659A24 /* libfreetype.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B41CF3006400659A24 /* libfreetype.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D45A395B1CF300AF00659A24 /* libjansson.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B51CF3006400659A24 /* libjansson.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D45A395D1CF300AF00659A24 /* libSDL2_ttf.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B71CF3006400659A24 /* libSDL2_ttf.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D45A395E1CF300AF00659A24 /* libSDL2.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B81CF3006400659A24 /* libSDL2.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D45A395F1CF300AF00659A24 /* libspeexdsp.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B91CF3006400659A24 /* libspeexdsp.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
D47304D51C4FF8250015C0EA /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D47304D41C4FF8250015C0EA /* libz.tbd */; };
@ -505,7 +508,6 @@
F7D7749B1EC6705F00BE6EBC /* libspeexdsp.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B91CF3006400659A24 /* libspeexdsp.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
F7D7749C1EC6705F00BE6EBC /* libzip.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C6E96E351E0408B40076A04F /* libzip.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
F7D7749E1EC6713200BE6EBC /* Cli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C857D1EC4E80E00FA49E2 /* Cli.cpp */; };
F7D774A11EC6715C00BE6EBC /* libSDL2_ttf.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B71CF3006400659A24 /* libSDL2_ttf.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
F7D774A21EC6715C00BE6EBC /* libSDL2.dylib in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D45A38B81CF3006400659A24 /* libSDL2.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
F7D774AC1EC6741D00BE6EBC /* language in CopyFiles */ = {isa = PBXBuildFile; fileRef = D4EC48E41C2637710024B507 /* language */; };
F7D774AD1EC6741D00BE6EBC /* shaders in CopyFiles */ = {isa = PBXBuildFile; fileRef = D43407E11D0E14CE00C2B3D4 /* shaders */; };
@ -550,12 +552,13 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
93AF4A6820B46400006489A5 /* libicudata.61.1.dylib in Embed Frameworks */,
93AF4A6920B46400006489A5 /* libicuuc.61.1.dylib in Embed Frameworks */,
C6E96E371E040E040076A04F /* libzip.dylib in Embed Frameworks */,
D45A39591CF300AF00659A24 /* libcrypto.dylib in Embed Frameworks */,
D45A395A1CF300AF00659A24 /* libfreetype.dylib in Embed Frameworks */,
D45A395B1CF300AF00659A24 /* libjansson.dylib in Embed Frameworks */,
D4A8B4B51DB4188D007A2F29 /* libpng16.dylib in Embed Frameworks */,
D45A395D1CF300AF00659A24 /* libSDL2_ttf.dylib in Embed Frameworks */,
D45A395E1CF300AF00659A24 /* libSDL2.dylib in Embed Frameworks */,
D45A395F1CF300AF00659A24 /* libspeexdsp.dylib in Embed Frameworks */,
);
@ -568,7 +571,6 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
F7D774A11EC6715C00BE6EBC /* libSDL2_ttf.dylib in Embed Frameworks */,
F7D774A21EC6715C00BE6EBC /* libSDL2.dylib in Embed Frameworks */,
F7D774971EC6705F00BE6EBC /* libcrypto.dylib in Embed Frameworks */,
F7D774981EC6705F00BE6EBC /* libfreetype.dylib in Embed Frameworks */,
@ -882,6 +884,235 @@
933F2CBA20935668001B33FD /* LocalisationService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalisationService.h; sourceTree = "<group>"; };
9346F9D6208A191900C77D91 /* Guest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Guest.cpp; sourceTree = "<group>"; };
9346F9D7208A191900C77D91 /* GuestPathfinding.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuestPathfinding.cpp; sourceTree = "<group>"; };
9350B44420B46E0800897BC5 /* translit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = translit.h; sourceTree = "<group>"; };
9350B44520B46E0800897BC5 /* ustdio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ustdio.h; sourceTree = "<group>"; };
9350B44620B46E0800897BC5 /* utf_old.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf_old.h; sourceTree = "<group>"; };
9350B44720B46E0800897BC5 /* ucsdet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucsdet.h; sourceTree = "<group>"; };
9350B44820B46E0800897BC5 /* tzfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tzfmt.h; sourceTree = "<group>"; };
9350B44920B46E0800897BC5 /* ubrk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ubrk.h; sourceTree = "<group>"; };
9350B44A20B46E0800897BC5 /* ufieldpositer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ufieldpositer.h; sourceTree = "<group>"; };
9350B44B20B46E0800897BC5 /* stringpiece.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stringpiece.h; sourceTree = "<group>"; };
9350B44C20B46E0800897BC5 /* ucat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucat.h; sourceTree = "<group>"; };
9350B44D20B46E0800897BC5 /* tblcoll.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tblcoll.h; sourceTree = "<group>"; };
9350B44E20B46E0800897BC5 /* stringoptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stringoptions.h; sourceTree = "<group>"; };
9350B44F20B46E0800897BC5 /* dtfmtsym.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtfmtsym.h; sourceTree = "<group>"; };
9350B45020B46E0800897BC5 /* unirepl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unirepl.h; sourceTree = "<group>"; };
9350B45120B46E0800897BC5 /* ptypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ptypes.h; sourceTree = "<group>"; };
9350B45220B46E0800897BC5 /* fmtable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fmtable.h; sourceTree = "<group>"; };
9350B45320B46E0800897BC5 /* dtitvfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtitvfmt.h; sourceTree = "<group>"; };
9350B45420B46E0800897BC5 /* choicfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = choicfmt.h; sourceTree = "<group>"; };
9350B45520B46E0800897BC5 /* usetiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = usetiter.h; sourceTree = "<group>"; };
9350B45620B46E0800897BC5 /* errorcode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = errorcode.h; sourceTree = "<group>"; };
9350B45720B46E0800897BC5 /* tznames.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tznames.h; sourceTree = "<group>"; };
9350B45820B46E0800897BC5 /* dtintrv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtintrv.h; sourceTree = "<group>"; };
9350B45920B46E0800897BC5 /* ucurr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucurr.h; sourceTree = "<group>"; };
9350B45A20B46E0800897BC5 /* icuplug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = icuplug.h; sourceTree = "<group>"; };
9350B45B20B46E0800897BC5 /* uregion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uregion.h; sourceTree = "<group>"; };
9350B45C20B46E0800897BC5 /* utext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utext.h; sourceTree = "<group>"; };
9350B45D20B46E0800897BC5 /* edits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = edits.h; sourceTree = "<group>"; };
9350B45E20B46E0800897BC5 /* parsepos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parsepos.h; sourceTree = "<group>"; };
9350B45F20B46E0800897BC5 /* ucal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucal.h; sourceTree = "<group>"; };
9350B46020B46E0800897BC5 /* fpositer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fpositer.h; sourceTree = "<group>"; };
9350B46120B46E0800897BC5 /* dtitvinf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtitvinf.h; sourceTree = "<group>"; };
9350B46220B46E0800897BC5 /* rbnf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbnf.h; sourceTree = "<group>"; };
9350B46320B46E0800897BC5 /* udat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udat.h; sourceTree = "<group>"; };
9350B46420B46E0800897BC5 /* urep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = urep.h; sourceTree = "<group>"; };
9350B46520B46E0800897BC5 /* utf32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf32.h; sourceTree = "<group>"; };
9350B46620B46E0800897BC5 /* vtzone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vtzone.h; sourceTree = "<group>"; };
9350B46720B46E0800897BC5 /* ustring.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ustring.h; sourceTree = "<group>"; };
9350B46820B46E0800897BC5 /* ubiditransform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ubiditransform.h; sourceTree = "<group>"; };
9350B46920B46E0800897BC5 /* uenum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uenum.h; sourceTree = "<group>"; };
9350B46A20B46E0800897BC5 /* appendable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = appendable.h; sourceTree = "<group>"; };
9350B46B20B46E0800897BC5 /* usearch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = usearch.h; sourceTree = "<group>"; };
9350B46C20B46E0800897BC5 /* numsys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = numsys.h; sourceTree = "<group>"; };
9350B46D20B46E0800897BC5 /* timezone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = timezone.h; sourceTree = "<group>"; };
9350B46E20B46E0800897BC5 /* uset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uset.h; sourceTree = "<group>"; };
9350B46F20B46E0800897BC5 /* casemap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = casemap.h; sourceTree = "<group>"; };
9350B47020B46E0800897BC5 /* coleitr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = coleitr.h; sourceTree = "<group>"; };
9350B47120B46E0800897BC5 /* schriter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = schriter.h; sourceTree = "<group>"; };
9350B47220B46E0800897BC5 /* msgfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = msgfmt.h; sourceTree = "<group>"; };
9350B47320B46E0800897BC5 /* fieldpos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fieldpos.h; sourceTree = "<group>"; };
9350B47420B46E0800897BC5 /* simpletz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = simpletz.h; sourceTree = "<group>"; };
9350B47520B46E0800897BC5 /* uldnames.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uldnames.h; sourceTree = "<group>"; };
9350B47620B46E0800897BC5 /* uiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uiter.h; sourceTree = "<group>"; };
9350B47720B46E0800897BC5 /* umsg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = umsg.h; sourceTree = "<group>"; };
9350B47820B46E0800897BC5 /* sortkey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sortkey.h; sourceTree = "<group>"; };
9350B47920B46E0800897BC5 /* docmain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = docmain.h; sourceTree = "<group>"; };
9350B47A20B46E0800897BC5 /* uniset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uniset.h; sourceTree = "<group>"; };
9350B47B20B46E0800897BC5 /* basictz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = basictz.h; sourceTree = "<group>"; };
9350B47C20B46E0800897BC5 /* udata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udata.h; sourceTree = "<group>"; };
9350B47D20B46E0800897BC5 /* stringtriebuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stringtriebuilder.h; sourceTree = "<group>"; };
9350B47E20B46E0800897BC5 /* chariter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chariter.h; sourceTree = "<group>"; };
9350B47F20B46E0800897BC5 /* umisc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = umisc.h; sourceTree = "<group>"; };
9350B48020B46E0800897BC5 /* reldatefmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = reldatefmt.h; sourceTree = "<group>"; };
9350B48120B46E0800897BC5 /* uloc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uloc.h; sourceTree = "<group>"; };
9350B48220B46E0800897BC5 /* plurrule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = plurrule.h; sourceTree = "<group>"; };
9350B48320B46E0800897BC5 /* bytestriebuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bytestriebuilder.h; sourceTree = "<group>"; };
9350B48420B46E0800897BC5 /* measunit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = measunit.h; sourceTree = "<group>"; };
9350B48520B46E0800897BC5 /* utrace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utrace.h; sourceTree = "<group>"; };
9350B48620B46E0800897BC5 /* locdspnm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = locdspnm.h; sourceTree = "<group>"; };
9350B48720B46E0800897BC5 /* gregocal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gregocal.h; sourceTree = "<group>"; };
9350B48820B46E0800897BC5 /* uchriter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uchriter.h; sourceTree = "<group>"; };
9350B48920B46E0800897BC5 /* enumset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = enumset.h; sourceTree = "<group>"; };
9350B48A20B46E0800897BC5 /* nounit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nounit.h; sourceTree = "<group>"; };
9350B48B20B46E0800897BC5 /* utf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf.h; sourceTree = "<group>"; };
9350B48C20B46E0800897BC5 /* measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = measure.h; sourceTree = "<group>"; };
9350B48D20B46E0800897BC5 /* tzrule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tzrule.h; sourceTree = "<group>"; };
9350B48E20B46E0800897BC5 /* strenum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = strenum.h; sourceTree = "<group>"; };
9350B48F20B46E0800897BC5 /* regex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = regex.h; sourceTree = "<group>"; };
9350B49020B46E0800897BC5 /* gender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gender.h; sourceTree = "<group>"; };
9350B49120B46E0800897BC5 /* dcfmtsym.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dcfmtsym.h; sourceTree = "<group>"; };
9350B49220B46E0800897BC5 /* ucnv_err.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucnv_err.h; sourceTree = "<group>"; };
9350B49320B46E0800897BC5 /* decimfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = decimfmt.h; sourceTree = "<group>"; };
9350B49420B46E0800897BC5 /* bytestrie.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bytestrie.h; sourceTree = "<group>"; };
9350B49520B46E0800897BC5 /* udatpg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udatpg.h; sourceTree = "<group>"; };
9350B49620B46E0800897BC5 /* listformatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = listformatter.h; sourceTree = "<group>"; };
9350B49720B46E0800897BC5 /* uobject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uobject.h; sourceTree = "<group>"; };
9350B49820B46E0800897BC5 /* calendar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = calendar.h; sourceTree = "<group>"; };
9350B49920B46E0800897BC5 /* ures.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ures.h; sourceTree = "<group>"; };
9350B49A20B46E0800897BC5 /* normlzr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = normlzr.h; sourceTree = "<group>"; };
9350B49B20B46E0800897BC5 /* usprep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = usprep.h; sourceTree = "<group>"; };
9350B49C20B46E0800897BC5 /* urename.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = urename.h; sourceTree = "<group>"; };
9350B49D20B46E0800897BC5 /* caniter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = caniter.h; sourceTree = "<group>"; };
9350B49E20B46E0800897BC5 /* ucol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucol.h; sourceTree = "<group>"; };
9350B49F20B46E0800897BC5 /* upluralrules.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = upluralrules.h; sourceTree = "<group>"; };
9350B4A020B46E0800897BC5 /* ucharstrie.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucharstrie.h; sourceTree = "<group>"; };
9350B4A120B46E0800897BC5 /* tmunit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tmunit.h; sourceTree = "<group>"; };
9350B4A220B46E0800897BC5 /* unistr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unistr.h; sourceTree = "<group>"; };
9350B4A320B46E0800897BC5 /* rbbi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbbi.h; sourceTree = "<group>"; };
9350B4A420B46E0800897BC5 /* ulocdata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ulocdata.h; sourceTree = "<group>"; };
9350B4A520B46E0800897BC5 /* idna.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = idna.h; sourceTree = "<group>"; };
9350B4A620B46E0800897BC5 /* unorm2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unorm2.h; sourceTree = "<group>"; };
9350B4A720B46E0800897BC5 /* dtptngen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtptngen.h; sourceTree = "<group>"; };
9350B4A820B46E0800897BC5 /* dbbi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dbbi.h; sourceTree = "<group>"; };
9350B4A920B46E0800897BC5 /* bytestream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bytestream.h; sourceTree = "<group>"; };
9350B4AA20B46E0800897BC5 /* uversion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uversion.h; sourceTree = "<group>"; };
9350B4AB20B46E0800897BC5 /* messagepattern.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = messagepattern.h; sourceTree = "<group>"; };
9350B4AC20B46E0800897BC5 /* uidna.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uidna.h; sourceTree = "<group>"; };
9350B4AD20B46E0800897BC5 /* filteredbrk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = filteredbrk.h; sourceTree = "<group>"; };
9350B4AE20B46E0800897BC5 /* tmutamt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tmutamt.h; sourceTree = "<group>"; };
9350B4AF20B46E0800897BC5 /* char16ptr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = char16ptr.h; sourceTree = "<group>"; };
9350B4B020B46E0800897BC5 /* symtable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = symtable.h; sourceTree = "<group>"; };
9350B4B120B46E0800897BC5 /* ucasemap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucasemap.h; sourceTree = "<group>"; };
9350B4B220B46E0800897BC5 /* ucoleitr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucoleitr.h; sourceTree = "<group>"; };
9350B4B320B46E0800897BC5 /* compactdecimalformat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = compactdecimalformat.h; sourceTree = "<group>"; };
9350B4B420B46E0800897BC5 /* unum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unum.h; sourceTree = "<group>"; };
9350B4B520B46E0800897BC5 /* udisplaycontext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udisplaycontext.h; sourceTree = "<group>"; };
9350B4B620B46E0800897BC5 /* tztrans.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tztrans.h; sourceTree = "<group>"; };
9350B4B720B46E0800897BC5 /* umachine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = umachine.h; sourceTree = "<group>"; };
9350B4B820B46E0800897BC5 /* numberformatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = numberformatter.h; sourceTree = "<group>"; };
9350B4B920B46E0800897BC5 /* datefmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = datefmt.h; sourceTree = "<group>"; };
9350B4BA20B46E0800897BC5 /* utmscale.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utmscale.h; sourceTree = "<group>"; };
9350B4BB20B46E0800897BC5 /* coll.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = coll.h; sourceTree = "<group>"; };
9350B4BC20B46E0800897BC5 /* currpinf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = currpinf.h; sourceTree = "<group>"; };
9350B4BD20B46E0800897BC5 /* uregex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uregex.h; sourceTree = "<group>"; };
9350B4BE20B46E0800897BC5 /* tmutfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tmutfmt.h; sourceTree = "<group>"; };
9350B4BF20B46E0800897BC5 /* plurfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = plurfmt.h; sourceTree = "<group>"; };
9350B4C020B46E0800897BC5 /* ustringtrie.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ustringtrie.h; sourceTree = "<group>"; };
9350B4C120B46E0800897BC5 /* smpdtfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = smpdtfmt.h; sourceTree = "<group>"; };
9350B4C220B46E0800897BC5 /* icudataver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = icudataver.h; sourceTree = "<group>"; };
9350B4C320B46E0800897BC5 /* uchar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uchar.h; sourceTree = "<group>"; };
9350B4C420B46E0800897BC5 /* unorm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unorm.h; sourceTree = "<group>"; };
9350B4C520B46E0800897BC5 /* ushape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ushape.h; sourceTree = "<group>"; };
9350B4C620B46E0800897BC5 /* unifunct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unifunct.h; sourceTree = "<group>"; };
9350B4C720B46E0800897BC5 /* ugender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ugender.h; sourceTree = "<group>"; };
9350B4C820B46E0800897BC5 /* selfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = selfmt.h; sourceTree = "<group>"; };
9350B4C920B46E0800897BC5 /* uformattable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uformattable.h; sourceTree = "<group>"; };
9350B4CA20B46E0800897BC5 /* ustream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ustream.h; sourceTree = "<group>"; };
9350B4CB20B46E0800897BC5 /* simpleformatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = simpleformatter.h; sourceTree = "<group>"; };
9350B4CC20B46E0800897BC5 /* ucnv_cb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucnv_cb.h; sourceTree = "<group>"; };
9350B4CD20B46E0800897BC5 /* curramt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = curramt.h; sourceTree = "<group>"; };
9350B4CE20B46E0800897BC5 /* locid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = locid.h; sourceTree = "<group>"; };
9350B4CF20B46E0800897BC5 /* udateintervalformat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udateintervalformat.h; sourceTree = "<group>"; };
9350B4D020B46E0800897BC5 /* resbund.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = resbund.h; sourceTree = "<group>"; };
9350B4D120B46E0800897BC5 /* ubidi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ubidi.h; sourceTree = "<group>"; };
9350B4D220B46E0800897BC5 /* stsearch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stsearch.h; sourceTree = "<group>"; };
9350B4D320B46E0800897BC5 /* alphaindex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = alphaindex.h; sourceTree = "<group>"; };
9350B4D420B46E0800897BC5 /* uvernum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uvernum.h; sourceTree = "<group>"; };
9350B4D520B46E0800897BC5 /* unimatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unimatch.h; sourceTree = "<group>"; };
9350B4D620B46E0800897BC5 /* rbtz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbtz.h; sourceTree = "<group>"; };
9350B4D720B46E0800897BC5 /* ucnvsel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucnvsel.h; sourceTree = "<group>"; };
9350B4D820B46E0800897BC5 /* uspoof.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uspoof.h; sourceTree = "<group>"; };
9350B4D920B46E0800897BC5 /* region.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = region.h; sourceTree = "<group>"; };
9350B4DA20B46E0800897BC5 /* ureldatefmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ureldatefmt.h; sourceTree = "<group>"; };
9350B4DB20B46E0800897BC5 /* utrans.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utrans.h; sourceTree = "<group>"; };
9350B4DC20B46E0800897BC5 /* parseerr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parseerr.h; sourceTree = "<group>"; };
9350B4DD20B46E0800897BC5 /* putil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = putil.h; sourceTree = "<group>"; };
9350B4DE20B46E0800897BC5 /* format.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = format.h; sourceTree = "<group>"; };
9350B4DF20B46E0800897BC5 /* scientificnumberformatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scientificnumberformatter.h; sourceTree = "<group>"; };
9350B4E020B46E0800897BC5 /* normalizer2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = normalizer2.h; sourceTree = "<group>"; };
9350B4E120B46E0800897BC5 /* dtrule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dtrule.h; sourceTree = "<group>"; };
9350B4E220B46E0800897BC5 /* ucnv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucnv.h; sourceTree = "<group>"; };
9350B4E320B46E0800897BC5 /* ucharstriebuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ucharstriebuilder.h; sourceTree = "<group>"; };
9350B4E420B46E0800897BC5 /* search.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = "<group>"; };
9350B4E520B46E0800897BC5 /* unumsys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unumsys.h; sourceTree = "<group>"; };
9350B4E620B46E0800897BC5 /* uconfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uconfig.h; sourceTree = "<group>"; };
9350B4E720B46E0800897BC5 /* utf16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf16.h; sourceTree = "<group>"; };
9350B4E820B46E0800897BC5 /* brkiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = brkiter.h; sourceTree = "<group>"; };
9350B4E920B46E0800897BC5 /* platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = "<group>"; };
9350B4EA20B46E0800897BC5 /* rep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rep.h; sourceTree = "<group>"; };
9350B4EB20B46E0800897BC5 /* std_string.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = std_string.h; sourceTree = "<group>"; };
9350B4EC20B46E0800897BC5 /* utf8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = "<group>"; };
9350B4ED20B46E0800897BC5 /* localpointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = localpointer.h; sourceTree = "<group>"; };
9350B4EE20B46E0800897BC5 /* uclean.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uclean.h; sourceTree = "<group>"; };
9350B4EF20B46E0800897BC5 /* uscript.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uscript.h; sourceTree = "<group>"; };
9350B4F020B46E0800897BC5 /* numfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = numfmt.h; sourceTree = "<group>"; };
9350B4F120B46E0800897BC5 /* currunit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = currunit.h; sourceTree = "<group>"; };
9350B4F220B46E0800897BC5 /* utypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utypes.h; sourceTree = "<group>"; };
9350B4F320B46E0800897BC5 /* ulistformatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ulistformatter.h; sourceTree = "<group>"; };
9350B4F420B46E0800897BC5 /* measfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = measfmt.h; sourceTree = "<group>"; };
9350B4F520B46E0800897BC5 /* unifilt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unifilt.h; sourceTree = "<group>"; };
9350B4F820B46E0900897BC5 /* ftsnames.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftsnames.h; sourceTree = "<group>"; };
9350B4F920B46E0900897BC5 /* ftwinfnt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftwinfnt.h; sourceTree = "<group>"; };
9350B4FA20B46E0900897BC5 /* ftsizes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftsizes.h; sourceTree = "<group>"; };
9350B4FB20B46E0900897BC5 /* fttypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fttypes.h; sourceTree = "<group>"; };
9350B4FC20B46E0900897BC5 /* ftparams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftparams.h; sourceTree = "<group>"; };
9350B4FD20B46E0900897BC5 /* ftmm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftmm.h; sourceTree = "<group>"; };
9350B4FF20B46E0900897BC5 /* ftstdlib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftstdlib.h; sourceTree = "<group>"; };
9350B50020B46E0900897BC5 /* ftheader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftheader.h; sourceTree = "<group>"; };
9350B50120B46E0900897BC5 /* ftconfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftconfig.h; sourceTree = "<group>"; };
9350B50220B46E0900897BC5 /* ftoption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftoption.h; sourceTree = "<group>"; };
9350B50320B46E0900897BC5 /* ftmodule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftmodule.h; sourceTree = "<group>"; };
9350B50420B46E0900897BC5 /* ftmodapi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftmodapi.h; sourceTree = "<group>"; };
9350B50520B46E0900897BC5 /* ftbzip2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftbzip2.h; sourceTree = "<group>"; };
9350B50620B46E0900897BC5 /* fttrigon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fttrigon.h; sourceTree = "<group>"; };
9350B50720B46E0900897BC5 /* ftbbox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftbbox.h; sourceTree = "<group>"; };
9350B50820B46E0900897BC5 /* ftgzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftgzip.h; sourceTree = "<group>"; };
9350B50920B46E0900897BC5 /* ftdriver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftdriver.h; sourceTree = "<group>"; };
9350B50A20B46E0900897BC5 /* ftoutln.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftoutln.h; sourceTree = "<group>"; };
9350B50B20B46E0900897BC5 /* ftadvanc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftadvanc.h; sourceTree = "<group>"; };
9350B50C20B46E0900897BC5 /* ftsynth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftsynth.h; sourceTree = "<group>"; };
9350B50D20B46E0900897BC5 /* fterrors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fterrors.h; sourceTree = "<group>"; };
9350B50E20B46E0900897BC5 /* ftgasp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftgasp.h; sourceTree = "<group>"; };
9350B50F20B46E0900897BC5 /* ftstroke.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftstroke.h; sourceTree = "<group>"; };
9350B51020B46E0900897BC5 /* ftcache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftcache.h; sourceTree = "<group>"; };
9350B51120B46E0900897BC5 /* ftotval.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftotval.h; sourceTree = "<group>"; };
9350B51220B46E0900897BC5 /* freetype.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = freetype.h; sourceTree = "<group>"; };
9350B51320B46E0900897BC5 /* ftincrem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftincrem.h; sourceTree = "<group>"; };
9350B51420B46E0900897BC5 /* ftfntfmt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftfntfmt.h; sourceTree = "<group>"; };
9350B51520B46E0900897BC5 /* fterrdef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fterrdef.h; sourceTree = "<group>"; };
9350B51620B46E0900897BC5 /* ttnameid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ttnameid.h; sourceTree = "<group>"; };
9350B51720B46E0900897BC5 /* ftpfr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftpfr.h; sourceTree = "<group>"; };
9350B51820B46E0900897BC5 /* ftgxval.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftgxval.h; sourceTree = "<group>"; };
9350B51920B46E0900897BC5 /* ftchapters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftchapters.h; sourceTree = "<group>"; };
9350B51A20B46E0900897BC5 /* tttags.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tttags.h; sourceTree = "<group>"; };
9350B51B20B46E0900897BC5 /* ftlzw.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftlzw.h; sourceTree = "<group>"; };
9350B51C20B46E0900897BC5 /* ftsystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftsystem.h; sourceTree = "<group>"; };
9350B51D20B46E0900897BC5 /* t1tables.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = t1tables.h; sourceTree = "<group>"; };
9350B51E20B46E0900897BC5 /* ftimage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftimage.h; sourceTree = "<group>"; };
9350B51F20B46E0900897BC5 /* tttables.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tttables.h; sourceTree = "<group>"; };
9350B52020B46E0900897BC5 /* ftcid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftcid.h; sourceTree = "<group>"; };
9350B52120B46E0900897BC5 /* ftglyph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftglyph.h; sourceTree = "<group>"; };
9350B52220B46E0900897BC5 /* ftmoderr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftmoderr.h; sourceTree = "<group>"; };
9350B52320B46E0900897BC5 /* ftbitmap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftbitmap.h; sourceTree = "<group>"; };
9350B52420B46E0900897BC5 /* ftlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftlist.h; sourceTree = "<group>"; };
9350B52520B46E0900897BC5 /* ftmac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftmac.h; sourceTree = "<group>"; };
9350B52620B46E0900897BC5 /* ftlcdfil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftlcdfil.h; sourceTree = "<group>"; };
9350B52720B46E0900897BC5 /* ftbdf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftbdf.h; sourceTree = "<group>"; };
9350B52820B46E0900897BC5 /* ftrender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftrender.h; sourceTree = "<group>"; };
9350B52920B46E0900897BC5 /* ft2build.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ft2build.h; sourceTree = "<group>"; };
93AF4A6220B462F7006489A5 /* libicuuc.61.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libicuuc.61.1.dylib; sourceTree = "<group>"; };
93AF4A6320B462F7006489A5 /* libicudata.61.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libicudata.61.1.dylib; sourceTree = "<group>"; };
93CBA4BE20A74FF200867D56 /* BitmapReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitmapReader.h; sourceTree = "<group>"; };
93CBA4BF20A74FF200867D56 /* BitmapReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitmapReader.cpp; sourceTree = "<group>"; };
93CBA4C120A7502D00867D56 /* Imaging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Imaging.h; sourceTree = "<group>"; };
@ -1003,7 +1234,6 @@
D45A38B31CF3006400659A24 /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libcrypto.dylib; sourceTree = "<group>"; };
D45A38B41CF3006400659A24 /* libfreetype.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libfreetype.dylib; sourceTree = "<group>"; };
D45A38B51CF3006400659A24 /* libjansson.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libjansson.dylib; sourceTree = "<group>"; };
D45A38B71CF3006400659A24 /* libSDL2_ttf.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libSDL2_ttf.dylib; sourceTree = "<group>"; };
D45A38B81CF3006400659A24 /* libSDL2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libSDL2.dylib; sourceTree = "<group>"; };
D45A38B91CF3006400659A24 /* libspeexdsp.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libspeexdsp.dylib; sourceTree = "<group>"; };
D45A38C41CF3007A00659A24 /* jansson_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jansson_config.h; sourceTree = "<group>"; };
@ -1141,7 +1371,6 @@
D45A394B1CF3007A00659A24 /* SDL_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_thread.h; sourceTree = "<group>"; };
D45A394C1CF3007A00659A24 /* SDL_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_timer.h; sourceTree = "<group>"; };
D45A394D1CF3007A00659A24 /* SDL_touch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_touch.h; sourceTree = "<group>"; };
D45A394E1CF3007A00659A24 /* SDL_ttf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_ttf.h; sourceTree = "<group>"; };
D45A394F1CF3007A00659A24 /* SDL_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_types.h; sourceTree = "<group>"; };
D45A39501CF3007A00659A24 /* SDL_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_version.h; sourceTree = "<group>"; };
D45A39511CF3007A00659A24 /* SDL_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_video.h; sourceTree = "<group>"; };
@ -1419,6 +1648,8 @@
D47304D51C4FF8250015C0EA /* libz.tbd in Frameworks */,
D41B73EF1C2101890080A7B9 /* libcurl.tbd in Frameworks */,
D41B741D1C210A7A0080A7B9 /* libiconv.tbd in Frameworks */,
93F9DA3620B46F3100D1BE92 /* libicudata.61.1.dylib in Frameworks */,
93F9DA3720B46F3100D1BE92 /* libicuuc.61.1.dylib in Frameworks */,
D45A38BC1CF3006400659A24 /* libcrypto.dylib in Frameworks */,
D45A38BE1CF3006400659A24 /* libjansson.dylib in Frameworks */,
D4A8B4B41DB41873007A2F29 /* libpng16.dylib in Frameworks */,
@ -1438,6 +1669,8 @@
F7D7748D1EC66F8600BE6EBC /* libopenrct2.a in Frameworks */,
F7D774901EC66FB000BE6EBC /* libz.tbd in Frameworks */,
F7D7748F1EC66FA900BE6EBC /* libcurl.tbd in Frameworks */,
93AF4A6720B462F8006489A5 /* libicudata.61.1.dylib in Frameworks */,
93AF4A6520B462F8006489A5 /* libicuuc.61.1.dylib in Frameworks */,
F7D7748E1EC66FA000BE6EBC /* libiconv.tbd in Frameworks */,
F7D774911EC66FBA00BE6EBC /* libcrypto.dylib in Frameworks */,
F7D774921EC66FBA00BE6EBC /* libfreetype.dylib in Frameworks */,
@ -1459,6 +1692,263 @@
path = thirdparty;
sourceTree = "<group>";
};
9350B44320B46E0800897BC5 /* unicode */ = {
isa = PBXGroup;
children = (
9350B44420B46E0800897BC5 /* translit.h */,
9350B44520B46E0800897BC5 /* ustdio.h */,
9350B44620B46E0800897BC5 /* utf_old.h */,
9350B44720B46E0800897BC5 /* ucsdet.h */,
9350B44820B46E0800897BC5 /* tzfmt.h */,
9350B44920B46E0800897BC5 /* ubrk.h */,
9350B44A20B46E0800897BC5 /* ufieldpositer.h */,
9350B44B20B46E0800897BC5 /* stringpiece.h */,
9350B44C20B46E0800897BC5 /* ucat.h */,
9350B44D20B46E0800897BC5 /* tblcoll.h */,
9350B44E20B46E0800897BC5 /* stringoptions.h */,
9350B44F20B46E0800897BC5 /* dtfmtsym.h */,
9350B45020B46E0800897BC5 /* unirepl.h */,
9350B45120B46E0800897BC5 /* ptypes.h */,
9350B45220B46E0800897BC5 /* fmtable.h */,
9350B45320B46E0800897BC5 /* dtitvfmt.h */,
9350B45420B46E0800897BC5 /* choicfmt.h */,
9350B45520B46E0800897BC5 /* usetiter.h */,
9350B45620B46E0800897BC5 /* errorcode.h */,
9350B45720B46E0800897BC5 /* tznames.h */,
9350B45820B46E0800897BC5 /* dtintrv.h */,
9350B45920B46E0800897BC5 /* ucurr.h */,
9350B45A20B46E0800897BC5 /* icuplug.h */,
9350B45B20B46E0800897BC5 /* uregion.h */,
9350B45C20B46E0800897BC5 /* utext.h */,
9350B45D20B46E0800897BC5 /* edits.h */,
9350B45E20B46E0800897BC5 /* parsepos.h */,
9350B45F20B46E0800897BC5 /* ucal.h */,
9350B46020B46E0800897BC5 /* fpositer.h */,
9350B46120B46E0800897BC5 /* dtitvinf.h */,
9350B46220B46E0800897BC5 /* rbnf.h */,
9350B46320B46E0800897BC5 /* udat.h */,
9350B46420B46E0800897BC5 /* urep.h */,
9350B46520B46E0800897BC5 /* utf32.h */,
9350B46620B46E0800897BC5 /* vtzone.h */,
9350B46720B46E0800897BC5 /* ustring.h */,
9350B46820B46E0800897BC5 /* ubiditransform.h */,
9350B46920B46E0800897BC5 /* uenum.h */,
9350B46A20B46E0800897BC5 /* appendable.h */,
9350B46B20B46E0800897BC5 /* usearch.h */,
9350B46C20B46E0800897BC5 /* numsys.h */,
9350B46D20B46E0800897BC5 /* timezone.h */,
9350B46E20B46E0800897BC5 /* uset.h */,
9350B46F20B46E0800897BC5 /* casemap.h */,
9350B47020B46E0800897BC5 /* coleitr.h */,
9350B47120B46E0800897BC5 /* schriter.h */,
9350B47220B46E0800897BC5 /* msgfmt.h */,
9350B47320B46E0800897BC5 /* fieldpos.h */,
9350B47420B46E0800897BC5 /* simpletz.h */,
9350B47520B46E0800897BC5 /* uldnames.h */,
9350B47620B46E0800897BC5 /* uiter.h */,
9350B47720B46E0800897BC5 /* umsg.h */,
9350B47820B46E0800897BC5 /* sortkey.h */,
9350B47920B46E0800897BC5 /* docmain.h */,
9350B47A20B46E0800897BC5 /* uniset.h */,
9350B47B20B46E0800897BC5 /* basictz.h */,
9350B47C20B46E0800897BC5 /* udata.h */,
9350B47D20B46E0800897BC5 /* stringtriebuilder.h */,
9350B47E20B46E0800897BC5 /* chariter.h */,
9350B47F20B46E0800897BC5 /* umisc.h */,
9350B48020B46E0800897BC5 /* reldatefmt.h */,
9350B48120B46E0800897BC5 /* uloc.h */,
9350B48220B46E0800897BC5 /* plurrule.h */,
9350B48320B46E0800897BC5 /* bytestriebuilder.h */,
9350B48420B46E0800897BC5 /* measunit.h */,
9350B48520B46E0800897BC5 /* utrace.h */,
9350B48620B46E0800897BC5 /* locdspnm.h */,
9350B48720B46E0800897BC5 /* gregocal.h */,
9350B48820B46E0800897BC5 /* uchriter.h */,
9350B48920B46E0800897BC5 /* enumset.h */,
9350B48A20B46E0800897BC5 /* nounit.h */,
9350B48B20B46E0800897BC5 /* utf.h */,
9350B48C20B46E0800897BC5 /* measure.h */,
9350B48D20B46E0800897BC5 /* tzrule.h */,
9350B48E20B46E0800897BC5 /* strenum.h */,
9350B48F20B46E0800897BC5 /* regex.h */,
9350B49020B46E0800897BC5 /* gender.h */,
9350B49120B46E0800897BC5 /* dcfmtsym.h */,
9350B49220B46E0800897BC5 /* ucnv_err.h */,
9350B49320B46E0800897BC5 /* decimfmt.h */,
9350B49420B46E0800897BC5 /* bytestrie.h */,
9350B49520B46E0800897BC5 /* udatpg.h */,
9350B49620B46E0800897BC5 /* listformatter.h */,
9350B49720B46E0800897BC5 /* uobject.h */,
9350B49820B46E0800897BC5 /* calendar.h */,
9350B49920B46E0800897BC5 /* ures.h */,
9350B49A20B46E0800897BC5 /* normlzr.h */,
9350B49B20B46E0800897BC5 /* usprep.h */,
9350B49C20B46E0800897BC5 /* urename.h */,
9350B49D20B46E0800897BC5 /* caniter.h */,
9350B49E20B46E0800897BC5 /* ucol.h */,
9350B49F20B46E0800897BC5 /* upluralrules.h */,
9350B4A020B46E0800897BC5 /* ucharstrie.h */,
9350B4A120B46E0800897BC5 /* tmunit.h */,
9350B4A220B46E0800897BC5 /* unistr.h */,
9350B4A320B46E0800897BC5 /* rbbi.h */,
9350B4A420B46E0800897BC5 /* ulocdata.h */,
9350B4A520B46E0800897BC5 /* idna.h */,
9350B4A620B46E0800897BC5 /* unorm2.h */,
9350B4A720B46E0800897BC5 /* dtptngen.h */,
9350B4A820B46E0800897BC5 /* dbbi.h */,
9350B4A920B46E0800897BC5 /* bytestream.h */,
9350B4AA20B46E0800897BC5 /* uversion.h */,
9350B4AB20B46E0800897BC5 /* messagepattern.h */,
9350B4AC20B46E0800897BC5 /* uidna.h */,
9350B4AD20B46E0800897BC5 /* filteredbrk.h */,
9350B4AE20B46E0800897BC5 /* tmutamt.h */,
9350B4AF20B46E0800897BC5 /* char16ptr.h */,
9350B4B020B46E0800897BC5 /* symtable.h */,
9350B4B120B46E0800897BC5 /* ucasemap.h */,
9350B4B220B46E0800897BC5 /* ucoleitr.h */,
9350B4B320B46E0800897BC5 /* compactdecimalformat.h */,
9350B4B420B46E0800897BC5 /* unum.h */,
9350B4B520B46E0800897BC5 /* udisplaycontext.h */,
9350B4B620B46E0800897BC5 /* tztrans.h */,
9350B4B720B46E0800897BC5 /* umachine.h */,
9350B4B820B46E0800897BC5 /* numberformatter.h */,
9350B4B920B46E0800897BC5 /* datefmt.h */,
9350B4BA20B46E0800897BC5 /* utmscale.h */,
9350B4BB20B46E0800897BC5 /* coll.h */,
9350B4BC20B46E0800897BC5 /* currpinf.h */,
9350B4BD20B46E0800897BC5 /* uregex.h */,
9350B4BE20B46E0800897BC5 /* tmutfmt.h */,
9350B4BF20B46E0800897BC5 /* plurfmt.h */,
9350B4C020B46E0800897BC5 /* ustringtrie.h */,
9350B4C120B46E0800897BC5 /* smpdtfmt.h */,
9350B4C220B46E0800897BC5 /* icudataver.h */,
9350B4C320B46E0800897BC5 /* uchar.h */,
9350B4C420B46E0800897BC5 /* unorm.h */,
9350B4C520B46E0800897BC5 /* ushape.h */,
9350B4C620B46E0800897BC5 /* unifunct.h */,
9350B4C720B46E0800897BC5 /* ugender.h */,
9350B4C820B46E0800897BC5 /* selfmt.h */,
9350B4C920B46E0800897BC5 /* uformattable.h */,
9350B4CA20B46E0800897BC5 /* ustream.h */,
9350B4CB20B46E0800897BC5 /* simpleformatter.h */,
9350B4CC20B46E0800897BC5 /* ucnv_cb.h */,
9350B4CD20B46E0800897BC5 /* curramt.h */,
9350B4CE20B46E0800897BC5 /* locid.h */,
9350B4CF20B46E0800897BC5 /* udateintervalformat.h */,
9350B4D020B46E0800897BC5 /* resbund.h */,
9350B4D120B46E0800897BC5 /* ubidi.h */,
9350B4D220B46E0800897BC5 /* stsearch.h */,
9350B4D320B46E0800897BC5 /* alphaindex.h */,
9350B4D420B46E0800897BC5 /* uvernum.h */,
9350B4D520B46E0800897BC5 /* unimatch.h */,
9350B4D620B46E0800897BC5 /* rbtz.h */,
9350B4D720B46E0800897BC5 /* ucnvsel.h */,
9350B4D820B46E0800897BC5 /* uspoof.h */,
9350B4D920B46E0800897BC5 /* region.h */,
9350B4DA20B46E0800897BC5 /* ureldatefmt.h */,
9350B4DB20B46E0800897BC5 /* utrans.h */,
9350B4DC20B46E0800897BC5 /* parseerr.h */,
9350B4DD20B46E0800897BC5 /* putil.h */,
9350B4DE20B46E0800897BC5 /* format.h */,
9350B4DF20B46E0800897BC5 /* scientificnumberformatter.h */,
9350B4E020B46E0800897BC5 /* normalizer2.h */,
9350B4E120B46E0800897BC5 /* dtrule.h */,
9350B4E220B46E0800897BC5 /* ucnv.h */,
9350B4E320B46E0800897BC5 /* ucharstriebuilder.h */,
9350B4E420B46E0800897BC5 /* search.h */,
9350B4E520B46E0800897BC5 /* unumsys.h */,
9350B4E620B46E0800897BC5 /* uconfig.h */,
9350B4E720B46E0800897BC5 /* utf16.h */,
9350B4E820B46E0800897BC5 /* brkiter.h */,
9350B4E920B46E0800897BC5 /* platform.h */,
9350B4EA20B46E0800897BC5 /* rep.h */,
9350B4EB20B46E0800897BC5 /* std_string.h */,
9350B4EC20B46E0800897BC5 /* utf8.h */,
9350B4ED20B46E0800897BC5 /* localpointer.h */,
9350B4EE20B46E0800897BC5 /* uclean.h */,
9350B4EF20B46E0800897BC5 /* uscript.h */,
9350B4F020B46E0800897BC5 /* numfmt.h */,
9350B4F120B46E0800897BC5 /* currunit.h */,
9350B4F220B46E0800897BC5 /* utypes.h */,
9350B4F320B46E0800897BC5 /* ulistformatter.h */,
9350B4F420B46E0800897BC5 /* measfmt.h */,
9350B4F520B46E0800897BC5 /* unifilt.h */,
);
path = unicode;
sourceTree = "<group>";
};
9350B4F620B46E0900897BC5 /* freetype2 */ = {
isa = PBXGroup;
children = (
9350B4F720B46E0900897BC5 /* freetype */,
9350B52920B46E0900897BC5 /* ft2build.h */,
);
path = freetype2;
sourceTree = "<group>";
};
9350B4F720B46E0900897BC5 /* freetype */ = {
isa = PBXGroup;
children = (
9350B4F820B46E0900897BC5 /* ftsnames.h */,
9350B4F920B46E0900897BC5 /* ftwinfnt.h */,
9350B4FA20B46E0900897BC5 /* ftsizes.h */,
9350B4FB20B46E0900897BC5 /* fttypes.h */,
9350B4FC20B46E0900897BC5 /* ftparams.h */,
9350B4FD20B46E0900897BC5 /* ftmm.h */,
9350B4FE20B46E0900897BC5 /* config */,
9350B50420B46E0900897BC5 /* ftmodapi.h */,
9350B50520B46E0900897BC5 /* ftbzip2.h */,
9350B50620B46E0900897BC5 /* fttrigon.h */,
9350B50720B46E0900897BC5 /* ftbbox.h */,
9350B50820B46E0900897BC5 /* ftgzip.h */,
9350B50920B46E0900897BC5 /* ftdriver.h */,
9350B50A20B46E0900897BC5 /* ftoutln.h */,
9350B50B20B46E0900897BC5 /* ftadvanc.h */,
9350B50C20B46E0900897BC5 /* ftsynth.h */,
9350B50D20B46E0900897BC5 /* fterrors.h */,
9350B50E20B46E0900897BC5 /* ftgasp.h */,
9350B50F20B46E0900897BC5 /* ftstroke.h */,
9350B51020B46E0900897BC5 /* ftcache.h */,
9350B51120B46E0900897BC5 /* ftotval.h */,
9350B51220B46E0900897BC5 /* freetype.h */,
9350B51320B46E0900897BC5 /* ftincrem.h */,
9350B51420B46E0900897BC5 /* ftfntfmt.h */,
9350B51520B46E0900897BC5 /* fterrdef.h */,
9350B51620B46E0900897BC5 /* ttnameid.h */,
9350B51720B46E0900897BC5 /* ftpfr.h */,
9350B51820B46E0900897BC5 /* ftgxval.h */,
9350B51920B46E0900897BC5 /* ftchapters.h */,
9350B51A20B46E0900897BC5 /* tttags.h */,
9350B51B20B46E0900897BC5 /* ftlzw.h */,
9350B51C20B46E0900897BC5 /* ftsystem.h */,
9350B51D20B46E0900897BC5 /* t1tables.h */,
9350B51E20B46E0900897BC5 /* ftimage.h */,
9350B51F20B46E0900897BC5 /* tttables.h */,
9350B52020B46E0900897BC5 /* ftcid.h */,
9350B52120B46E0900897BC5 /* ftglyph.h */,
9350B52220B46E0900897BC5 /* ftmoderr.h */,
9350B52320B46E0900897BC5 /* ftbitmap.h */,
9350B52420B46E0900897BC5 /* ftlist.h */,
9350B52520B46E0900897BC5 /* ftmac.h */,
9350B52620B46E0900897BC5 /* ftlcdfil.h */,
9350B52720B46E0900897BC5 /* ftbdf.h */,
9350B52820B46E0900897BC5 /* ftrender.h */,
);
path = freetype;
sourceTree = "<group>";
};
9350B4FE20B46E0900897BC5 /* config */ = {
isa = PBXGroup;
children = (
9350B4FF20B46E0900897BC5 /* ftstdlib.h */,
9350B50020B46E0900897BC5 /* ftheader.h */,
9350B50120B46E0900897BC5 /* ftconfig.h */,
9350B50220B46E0900897BC5 /* ftoption.h */,
9350B50320B46E0900897BC5 /* ftmodule.h */,
);
path = config;
sourceTree = "<group>";
};
C6352B871F477032006CCEE3 /* actions */ = {
isa = PBXGroup;
children = (
@ -1678,7 +2168,6 @@
D45A394B1CF3007A00659A24 /* SDL_thread.h */,
D45A394C1CF3007A00659A24 /* SDL_timer.h */,
D45A394D1CF3007A00659A24 /* SDL_touch.h */,
D45A394E1CF3007A00659A24 /* SDL_ttf.h */,
D45A394F1CF3007A00659A24 /* SDL_types.h */,
D45A39501CF3007A00659A24 /* SDL_version.h */,
D45A39511CF3007A00659A24 /* SDL_video.h */,
@ -1751,10 +2240,12 @@
D4EC48811C2634870024B507 /* include */ = {
isa = PBXGroup;
children = (
9350B4F620B46E0900897BC5 /* freetype2 */,
D45A38C61CF3007A00659A24 /* libpng16 */,
D45A38CA1CF3007A00659A24 /* openssl */,
D45A39161CF3007A00659A24 /* SDL2 */,
D45A39521CF3007A00659A24 /* speex */,
9350B44320B46E0800897BC5 /* unicode */,
D45A38C41CF3007A00659A24 /* jansson_config.h */,
D45A38C51CF3007A00659A24 /* jansson.h */,
C6E96E331E0408A80076A04F /* zip.h */,
@ -1770,7 +2261,8 @@
D45A38B41CF3006400659A24 /* libfreetype.dylib */,
D45A38B51CF3006400659A24 /* libjansson.dylib */,
D4A8B4B31DB41873007A2F29 /* libpng16.dylib */,
D45A38B71CF3006400659A24 /* libSDL2_ttf.dylib */,
93AF4A6320B462F7006489A5 /* libicudata.61.1.dylib */,
93AF4A6220B462F7006489A5 /* libicuuc.61.1.dylib */,
D45A38B81CF3006400659A24 /* libSDL2.dylib */,
D45A38B91CF3006400659A24 /* libspeexdsp.dylib */,
C6E96E351E0408B40076A04F /* libzip.dylib */,
@ -2924,7 +3416,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "version=\"12\"\nzipname=\"openrct2-libs-macos.zip\"\nliburl=\"https://github.com/OpenRCT2/Dependencies/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/libxc\" || ! -e \"${SRCROOT}/libversion\" || $(head -n 1 \"${SRCROOT}/libversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/libxc\" ]]; then rm -r \"${SRCROOT}/libxc\"; fi\nmkdir \"${SRCROOT}/libxc\"\n\ncurl -L -o \"${SRCROOT}/libxc/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/libxc\" \"${SRCROOT}/libxc/$zipname\"\nrm \"${SRCROOT}/libxc/$zipname\"\n\necho $version > \"${SRCROOT}/libversion\"\nfi";
shellScript = "version=\"17\"\nzipname=\"openrct2-libs-macos.zip\"\nliburl=\"https://github.com/OpenRCT2/Dependencies/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/libxc\" || ! -e \"${SRCROOT}/libversion\" || $(head -n 1 \"${SRCROOT}/libversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/libxc\" ]]; then rm -r \"${SRCROOT}/libxc\"; fi\nmkdir \"${SRCROOT}/libxc\"\n\ncurl -L -o \"${SRCROOT}/libxc/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/libxc\" \"${SRCROOT}/libxc/$zipname\"\nrm \"${SRCROOT}/libxc/$zipname\"\n\necho $version > \"${SRCROOT}/libversion\"\nfi";
};
D42C09D21C254F4E00309751 /* Build g2.dat */ = {
isa = PBXShellScriptBuildPhase;
@ -3638,6 +4130,7 @@
"$(SRCROOT)/libxc/include/SDL2",
"$(SRCROOT)/libxc/include/libpng16",
"$(SRCROOT)/libxc/include/openssl",
"$(SRCROOT)/libxc/include/freetype2",
"$(SRCROOT)/src/",
);
INFOPLIST_FILE = "$(DERIVED_FILE_DIR)/Info.plist";
@ -3675,6 +4168,7 @@
"$(SRCROOT)/libxc/include/SDL2",
"$(SRCROOT)/libxc/include/libpng16",
"$(SRCROOT)/libxc/include/openssl",
"$(SRCROOT)/libxc/include/freetype2",
"$(SRCROOT)/src/",
);
INFOPLIST_FILE = "$(DERIVED_FILE_DIR)/Info.plist";
@ -3714,6 +4208,7 @@
"$(SRCROOT)/libxc/include/SDL2",
"$(SRCROOT)/libxc/include/libpng16",
"$(SRCROOT)/libxc/include/openssl",
"$(SRCROOT)/libxc/include/freetype2",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
@ -3752,6 +4247,7 @@
"$(SRCROOT)/libxc/include/SDL2",
"$(SRCROOT)/libxc/include/libpng16",
"$(SRCROOT)/libxc/include/openssl",
"$(SRCROOT)/libxc/include/freetype2",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",

2
debian/control vendored
View File

@ -4,7 +4,7 @@ Section: misc
Priority: optional
Standards-Version: 3.9.2
Multi-Arch: same
Build-Depends: debhelper (>= 9), cmake, libsdl2-dev, gcc (>= 7), pkg-config, libjansson4 (>= 2.3), libjansson-dev (>= 2.3), libspeex-dev, libspeexdsp-dev, libcurl4-openssl-dev, libcrypto++-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev, libssl-dev, libzip-dev (>= 1.0.0)
Build-Depends: debhelper (>= 9), cmake, libsdl2-dev, gcc (>= 7), pkg-config, libjansson4 (>= 2.3), libjansson-dev (>= 2.3), libspeex-dev, libspeexdsp-dev, libcurl4-openssl-dev, libcrypto++-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev, libssl-dev, libzip-dev (>= 1.0.0), libicu-dev (>= 59.0)
Package: openrct2
Architecture: any

View File

@ -109,7 +109,7 @@ The program can also be built as a command line program using CMake. This type o
- curl (only if building with http support)
- jansson (>= 2.5)
- openssl (>= 1.0; only if building with multiplayer support)
- iconv (part of glibc on Linux)
- icu (>= 59.0)
- zlib
- gl (commonly provided by Mesa or GPU vendors; only for UI client, can be disabled)
- cmake

View File

@ -1,5 +1,5 @@
# CMAKE project for libopenrct2 (core OpenRCT2 component)
cmake_minimum_required(VERSION 3.1)
cmake_minimum_required(VERSION 3.7)
if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR)
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
endif ()
@ -110,6 +110,16 @@ if (NOT DISABLE_NETWORK)
endif ()
endif ()
if (NOT MINGW AND NOT MSVC)
# For unicode code page conversion.
find_package(ICU 59.0 REQUIRED COMPONENTS uc)
if (STATIC)
target_link_libraries(${PROJECT} ${ICU_STATIC_LIBRARIES})
else ()
target_link_libraries(${PROJECT} ${ICU_LIBRARIES})
endif ()
endif ()
if (NOT APPLE AND NOT MINGW AND NOT MSVC)
# This is ugly hack to work around https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899.
# Once C++17 is enabled (and thus old compilers are no longer supported, this needs to be gone.
@ -131,11 +141,6 @@ if (NOT DISABLE_TTF)
endif ()
endif ()
if (UNIX OR STATIC OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD")
find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
target_link_libraries(${PROJECT} ${ICONV_LIBRARIES})
endif()
if (HAVE_DISCORD_RPC)
target_link_libraries(libopenrct2 discord-rpc)
endif()

View File

@ -14,9 +14,20 @@
*****************************************************************************/
#pragma endregion
#ifdef __MINGW32__
// 0x0600 == vista
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#endif // __MINGW32__
#include <cwctype>
#include <stdexcept>
#include <vector>
#ifndef _WIN32
#include <unicode/ucnv.h>
#include <unicode/unistr.h>
#include <unicode/utypes.h>
#endif
#ifdef _WIN32
#ifndef NOMINMAX
@ -26,12 +37,15 @@
#include <windows.h>
#endif
#include "../common.h"
#include "../localisation/ConversionTables.h"
#include "../localisation/Language.h"
#include "../util/Util.h"
#include "Math.hpp"
#include "Memory.hpp"
#include "String.hpp"
#include "StringBuilder.hpp"
namespace String
{
@ -60,28 +74,65 @@ namespace String
return returnValue;
}
std::string ToUtf8(const std::wstring &s)
std::string ToUtf8(const std::wstring_view& src)
{
std::string result;
utf8 * cstr = widechar_to_utf8(s.c_str());
if (cstr != nullptr)
{
result = std::string(cstr);
}
free(cstr);
#ifdef _WIN32
int srcLen = (int)src.size();
int sizeReq = WideCharToMultiByte(CODE_PAGE::CP_UTF8, 0, src.data(), srcLen, nullptr, 0, nullptr, nullptr);
auto result = std::string(sizeReq, 0);
WideCharToMultiByte(CODE_PAGE::CP_UTF8, 0, src.data(), srcLen, result.data(), sizeReq, nullptr, nullptr);
return result;
#else
// Which constructor to use depends on the size of wchar_t...
// UTF-32 is the default on most POSIX systems; Windows uses UTF-16.
// Unfortunately, we'll have to help the compiler here.
#if U_SIZEOF_WCHAR_T==4
icu::UnicodeString str = icu::UnicodeString::fromUTF32((const UChar32*) src.data(), src.length());
#elif U_SIZEOF_WCHAR_T==2
std::wstring wstr = std::wstring(src);
icu::UnicodeString str = icu::UnicodeString((const wchar_t*) wstr.c_str());
#else
#error Unsupported U_SIZEOF_WCHAR_T size
#endif
std::string result;
str.toUTF8String(result);
return result;
#endif
}
std::wstring ToUtf16(const std::string &s)
std::wstring ToUtf16(const std::string_view& src)
{
std::wstring result;
wchar_t * wcstr = utf8_to_widechar(s.c_str());
if (wcstr != nullptr)
{
result = std::wstring(wcstr);
}
free(wcstr);
#ifdef _WIN32
int srcLen = (int)src.size();
int sizeReq = MultiByteToWideChar(CODE_PAGE::CP_UTF8, 0, src.data(), srcLen, nullptr, 0);
auto result = std::wstring(sizeReq, 0);
MultiByteToWideChar(CODE_PAGE::CP_UTF8, 0, src.data(), srcLen, result.data(), sizeReq);
return result;
#else
icu::UnicodeString str = icu::UnicodeString::fromUTF8(std::string(src));
// Which constructor to use depends on the size of wchar_t...
// UTF-32 is the default on most POSIX systems; Windows uses UTF-16.
// Unfortunately, we'll have to help the compiler here.
#if U_SIZEOF_WCHAR_T==4
size_t length = (size_t) str.length();
std::wstring result(length, '\0');
UErrorCode status = U_ZERO_ERROR;
str.toUTF32((UChar32*) &result[0], str.length(), status);
#elif U_SIZEOF_WCHAR_T==2
const char16_t* buffer = str.getBuffer();
std::wstring result = (wchar_t*) buffer;
#else
#error Unsupported U_SIZEOF_WCHAR_T size
#endif
return result;
#endif
}
bool IsNullOrEmpty(const utf8 * str)
@ -544,6 +595,74 @@ namespace String
return std::string(startSubstr, stringLength);
}
#ifndef _WIN32
static const char* GetIcuCodePage(sint32 codePage)
{
switch (codePage)
{
case CODE_PAGE::CP_932:
return "windows-932";
case CODE_PAGE::CP_936:
return "GB2312";
case CODE_PAGE::CP_949:
return "windows-949";
case CODE_PAGE::CP_950:
return "big5";
case CODE_PAGE::CP_1252:
return "windows-1252";
case CODE_PAGE::CP_UTF8:
return "utf-8";
default:
throw std::runtime_error("Unsupported code page: " + std::to_string(codePage));
}
}
static std::string CodePageFromUnicode(icu::UnicodeString src, sint32 dstCodePage)
{
UConverter* conv;
UErrorCode status = U_ZERO_ERROR;
const char* codepage = GetIcuCodePage(dstCodePage);
conv = ucnv_open(codepage, &status);
if (U_FAILURE(status))
{
log_error("ICU error: %s", u_errorName(status));
return nullptr;
}
// Allocate buffer to convert to.
int8_t char_size = ucnv_getMaxCharSize(conv);
std::string buffer(char_size * src.length(), '\0');
char* buffer_limit = &buffer[0] + (char_size * src.length());
// Ready the source string as well...
const char16_t* source = src.getTerminatedBuffer();
const char16_t* source_limit = source + src.length();
// Convert the lot.
char* buffer_target = &buffer[0];
ucnv_fromUnicode(conv, &buffer_target, buffer_limit, (const UChar**) &source, source_limit, nullptr, true, &status);
if (U_FAILURE(status))
{
log_error("ICU error: %s", u_errorName(status));
return nullptr;
}
ucnv_close(conv);
return buffer;
}
#endif
std::string Convert(const std::string_view& src, sint32 srcCodePage, sint32 dstCodePage)
{
#ifdef _WIN32
@ -567,8 +686,73 @@ namespace String
return dst;
#else
STUB();
return std::string(src);
const char* codepage = GetIcuCodePage(srcCodePage);
icu::UnicodeString convertString(src.data(), codepage);
std::string result;
if (dstCodePage == CODE_PAGE::CP_UTF8)
{
convertString.toUTF8String(result);
}
else
{
result = CodePageFromUnicode(convertString, dstCodePage);
}
return result;
#endif
}
std::string ToUpper(const std::string_view& src)
{
#ifdef _WIN32
auto srcW = ToUtf16(src);
// Measure how long the destination needs to be
auto requiredSize = LCMapStringEx(
LOCALE_NAME_INVARIANT,
LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING,
srcW.c_str(),
(int)srcW.length(),
nullptr,
0,
nullptr,
nullptr,
0);
auto dstW = std::wstring();
dstW.resize(requiredSize);
// Transform the string
auto result = LCMapStringEx(
LOCALE_NAME_INVARIANT,
LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING,
srcW.c_str(),
(int)srcW.length(),
dstW.data(),
(int)dstW.length(),
nullptr,
nullptr,
0);
if (result == 0)
{
// Check the error
auto error = GetLastError();
log_warning("LCMapStringEx failed with %d", error);
return std::string(src);
}
else
{
return String::ToUtf8(dstW);
}
#else
icu::UnicodeString str = icu::UnicodeString::fromUTF8(std::string(src));
str.toUpper();
std::string res;
str.toUTF8String(res);
return res;
#endif
}
} // namespace String

View File

@ -42,8 +42,8 @@ namespace String
std::string ToStd(const utf8 * str);
std::string StdFormat_VA(const utf8 * format, va_list args);
std::string StdFormat(const utf8 * format, ...);
std::string ToUtf8(const std::wstring &s);
std::wstring ToUtf16(const std::string &s);
std::string ToUtf8(const std::wstring_view& src);
std::wstring ToUtf16(const std::string_view& src);
bool IsNullOrEmpty(const utf8 * str);
sint32 Compare(const std::string &a, const std::string &b, bool ignoreCase = false);
@ -111,4 +111,9 @@ namespace String
* Converts a multi-byte string from one code page to another.
*/
std::string Convert(const std::string_view& src, sint32 srcCodePage, sint32 dstCodePage);
} // namespace String
/**
* Returns an uppercased version of a UTF-8 string.
*/
std::string ToUpper(const std::string_view& src);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
#pragma region Copyright (c) 2014-2018 OpenRCT2 Developers
/*****************************************************************************
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 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 3 of the License, or
* (at your option) any later version.
*
* A full copy of the GNU General Public License can be found in licence.txt
*****************************************************************************/
#pragma endregion
#pragma once
#include "../common.h"
struct encoding_convert_entry
{
uint16 code;
uint32 unicode;
};
extern const encoding_convert_entry RCT2ToUnicodeTable[256];
static sint32 encoding_search_compare(const void *pKey, const void *pEntry);
static wchar_t encoding_convert_x_to_unicode(wchar_t code, const encoding_convert_entry *table, size_t count);
wchar_t encoding_convert_rct2_to_unicode(wchar_t rct2str);
uint32 encoding_convert_unicode_to_rct2(uint32 unicode);

View File

@ -151,39 +151,16 @@ static std::string DecodeConvertWithTable(const std::string_view& src, TConvertF
std::string rct2_to_utf8(const std::string_view& src, RCT2LanguageId languageId)
{
auto codePage = GetCodePageForRCT2Language(languageId);
std::string result;
switch (codePage)
if (codePage == CODE_PAGE::CP_1252)
{
case CODE_PAGE::CP_1252:
// The code page used by RCT2 was not quite 1252 as some codes were used for Polish characters.
result = DecodeConvertWithTable(src, encoding_convert_rct2_to_unicode);
break;
#ifdef _WIN32
default:
auto decoded = DecodeToMultiByte(src);
result = String::Convert(decoded, codePage, CODE_PAGE::CP_UTF8);
#else
// TODO Change this to use a library such as libicu
case CODE_PAGE::CP_932:
result = DecodeConvertWithTable(src, encoding_convert_cp932_to_unicode);
break;
case CODE_PAGE::CP_936:
result = DecodeConvertWithTable(src, encoding_convert_gb2312_to_unicode);
break;
case CODE_PAGE::CP_949:
result = DecodeConvertWithTable(src, encoding_convert_cp949_to_unicode);
break;
case CODE_PAGE::CP_950:
result = DecodeConvertWithTable(src, encoding_convert_big5_to_unicode);
break;
default:
throw std::runtime_error("Unsupported code page: " + std::to_string(codePage));
break;
#endif
// The code page used by RCT2 was not quite 1252 as some codes were used for Polish characters.
return DecodeConvertWithTable(src, encoding_convert_rct2_to_unicode);
}
else
{
auto decoded = DecodeToMultiByte(src);
return String::Convert(decoded, codePage, CODE_PAGE::CP_UTF8);
}
return result;
}
std::string utf8_to_rct2(const std::string_view& src)

View File

@ -18,7 +18,6 @@
#include "../Context.h"
#include "../core/Path.hpp"
#include "../core/String.hpp"
#include "../core/StringBuilder.hpp"
#include "../interface/Fonts.h"
#include "../interface/FontFamilies.h"
#include "../object/ObjectManager.h"

View File

@ -31,6 +31,7 @@
#include "../common.h"
#include "../config/Config.h"
#include "../core/Math.hpp"
#include "../core/String.hpp"
#include "../core/Util.hpp"
#include "Date.h"
#include "../Game.h"
@ -1215,12 +1216,16 @@ void format_string_to_upper(utf8 *dest, size_t size, rct_string_id format, void
format_string(dest, size, format, args);
// Convert to upper case
utf8 *ch = dest;
while (*ch != '\0') {
*ch = toupper(*ch);
ch++;
std::string upperString = String::ToUpper(dest);
if (upperString.size() + 1 >= size) {
upperString.resize(size - 1);
dest[size - 1] = '\0';
log_warning("Truncating formatted string \"%s\" to %d bytes.", dest, size);
}
upperString.copy(dest, upperString.size());
dest[upperString.size()] = '\0';
}
money32 string_to_money(char * string_to_monetise)
@ -1325,106 +1330,3 @@ void money_to_string(money32 amount, char * buffer_to_put_value_to, size_t buffe
snprintf(buffer_to_put_value_to, buffer_len, "0");
}
}
utf8 *win1252_to_utf8_alloc(const char *src, size_t srcMaxSize)
{
size_t stringLength = strnlen(src, srcMaxSize);
size_t reservedSpace = (stringLength * 4) + 1;
utf8 * result = (utf8 *)malloc(reservedSpace);
sint32 actualSpace = win1252_to_utf8(result, src, stringLength, reservedSpace);
return (utf8*)realloc(result, actualSpace);
}
sint32 win1252_to_utf8(utf8string dst, const char *src, size_t srcLength, size_t maxBufferLength)
{
#ifdef _WIN32
utf16 stackBuffer[256];
utf16 *heapBuffer = nullptr;
utf16 *intermediateBuffer = stackBuffer;
size_t bufferCount = Util::CountOf(stackBuffer);
if (maxBufferLength > bufferCount) {
if (srcLength > bufferCount) {
bufferCount = srcLength + 4;
heapBuffer = (utf16 *)malloc(bufferCount * sizeof(utf16));
assert(heapBuffer != nullptr);
intermediateBuffer = heapBuffer;
}
}
MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, (sint32)bufferCount);
sint32 result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, (sint32)maxBufferLength, NULL, NULL);
free(heapBuffer);
#elif defined(__ANDROID__)
JNIEnv *env = (_JNIEnv *)SDL_AndroidGetJNIEnv();
jclass localisation = env->FindClass("website/openrct2/Localisation");
jmethodID win1252ToUtf8 = env->GetStaticMethodID(localisation, "win1252ToUtf8", "([B)Ljava/lang/String;");
jbyteArray bytes = env->NewByteArray(srcLength);
env->SetByteArrayRegion(bytes, 0, srcLength, (jbyte *) src);
jstring jstring1 = (jstring)env->CallStaticObjectMethod(localisation, win1252ToUtf8, bytes);
const char* utf = env->GetStringUTFChars(jstring1, NULL);
strcpy(dst, utf);
env->ReleaseStringUTFChars(jstring1, utf);
env->DeleteLocalRef(localisation);
env->DeleteLocalRef(bytes);
env->DeleteLocalRef(jstring1);
int result = strlen(dst) + 1;
#else
//log_warning("converting %s of size %d", src, srcLength);
char *buffer_conv = strndup(src, srcLength);
char *buffer_orig = buffer_conv;
const char *to_charset = "UTF-8";
const char *from_charset = "CP1252";
iconv_t cd = iconv_open(to_charset, from_charset);
if ((iconv_t)-1 == cd)
{
sint32 error = errno;
switch (error)
{
case EINVAL:
log_error("Unsupported conversion from %s to %s, errno = %d", from_charset, to_charset, error);
break;
default:
log_error("Unknown error while initialising iconv, errno = %d", error);
}
return 0;
}
size_t obl = maxBufferLength;
char *outBuf = dst;
size_t conversion_result = iconv(cd, &buffer_conv, &srcLength, &outBuf, &obl);
if (conversion_result == (size_t)-1)
{
sint32 error = errno;
switch (error)
{
case EILSEQ:
log_error("Encountered invalid sequence");
break;
case EINVAL:
log_error("Encountered incomplete sequence");
break;
case E2BIG:
log_error("Ran out of space");
break;
default:
log_error("Unknown error encountered, errno = %d", error);
}
}
sint32 close_result = iconv_close(cd);
if (close_result == -1)
{
log_error("Failed to close iconv, errno = %d", errno);
}
size_t byte_diff = maxBufferLength - obl + 1;
dst[byte_diff - 1] = '\0';
//log_warning("converted %s of size %d, %d", dst, byte_diff, strlen(dst));
sint32 result = byte_diff;
free(buffer_orig);
#endif // _WIN32
return result;
}

View File

@ -50,21 +50,9 @@ rct_string_id user_string_allocate(sint32 base, const utf8 *text);
void user_string_free(rct_string_id id);
bool is_user_string_id(rct_string_id stringId);
utf8 *win1252_to_utf8_alloc(const char *src, size_t srcMaxSize);
sint32 win1252_to_utf8(utf8string dst, const char *src, size_t srcLength, size_t maxBufferLength);
wchar_t encoding_convert_rct2_to_unicode(wchar_t rct2str);
uint32 encoding_convert_unicode_to_rct2(uint32 unicode);
#ifndef _WIN32
wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312);
wchar_t encoding_convert_big5_to_unicode(wchar_t big5);
wchar_t encoding_convert_cp932_to_unicode(wchar_t cp932);
wchar_t encoding_convert_cp949_to_unicode(wchar_t cp949);
#endif
#define MAX_USER_STRINGS 1024
#define USER_STRING_MAX_LENGTH 32

View File

@ -33,6 +33,7 @@
#include "ScenarioSources.h"
#include "../config/Config.h"
#include "../localisation/Language.h"
#include "../localisation/Localisation.h"
#include "../localisation/LocalisationService.h"
#include "../platform/platform.h"
@ -128,7 +129,7 @@ private:
static constexpr uint32 MAGIC_NUMBER = 0x58444953; // SIDX
static constexpr uint16 VERSION = 3;
static constexpr auto PATTERN = "*.sc4;*.sc6";
public:
explicit ScenarioFileIndex(const IPlatformEnvironment& env) :
FileIndex("scenario index",
@ -238,7 +239,7 @@ private:
// RCT2 scenario
auto fs = FileStream(path, FILE_MODE_OPEN);
auto chunkReader = SawyerChunkReader(&fs);
rct_s6_header header = chunkReader.ReadChunkAs<rct_s6_header>();
if (header.type == S6_TYPE_SCENARIO)
{
@ -647,7 +648,8 @@ private:
if (scBasic.CompanyValue > highscore->company_value)
{
SafeFree(highscore->name);
highscore->name = win1252_to_utf8_alloc(scBasic.CompletedBy, Util::CountOf(scBasic.CompletedBy));
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK);
highscore->name = String::Duplicate(name.c_str());
highscore->company_value = scBasic.CompanyValue;
highscore->timestamp = DATETIME64_MIN;
break;
@ -658,7 +660,8 @@ private:
{
scenario_highscore_entry * highscore = InsertHighscore();
highscore->fileName = String::Duplicate(scBasic.Path);
highscore->name = win1252_to_utf8_alloc(scBasic.CompletedBy, Util::CountOf(scBasic.CompletedBy));
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK);
highscore->name = String::Duplicate(name.c_str());
highscore->company_value = scBasic.CompanyValue;
highscore->timestamp = DATETIME64_MIN;
}

View File

@ -86,6 +86,12 @@ add_executable(testpaint EXCLUDE_FROM_ALL ${ORCT2_RIDE_SOURCES} ${ORCT2_RIDE_DEP
target_include_directories(testpaint PRIVATE "${ROOT_DIR}/src/")
target_link_libraries(testpaint z)
if (NOT MINGW AND NOT MSVC)
# For unicode code page conversion
find_package(ICU 59.0 REQUIRED COMPONENTS uc)
target_link_libraries(testpaint ${ICU_LIBRARIES})
endif ()
set_target_properties(testpaint PROPERTIES COMPILE_FLAGS "-DNO_VEHICLES -D__TESTPAINT__ -Wno-unused")
set_target_properties(testpaint PROPERTIES LINK_FLAGS ${RCT2_SEGMENT_LINKER_FLAGS})
add_dependencies(testpaint segfiles)

View File

@ -91,6 +91,12 @@ add_library(test-common STATIC ${COMMON_TEST_SOURCES})
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_CURRENT_LIST_DIR}/testdata" "${CMAKE_CURRENT_BINARY_DIR}/testdata")
install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_DATADIR}/openrct2\" \"${CMAKE_CURRENT_BINARY_DIR}/data\")")
if (NOT MINGW AND NOT MSVC)
# For unicode code page conversion (required for ini and string tests)
find_package(ICU 59.0 REQUIRED COMPONENTS uc)
target_link_libraries(test-common ${ICU_LIBRARIES})
endif ()
# Start of our tests
# sawyercoding test

View File

@ -78,9 +78,6 @@ TEST_F(StringTest, Split_ByEmpty)
// Tests for String::Convert
///////////////////////////////////////////////////////////////////////////////
// TODO Remove when String::Convert is implemented for non-Windows platforms
#ifdef _WIN32
TEST_F(StringTest, Convert_950_to_UTF8)
{
auto input = StringFromHex("a7d6b374aabab4c4a6e2aab0af57");
@ -113,4 +110,37 @@ TEST_F(StringTest, Convert_Empty)
ASSERT_EQ(expected, actual);
}
#endif
///////////////////////////////////////////////////////////////////////////////
// Tests for String::ToUpper
///////////////////////////////////////////////////////////////////////////////
TEST_F(StringTest, ToUpper_Basic)
{
auto actual = String::ToUpper("test TEST tEsT 1234");
ASSERT_STREQ(actual.c_str(), "TEST TEST TEST 1234");
}
TEST_F(StringTest, ToUpper_Dutch)
{
auto actual = String::ToUpper(u8"fijntjes puffend fietsen");
ASSERT_STREQ(actual.c_str(), u8"FIJNTJES PUFFEND FIETSEN");
}
TEST_F(StringTest, ToUpper_French)
{
auto actual = String::ToUpper(u8"jusqu'à 2500 carrés de côté");
ASSERT_STREQ(actual.c_str(), u8"JUSQU'À 2500 CARRÉS DE CÔTÉ");
}
TEST_F(StringTest, ToUpper_Greek)
{
auto actual = String::ToUpper(u8"μέχρι 2500 τετράγωνα στην άκρη");
ASSERT_STREQ(actual.c_str(), u8"ΜΈΧΡΙ 2500 ΤΕΤΡΆΓΩΝΑ ΣΤΗΝ ΆΚΡΗ");
}
TEST_F(StringTest, ToUpper_Russian)
{
auto actual = String::ToUpper(u8"до 2500 квадратов в сторону");
ASSERT_STREQ(actual.c_str(), u8"ДО 2500 КВАДРАТОВ В СТОРОНУ");
}
TEST_F(StringTest, ToUpper_Japanese)
{
auto actual = String::ToUpper(u8"日本語で大文字がなし");
ASSERT_STREQ(actual.c_str(), u8"日本語で大文字がなし");
}