diff --git a/ChangeLog b/ChangeLog
index c6d28de..f6fa603 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2012-01-24  Mark Rowe  <mrowe@apple.com>
+
+        Death to JavaScriptGlue.
+
+        Rubber-stamped by Geoffrey Garen.
+
+        * Source/JavaScriptGlue: Removed.
+        * Source/Makefile: Stop building JavaScriptGlue.
+
 2012-01-24  Simon Hausmann  <simon.hausmann@nokia.com>
 
         Some qmake build files must include Qt5's "quick" module.
diff --git a/Source/JavaScriptGlue/ChangeLog b/Source/JavaScriptGlue/ChangeLog
deleted file mode 100644
index d943fd0..0000000
--- a/Source/JavaScriptGlue/ChangeLog
+++ /dev/null
@@ -1,4569 +0,0 @@
-2012-01-23  Geoffrey Garen  <ggaren@apple.com>
-
-        JSValue::toString() should return a JSString* instead of a UString
-        https://bugs.webkit.org/show_bug.cgi?id=76861
-
-        Reviewed by Gavin Barraclough.
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-
-2012-01-19  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Implement a new allocator for backing stores
-        https://bugs.webkit.org/show_bug.cgi?id=75181
-
-        Reviewed by Filip Pizlo.
-
-        Added forwarding header for new CheckedBoolean used in the bump allocator.
-
-        * ForwardingHeaders/wtf/CheckedBoolean.h: Added.
-
-2012-01-06  Sam Weinig  <sam@webkit.org>
-
-        Remove unused OwnFastMallocPtr class.
-        https://bugs.webkit.org/show_bug.cgi?id=75722
-
-        Reviewed by Geoffrey Garen.
-
-        * ForwardingHeaders/wtf/OwnFastMallocPtr.h: Removed.
-
-2012-01-05  Dan Bernstein  <mitz@apple.com>
-
-        <rdar://problem/10633760> Update copyright strings
-
-        Reviewed by Mark Rowe.
-
-        * Info.plist:
-
-2012-01-05  Benjamin Poulain  <benjamin@webkit.org>
-
-        Improve charactersAreAllASCII() to compare multiple characters at a time
-        https://bugs.webkit.org/show_bug.cgi?id=74063
-
-        Reviewed by Darin Adler.
-
-        Add forwarding header for ASCIIFastPath.h.
-
-        * ForwardingHeaders/wtf/text/ASCIIFastPath.h: Added.
-
-2011-12-16  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize destructors
-        https://bugs.webkit.org/show_bug.cgi?id=74331
-
-        Reviewed by Geoffrey Garen.
-
-        * UserObjectImp.cpp: Add static destroy function.
-        (UserObjectImp::destroy):
-        * UserObjectImp.h:
-
-2011-12-14  Hajime Morrita  <morrita@chromium.org>
-
-        JS_INLINE and WTF_INLINE should be visible from WebCore
-        https://bugs.webkit.org/show_bug.cgi?id=73191
-
-        - Extracted export related macro definitions to ExportMacros.h and JSExportMacros.h
-        - Added forwarding headers which used in config.h
-
-        Reviewed by Kevin Ollivier.
-
-        * ForwardingHeaders/runtime/JSExportMacros.h: Added.
-        * ForwardingHeaders/wtf/ExportMacros.h: Added.
-        * config.h:
-
-2011-12-02  David Levin  <levin@chromium.org>
-
-        Rename WTF class from TemporarilyChange to TemporaryChange.
-        https://bugs.webkit.org/show_bug.cgi?id=73479
-
-        Reviewed by Eric Seidel.
-
-        * ForwardingHeaders/wtf/TemporarilyChange.h: Removed.
-        * ForwardingHeaders/wtf/TemporaryChange.h: Added.
-
-2011-12-02  Hajime Morrita  <morrita@chromium.org>
-
-        Unreviewed, rolling out r101751 and r101775.
-        http://trac.webkit.org/changeset/101751
-        http://trac.webkit.org/changeset/101775
-        https://bugs.webkit.org/show_bug.cgi?id=73191
-
-        breaks Windows build
-
-        * ForwardingHeaders/runtime/JSExportMacros.h: Removed.
-        * ForwardingHeaders/wtf/ExportMacros.h: Removed.
-        * config.h:
-
-2011-12-01  Hajime Morrita  <morrita@chromium.org>
-
-        JS_INLINE and WTF_INLINE should be visible from WebCore
-        https://bugs.webkit.org/show_bug.cgi?id=73191
-
-        - Extracted export related macro definitions to ExportMacros.h and JSExportMacros.h
-        - Added forwarding headers which used in config.h
-
-        Reviewed by Kevin Ollivier.
-
-        * ForwardingHeaders/runtime/JSExportMacros.h: Added.
-        * ForwardingHeaders/wtf/ExportMacros.h: Added.
-        * config.h:
-
-2011-11-29  David Levin  <levin@chromium.org>
-
-        Add a way to revert a variable to its previous value after leaving a scope.
-        https://bugs.webkit.org/show_bug.cgi?id=73371
-
-        Reviewed by Adam Barth.
-
-        * ForwardingHeaders/wtf/TemporarilyChange.h: Added.
-
-2011-11-11  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add jsCast to replace static_cast
-        https://bugs.webkit.org/show_bug.cgi?id=72071
-
-        Reviewed by Geoffrey Garen.
-
-        Added new jsCast and changed all of the static_cast sites in functions that 
-        are in the MethodTable to use jsCast instead.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getCallData):
-        (UserObjectImp::getOwnPropertyNames):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::visitChildren):
-
-2011-11-10  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add jsCast to replace static_cast
-        https://bugs.webkit.org/show_bug.cgi?id=72071
-
-        Reviewed by Geoffrey Garen.
-
-        Added new jsCast and changed all of the static_cast sites in functions that 
-        are in the MethodTable to use jsCast instead.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getCallData):
-        (UserObjectImp::getOwnPropertyNames):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::visitChildren):
-
-2011-11-03  Filip Pizlo  <fpizlo@apple.com>
-
-        JSC should be able to sample itself in a more flexible way than just sampling flags
-        https://bugs.webkit.org/show_bug.cgi?id=71522
-
-        Reviewed by Gavin Barraclough.
-        
-        * ForwardingHeaders/wtf/Spectrum.h: Added.
-
-2011-11-03  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize JSObject::getPropertyNames
-        https://bugs.webkit.org/show_bug.cgi?id=71306
-
-        Reviewed by Darin Adler.
-
-        Added getPropertyNames to the MethodTable, changed all the virtual 
-        implementations of getPropertyNames to static ones, and replaced 
-        all call sites with corresponding lookups in the MethodTable.
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-
-2011-11-03  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize JSObject::className
-        https://bugs.webkit.org/show_bug.cgi?id=71428
-
-        Reviewed by Sam Weinig.
-
-        Added className to the MethodTable, changed all the virtual 
-        implementations of className to static ones, and replaced 
-        all call sites with corresponding lookups in the MethodTable.
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-
-2011-11-02  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize JSObject::getOwnPropertyNames
-        https://bugs.webkit.org/show_bug.cgi?id=71307
-
-        Reviewed by Darin Adler.
-
-        Added getOwnPropertyNames to the MethodTable, changed all the virtual 
-        implementations of getOwnPropertyNames to static ones, and replaced 
-        all call sites with corresponding lookups in the MethodTable.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertyNames):
-        * UserObjectImp.h:
-
-2011-10-26  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Remove getOwnPropertySlotVirtual
-        https://bugs.webkit.org/show_bug.cgi?id=70741
-
-        Reviewed by Geoffrey Garen.
-
-        Removed all declarations and definitions of getOwnPropertySlotVirtual.
-        Also replaced all call sites to getOwnPropertyVirtualVirtual with a 
-        corresponding lookup in the MethodTable.
-
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-25  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Remove putVirtual
-        https://bugs.webkit.org/show_bug.cgi?id=70740
-
-        Reviewed by Geoffrey Garen.
-
-        Removed all declarations and definitions of putVirtual.
-        Also replaced all call sites to putVirtual with a 
-        corresponding lookup in the MethodTable.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectSetProperty):
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-19  Geoffrey Garen  <ggaren@apple.com>
-
-        Removed StringImplBase, fusing it into StringImpl
-        https://bugs.webkit.org/show_bug.cgi?id=70443
-
-        Reviewed by Gavin Barraclough.
-
-        * ForwardingHeaders/wtf/text/StringImplBase.h: Removed.
-
-2011-10-14  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Rename getOwnPropertySlot to getOwnPropertySlotVirtual
-        https://bugs.webkit.org/show_bug.cgi?id=69810
-
-        Reviewed by Geoffrey Garen.
-
-        Renamed the virtual version of getOwnPropertySlot to getOwnPropertySlotVirtual
-        in preparation for when we add the static getOwnPropertySlot to the MethodTable 
-        in ClassInfo.
-
-        Also added a few static getOwnPropertySlot functions where they had been overlooked 
-        before (especially in CodeGeneratorJS.pm).
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertySlotVirtual):
-        * UserObjectImp.h:
-
-2011-10-14  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Rename virtual put to putVirtual
-        https://bugs.webkit.org/show_bug.cgi?id=69851
-
-        Reviewed by Darin Adler.
-
-        Renamed virtual versions of put to putVirtual in prepration for 
-        adding the static put to the MethodTable in ClassInfo since the 
-        compiler gets mad if the virtual and static versions have the same 
-        name.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectSetProperty):
-        * UserObjectImp.cpp:
-        (UserObjectImp::putVirtual):
-        * UserObjectImp.h:
-
-2011-10-14  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Rename virtual put to putVirtual
-        https://bugs.webkit.org/show_bug.cgi?id=69851
-
-        Reviewed by Darin Adler.
-
-        Renamed virtual versions of put to putVirtual in prepration for 
-        adding the static put to the MethodTable in ClassInfo since the 
-        compiler gets mad if the virtual and static versions have the same 
-        name.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectSetProperty):
-        * UserObjectImp.cpp:
-        (UserObjectImp::putVirtual):
-        * UserObjectImp.h:
-
-2011-10-13  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualized JSCell::toNumber
-        https://bugs.webkit.org/show_bug.cgi?id=69858
-
-        Reviewed by Sam Weinig.
-
-        Removed UserObjectImp::toNumber because it's no longer necessary since 
-        JSObject::toNumber can cover this case.
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-12  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize JSCell::toString
-        https://bugs.webkit.org/show_bug.cgi?id=69677
-
-        Reviewed by Sam Weinig.
-
-        Removed UserObjectImp::toString because it's no longer necessary since 
-        clients can provide their own toString callback which will in turn be 
-        called by JSObject::toString.
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-10  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Remove getCallDataVirtual methods
-        https://bugs.webkit.org/show_bug.cgi?id=69186
-
-        Reviewed by Geoffrey Garen.
-
-        Removed all getCallDataVirtual methods and replaced their call sites 
-        with an explicit lookup in the MethodTable.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-08  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add static version of JSCell::getOwnPropertySlot
-        https://bugs.webkit.org/show_bug.cgi?id=69593
-
-        Reviewed by Geoffrey Garen.
-
-        Added static version of getOwnPropertySlot to every class that overrides
-        JSCell::getOwnPropertySlot.  The virtual versions now call the static versions.
-        This is the first step in de-virtualizing JSCell::getOwnPropertySlot.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertySlot):
-        * UserObjectImp.h:
-
-2011-10-08  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r96996.
-        http://trac.webkit.org/changeset/96996
-        https://bugs.webkit.org/show_bug.cgi?id=69697
-
-        It broke all tests on the Qt bot (Requested by Ossy_night on
-        #webkit).
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getCallDataVirtual):
-        * UserObjectImp.h:
-
-2011-10-07  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Remove getCallDataVirtual methods
-        https://bugs.webkit.org/show_bug.cgi?id=69186
-
-        Reviewed by Geoffrey Garen.
-
-        Removed all getCallDataVirtual methods and replaced their call sites 
-        with an explicit lookup in the MethodTable.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-10-07  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add static version of JSCell::put
-        https://bugs.webkit.org/show_bug.cgi?id=69382
-
-        Reviewed by Geoffrey Garen.
-
-        Added static version of both versions of put to all classes that 
-        override them and changed the virtual versions to call the static 
-        versions.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::put):
-        * UserObjectImp.h:
-
-2011-10-06  Anders Carlsson  <andersca@apple.com>
-
-        When building with clang, enable -Wglobal-constructors and -Wexit-time-destructors
-        https://bugs.webkit.org/show_bug.cgi?id=69586
-
-        Reviewed by Darin Adler.
-
-        * Configurations/Base.xcconfig:
-        Add -Wglobal-constructors and -Wexit-time-destructors when building with clang.
-        
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        When building with clang, we don't need to run the check-for-global-initializers and
-        check-for-exit-time-destructors anymore.
-
-2011-10-05  Gavin Barraclough  <barraclough@apple.com>
-
-        Add explicit JSGlobalThis type.
-        https://bugs.webkit.org/show_bug.cgi?id=69478
-
-        Reviewed by Darin Adler.
-
-        JSC supports a split global object, as used by WebCore for the Window. As a stage
-        of making this visible to JSC, make it so that if the global this value is not the
-        global object itself, it must be a subclass of JSGlobalThis.
-
-        * JSRun.h:
-        (JSGlueGlobalObject::create):
-            - Don't pass the thisValue to JSGlobalObject::finishCreation.
-
-2011-10-01  Geoffrey Garen  <ggaren@apple.com>
-
-        Removed redundant helper functions for allocating Strong handles
-        https://bugs.webkit.org/show_bug.cgi?id=69218
-
-        Reviewed by Sam Weinig.
-
-        * JSRun.cpp:
-        * JSValueWrapper.cpp:
-
-2011-09-29  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        De-virtualize JSCell::visitChildrenVirtual and remove all other visitChildrenVirtual methods
-        https://bugs.webkit.org/show_bug.cgi?id=68839
-
-        Reviewed by Geoffrey Garen.
-
-        Removed the remaining visitChildrenVirtual methods.  This patch completes the process of 
-        de-virtualizing visitChildren.
-
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2011-09-27  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add static version of JSCell::getCallData
-        https://bugs.webkit.org/show_bug.cgi?id=68741
-
-        Reviewed by Darin Adler.
-
-        In this patch we just extract the bodies of the virtual getCallData methods
-        throughout the JSCell inheritance hierarchy out into static methods, which are 
-        now called from the virtual methods.  This is an intermediate step in trying to 
-        move the virtual-ness of getCallData into our own method table stored in 
-        ClassInfo.  We need to convert the methods to static methods because static methods 
-        can be represented as function pointers rather than pointers to member functions, and
-        function pointers are smaller and faster to call than pointers to member functions.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getCallDataVirtual):
-        (UserObjectImp::getCallData):
-        * UserObjectImp.h:
-
-2011-09-25  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add custom vtable struct to ClassInfo struct
-        https://bugs.webkit.org/show_bug.cgi?id=68567
-
-        Reviewed by Oliver Hunt.
-
-        Added CREATE_METHOD_TABLE macro to generate the custom vtable for the 
-        specified class in its ClassInfo.  Also added to it the first function to use 
-        this macro, visitChildren.  This is part of the process of getting rid of all 
-        C++ virtual methods in JSCell.  Eventually all virtual functions in JSCell 
-        that can't easily be converted to non-virtual functions will be put into 
-        this custom vtable structure.
-
-        * UserObjectImp.cpp:
-
-2011-09-23  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add static version of JSCell::visitChildren
-        https://bugs.webkit.org/show_bug.cgi?id=68404
-
-        Reviewed by Darin Adler.
-
-        In this patch we just extract the bodies of the virtual visitChildren methods
-        throughout the JSCell inheritance hierarchy out into static methods, which are 
-        now called from the virtual methods.  This is an intermediate step in trying to 
-        move the virtual-ness of visitChildren into our own custom vtable stored in 
-        ClassInfo.  We need to convert the methods to static methods in order to be 
-        able to more easily store and refer to them in our custom vtable since normal 
-        member methods store some implicit information in their types, making it 
-        impossible to store them generically in ClassInfo.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::visitChildrenVirtual):
-        (UserObjectImp::visitChildren):
-        * UserObjectImp.h:
-
-2011-09-14  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Unzip initialization lists and constructors in JSCell hierarchy (6/7)
-        https://bugs.webkit.org/show_bug.cgi?id=67692
-
-        Reviewed by Geoffrey Garen.
-
-        Completed the sixth level of the refactoring to add finishCreation() 
-        methods to all classes within the JSCell hierarchy with non-trivial 
-        constructor bodies.
-
-        This primarily consists of pushing the calls to finishCreation() down 
-        into the constructors of the subclasses of the fifth level of the hierarchy 
-        as well as pulling the finishCreation() calls out into the class's corresponding
-        create() method if it has one.  Doing both simultaneously allows us to 
-        maintain the invariant that the finishCreation() method chain is called exactly 
-        once during the creation of an object, since calling it any other number of 
-        times (0, 2, or more) will cause an assertion failure.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        * JSRun.h:
-        (JSGlueGlobalObject::create):
-
-2011-09-13  Anders Carlsson  <andersca@apple.com>
-
-        Disable C++ exceptions when building with clang
-        https://bugs.webkit.org/show_bug.cgi?id=68031
-        <rdar://problem/9556880>
-
-        Reviewed by Mark Rowe.
-
-        * Configurations/Base.xcconfig:
-
-2011-09-09  Oliver Hunt  <oliver@apple.com>
-
-        Remove support for anonymous storage from jsobjects
-        https://bugs.webkit.org/show_bug.cgi?id=67881
-
-        Reviewed by Sam Weinig.
-
-        Don't need an anonymous slot count anymore
-
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2011-08-18  Filip Pizlo  <fpizlo@apple.com>
-
-        The executable allocator makes it difficult to free individual
-        chunks of executable memory
-        https://bugs.webkit.org/show_bug.cgi?id=66363
-
-        Reviewed by Oliver Hunt.
-        
-        Introduced a best-fit, balanced-tree based allocator. The allocator
-        required a balanced tree that does not allocate memory and that
-        permits the removal of individual nodes directly (as opposed to by
-        key); neither AVLTree nor WebCore's PODRedBlackTree supported this.
-        Changed all references to executable code to use a reference counted
-        handle.
-
-        * ForwardingHeaders/wtf/MetaAllocatorHandle.h: Added.
-
-2011-09-09  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Unzip initialization lists and constructors in JSCell hierarchy (5/7)
-        https://bugs.webkit.org/show_bug.cgi?id=67420
-
-        Reviewed by Geoffrey Garen.
-
-        Completed the fifth level of the refactoring to add finishCreation() 
-        methods to all classes within the JSCell hierarchy with non-trivial 
-        constructor bodies.
-
-        This primarily consists of pushing the calls to finishCreation() down 
-        into the constructors of the subclasses of the second level of the hierarchy 
-        as well as pulling the finishCreation() calls out into the class's corresponding
-        create() method if it has one.  Doing both simultaneously allows us to 
-        maintain the invariant that the finishCreation() method chain is called exactly 
-        once during the creation of an object, since calling it any other number of 
-        times (0, 2, or more) will cause an assertion failure.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-
-2011-09-08  Sam Weinig  <sam@webkit.org>
-
-        Remove the Completion object from JSC, I have never liked it
-        https://bugs.webkit.org/show_bug.cgi?id=67755
-
-        Reviewed by Gavin Barraclough.
-
-        * JSRun.cpp:
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax):
-        * JSRun.h:
-        * JavaScriptGlue.cpp:
-        (JSRunEvaluate):
-
-2011-09-07  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r94627 and r94632.
-        http://trac.webkit.org/changeset/94627
-        http://trac.webkit.org/changeset/94632
-        https://bugs.webkit.org/show_bug.cgi?id=67698
-
-        It broke tests on GTK and Qt (Requested by Ossy on #webkit).
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-
-2011-09-06  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Unzip initialization lists and constructors in JSCell hierarchy (5/7)
-        https://bugs.webkit.org/show_bug.cgi?id=67420
-
-        Reviewed by Geoffrey Garen.
-
-        Completed the fifth level of the refactoring to add finishCreation() 
-        methods to all classes within the JSCell hierarchy with non-trivial 
-        constructor bodies.
-
-        This primarily consists of pushing the calls to finishCreation() down 
-        into the constructors of the subclasses of the second level of the hierarchy 
-        as well as pulling the finishCreation() calls out into the class's corresponding
-        create() method if it has one.  Doing both simultaneously allows us to 
-        maintain the invariant that the finishCreation() method chain is called exactly 
-        once during the creation of an object, since calling it any other number of 
-        times (0, 2, or more) will cause an assertion failure.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-
-2011-09-05  Oliver Hunt  <oliver@apple.com>
-
-        An object's structure should reference the global object responsible for its creation
-        https://bugs.webkit.org/show_bug.cgi?id=67624
-
-        Reviewed by Gavin Barraclough.
-
-        Update for Structure::create() requiring a global object.
-
-        * JSRun.h:
-        (JSGlueGlobalObject::create):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2011-09-01  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Unzip initialization lists and constructors in JSCell hierarchy (4/7)
-        https://bugs.webkit.org/show_bug.cgi?id=67174
-
-        Reviewed by Oliver Hunt.
-
-        Completed the fourth level of the refactoring to add finishCreation() 
-        methods to all classes within the JSCell hierarchy with non-trivial 
-        constructor bodies.
-
-        This primarily consists of pushing the calls to finishCreation() down 
-        into the constructors of the subclasses of the second level of the hierarchy 
-        as well as pulling the finishCreation() calls out into the class's corresponding
-        create() method if it has one.  Doing both simultaneously allows us to 
-        maintain the invariant that the finishCreation() method chain is called exactly 
-        once during the creation of an object, since calling it any other number of 
-        times (0, 2, or more) will cause an assertion failure.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp):
-        * UserObjectImp.h:
-        (UserObjectImp::create):
-
-2011-08-29  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Unzip initialization lists and constructors in JSCell hierarchy (3/7)
-        https://bugs.webkit.org/show_bug.cgi?id=67064
-
-        Reviewed by Darin Adler.
-
-        Completed the third level of the refactoring to add finishCreation() 
-        methods to all classes within the JSCell hierarchy with non-trivial 
-        constructor bodies.
-
-        This primarily consists of pushing the calls to finishCreation() down 
-        into the constructors of the subclasses of the second level of the hierarchy 
-        as well as pulling the finishCreation() calls out into the class's corresponding
-        create() method if it has one.  Doing both simultaneously allows us to 
-        maintain the invariant that the finishCreation() method chain is called exactly 
-        once during the creation of an object, since calling it any other number of 
-        times (0, 2, or more) will cause an assertion failure.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp):
-
-2011-08-15  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Refactor JS objects to allocate in static create methods rather than constructors
-        https://bugs.webkit.org/show_bug.cgi?id=65347
-
-        Reviewed by Geoffrey Garen.
-
-        Removed all calls to deprecatedGetDOMObject from initialization lists as part of a 
-        larger refactoring to get rid of all allocation during initialization.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        * JSRun.h:
-        (JSGlueGlobalObject::create):
-
-2011-08-12  Mark Rowe  <mrowe@apple.com>
-
-        Be more forward-looking in the choice of compiler.
-
-        Rubber-stamped by Jon Honeycutt.
-
-        * Configurations/CompilerVersion.xcconfig:
-
-2011-08-12  Sam Weinig  <sam@webkit.org>
-
-        Move compiler specific macros to their own header
-        https://bugs.webkit.org/show_bug.cgi?id=66119
-
-        Reviewed by Anders Carlsson.
-
-        * ForwardingHeaders/wtf/Compiler.h: Added.
-
-2011-08-09  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Add ParentClass typedef in all JSC classes
-        https://bugs.webkit.org/show_bug.cgi?id=65731
-
-        Reviewed by Oliver Hunt.
-
-        Just added the Base typedefs in all the classes that are a subclass of JSCell 
-        to point at their parent classes.  This is a change to support future changes to the way
-        constructors and destructors are implemented in JS objects, among other things.
-
-        * JSRun.h:
-        * UserObjectImp.h:
-
-2011-08-04  Mark Rowe  <mrowe@apple.com>
-
-        Future-proof Xcode configuration settings.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/CompilerVersion.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-        * Configurations/Version.xcconfig:
-
-2011-08-01  David Levin  <levin@chromium.org>
-
-        Add asserts to RefCounted to make sure ref/deref happens on the right thread.
-        https://bugs.webkit.org/show_bug.cgi?id=31639
-
-        Reviewed by Dmitry Titov.
-
-        * ForwardingHeaders/wtf/ThreadRestrictionVerifier.h: Added.
-
-2011-07-27  Mark Hahnenberg  <mhahnenberg@apple.com>
-
-        Remove operator new from JSCell
-        https://bugs.webkit.org/show_bug.cgi?id=64999
-
-        Reviewed by Oliver Hunt.
-
-        Removed the implementation of operator new in JSCell, so any further uses
-        will not successfully link.  Also removed any remaining uses of operator new.
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        * JSRun.h:
-        (JSGlueGlobalObject::create):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (getThreadGlobalObject):
-        * UserObjectImp.h:
-        (UserObjectImp::create):
-
-2011-07-01  Jungshik Shin  <jshin@chromium.org>
-
-        Reviewed by Alexey Proskuryakov.
-
-        Add uscript.h to icu/unicode to get JavaScriptGlue get built. The same
-        file was added to JavaScriptCore/icu/unicode.
-
-        http://bugs.webkit.org/show_bug.cgi?id=20797
-
-        * icu/unicode/uscript.h: Added.
-
-2011-06-24  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r89594.
-        http://trac.webkit.org/changeset/89594
-        https://bugs.webkit.org/show_bug.cgi?id=63316
-
-        It broke 5 tests on the Qt bot (Requested by Ossy_DC on
-        #webkit).
-
-        * icu/unicode/uscript.h: Removed.
-
-2011-06-23  Jungshik Shin  <jshin@chromium.org>
-
-        Reviewed by Alexey Proskuryakov.
-
-        Add uscript.h to icu/unicode to get JavaScriptGlue get built. The same
-        file was added to JavaScriptCore/icu/unicode.
-
-        http://bugs.webkit.org/show_bug.cgi?id=20797
-
-        * icu/unicode/uscript.h: Added.
-
-2011-05-16  David Kilzer  <ddkilzer@apple.com>
-
-        <http://webkit.org/b/60913> C++ exceptions should not be enabled when building with llvm-gcc-4.2
-        <rdar://problem/9446430>
-
-        Reviewed by Mark Rowe.
-
-        * Configurations/Base.xcconfig: Fixed typo.
-
-2011-05-12  David Kilzer  <ddkilzer@apple.com>
-
-        <http://webkit.org/b/60710> JavaScriptGlue should compile with -Wmissing-prototypes
-
-        Reviewed by Geoffrey Garen.
-
-        Enabling -Wmissing-prototypes fixes an Xcode 4 project warning.
-
-        This also fixes the following compiler warning:
-
-            JavaScriptGlue/JSUtils.cpp:407:15: error: no previous prototype for function 'getThreadGlobalData' [-Werror,-Wmissing-prototypes,3]
-             JSGlobalData* getThreadGlobalData()
-                           ^
-
-        * Configurations/Base.xcconfig: Set
-        GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES.
-        * JSUtils.cpp:
-        (getThreadGlobalData): Made static.
-
-2011-05-06  David Kilzer  <ddkilzer@apple.com>
-
-        Remove unused GCC_ENABLE_FIX_AND_CONTINUE and ZERO_LINK settings
-
-        Reviewed by Jon Honeycutt.
-
-        This fixes an Xcode 4 warning about using obsolete settings.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Removed
-        GCC_ENABLE_FIX_AND_CONTINUE and ZERO_LINK settings.
-
-2011-04-28  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r85233 and r85235.
-        http://trac.webkit.org/changeset/85233
-        http://trac.webkit.org/changeset/85235
-        https://bugs.webkit.org/show_bug.cgi?id=59754
-
-        Causes issues with jsc. (Requested by dave_levin on #webkit).
-
-        * ForwardingHeaders/wtf/ThreadRestrictionVerifier.h: Removed.
-
-2011-04-04  David Levin  <levin@chromium.org>
-
-        Reviewed by Darin Adler.
-
-        Add asserts to RefCounted to make sure ref/deref happens on the right thread.
-        https://bugs.webkit.org/show_bug.cgi?id=31639
-
-        * ForwardingHeaders/wtf/ThreadRestrictionVerifier.h: Added.
-
-2011-04-26  Dan Bernstein  <mitz@apple.com>
-
-        Build fix.
-
-        * Configurations/CompilerVersion.xcconfig:
-
-2011-04-26  Dan Bernstein  <mitz@apple.com>
-
-        Reviewed by Mark Rowe.
-
-        Choose the compiler based on the Xcode version for Snow Leopard debug builds.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/CompilerVersion.xcconfig: Added.
-
-2011-04-21  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoffrey Garen.
-
-        Start moving to a general visitor pattern for GC traversal
-        https://bugs.webkit.org/show_bug.cgi?id=59141
-
-        This is just a rename:
-            markChildren -> visitChildren
-            markAggregate -> visitAggregate
-            markStack -> visitor
-            MarkStack -> typedef'd to SlotVisitor
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::visitChildren):
-
-2011-04-19  Renata Hodovan  <reni@webkit.org>
-
-        Reviewed by Eric Seidel.
-
-        Move the alignment related macros in Vector.h to new Alignment.h.
-        https://bugs.webkit.org/show_bug.cgi?id=56000
-
-        Adding the new file to the forwarding headers of JavaScriptGlue.
-
-        * ForwardingHeaders/wtf/Alignment.h: Added.
-
-2011-04-15  Oliver Hunt  <oliver@apple.com>
-
-        GC allocate Structure
-        https://bugs.webkit.org/show_bug.cgi?id=58483
-
-        Rolling r83894 r83827 r83810 r83809 r83808 back in with
-        a workaround for the gcc bug seen by the gtk bots
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        * JSRun.h:
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2011-04-08  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        A few heap-related renames and file moves.
-        
-        WeakGCPtr<T> => Weak<T>
-        Global<T> => Strong<T>
-        collector/ => heap/
-        collector/* => heap/*
-        runtime/WeakGCPtr.h => heap/Weak.h
-        
-        (Eventually, even more files should move into the heap directory. Like
-        Heap.h and Heap.cpp, for example.)
-
-        * JSRun.h:
-        * JSValueWrapper.h:
-
-2011-04-07  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        Some Handle<T> cleanup
-        https://bugs.webkit.org/show_bug.cgi?id=58109
-
-        * JSRun.h:
-        * JSValueWrapper.h: #include a file that was missing before, but was
-        harmlessly so until now.
-
-2011-03-30  Timur Iskhodzhanov  <timurrrr@google.com>
-
-        Reviewed by Alexey Proskuryakov.
-
-        Add some dynamic annotations to JavaScriptCore/wtf
-        https://bugs.webkit.org/show_bug.cgi?id=53747
-
-        By using these annotations we can improve the precision of finding
-        WebKit errors using dynamic analysis tools like ThreadSanitizer and Valgrind.
-        These annotations don't affect the compiled binaries unless USE(DYNAMIC_ANNOTATIONS) is "1".
-
-        These files don't add new functionality, so don't need extra tests.
-
-        * ForwardingHeaders/wtf/DynamicAnnotations.h: Added.
-
-2011-03-25  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoffrey Garen.
-
-        instanceof Array test fails when using iframes
-        https://bugs.webkit.org/show_bug.cgi?id=17250
-
-        Up date for new toObject api
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive):
-        (UserObjectImp::toBoolean):
-        (UserObjectImp::toNumber):
-        (UserObjectImp::toString):
-
-2011-03-26  Adam Barth  <abarth@webkit.org>
-
-        Remove the JavaScriptGlue GYP build.  We're not going to use GYP for
-        JavaScriptGlue because JavaScriptGlue is used only by one port.
-
-        * gyp: Removed.
-        * gyp/JavaScriptGlue.gyp: Removed.
-        * gyp/JavaScriptGlue.gypi: Removed.
-        * gyp/remove-headers-if-needed.sh: Removed.
-        * gyp/run-if-exists.sh: Removed.
-        * gyp/update-info-plist.sh: Removed.
-
-2011-03-22  Eric Seidel  <eric@webkit.org>
-
-        Reviewed by Adam Barth.
-
-        Make it possible to build JavaScriptCore and WebCore gyp builds outside of Source
-        https://bugs.webkit.org/show_bug.cgi?id=56867
-
-        This should make it possible to build the gyp-generated JavaScriptGlue.xcodeproj
-        from a JavaScriptGlue directory outside of Source.
-
-        * gyp/JavaScriptGlue.gyp:
-        * gyp/run-if-exists.sh: Added.
-        * gyp/update-info-plist.sh: Added.
-
-2011-03-22  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Eric Seidel.
-
-        Production configuration in GYP isn&apos;t set up correctly
-        https://bugs.webkit.org/show_bug.cgi?id=56786
-
-        Update JavaScriptGlue.gyp with information mined from
-        JavaScriptGlue.xcodeproj.
-
-        * gyp/JavaScriptGlue.gyp:
-        * gyp/JavaScriptGlue.gypi:
-
-2011-03-21  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Eric Seidel.
-
-        GYP build should not have include paths that point within the source tree
-        https://bugs.webkit.org/show_bug.cgi?id=56788
-
-        Turns out we don't need these include paths anymore now that we have
-        header maps working properly.
-
-        * gyp/JavaScriptGlue.gyp:
-
-2011-03-20  Bill Budge  <bbudge@chromium.org>
-
-        Reviewed by Adam Barth.
-
-        Rename ThreadSafeShared to ThreadSafeRefCounted
-        https://bugs.webkit.org/show_bug.cgi?id=56714
-
-        No new tests. Exposes no new functionality.
-
-        * ForwardingHeaders/wtf/ThreadSafeRefCounted.h: Copied from ForwardingHeaders/wtf/ThreadSafeShared.h.
-        * ForwardingHeaders/wtf/ThreadSafeShared.h: Removed.
-        * gyp/JavaScriptGlue.gypi:
-
-2011-03-17  Jeff Miller  <jeffm@apple.com>
-
-        Use a consistent set of file patterns in the svn:ignore property for all .xcodeproj directories, specifically:
-        
-        *.mode*
-        *.pbxuser
-        *.perspective*
-        project.xcworkspace
-        xcuserdata
-
-        * JavaScriptGlue.xcodeproj: Modified property svn:ignore.
-
-2011-03-15  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoffrey Garen.
-
-        Make Structure creation require a JSGlobalData
-        https://bugs.webkit.org/show_bug.cgi?id=56438
-
-        Mechanical change to make all structure creation pass a JSGlobalData&.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        (JSRun::JSRun):
-        * JSRun.h:
-        * JSUtils.cpp:
-        (getThreadGlobalObject):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2011-03-15  Kevin Ollivier  <kevino@theolliviers.com>
-
-        Reviewed by Darin Adler.
-
-        Introduce WTF_USE_EXPORT_MACROS, which will allow us to put shared library import/export
-        info into the headers rather than in export symbol definition files, but disable it on 
-        all platforms initially so we can deal with port build issues one port at a time.
-        
-        https://bugs.webkit.org/show_bug.cgi?id=27551
-
-        * config.h:
-
-2011-03-10  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Rolled back in 80277 and 80280 with event handler layout test failures fixed.
-        https://bugs.webkit.org/show_bug.cgi?id=55653        
-
-        The failures were caused by a last minute typo: assigning to currentEvent
-        instead of m_currentEvent.
-
-        * JSRun.cpp:
-        * JSRun.h:
-
-2011-03-04  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Dimitri Glazkov.
-
-        Use target_defaults to reduce boilerplate in GYP build system
-        https://bugs.webkit.org/show_bug.cgi?id=55790
-
-        Instead of setting up the configuration in each target, just defer to
-        target_defaults.  Also, removed a define that was redundant with the
-        xcconfig.
-
-        * gyp/JavaScriptGlue.gyp:
-
-2011-03-03  Geoffrey Garen  <ggaren@apple.com>
-
-        Rolled out 80277 and 80280 because they caused event handler layout test
-        failures.
-
-        * JSRun.cpp:
-        * JSRun.h:
-
-2011-03-01  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Dimitri Glazkov.
-
-        Add pre- and post-build actions for JavaScriptCore GYP build
-        https://bugs.webkit.org/show_bug.cgi?id=55507
-
-        Remove the portion of this file that was split out into common.gypi.
-
-        * gyp/JavaScriptGlue.gyp:
-
-2011-02-28  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Sam Weinig & Darin Adler.
-
-        Bug 55423 - Clean up property tables in Structure
-
-        Encapsulate, reduce duplication of table search code,
-        and reduce the size of the tables (remove the index,
-        just maintain the tables in the correct order).
-
-        Shows a 0.5% - 1% progression on sunspider.
-
-        * ForwardingHeaders/wtf/HashTable.h: Added.
-
-2011-02-28  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Dimitri Glazkov.
-
-        Teach JavaScriptGlue gyp build about DEPTH
-        https://bugs.webkit.org/show_bug.cgi?id=55421
-
-        After this path, we should set DEPTH to the Source directory, which is
-        a common point for all the frameworks that make up WebKit.  These
-        changes to the GYP teach JavaScriptGlue how to find various files based
-        on DEPTH rather than based on the location of the xcodeproj file.
-
-        * gyp/JavaScriptGlue.gyp:
-        * gyp/remove-headers-if-needed.sh: Removed.
-        * gyp/run-if-exists.sh: Removed.
-        * gyp/update-info-plist.sh: Removed.
-
-2011-02-28  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Dimitri Glazkov.
-
-        Use more xcconfig files in JavaScriptGlue gyp build
-        https://bugs.webkit.org/show_bug.cgi?id=55395
-
-        Technically this patch breaks the build because the generated project
-        can't find the Info.plist file or the list of exported symbols.  I'll
-        fix that in a follow-up patch.
-
-        * gyp/JavaScriptGlue.gyp:
-
-2011-02-28  Dimitri Glazkov  <dglazkov@chromium.org>
-
-        Reviewed by Adam Barth.
-
-        Add necessary build steps to JavaScriptGlue GYP project.
-        https://bugs.webkit.org/show_bug.cgi?id=55196
-
-        * gyp/JavaScriptGlue.gyp: Added pre- and post- build steps.
-        * gyp/JavaScriptGlue.gypi: Added Info.plist.
-        * gyp/remove-headers-if-needed.sh: Added.
-        * gyp/run-if-exists.sh: Added.
-        * gyp/update-info-plist.sh: Added.
-
-2011-02-23  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Rolled back in r79367 with SnowLeopard Release bot crash fixed.
-        https://bugs.webkit.org/show_bug.cgi?id=54999
-
-2011-02-22  Adam Barth  <abarth@webkit.org>
-
-        Reviewed by Eric Seidel.
-
-        Add a GYP project for JavaScriptGlue
-        https://bugs.webkit.org/show_bug.cgi?id=55019
-
-        This is really just a proof-of-concept.  The Xcode project file it
-        produces is able to build JavaScriptGlue, but it's not 100% correct.
-        Also, the GYP declarations aren't properly structured to allow for
-        multiple projects or ports.  That should get better as we add
-        proof-of-concepts for other projects and ports.
-
-        This build system is not used currently.
-
-        * gyp: Added.
-        * gyp/JavaScriptGlue.gyp: Added.
-        * gyp/JavaScriptGlue.gypi: Added.
-
-2011-02-22  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r79367.
-        http://trac.webkit.org/changeset/79367
-        https://bugs.webkit.org/show_bug.cgi?id=55012
-
-        all layout tests are crashing on Snow Leopard (Requested by
-        rniwa on #webkit).
-
-        * ForwardingHeaders/wtf/DoublyLinkedList.h: Removed.
-
-2011-02-22  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Manage MarkedBlocks in a linked list instead of a vector, so arbitrary removal is O(1)
-        https://bugs.webkit.org/show_bug.cgi?id=54999
-        
-        New WTF header.
-
-        * ForwardingHeaders/wtf/DoublyLinkedList.h: Copied from ForwardingHeaders/wtf/FixedArray.h.
-
-2011-02-18  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Bug 54786 - Devirtualize JSCell::classInfo()
-
-        Instead of making a virtual function call, add a pointer to the ClassInfo
-        onto Structure.
-
-        This removes a virtual function call, and paves the way towards removing all
-        the createStructure methods, and StructureFlags/AnonymousSlotCount properties
-        (these should be able to move onto ClassInfo).
-
-        Calls to Structure::create must now pass a pointer to the ClassInfo for the
-        structure. All objects now have a ClassInfo pointer, non-object cell types
-        still do not.
-
-        Changes are most mechanical, involving three steps:
-            * Remove virtual classInfo() methods.
-            * Add &s_info parameter to calls to Structure::create.
-            * Rename ClassInfo static members on classes from 'info' to 's_info',
-              for consistency.
-
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (KJSValueToCFTypeInternal):
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2011-02-15  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        Bug 54524 - Allow JSObject to fully utilize cell's capacity for inline storage.
-
-        Currently JSObject is both directly instantiated for regular JS objects, and
-        derived to implement subtypes. A consequence of this is that we need to ensure
-        that sufficient space from the cell is left unused and available for any data
-        members that will be introduced by subclasses of JSObject. By restructuring
-        the internal storage array out of JSObject we can increase the size in the
-        internal storage for regular objects.
-
-        Add classes JSFinalObject and JSNonFinalObject. JSNonFinalObject retains as
-        much additional capacity as is currently available to allow for data members
-        in subclasses. JSFinalObject utilizes all available space for internal storage,
-        and only allows construction through JSFinalObject::create().
-
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-            Update JSObject -> JSNonFinalObject.
-
-2011-02-14  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough and Geoff Garen.
-
-        Refactor handles and weak pointers to become nicer and more automatic
-        https://bugs.webkit.org/show_bug.cgi?id=54415
-
-        Update to use new Global<> type
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        (JSRun::GlobalObject):
-        * JSRun.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        * JSValueWrapper.h:
-
-2011-02-13  Cameron Zwarich  <zwarich@apple.com>
-
-        Reviewed by Dan Bernstein.
-
-        Bug 53760 - JSC fails to build with TOT Clang
-        https://bugs.webkit.org/show_bug.cgi?id=53760
-
-        Fix -Woverloaded-virtual warnings.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive): Use PreferredPrimitiveType instead of JSType to
-        match the base class.
-        * UserObjectImp.h: 
-
-2011-02-06  Ryosuke Niwa  <rniwa@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        OwnArraryPtr.h uses deleteOwnedPtr but doesn't include OwnPtrCommon.h
-        https://bugs.webkit.org/show_bug.cgi?id=52867
-
-        * ForwardingHeaders/wtf/OwnArrayPtrCommon.h: Removed.
-
-2011-01-31  Oliver Hunt  <oliver@apple.com>
-
-        Convert markstack to a slot visitor API
-        https://bugs.webkit.org/show_bug.cgi?id=53219
-
-        rolling r77098, r77099, r77100, r77109, and
-        r77111 back in, along with a few more Qt fix attempts.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2011-01-30  Csaba Osztrogonác  <ossy@webkit.org>
-
-        Unreviewed, rolling out r77098, r77099, r77100, r77109, and
-        r77111.
-        http://trac.webkit.org/changeset/77098
-        http://trac.webkit.org/changeset/77099
-        http://trac.webkit.org/changeset/77100
-        http://trac.webkit.org/changeset/77109
-        http://trac.webkit.org/changeset/77111
-        https://bugs.webkit.org/show_bug.cgi?id=53219
-
-        Qt build is broken
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2011-01-30  Oliver Hunt  <oliver@apple.com>
-
-        Convert markstack to a slot visitor API
-        https://bugs.webkit.org/show_bug.cgi?id=53219
-
-        rolling r77006 and r77020 back in.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2011-01-28  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r77006 and r77020.
-        http://trac.webkit.org/changeset/77006
-        http://trac.webkit.org/changeset/77020
-        https://bugs.webkit.org/show_bug.cgi?id=53360
-
-        "Broke Windows tests" (Requested by rniwa on #webkit).
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2011-01-27  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoffrey Garen.
-
-        Convert markstack to a slot visitor API
-        https://bugs.webkit.org/show_bug.cgi?id=53219
-
-        There's no reason to recurse here, the value we
-        were marking was protected.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2011-01-23  Mark Rowe  <mrowe@apple.com>
-
-        Follow-up to r76477.
-
-        Fix the scripts that detect problematic code such as static initializers
-        and destructors, weak vtables, inappropriate files in the framework wrappers,
-        and public headers including private headers. These had all been broken
-        since the projects were moved in to the Source directory as the paths to the
-        scripts were not updated at that time.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2011-01-17  Dan Bernstein  <mitz@apple.com>
-
-        Rubber-stamped by Mark Rowe.
-
-        Update xcodeproj svn:ignore to include xcuserdata.
-
-        * JavaScriptGlue.xcodeproj: Modified property svn:ignore.
-
-2011-01-10  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Moved Collector.* => Heap.*, since the file contains a class named "Heap".
-
-        * JSUtils.h:
-
-2011-01-02  Dan Bernstein  <mitz@apple.com>
-
-        Rubber-stamped by Simon Fraser.
-
-        <rdar://problem/8812159> Update copyright strings
-
-        * Info.plist:
-
-2010-12-22  Dan Bernstein  <mitz@apple.com>
-
-        Rubber-stamped by Mark Rowe.
-
-        Changed WebKitTools to Tools in script build phases.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2010-12-21  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Gavin Barraclough & Oliver Hunt.
-
-        Added PageAllocationAligned, a cross-platform abstraction for memory allocations with arbitrary alignment requirements
-        https://bugs.webkit.org/show_bug.cgi?id=51359
-
-        * ForwardingHeaders/wtf/PageAllocationAligned.h: Added.
-
-2010-12-21  Daniel Bates  <dbates@rim.com>
-
-        Reviewed by Eric Seidel and Darin Adler.
-
-        Deallocate GregorianDateTime.timeZone (if allocated) when copying so that we don't leak memory.
-        https://bugs.webkit.org/show_bug.cgi?id=51367
-
-        Add forwarding header for PassOwnArrayPtr.h.
-
-        * ForwardingHeaders/wtf/PassOwnArrayPtr.h: Added.
-
-2010-12-18  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Bug 26276 - Need a mechanism to determine stack extent
-
-        Add forwarding header for StackBounds.h.
-
-        * ForwardingHeaders/wtf/StackBounds.h: Added.
-
-2010-12-20  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Factored common page set management into a new PageBlock base class
-        https://bugs.webkit.org/show_bug.cgi?id=51285
-
-        * ForwardingHeaders/wtf/PageBlock.h: Added.
-
-2010-12-01  Geoffrey Garen  <ggaren@apple.com>
-
-        Build fix: Added a forwarding header.
-
-        * ForwardingHeaders/wtf/OSAllocator.h: Added.
-
-2010-10-25  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Remove exec and globalData arguments from jsNumber
-        https://bugs.webkit.org/show_bug.cgi?id=48270
-
-        Don't pass exec to jsNumber
-
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive):
-
-2010-10-25  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r70451.
-        http://trac.webkit.org/changeset/70451
-        https://bugs.webkit.org/show_bug.cgi?id=48249
-
-        Broke set-unloaded-frame-location.html under Qt (Requested by
-        caseq on #webkit).
-
-        * ForwardingHeaders/wtf/text/TextPosition.h: Removed.
-
-2010-10-16  Patrick Gansterer  <paroga@webkit.org>
-
-        Reviewed by Adam Barth.
-
-        Rename StringHasherFunctions.h to StringHasher.h
-        https://bugs.webkit.org/show_bug.cgi?id=47200
-
-        * ForwardingHeaders/wtf/StringHashFunctions.h: Removed.
-        * ForwardingHeaders/wtf/StringHasher.h: Copied from JavaScriptGlue/ForwardingHeaders/wtf/StringHashFunctions.h.
-
-2010-09-09  Michael Saboff  <msaboff@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Added ListHashSet.h as an exported header in support of RegExp tracing.
-        https://bugs.webkit.org/show_bug.cgi?id=45401
-
-        * ForwardingHeaders/wtf/ListHashSet.h: Added.
-
-2010-09-07  Anders Carlsson  <andersca@apple.com>
-
-        Reviewed by Darin Adler.
-
-        <rdar://problem/8381749> -Wcast-align warning emitted when building with clang
-
-        Remove the -Wcast-align-warning since it isn't really useful, and clang is more aggressive about warning than gcc.
-
-        * Configurations/Base.xcconfig:
-
-2010-08-26  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        Add PassOwnArrayPtr
-        https://bugs.webkit.org/show_bug.cgi?id=44627
-
-        Add new forwarding header.
-
-        * ForwardingHeaders/wtf/OwnArrayPtrCommon.h: Added.
-
-2010-08-23  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        https://bugs.webkit.org/show_bug.cgi?id=44487
-
-        * ForwardingHeaders/wtf/text/WTFString.h: Added.
-
-2010-08-24  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        Don't seed the JS random number generator from time()
-        https://bugs.webkit.org/show_bug.cgi?id=41868
-        <rdar://problem/8171025>
-
-        Add forwarding header for RandomNumber in JavaScriptGlue
-
-        * ForwardingHeaders/wtf/RandomNumber.h: Added.
-
-2010-08-11  Gavin Barraclough  <barraclough@apple.com>
-
-        Rubber stamps by Darin Adler & Sam Weinig.
-
-        Bug 43867 - Some UString cleanup
-
-        Change JSC::UString data(), size(), and from(), to characters(), length(), and number() to match WTF::String.
-        Move string concatenation methods to a new header to simplify down UString.h.  Remove is8Bit().
-
-        * JSUtils.cpp:
-        (UStringToCFString):
-        (KJSValueToCFTypeInternal):
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2010-08-04  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Bug 43515 - Fix small design issues with PageAllocation, split out PageReservation.
-        (add forwarding headers)
-
-        * ForwardingHeaders/wtf/Bitmap.h: Added.
-        * ForwardingHeaders/wtf/PageReservation.h: Added.
-
-2010-08-04  Sheriff Bot  <webkit.review.bot@gmail.com>
-
-        Unreviewed, rolling out r64655.
-        http://trac.webkit.org/changeset/64655
-        https://bugs.webkit.org/show_bug.cgi?id=43496
-
-        JavaScriptCore references patch seems to have caused
-        regressions in QT and GTK builds (Requested by nlawrence on
-        #webkit).
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2010-08-04  Nathan Lawrence  <nlawrence@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Removed unneeded marking.  We need to remove this marking in order to have
-        MarkStack::append take references for updating movable objects.
-
-        https://bugs.webkit.org/show_bug.cgi?id=41177
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2010-08-03  Gavin Barraclough  <barraclough@apple.com>
-
-        Build fix following r64624.
-
-        * ForwardingHeaders/wtf/BitMap.h: Added.
-
-2010-07-27  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Bug 42621 - Add a bump allocator for the YARR interpreter
-
-        The regex engine requires lifo allocation, however currently uses the general purpose
-        malloc/free memory allocation.  A simple bump pointer allocator should provide a lower
-        overhead allocation solution.
-
-        * ForwardingHeaders/wtf/BumpPointerAllocator.h: Added.
-
-2010-07-26  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Bug 43009 - Abstract out page allocation from executable allocators
-
-        * ForwardingHeaders/wtf/PageAllocation.h: Added.
-
-2010-07-01  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        Add a FixedArray template to encapsulate fixed length arrays
-        https://bugs.webkit.org/show_bug.cgi?id=41506
-
-        Add forwarding header.
-
-        * ForwardingHeaders/wtf/FixedArray.h: Added.
-
-2010-06-02  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Bug 40094 - The return type of NativeFunction should be EncodedJSValue
-        On Windows & Linux, using JSVALUE32_64, EncodedJSValue is returned in registers, but JSValue is not.
-
-        * JSObject.cpp:
-        (nativeCallFunction):
-
-2010-05-28  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig, Gavin Barraclough, Oliver Hunt.
-
-        Simplified the host calling convention.
-
-        PART ONE: Functional code changes.
-        
-        [ None in JavaScriptGlue ]
-        
-        PART TWO: Global search and replace.
-        
-        In the areas below, I used global search-and-replace to change
-            (ExecState*, JSObject*, JSValue, const ArgList&) => (ExecState*)
-            args.size() => exec->argumentCount()
-            args.at(i) => exec->argument(i)
-
-        * JSObject.cpp:
-        (nativeCallFunction):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        * UserObjectImp.h:
-
-2010-04-23  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by David Levin.
-
-        Fix for https://bugs.webkit.org/show_bug.cgi?id=38060
-        Split up Threading.h
-
-        Add necessary forwarding headers.
-
-        * ForwardingHeaders/wtf/Atomics.h: Added.
-        * ForwardingHeaders/wtf/ThreadSafeShared.h: Added.
-        * ForwardingHeaders/wtf/ThreadingPrimitives.h: Added.
-
-2010-04-22  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Anders Carlsson.
-
-        Fix for https://bugs.webkit.org/show_bug.cgi?id=38022
-        Move isMainThread predicate function to MainThread.h
-
-        Added forwarding header for MainThread.h
-
-        * ForwardingHeaders/wtf/MainThread.h: Added.
-
-2010-04-22  Gavin Barraclough  <barraclough@apple.com>
-
-        Rubber stamped by Sam Weinig
-
-        Do not get the globaldata for the APIShim via the
-        global object; global object construction creates identifiers
-        which results in the ASSERTs checking the thread data's
-        identifierTable has been set failing.
-
-        * JSUtils.cpp:
-        (unprotectGlobalObject):
-        (getThreadGlobalData):
-        (getThreadGlobalObject):
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        (JSGlueAPICallback::~JSGlueAPICallback):
-
-2010-04-21  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        <rdar://problem/7879485> Leopard: Crash after opening Software Update dialog
-
-        * JSUtils.cpp:
-        (unprotectGlobalObject): Use the version of JSGlueAPIEntry that doesn't
-        call pthread_getspecific, since it's not safe to call pthread_getspecific
-        from a thread-specific data destructor. (<rdar://problem/7889842>
-        pthread_getspecific returns 0 when called from thread-specific data
-        destructor function)
-
-        (getThreadGlobalObject): Make sure to set the currentIdentifierTable
-        when first constructing our JSGlobalObject, since JSGlueAPIEntry has not
-        yet had an opportunity to do so.
-
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        * JSUtils.h: New version of JSGlueAPIEntry that doesn't call
-        pthread_getspecific.
-
-2010-04-21  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by NOBODY (build fix).
-        Errk! tree on fire, add fwd!
-
-        * ForwardingHeaders/wtf/text/StringHash.h: Added.
-
-2010-04-20  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt, Darin Adler.
-
-        Bug 37906 - Remove JSC::UStringImpl; unify with StringImpl.
-        Add forwarding header.
-
-        * ForwardingHeaders/wtf/ASCIICType.h: Added.
-        * ForwardingHeaders/wtf/text/StringImpl.h: Added.
-
-2010-04-20  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Bug 37895 - Share common code from UStringImplBase with StringImpl
-        Add forwarding header.
-
-        * ForwardingHeaders/wtf/text/StringImplBase.h: Added.
-
-2010-04-20  Gavin Barraclough  <barraclough@apple.com>
-
-        Rubber stamped by Maciej Stachowiak (relanding r57829).
-        Added missing JS_EXPORTDATA
-
-        * ForwardingHeaders/wtf/WTFThreadData.h: Copied from JavaScriptGlue/ForwardingHeaders/wtf/WTFThreadData.h.
-        * JSUtils.cpp:
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        (JSGlueAPIEntry::~JSGlueAPIEntry):
-        (JSGlueAPICallback::JSGlueAPICallback):
-        (JSGlueAPICallback::~JSGlueAPICallback):
-
-2010-04-19  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by NOBODY (rolling out r57829).
-        This broke windows.
-
-        * ForwardingHeaders/wtf/WTFThreadData.h: Removed.
-        * JSUtils.cpp:
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        (JSGlueAPIEntry::~JSGlueAPIEntry):
-        (JSGlueAPICallback::JSGlueAPICallback):
-        (JSGlueAPICallback::~JSGlueAPICallback):
-
-2010-04-16  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        https://bugs.webkit.org/show_bug.cgi?id=37745
-        Move string uniquing tables to (new) WTFThreadData class.
-
-        Remove AtomicString's dependency on ThreadGlobalData so that we can move
-        WebCore's string classes up to WTF.
-
-        * ForwardingHeaders/wtf/WTFThreadData.h: Added.
-        * JSUtils.cpp: Update 
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        (JSGlueAPIEntry::~JSGlueAPIEntry):
-        (JSGlueAPICallback::JSGlueAPICallback):
-        (JSGlueAPICallback::~JSGlueAPICallback):
-
-2010-03-31  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        Bug 36871 - Remove JSC::CString
-        Use WTF::CString instead (which until recently was WebCore::CString).
-
-        * ForwardingHeaders/wtf/text: Added.
-        * ForwardingHeaders/wtf/text/CString.h: Added.
-
-2010-03-11  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by David Kilzer.
-
-        <rdar://problem/7745082> Make it possible to build WebKit for older Mac OS X versions from the current Mac OS X version
-
-        Default to using the appropriate SDK if the target Mac OS X version is not the current Mac OS X version.
-
-        * Configurations/Base.xcconfig:
-
-2010-03-11  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        <rdar://problem/7745082> Make it possible to build WebKit for older Mac OS X versions from the current Mac OS X version
-
-        Introduce TARGET_MAC_OS_X_VERSION_MAJOR to represent the Mac OS X version that is being targeted.  It defaults to the
-        current Mac OS X version unless otherwise specified.
-
-        Key off TARGET_MAC_OS_X_VERSION_MAJOR where we'd previously been keying off MAC_OS_X_VERSION_MAJOR.
-
-        Explicitly map from the target Mac OS X version to the preferred compiler since Xcode's default compiler choice
-        may not be usable when targetting a different Mac OS X version.
-
-        Key off TARGET_GCC_VERSION rather than MAC_OS_X_VERSION_MAJOR in locations where we'd previously been keying off
-        MAC_OS_X_VERSION_MAJOR but the decision is really related to the compiler version being used.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-        * Configurations/Version.xcconfig:
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2010-03-01  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        Refactor named getter function signature to be in line with indexing getter signature
-        https://bugs.webkit.org/show_bug.cgi?id=35563
-
-        Fix method signature and update code as appropriate
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::userObjectGetter):
-        * UserObjectImp.h:
-
-2010-02-09  Alexey Proskuryakov  <ap@apple.com>
-
-        Reviewed by Geoffrey Garen.
-
-        https://bugs.webkit.org/show_bug.cgi?id=34490
-        WebCore::ImageEventSender::dispatchPendingEvents() crashes in certain conditions
-
-        * ForwardingHeaders/wtf/ValueCheck.h: Added.
-
-2010-02-04  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Timothy Hatcher.
-
-        Build fix.  Remove a symbol corresponding to an inline function from the linker export
-        file to prevent a weak external failure.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Accommodate rename of script.
-
-2010-01-28  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Simplify anonymous slot implementation
-        https://bugs.webkit.org/show_bug.cgi?id=34282
-
-        Update JSGlue Structure usage to pass the anonymous slot count.
-
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2010-01-12  Kent Hansen  <kent.hansen@nokia.com>
-
-        Reviewed by Geoffrey Garen.
-
-        [ES5] Implement Object.getOwnPropertyNames
-        https://bugs.webkit.org/show_bug.cgi?id=32242
-
-        Add new argument to the reimplementation of getOwnPropertyNames().
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertyNames):
-        * UserObjectImp.h:
-
-2010-01-07  Alexey Proskuryakov  <ap@apple.com>
-
-        Mac build fix.
-
-        * config.h: Define JS_EXPORTCLASS for JavaScriptGlue.
-
-2010-01-05  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        https://bugs.webkit.org/show_bug.cgi?id=33236
-        Remove m_identifierTable pointer from UString
-
-        Add API shims similar to those used in the JSC API to track the current identifierTable.
-
-        * JSBase.cpp:
-        (JSBase::Release):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (unprotectGlobalObject):
-        (JSGlueAPIEntry::JSGlueAPIEntry):
-        (JSGlueAPIEntry::~JSGlueAPIEntry):
-        (JSGlueAPICallback::JSGlueAPICallback):
-        (JSGlueAPICallback::~JSGlueAPICallback):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2010-01-04  Gavin Barraclough <barraclough@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Add a forwarding header so that StringHashFunctions.h can be found.
-
-        * ForwardingHeaders/wtf/StringHashFunctions.h: Added.
-
-2010-01-04  Dan Bernstein  <mitz@apple.com>
-
-        Reviewed by Ada Chan and Mark Rowe.
-
-        Updated copyright string
-
-        * Info.plist:
-
-2009-12-21  Gavin Barraclough  <barraclough@apple.com>
-
-        Reviewed by Darin Adler.
-
-        https://bugs.webkit.org/show_bug.cgi?id=32831
-        Replace UString::Rep implementation, following introduction of ropes to JSC.
-
-        * ForwardingHeaders/wtf/PossiblyNull.h: Added.
-            - add forwarding header.
-
-2009-12-16  Mark Rowe  <mrowe@apple.com>
-
-        Build fix.  Disable debug variants of WebKit frameworks.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2009-12-13  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-        
-        Changed GC from mark-sweep to mark-allocate.
-        
-        * JavaScriptGlue.cpp:
-        (JSCollect): Updated for rename. Fixed a bug where JSGlue would not check
-        to avoid nested GC calls.
-
-2009-12-08  Dmitry Titov  <dimich@chromium.org>
-
-        Rubber-stamped by David Levin.
-
-        Revert and reopen "Add asserts to RefCounted to make sure ref/deref happens on the right thread."
-        It may have caused massive increase of reported leaks on the bots.
-        https://bugs.webkit.org/show_bug.cgi?id=31639
-
-        * ForwardingHeaders/wtf/ThreadVerifier.h: Removed.
-
-2009-12-08  Dmitry Titov  <dimich@chromium.org>
-
-        Reviewed by Darin Adler.
-
-        Add asserts to RefCounted to make sure ref/deref happens on the right thread.
-        https://bugs.webkit.org/show_bug.cgi?id=31639
-
-        * ForwardingHeaders/wtf/ThreadVerifier.h: Added.
-
-2009-11-24  Mark Rowe  <mrowe@apple.com>
-
-        Fix production builds where the source tree may be read-only.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2009-11-08  David Levin  <levin@chromium.org>
-
-        Reviewed by NOBODY (chromium build fix).
-
-        Added the use jsc define for files that use
-        this config file and DateMath.h. This should
-        be able to go away when DateMath is properly
-        split into wtf and jsc portions which is this bug:
-        https://bugs.webkit.org/show_bug.cgi?id=31246
-
-        * config.h:
-
-2009-11-06  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        https://bugs.webkit.org/show_bug.cgi?id=31197
-        Implemented a timezone cache not based on Mac OS X's notify_check API.
-        
-        * ForwardingHeaders/wtf/CurrentTime.h: Added.
-
-2009-10-27  Geoffrey Garen  <ggaren@apple.com>
-
-        Build fix: Updated for JavaScriptCore export changes.
-
-        * ForwardingHeaders/wtf/DateInstanceCache.h: Added.
-
-2009-10-27  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Updated for JavaScriptCore export changes.
-
-        * ForwardingHeaders/wtf/DateMath.h: Added.
-
-2009-10-27  Dan Bernstein  <mitz@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Updated license
-
-        * LICENSE:
-
-2009-10-16  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Make typeinfo flags default to false
-        https://bugs.webkit.org/show_bug.cgi?id=30372
-
-        Last part -- replace HasDefaultGetPropertyNames with OverridesGetPropertyNames
-        flag.
-
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2009-10-15  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Make typeinfo flags default to false
-        https://bugs.webkit.org/show_bug.cgi?id=30372
-
-        Part 2 -- Reverse the TypeInfo HasDefaultMark flag to OverridesMarkChildren, etc
-
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2009-10-14  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        Make typeinfo flags default to false
-        https://bugs.webkit.org/show_bug.cgi?id=30372
-        
-        Part 1. Reverse the HasStandardGetOwnPropertySlot flag.
-
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2009-09-28  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Removed virtual destructor from JSGlobalObjectData to eliminate pointer
-        fix-ups when accessing JSGlobalObject::d.
-        
-        Replaced with an explicit destructor function pointer.
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::destroyData):
-        * JSRun.h:
-        (JSGlueGlobalObject::Data::Data):
-
-2009-09-12  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        [ES5] Implement Object.keys
-        https://bugs.webkit.org/show_bug.cgi?id=29170
-
-        Switch over to getOwnPropertyNames instead of getPropertyNames.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertyNames):
-        * UserObjectImp.h:
-
-2009-09-02  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark): Removed a check of the mark
-        bit. It's OK to do more work in this case, and there is no
-        longer a public function to access the mark bit.
-
-2009-08-14  Darin Adler  <darin@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Rename the confusing isObject(<class>) to inherits(<class>).
-        It still works on non-objects, returning false.
-
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (KJSValueToCFTypeInternal):
-        Changed from isObject to inherits.
-
-2009-08-13  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        Devirtualise marking
-        https://bugs.webkit.org/show_bug.cgi?id=28294
-
-        Continue to jump through hoops to deal with the exposed marking routines
-        in JavaScriptGlue.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-
-2009-08-07  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Stack overflow crash in JavaScript garbage collector mark pass
-        https://bugs.webkit.org/show_bug.cgi?id=12216
-
-        Make JSGlue interact with the new iterative mark logic.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectMark):
-          Unfortunately JSGlue exposes recursive marking so we can only flatten
-          the recursion.  We just create a local mark stack if necessary and mark
-          the given object iteratively from this point.
-        * UserObjectImp.cpp:
-        (UserObjectImp::markChildren):
-        * UserObjectImp.h:
-
-2009-08-06  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Sam Weinig.
-
-        Add explicit dependencies for our build verification scripts to ensure that they always run after linking has completed.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2009-07-27  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        https://bugs.webkit.org/show_bug.cgi?id=27735
-        Give a helpful name to JSLock constructor argument
-
-        * JSBase.cpp:
-        (JSBase::Release):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (unprotectGlobalObject):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-
-2009-07-10  Adam Roben  <aroben@apple.com>
-
-        Sort all our Xcode projects
-
-        Accomplished using sort-Xcode-project-file.
-
-        Requested by Dave Kilzer.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2009-07-08  Darin Adler  <darin@apple.com>
-
-        Reviewed by Dan Bernstein
-
-        - fix <rdar://problem/6971484> REGRESSION (r30534): "Scrolling Credits"
-          effect does not scroll on iMovie 7.1.4 on Tiger
-
-        In <http://trac.webkit.org/changeset/30534>, the prototype of
-        JSObject::put() which UserObjectImp had been overriding changed, but
-        UserObjectImp wasn't updated, so its override was no longer getting
-        called after that.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::put): Match the current prototype of JSObject::put().
-        The PutPropertySlot argument is unused.
-        * UserObjectImp.h: Ditto.
-
-2009-06-19  Zoltan Horvath  <hzoltan@inf.u-szeged.hu>
-
-        Reviewed by Darin Adler.
-
-        Add FastAllocBase.h to JavaScriptGlue's ForwardingHeaders/wtf, because it's needed by HashCountedSet.h on MAC.
-
-        * ForwardingHeaders/wtf/FastAllocBase.h: Added.
-
-2009-06-02  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Anders Carlsson.
-
-        Remove workaround that was added to address <rdar://problem/5488678> as it no longer affects our Tiger builds.
-
-        * Configurations/Base.xcconfig:
-
-2009-05-25  David Levin  <levin@chromium.org>
-
-        Reviewed by Maciej Stachowiak and Oliver Hunt.
-
-        https://bugs.webkit.org/show_bug.cgi?id=25126
-
-        Added forwarding headers.
-
-        * ForwardingHeaders/wtf/CrossThreadRefCounted.h: Added.
-        * ForwardingHeaders/wtf/OwnFastMallocPtr.h: Added.
-
-2009-05-23  David Kilzer  <ddkilzer@apple.com>
-
-        Part 1 of 2: Bug 25495: Implement PassOwnPtr and replace uses of std::auto_ptr
-
-        <https://bugs.webkit.org/show_bug.cgi?id=25495>
-
-        Reviewed by Oliver Hunt.
-
-        * ForwardingHeaders/wtf/OwnPtrCommon.h: Added.
-        * ForwardingHeaders/wtf/PassOwnPtr.h: Added.
-
-2009-05-14  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Darin Adler.
-
-        <rdar://problem/6681868> When building with Xcode 3.1.3 should be using gcc 4.2
-
-        The meaning of XCODE_VERSION_ACTUAL is more sensible in newer versions of Xcode.
-        Update our logic to select the compiler version to use the more appropriate XCODE_VERSION_MINOR
-        if the version of Xcode supports it, and fall back to XCODE_VERSION_ACTUAL if not.
-
-        * Configurations/Base.xcconfig:
-
-2009-05-07  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Add calling convention annotation
-
-        * JSObject.cpp:
-
-2009-05-01  Geoffrey Garen  <ggaren@apple.com>
-
-        Rubber Stamped by Sam Weinig.
-        
-        Renamed JSValuePtr => JSValue.
-
-        * JSObject.cpp:
-        (nativeCallFunction):
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (KJSValueToCFType):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        * JSValueWrapper.h:
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::userObjectGetter):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::toPrimitive):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2009-04-29  Oliver Hunt  <oliver@apple.com>
-
-        Reviewed by Gavin Barraclough.
-
-        Clean up ArgList to be a trivial type
-
-        Start using MarkedArgumentBuffer to create argument lists for function calls
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-
-2009-04-28  Geoffrey Garen  <ggaren@apple.com>
-
-        Rubber stamped by Beth Dakin.
-        
-        Missed one.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2009-04-21  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Mark Rowe.
-
-        Tiger crash fix: Put VM tags in their own header file, and fixed up the
-        #ifdefs so they're not used on Tiger.
-
-        * ForwardingHeaders/wtf/VMTags.h: Copied from JavaScriptGlue/ForwardingHeaders/wtf/HashTraits.h.
-
-2009-04-20  Sam Weinig  <sam@webkit.org>
-
-        Rubber-stamped by Tim Hatcher.
-
-        Add licenses for xcconfig files.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-        * Configurations/JavaScriptGlue.xcconfig:
-        * Configurations/Version.xcconfig:
-
-2009-03-13  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Dan Bernstein.
-
-        Take advantage of the ability of recent versions of Xcode to easily switch the active
-        architecture.
-
-        * Configurations/DebugRelease.xcconfig:
-
-2009-02-24  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Dan Bernstein.
-
-        <rdar://problem/6407844> JavaScriptGlue should use -Os rather than -O2
-
-        * Configurations/Base.xcconfig:
-
-2009-01-28  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Gavin Barraclough.
-
-        Fix for <rdar://problem/6525537>
-        Hang occurs when closing Installer window (iTunes, Aperture)
-
-        * JSUtils.cpp:
-        (getThreadGlobalObject): Use the shared JSGlobalData instance.
-
-2009-01-22  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Anders Carlsson.
-
-        Disable GCC_WARN_ABOUT_MISSING_PROTOTYPES temporarily.
-
-        Current versions of Xcode only respect it for C and Objective-C files,
-        and our code doesn't currently compile if it is applied to C++ and
-        Objective-C++ files.
-
-        * Configurations/Base.xcconfig:
-
-2009-01-19  Sam Weinig  <sam@webkit.org>
-
-        Rubber-stamped by Gavin Barraclough.
-
-        Remove temporary operator-> from JSValuePtr.
-
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectMark):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertySlot):
-
-2009-01-14  Dan Bernstein  <mitz@apple.com>
-
-        Reviewed by John Sullivan.
-
-        - update copyright
-
-        * Info.plist:
-
-2009-01-09  David Levin  <levin@chromium.org>
-
-        Reviewed by Oliver Hunt.
-
-        https://bugs.webkit.org/show_bug.cgi?id=23175
-
-        Added forwarding header.
-
-        * ForwardingHeaders/wtf/PtrAndFlags.h: Added.
-
-2009-01-05  Gavin Barraclough  <baraclough@apple.com>
-
-        Rubber Stamped by Oliver Hunt.
-
-        Replace all uses of JSValue* with new wrapper class, JSValuePtr.
-        See JavaScriptCore/ChangeLog for more detailed description.
-
-        * JSObject.cpp:
-        (nativeCallFunction):
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (KJSValueToCFType):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        * JSValueWrapper.h:
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::userObjectGetter):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::toPrimitive):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2008-12-15  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Cameron Zwarich.
-
-        <rdar://problem/6289933> Change WebKit-related projects to build with GCC 4.2 on Leopard.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-
-2008-12-08  David Kilzer  <ddkilzer@apple.com>
-
-        Bug 22555: Sort "children" sections in Xcode project files
-
-        <https://bugs.webkit.org/show_bug.cgi?id=22555>
-
-        Reviewed by Eric Seidel.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Sorted.
-
-2008-11-17  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-        
-        Updated for JavaScriptCore rename.
-
-        * ForwardingHeaders/runtime/CallFrame.h: Copied from JavaScriptGlue/ForwardingHeaders/runtime/ExecState.h.
-        * ForwardingHeaders/runtime/ExecState.h: Removed.
-        * config.h:
-
-2008-11-17  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-        
-        Updated for JavaScriptCore rename.
-
-        * ForwardingHeaders/interpreter: Added.
-        * ForwardingHeaders/interpreter/CallFrame.h: Copied from ForwardingHeaders/runtime/ExecState.h.
-        * ForwardingHeaders/runtime/ExecState.h: Removed.
-
-2008-11-15  Darin Adler  <darin@apple.com>
-
-        Rubber stamped by Geoff Garen.
-
-        - do the long-planned StructureID -> Structure rename
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        (JSRun::JSRun):
-        * JSRun.h:
-        (JSGlueGlobalObject::userObjectStructure):
-        * JSUtils.cpp:
-        (getThreadGlobalObject):
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructure):
-
-2008-11-15  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-        
-        Updated for JavaScriptCore renames.
-
-        * JSRun.cpp:
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax):
-
-2008-11-05  Cameron Zwarich  <zwarich@apple.com>
-
-        Not reviewed.
-
-        Fix the JavaScriptGlue build. This wouldn't show up unless one was
-        doing a clean build, because changes in JavaScriptCore don't cause
-        anything in JavaScriptGlue to get rebuilt.
-
-        * JSRun.cpp:
-        * JSUtils.h:
-        * JavaScriptGlue.cpp:
-
-2008-11-04  Cameron Zwarich  <zwarich@apple.com>
-
-        Reviewed by Mark Rowe.
-
-        Remove JavaScriptGlue forwarding headers that are no longer necessary,
-        and correct the path of the ExecState.h forwarding header.
-
-        * ForwardingHeaders/kjs: Removed.
-        * ForwardingHeaders/kjs/CTI.h: Removed.
-        * ForwardingHeaders/kjs/ExecState.h: Removed.
-        * ForwardingHeaders/kjs/JSValue.h: Removed.
-        * ForwardingHeaders/kjs/PutPropertySlot.h: Removed.
-        * ForwardingHeaders/kjs/ustring.h: Removed.
-        * ForwardingHeaders/runtime: Added.
-        * ForwardingHeaders/runtime/ExecState.h: Copied from ForwardingHeaders/kjs/ExecState.h.
-        * config.h:
-
-2008-10-31  Stephanie Lewis  <slewis@apple.com>
-
-        Fix build by including right files.
-
-        * JSRun.cpp:
-
-2008-10-30  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Jon Homeycutt.
-
-        Explicitly default to building for only the native architecture in debug and release builds.
-
-        * Configurations/DebugRelease.xcconfig:
-
-2008-10-24  Darin Adler  <darin@apple.com>
-
-        - finish rolling out https://bugs.webkit.org/show_bug.cgi?id=21732
-
-        * JSObject.cpp:
-        (nativeCallFunction):
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (KJSValueToCFType):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        * JSValueWrapper.h:
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::userObjectGetter):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::toPrimitive):
-        * UserObjectImp.h:
-        (UserObjectImp::createStructureID):
-        Use JSValue* instead of JSValuePtr.
-
-2008-10-23  Darin Adler  <darin@apple.com>
-
-        - roll out https://bugs.webkit.org/show_bug.cgi?id=21732
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::GetValue): Added missing call to .get().
-        * JSValueWrapper.h: ProtectedPtr<JSValue> instead of ProtectedPtr<JSValuePtr>.
-
-2008-10-22  Darin Adler  <darin@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        - fix https://bugs.webkit.org/show_bug.cgi?id=21294
-          Bug 21294: Devirtualize getOwnPropertySlot()
-
-        * JSRun.cpp:
-        (JSGlueGlobalObject::JSGlueGlobalObject): Moved constructor here.
-        Set up flags in its new location in global object data, and set up
-        a structure for UserObjectImp too.
-        (JSRun::JSRun): Added code to give the JSGlueGlobalObject its own unique
-        structure, rather than using the default one from JSGlobalObject.
-
-        * JSRun.h: Made JSGlueGlobalObject take a structure ID. Also moved
-        the data into a separate data object. And added userObjectStructure,
-        a Structure to be used by UserObjectImp.
-
-        * JSUtils.cpp: Removed unused sharedGlobalData global.
-        (JSObjectKJSValue): Pass Structure in when creating UserObjectImp.
-        (unprotectGlobalObject): Use JSGlueGLobalObject type specifically.
-        (initializeGlobalObjectKey): Removed code to set up unused sharedGlobalData.
-        (getThreadGlobalObject): Added. Shared by JSObjectKJSValue and
-        getThreadGlobalExecState. Also now passes in a structure ID when creating
-        the global object.
-        (getThreadGlobalExecState): Changed to call getThreadGlobalObject.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp): Changed to take a structure.
-        * UserObjectImp.h:
-        (UserObjectImp::createStructureID): Added. Returns a structure without
-        HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot.
-
-2008-10-20  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Cameron Zwarich.
-
-        Fix for https://bugs.webkit.org/show_bug.cgi?id=21766
-        REGRESSION: 12 JSC tests fail
-
-        The JSGlobalObject constructor no longer takes a JSGlobalData
-        as an argument.
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        * JSRun.h:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        * JSUtils.cpp:
-        (getThreadGlobalExecState):
-
-2008-10-19  Darin Adler  <darin@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        - next step of https://bugs.webkit.org/show_bug.cgi?id=21732
-          improve performance by eliminating JSValue as a base class for JSCell
-
-        Remove most uses of JSValue, which will be removed in a future patch.
-
-        * JSValueWrapper.h: Use JSValuePtr instead of JSValue*.
-
-2008-10-18  Darin Adler  <darin@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        - next step of https://bugs.webkit.org/show_bug.cgi?id=21732
-          improve performance by eliminating JSValue as a base class for JSCell
-
-        Tweak a little more to get closer to where we can make JSValuePtr a class.
-
-        * JSObject.cpp:
-        (nativeCallFunction): Call asObject.
-
-        * JSUtils.cpp:
-        (KJSValueToJSObject): Use JSValuePtr and asObject.
-        (JSObjectKJSValue): Ditto.
-        (KJSValueToCFTypeInternal): Ditto.
-        (KJSValueToCFType): Ditto.
-        * JSUtils.h: Ditto.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction): Use JSValuePtr and asObject.
-        (UserObjectImp::userObjectGetter): Ditto.
-        (UserObjectImp::getOwnPropertySlot): Ditto.
-        (UserObjectImp::put): Ditto.
-        (UserObjectImp::toPrimitive): Ditto.
-        * UserObjectImp.h: Ditto.
-
-2008-10-18  Darin Adler  <darin@apple.com>
-
-        Reviewed by Cameron Zwarich.
-
-        - next step on https://bugs.webkit.org/show_bug.cgi?id=21732
-          improve performance by eliminating JSValue as a base class for JSCell
-
-        Use JSValuePtr everywhere instead of JSValue*. In the future, we'll be
-        changing JSValuePtr to be a class, and then eventually renaming it
-        to JSValue once that's done.
-
-        * JSObject.cpp:
-        * JSValueWrapper.cpp:
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-        Replace JSValue* with JSValuePtr.
-
-2008-10-13  Maciej Stachowiak  <mjs@apple.com>
-
-        Rubber stamped by Mark Rowe.
-        
-        - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default
-
-        * Configurations/DebugRelease.xcconfig:
-
-2008-10-06  Maciej Stachowiak  <mjs@apple.com>
-
-        Not reviewed. Build fix.
-
-        - revert toBoolean changes (r37333 and r37335); need to make WebCore work with these
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-
-2008-10-06  Maciej Stachowiak  <mjs@apple.com>
-
-        Not reviewed.
-        
-        - fix build; toBoolean no longer takes an ExecState
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-
-2008-10-04  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        Add a 'Check For Weak VTables' build phase to catch weak vtables as early as possible.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2008-10-01  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler and Cameron Zwarich.
-
-        * JSRun.cpp:
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax): Provide a SourceCode to the Interpreter, since
-        other APIs are no longer supported.
-
-2008-09-29  Geoffrey Garen  <ggaren@apple.com>
-
-        Not reviewed.
-        
-        Forwarding headers to fix the build.
-
-        * ForwardingHeaders/kjs/CTI.h: Copied from ForwardingHeaders/kjs/ExecState.h.
-        * ForwardingHeaders/kjs/ustring.h: Copied from ForwardingHeaders/kjs/ExecState.h.
-        * ForwardingHeaders/masm: Added.
-        * ForwardingHeaders/masm/X86Assembler.h: Added.
-        * ForwardingHeaders/profiler: Added.
-        * ForwardingHeaders/profiler/Profiler.h: Added.
-
-2008-09-08  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Maciej Stachowiak and Oliver Hunt.
-
-        Add forwarding headers.
-
-        * ForwardingHeaders/wtf/HashFunctions.h: Added.
-        * ForwardingHeaders/wtf/HashTraits.h: Added.
-
-2008-09-02  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-        
-        Implemented the rest of Darin's review comments for the 09-01 inline
-        caching patch.
-        
-        * ForwardingHeaders/kjs/PutPropertySlot.h: Added.
-
-2008-09-01  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler.
-
-        First cut at inline caching for access to vanilla JavaScript properties.
-        
-        Updated for JavaScriptCore changes. Mostly mechanical addition of StructureIDs
-        to JavaScriptGlue classes, and PutPropertySlot& arguments to put functions.
-
-2008-08-22  Anders Carlsson  <andersca@apple.com>
-
-        Fix build for real this time.
-        
-        * UserObjectImp.h:
-
-2008-08-22  Anders Carlsson  <andersca@apple.com>
-
-        Fix build.
-        
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive):
-        * UserObjectImp.h:
-
-2008-08-19  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoff Garen.
-
-        Bring back shared JSGlobalData and implicit locking, because too many clients rely on it.
-
-        * JSBase.cpp:
-        (JSBase::Release):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (unprotectGlobalObject):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2008-08-12  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff.
-
-        - eliminate JSValue::type()
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal): Replaced uses of JSValue::type() with
-        JSValue::is functions.
-        * UserObjectImp.cpp:
-        (UserObjectImp::getOwnPropertySlot): Ditto.
-        (UserObjectImp::toPrimitive): Take PreferredPrimitiveType argument
-        instead of JSType argument.
-        * UserObjectImp.h: Ditto.
-
-2008-08-17  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Cameron Zwarich.
-        
-        Updated project files to XCode 3.1.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2008-08-15  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Geoff Garen.
-
-        <rdar://problem/6139914> Please include a _debug version of JavaScriptCore framework
-
-        * Configurations/Base.xcconfig: Factor out the debug-only settings so that they can shared
-        between the Debug configuration and debug Production variant.
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Enable the debug variant.
-
-2008-07-31  Alexey Proskuryakov  <ap@webkit.org>
-
-        Rubber-stamped by Maciej.
-
-        Eliminate JSLock (it was already disabled, removing the stub implementaion and all
-        call sites now).
-
-        * JSBase.cpp:
-        (JSBase::Release):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (unprotectGlobalObject):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2008-07-29  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoff Garen.
-
-        Implement JSContextGroup APIs to make concurrent execution possible for
-        JavaScriptCore clients.
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        * JSUtils.cpp:
-        (getThreadGlobalExecState):
-        Changed JavaScriptGlue to use a JSGlobalData of its own, now that there is no shared
-        instance.
-
-2008-07-23  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoff Garen.
-
-        Make JSClassRef work with any context, not just the first one it was used in.
-
-        * ForwardingHeaders/wtf/HashMap.h: Added.
-
-2008-07-22  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt and Sam Weinig.
-
-        Next step toward putting doubles in registers: Prepare the Register class
-        and its clients for registers that don't contain JSValue*s.
-        
-2008-07-21  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        <rdar://problem/6091287> Revamp the handling of CFBundleShortVersionString to be fixed at the major component of the version number.
-
-        * Configurations/Version.xcconfig:
-        * Info.plist:
-
-2008-07-18  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Cameron Zwarich.
-        
-        Three renames:
-        
-        "CallTypeNative" => "CallTypeHost"
-        "code" => "byteCode"
-        "generatedCode" => "generatedByteCode"
-
-        * ChangeLog:
-        * JSObject.cpp:
-        (JSUserObject::getCallData):
-
-2008-07-14  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoff Garen.
-
-        Eliminate per-thread JavaScript global data instance support and make arbitrary
-        global data/global object combinations possible.
-
-        * ForwardingHeaders/wtf/ThreadSpecific.h: Added.
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        * JSUtils.cpp:
-        (getThreadGlobalExecState):
-        Adapt to the new way of asking for shared JSGlobalData.
-
-2008-07-10  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Define WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST when building WebKit to ensure that no symbols end up with the weak_import attribute.
-
-        * Configurations/JavaScriptGlue.xcconfig:
-
-2008-07-09  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Geoff Garen.
-
-        Don't warn about deprecated functions in production builds.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-
-2008-07-08  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        <rdar://problem/6058368> REGRESSION: Crash occurs in KJS::Machine after launching
-        Apple Installer
-
-        The problem was that JSUserObject::getCallData() was setting call type to native, but
-        left callData.native.function uninitialized.
-
-        * JSObject.cpp:
-        (JSUserObject::getCallData): Initialize callData.native.function.
-        (nativeCallFunction): Call UserObjectImp::callAsFunction().
-
-2008-07-04  Sam Weinig  <sam@webkit.org>
-
-        Rubber-stamped by Dan Bernstein.
-
-        * JSObject.h: Rename the header guard as it now conflicts with the
-        JSObject in JavaScriptCore.
-
-2008-07-01  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        Disable JSLock for per-thread contexts.
-
-        * ForwardingHeaders/wtf/Locker.h: Added.
-        * ForwardingHeaders/wtf/Threading.h: Added.
-        * JSBase.cpp:
-        (JSBase::Release):
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (unprotectGlobalObject):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        Pass a parameter (always true) to JSLock and JSLock::DropAllLocks to indicate that JSG
-        clients always need implicit mutex protection.
-        Added includes that are now needed.
-
-2008-06-26  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff.
-
-        * JSUtils.cpp: Added include of <JavaScriptCore/JSString.h> since jsString
-        will soon be changed to return a JSString*.
-        * UserObjectImp.cpp: Ditto.
-
-2008-06-23  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff.
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction): Updated to use getCallData and call instead
-        of the old callAsFunction.
-
-2008-06-17  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        Prepare JavaScript heap for being per-thread.
-
-        * JSRun.cpp: (JSRun::JSRun): Create JSGlueGlobalObject in a shared JS heap.
-
-        * JSUtils.h: Made getThreadGlobalExecState available throughout JSGlue.
-
-        * JSUtils.cpp:
-        (JSObjectKJSValue): Pass an ExecState where now required.
-        (unprotectGlobalObject):
-        (initializeGlobalObjectKey):
-        (getThreadGlobalExecState):
-        Moved these functions from JSValueWrapper.cpp, as the global exec state is now needed
-        elsewhere. I'm not quite sure how this relates to the global object from JSRun, but
-        since the new uses are all for Heap access, there doesn't seem to be any behavior change.
-
-        * JavaScriptGlue.cpp:
-        (JSLockInterpreter): Don't call registerThread explicitly, as JSLock will do that.
-
-        * UserObjectImp.cpp: (UserObjectImp::toPrimitive): Pass ExecState* where now required.
-
-2008-06-17  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Darin Adler.
-
-        <rdar://problem/5775802> JavaScriptGlue should not force use of GCC 4.0.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2008-06-16  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Alexey.
-
-        - removed nearly unused types.h and LocalStorageEntry.h headers
-
-        * JSUtils.h:
-
-2008-06-16  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoff Garen.
-
-        Make Identifier construction use an explicitly passed IdentifierTable.
-
-        * JSUtils.cpp:
-        (CFStringToIdentifier):
-        (KJSValueToCFTypeInternal):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getPropertyNames):
-        Pass ExecState or JSGlobalData everywhere.
-
-2008-06-15  Darin Adler  <darin@apple.com>
-
-        - rename KJS::List to KJS::ArgList
-
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCallFunction):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        * UserObjectImp.h:
-
-2008-06-15  Darin Adler  <darin@apple.com>
-
-        - new names for a few key JavaScriptCore files
-
-        * ForwardingHeaders/kjs/JSValue.h: Copied from JavaScriptGlue/ForwardingHeaders/kjs/value.h.
-        * ForwardingHeaders/kjs/value.h: Removed.
-        * JSUtils.h:
-
-2008-06-03  Darin Adler  <darin@apple.com>
-
-        - update for JavaScriptCore changes for https://bugs.webkit.org/show_bug.cgi?id=19269
-          speed up SunSpider by eliminating the toObject call for most get/put/delete
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::userObjectGetter): Removed originalObject argument.
-        * UserObjectImp.h: Ditto.
-
-2008-06-02  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Alexey Proskuryakov.
-
-        Removed JSObject::call, since it just called JSObject::callAsFunction.
-
-        SunSpider reports no change.
-
-2008-05-28  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-        
-        Fixed total destruction in Software Update.app.
-        
-        Updated JavaScriptGlue to honor squirrelfish's new getCallData mechanism for
-        indicating that an object can be called as a function.
-
-2008-05-10  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Oliver.
-
-        - JavaScriptGlue part of fix for: "SQUIRRELFISH: function toString broken after calling"
-        https://bugs.webkit.org/show_bug.cgi?id=18869
-        
-        * JSRun.cpp:
-        (JSRun::Evaluate): Use UString version of eveluate() instead of
-        the now departed UChar*/length variant; use of the lower-level
-        version was gratuitous in any case.
-        (JSRun::CheckSyntax): Ditto for checkSyntax().
-
-2008-04-30  Geoffrey Garen  <ggaren@apple.com>
-
-        Build fix: supply missing parameter that used to be implicit.
-
-        * JSRun.cpp:
-        (JSRun::Evaluate):
-
-2008-03-30  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-        
-        Build fix.
-
-        * ForwardingHeaders/wtf/UnusedParam.h: Copied from ForwardingHeaders/wtf/OwnPtr.h.
-
-2008-05-12  Alexey Proskuryakov  <ap@webkit.org>
-
-        Roll out recent  threading changes (r32807, r32810, r32819, r32822) to simplify
-        SquirrelFish merging.
-
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (unprotectGlobalObject):
-        (initializeGlobalObjectKey):
-        (getThreadGlobalExecState):
-        * JavaScriptGlue.cpp:
-        (JSCollect):
-        (JSLockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive):
-
-2008-05-02  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        Make JavaScriptGlue and JavaScriptCore API functions implicitly call initializeThreading
-        for the sake of non-WebKit clients.
-
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSCollect):
-        (JSCreateJSArrayFromCFArray):
-        (JSLockInterpreter):
-        These are all possible JavaScriptGlue entry points.
-
-2008-05-02  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Geoffrey Garen.
-
-        https://bugs.webkit.org/show_bug.cgi?id=18826
-        Make JavaScript heap per-thread
-
-        * JSValueWrapper.cpp:
-        * JSUtils.h:
-        Moved getThreadGlobalExecState() to JSUtils and made it extern, as ExecState is now needed
-        for all JS allocations.
-
-        * JSUtils.cpp:
-        (JSObjectKJSValue): Pass ExecState to functions that now need it.
-        (unprotectGlobalObject): Moved from JSValueWrapper.cpp.
-        (initializeGlobalObjectKey): Ditto.
-        (getThreadGlobalExecState): Ditto.
-
-        * UserObjectImp.cpp: (UserObjectImp::toPrimitive): Pass ExecState to jsString and jsNumber.
-
-        * JavaScriptGlue.cpp:
-        (JSCollect): Use current thread's heap.
-        (JSLockInterpreter): Removed JSLock::registerThread(), because a JS heap doesn't need to
-        know about other threads.
-
-2008-04-25  Alexey Proskuryakov  <ap@webkit.org>
-
-        Reviewed by Darin Adler.
-
-        Fix run-webkit-tests --threading
-        and provisionally fix <https://bugs.webkit.org/show_bug.cgi?id=18661>
-        Proxy server issue in Sunday's Nightly
-
-        * UserObjectImp.cpp: Adjusted for the new member added to ClassInfo.
-
-2008-04-25  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Adele Peterson.
-
-        <rdar://problem/5891264> Don't install the JavaScriptGlue headers
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2008-04-25  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Sam Weinig.
-
-        Add some content to an empty ICU header file to prevent verification errors.
-
-        * icu/unicode/utf_old.h:
-
-2008-04-02  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Ensure that debug symbols are generated for x86_64 and ppc64 builds.
-
-        * Configurations/Base.xcconfig:
-
-2008-03-20  Maciej Stachowiak  <mjs@apple.com>
-
-        - fix build
-
-        * ForwardingHeaders/wtf/ListRefPtr.h: Added.
-
-2008-03-01  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        Update Xcode configuration to support building debug and release from the mysterious future.
-
-        * Configurations/Base.xcconfig:
-        * Configurations/DebugRelease.xcconfig:
-
-2008-02-29  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by David Harrison.
-        
-        Fixed <rdar://problem/5765063> TOT REGRESSION: Software Update crash in
-        KJS::Collector::collect() (missing JSLock)
-
-        * JSValueWrapper.cpp:
-        (unprotectGlobalObject): Added missing JSLock.
-
-2008-02-05  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Oliver Hunt.
-
-        Update versioning to support the mysterious future.
-
-        * Configurations/Version.xcconfig: Add SYSTEM_VERSION_PREFIX_1060.
-
-2008-01-28  Eric Seidel  <eric@webkit.org>
-
-        Reviewed by darin.
-        
-        Add icu headers to JSG in preparation for depending on ::UChar.
-
-        * Configurations/Base.xcconfig:
-        * ForwardingHeaders/wtf/unicode: Added.
-        * ForwardingHeaders/wtf/unicode/Unicode.h: Added.
-        * ForwardingHeaders/wtf/unicode/icu: Added.
-        * ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h: Added.
-        * icu: Copied from ../JavaScriptCore/icu.
-
-2007-12-19  Geoffrey Garen  <ggaren@apple.com>
-
-        Build fix.
-
-        * ForwardingHeaders/wtf/VectorTraits.h: Added.
-
-2007-12-10  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Mark Rowe.
-
-        <rdar://problem/5639463> Bundle versions on Tiger should be 4523.x not 523.x
-
-        * Configurations/Version.xcconfig: Some Tiger versions of Xcode don't set MAC_OS_X_VERSION_MAJOR,
-          so assume Tiger and use a 4 for the SYSTEM_VERSION_PREFIX.
-
-2007-12-04  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Third step in refactoring JSGlobalObject: Moved data members and data
-        member access from Interpreter to JSGlobalObject. Replaced JSInterpreter
-        subclass with JSGlobalObject subclass.
-        
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax):
-        * JSRun.h:
-        (JSGlueGlobalObject::JSGlueGlobalObject):
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (getThreadGlobalExecState):
-
-2007-12-02  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Eric Seidel.
-
-        Updated to match the JavaScriptCore change to move virtual methods from
-        Interpreter to JSGlobalObject.
-        
-        * JSRun.cpp:
-        * JSRun.h:
-        * JSValueWrapper.cpp:
-        (getThreadGlobalExecState):
-        * JavaScriptGlue.cpp:
-        (JSRunCopyGlobalObject):
-        (JSRunEvaluate):
-
-2007-11-30  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Beth Dakin.
-        
-        Modified to follow new JSGlobalObject/Interpreter ownership rules 
-        in JavaScriptCore.
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        (JSRun::GetInterpreter):
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax):
-        * JSRun.h:
-        * JSValueWrapper.cpp:
-        (unprotectGlobalObject):
-        (initializeGlobalObjectKey):
-        (getThreadGlobalExecState):
-
-2007-11-29  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Maciej.
-
-        Fix REGRESSION(r27885): Installer hits assertion failure in JavaScriptGlue.
-
-        * JSValueWrapper.cpp:
-        (getThreadGlobalExecState): Set the global object on the Interpreter before using it.
-
-2007-11-27  Anders Carlsson  <andersca@apple.com>
-        
-        Build fix.
-        
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-
-2007-11-21  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Eric.
-
-        Fix JavaScriptGlue to build without warnings using GCC 4.2.
-
-        * Configurations/Base.xcconfig:
-        * JSRun.h:
-
-2007-11-17  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Darin Adler.
-
-        Fix: <rdar://problem/5607032> REGRESSION: testapi exits with assertion failure in debug build
-             <rdar://problem/5440659> JSGlobalContextCreate throws away globalObjectClass's prototype
-             http://bugs.webkit.org/show_bug.cgi?id=16033
-
-        Update for changes in Interpreter method signatures.
-
-        * JSRun.h:
-
-2007-11-13  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Anders Carlsson.
-
-        Renamed Shared to RefCounted.
-
-        * ForwardingHeaders/wtf/RefCounted.h: Copied from JavaScriptGlue/ForwardingHeaders/wtf/Shared.h.
-        * ForwardingHeaders/wtf/Shared.h: Removed.
-
-2007-11-13  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Sam Weinig.
-
-        Moved Shared.h into wtf so it could be used in more places.
-
-        * ForwardingHeaders/wtf/Shared.h: Added.
-
-2007-11-08  Mark Rowe  <mrowe@apple.com>
-
-        Build fix.
-
-        * ForwardingHeaders/wtf/MathExtras.h: Copied from WebCore/ForwardingHeaders/wtf/MathExtras.h.
-
-2007-11-05  Geoffrey Garen  <ggaren@apple.com>
-
-        Build fix.
-
-        * ForwardingHeaders/kjs/value.h: Added.
-
-2007-11-03  Sam Weinig  <sam@webkit.org>
-
-        Build-fix.
-
-        * UserObjectImp.cpp:
-
-2007-11-03  David D. Kilzer  <ddkilzer@webkit.org>
-
-        Sort files(...); sections of Xcode project files.
-
-        Rubber-stamped by Darin Adler.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2007-10-25  Eric Seidel  <eric@webkit.org>
-
-        Reviewed by Geoff.
-        
-        Make JSG build again after JSGlobalObject change.
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        (JSRun::GlobalObject):
-        * JSRun.h:
-        (JSInterpreter::JSInterpreter):
-        * JSUtils.h:
-
-2007-10-11  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        Fix for <rdar://problem/5488678>.  Disable debugging symbols in production builds for 10.4
-        PowerPC to prevent a huge STABS section from being generated.
-
-        * Configurations/Base.xcconfig:
-
-2007-10-04  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Oliver.
-
-        Switch to default level of debugging symbols to resolve <rdar://problem/5488678>.
-        The "full" level appears to offer no observable benefits even though the documentation
-        suggests it be used for dead code stripping.  This should also decrease link times.
-
-        * Configurations/Base.xcconfig:
-
-2007-09-03  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        <rdar://problem/5452164> Production build with in symbols directory has no debug info
-
-        Enable debug symbol generation on all build configurations.  Production builds are stripped
-        of symbols by Xcode during deployment post-processing.
-
-        * Configurations/Base.xcconfig:
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2007-08-09  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Antti.
-
-        <rdar://problem/5400709> Versioning in debug and release builds should include minor and tiny version before +
-
-        * Configurations/Version.xcconfig:
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Add a shell script phase to make to dependency between
-        Version.xcconfig and Info.plist explicit to Xcode.
-
-2007-07-16  Sam Weinig  <sam@webkit.org>
-
-        Reviewed by Oliver.
-
-        Turn off -Wshorten-64-to-32 warning for 64-bit builds.
-
-        * Configurations/Base.xcconfig:
-
-2007-04-27  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Oliver.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Improve dependencies in Xcode project
-        by marking JavaScriptGlue as a dependency of testjsglue.
-
-2007-03-24  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Dave Hyatt.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Use GCC 4.0 for testjsglue.
-
-2007-03-24  Mark Rowe  <mrowe@apple.com>
-
-        Rubber-stamped by Darin Adler.
-
-        * Configurations/JavaScriptGlue.xcconfig: Remove unnecessary INFOPLIST_PREPROCESS.
-
-2007-03-19  Andrew Wellington  <proton@wiretapped.net>
-
-        Reviewed by Maciej.
-
-        Really set Xcode editor to use 4 space indentation (http://webkit.org/coding/coding-style.html)
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2007-03-18  Andrew Wellington  <proton@wiretapped.net>
-
-        Reviewed by Mark Rowe
-        
-        Set Xcode editor to use 4 space indentation (http://webkit.org/coding/coding-style.html)
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2007-03-17  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Mark Rowe.
-
-        Made Version.xcconfig smarter when building for different configurations.
-        Now uses the 522+ OpenSource version for Debug and Release, while using the    
-        full 522.4 version for Production builds. The system prefix is also computed
-        based on the current system, so 4522.4 on Tiger and 5522.4 on Leopard.
-
-        * Configurations/JavaScriptGlue.xcconfig:
-        * Configurations/Version.xcconfig:
-
-2007-03-15  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by John.
-
-        * Factored out most of our common build settings into .xcconfig files. Anything that was common in
-          each build configuration was factored out into the shared .xcconfig file.
-        * Adds a Version.xcconfig file to define the current framework version, to be used in other places.
-        * Use the new $(BUNDLE_VERSION) (defined in Version.xcconfig) in the preprocessed Info.plist.
-        * Use the versions defined in Version.xcconfig to set $(DYLIB_CURRENT_VERSION).
-
-        * Configurations/Base.xcconfig: Added.
-        * Configurations/DebugRelease.xcconfig: Added.
-        * Configurations/JavaScriptGlue.xcconfig: Added.
-        * Configurations/Version.xcconfig: Added.
-        * Info.plist:
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-=== Safari-5522.4 ===
-
-2007-03-12  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Oliver Hunt.
-        
-        Updated in light of fix for <rdar://problem/4681051> Installer crashes 
-        in KJS::Collector::markOtherThreadConservatively(KJS::Collector::Thread*) 
-        trying to install iLife 06 using Rosetta on an Intel Machine
-        
-        * JavaScriptGlue.cpp:
-        (JSLockInterpreter): Ensure backwards compatibility by calling 
-        registerThread() when explicitly taking the JSLock. (This doesn't happen 
-        automatically anymore.) I doubt this actally matters, but in JavaScriptGlue
-        territory, that kind of thinking will get you killed.
-
-2007-03-06  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Maciej Stachowiak.
-
-        Fixed all known crashers exposed by run-webkit-tests --threaded while using
-        a PAC file (for maximum carnage). See JavaScriptCore ChangeLog for 
-        more details.
-
-        * JSBase.cpp:
-        (JSBase::Release): Lock when deleting, because we may be deleting an object
-        (like a JSRun) that holds thread-unsafe data.
-
-        * JSUtils.cpp:
-        (CFStringToUString): Don't lock, because our caller locks. Also, locking
-        inside a function that returns thread-unsafe data by copy will only mask
-        threading problems.
-
-        * JavaScriptGlue.cpp:
-        (JSRunEvaluate): Added missing JSLock.
-        (JSRunCheckSyntax): Converted to JSLock.
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2007-02-22  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler.
-        
-        Fixed <rdar://problem/4942528> Installer.app Stuck "Examining additional 
-        volumes..."
-        
-        The problem was that JavaScriptGlue held a JSObject in a static pointer
-        without protecting it from garbage collection. 
-        
-            sUserObjectPrototypeImp  = new UserObjectPrototypeImp();
-            static ProtectedPtr<UserObjectPrototypeImp> protectPrototype; // valiant, brave, but useless
-
-        Through an interesting comedy of errors, this object would be collected 
-        and then assigned as the prototype of another object allocated at the 
-        same address, thus becoming its own prototype. (See http://www.ziplo.com/grandpa.htm
-        for further explanation of this phenomenon.) Hence the infinte loop in 
-        property lookup.
-        
-        The solution is equally humorous: all of this code was completely useless --
-        it only served to create an empty object in the prototype chain -- so
-        I just removed it.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::UserObjectImp):
-        * UserObjectImp.h:
-
-2007-02-19  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Geoff.
-
-        <rdar://problem/4636301> Deprecate JavaScriptGlue
-
-        * JavaScriptGlue.h: adds DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER to everything
-        * JavaScriptGlue.xcodeproj/project.pbxproj: use -Wno-deprecated-declarations to keep the project building
-        * config.h: define DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER as empty on other systems
-
-2007-02-16  Darin Adler  <darin@apple.com>
-
-        Reviewed by Anders.
-
-        - fix <rdar://problem/5000216> JavaScriptGlue framework started turning all CFNumbers
-          into signed 32bit values
-
-        Circumstantial evidence seems to indicate that JavaScriptGlue was depending on a bug
-        in CFNumber where CFNumberIsFloatType was returning true for 64-bit integer values.
-
-        * JSUtils.cpp: (JSObjectKJSValue): Removed the call to CFNumberIsFloatType in the
-        conversion of numeric values, and always use kCFNumberDoubleType, since double is
-        the internal format of numbers in JavaScriptCore. There's no value to having a
-        separate code path for integers. There's also no reason to check the return value
-        from CFNumberGetValue -- if it returns false it still does the best it can to convert
-        to a double, which is what we want.
-
-        * UserObjectImp.cpp: (UserObjectImp::toString): Removed a similar code path that
-        tried to handle integers separate from double. Instead, always use a double. For
-        compatibility, use a format without a decimal point when CFNumberIsFloatType returns
-        false. Also removed a bogus cast to float; the "%f" format string takes a double,
-        not a float, so all the cast did was cut down on precision.
-
-2007-01-25  Mark Rowe  <mrowe@apple.com>
-
-        Reviewed by Maciej.
-
-        * Info.plist: Update copyright string.
-
-2006-12-19  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Darin Adler.
-
-        <rdar://problem/4891774> Local WebCore/WebBrowser builds fail in 9A328 due to warning about ObjC-2.0 language features
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-=== Safari-521.26 ===
-
-2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>
-
-        Reviewed by Tim H.
-
-        Build fix:  DWARF and -gfull are incompatible with symbol separation.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>
-
-        Reviewed by Tim H.
-
-        http://bugs.webkit.org/show_bug.cgi?id=10394
-        Bug 10394: WebKit Release and Production configurations should enable dead code stripping
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>
-
-        Reviewed by Tim H.
-
-        http://bugs.webkit.org/show_bug.cgi?id=10384
-        Bug 10384: Switch to DWARF for Release configuration
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-08-04  Sam Weinig  <sam.weinig@gmail.com>
-
-        Reviewed by Darin Adler.
-
-        - patch for http://bugs.webkit.org/show_bug.cgi?id=10192
-          Make WebCore (and friends) compile with -Wshorten-64-to-32
-
-          * Adds -Wshorten-64-to-32 flag to Xcode project.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-08-03  Sam Weinig  <sam.weinig@gmail.com>
-
-        Reviewed by Darin Adler.
-
-        - patch for http://bugs.webkit.org/show_bug.cgi?id=10176
-          Make WebCore compile with -Wundef
-
-          * Adds -Wundef flag to Xcode project
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-07-29  Sam Weinig  <sam.weinig@gmail.com>
-
-        Reviewed by Darin Adler.
-
-        - patch for http://bugs.webkit.org/show_bug.cgi?id=10080
-          Adopt pedantic changes from the Unity project to improve 
-          cross-compiler compatibility
-
-          Changes include:
-          * Turning on gcc warning for missing newline at the end of a source file
-            (GCC_WARN_ABOUT_MISSING_NEWLINE in Xcode, -Wnewline in gcc).
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-=== Safari-521.19 ===
-
-2006-07-19  Geoffrey Garen  <ggaren@apple.com>
-
-        Fixed by Darin & Maciej, reviewed by me.
-        
-        - Fixed <rdar://problem/4638934> Leopard 9A227: Installer crashes right 
-        after LCA and while preparing Installation
-
-        Compile release/production with NDEBUG set, to ensure binary compatibility
-        between JavaScriptGlue and JavaScriptCore. In debug builds, JavaScriptCore 
-        includes an extra debug data member in HashSet.
-        
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-=== Safari-521.18 ===
-
-2006-07-15  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Darin Adler.
-
-        - switch property lists to be vector+set of Identifiers instead of list of References
-        
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal): updated for JSC SPI changes
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames): ditto
-        * UserObjectImp.cpp:
-        (UserObjectImp::getPropertyNames): ditto
-        * UserObjectImp.h:
-
-=== Safari-521.17 ===
-
-2006-07-14  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Maciej.
-        
-        - Updated JSInterpreter to work with Interpreter ref-counting in JavaScriptCore.
-
-        (JSInterpreter::JSInterpreter::~JSInterpreter): Now protected to catch
-        manual delete.
-
-2006-07-12  Anders Carlsson  <acarlsson@apple.com>
-
-        Build fix
-        
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getPropertyList):
-        
-=== Safari-521.15 ===
-
-2006-07-07  Geoffrey Garen  <ggaren@apple.com>
-
-        - build fix
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-
-2006-07-03  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Maciej.
-        
-        * JSRun.cpp:
-        (JSRun::CheckSyntax): Updated to use new checkSyntax syntax in JSC.
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-=== Safari-521.14 ===
-
-2006-06-28  Timothy Hatcher  <timothy@apple.com>
-
-        Prefer the Stabs debugging symbols format until DWARF bugs are fixed.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-06-24  David Kilzer  <ddkilzer@kilzer.net>
-
-        Reviewed by Timothy.
-
-        * Info.plist: Fixed copyright to include 2003-2006.
-
-=== JavaScriptGlue-521.13 ===
-        
-2006-06-20  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Anders.
-        
-        - Required for JS API: Rename propList to getPropertyList and have it
-        take its target property list by reference so that subclasses can
-        add properties to the list before calling through to their superclasses.
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        * UserObjectImp.cpp:
-        (UserObjectImp::getPropertyList):
-        * UserObjectImp.h:
-
-2006-06-15  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Geoff and Darin.
-        
-        Prefer the DWARF debugging symbols format for use in Xcode 2.3.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-06-12  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by TimO, Maciej.
-        
-        - JSGlue part of merging InterpreterImp into Interpreter.
-        
-        Since there's now a kjs forwarding header, I moved all forwarding
-        headers into a "ForwardingHeaders" directory, like in WebCore.
-
-        * ForwardingHeaders: Added.
-        * ForwardingHeaders/kjs: Added.
-        * ForwardingHeaders/kjs/ExecState.h: Added.
-        * ForwardingHeaders/wtf: Added.
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        * config.h:
-        * wtf: Removed.
-        * wtf/AlwaysInline.h: Removed.
-        * wtf/Assertions.h: Removed.
-        * wtf/FastMalloc.h: Removed.
-        * wtf/Forward.h: Removed.
-        * wtf/HashCountedSet.h: Removed.
-        * wtf/HashSet.h: Removed.
-        * wtf/Noncopyable.h: Removed.
-        * wtf/OwnArrayPtr.h: Removed.
-        * wtf/OwnPtr.h: Removed.
-        * wtf/PassRefPtr.h: Removed.
-        * wtf/Platform.h: Removed.
-        * wtf/RefPtr.h: Removed.
-        * wtf/Vector.h: Removed.
-
-=== JavaScriptGlue-521.10 ===
-
-2006-05-09  Maciej Stachowiak  <mjs@apple.com>
-
-        Rubber stamped by Anders.
-        
-        - renamed kxmlcore to wtf
-        
-        kxmlcore --> wtf
-        KXMLCore --> WTF
-        KXC --> WTF
-
-        * config.h:
-        * kxmlcore: Removed.
-        * kxmlcore/AlwaysInline.h: Removed.
-        * kxmlcore/Assertions.h: Removed.
-        * kxmlcore/FastMalloc.h: Removed.
-        * kxmlcore/Forward.h: Removed.
-        * kxmlcore/HashCountedSet.h: Removed.
-        * kxmlcore/HashSet.h: Removed.
-        * kxmlcore/Noncopyable.h: Removed.
-        * kxmlcore/OwnArrayPtr.h: Removed.
-        * kxmlcore/OwnPtr.h: Removed.
-        * kxmlcore/PassRefPtr.h: Removed.
-        * kxmlcore/Platform.h: Removed.
-        * kxmlcore/RefPtr.h: Removed.
-        * kxmlcore/Vector.h: Removed.
-        * wtf: Added.
-
-2006-04-11  Darin Adler  <darin@apple.com>
-
-        - try to fix Windows build
-
-        * kxmlcore/HashForward.h: Removed.
-
-2006-04-10  Darin Adler  <darin@apple.com>
-
-        Rubber-stamped by John Sullivan.
-
-        - added forwarding headers for the new Forward.h and HashForward.h files
-
-        * kxmlcore/Forward.h: Added.
-        * kxmlcore/HashForward.h: Added.
-
-2006-04-04  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Darin Adler.
-
-        The Debug and Release frameworks are now built with install paths relative to the build products directory.
-        This removes the need for other projects to build with -framework WebCore and -framework JavaScriptCore. 
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-04-02  Eric Seidel  <eseidel@apple.com>
-
-        Reviewed by andersca.
-
-        Add missing forwarding header.
-
-        * kxmlcore/Vector.h: Added.
-
-2006-03-31  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Darin Adler.
-
-        - Fixed <rdar://problem/4430836> JavaScript patch crashing Quartz
-        Composer
-
-        JSValueWrappers used to hold on to the ExecState that pertained at
-        the time of their creation. Since ExecStates are transient, that
-        design was totally bogus, and it would crash once the ExecState had
-        been deallocated.
-
-        Unfortunately, there's no clean solution to this problem, since
-        the JSGlue API has no notion of state. The solution here is to use
-        a shared, global ExecState for the purpose of JSGlue calls. Given
-        the pre-existing limitations in the JSGlue API, this design
-        shouldn't actually introduce any new limitations (see comments in
-        JSValueWrapper.cpp).
-
-        I tested with Quartz Composer and PAC files, neither of which are
-        layout-testable.
-        
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (getProcessGlobalExecState):
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JSValueWrapper.h:
-
-        Also added a test harness file. It was helpful while I was testing,
-        and may come in handy in the future:
-        
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        testjsglue.cpp: Added.
-
-2006-03-28  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff.
-
-        - added a build step that checks for init routines
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Added a custom build phase that invokes the
-        check-for-global-initializers script.
-
-2006-03-02  Maciej Stachowiak  <mjs@apple.com>
-
-        Not reviewed, but I noticed these trivial extra changes were needed to avoid
-        breaking the build with my reviewed patch for:
-        
-        http://bugs.webkit.org/show_bug.cgi?id=7387
-        
-        Add config.h, includes of it, and Platform.h forwarding header.
-
-        * JSBase.cpp:
-        * JSObject.cpp:
-        * JSRun.cpp:
-        * JSUtils.cpp:
-        * JSValueWrapper.cpp:
-        * JavaScriptGlue.cpp:
-        * UserObjectImp.cpp:
-        * config.h: Added.
-        * kxmlcore/Platform.h: Added.
-
-=== JavaScriptGlue-521.7 ===
-
-2006-02-10  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by eric.
-
-        - Fixed build.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::toPrimitive):
-        * UserObjectImp.h:
-
-2006-02-03  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Justin.
-
-        Renamed configuration names to Debug, Release and Production.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2006-02-01  Darin Adler  <darin@apple.com>
-
-        - added some forwarding headers to make new JavaScriptCore changes work
-
-        * kxmlcore/Assertions.h: Added.
-        * kxmlcore/Noncopyable.h: Added.
-        * kxmlcore/OwnPtr.h: Added.
-        * kxmlcore/OwnArrayPtr.h: Added.
-
-2006-01-16  Timothy Hatcher  <timothy@apple.com>
-
-        Adding the license header to all files so we can
-        move JavaScriptGlue into the open source repository.
-
-        * LICENSE: Added.
-        * JSBase.cpp: license header added.
-        * JSBase.h: ditto.
-        * JSObject.cpp: ditto.
-        * JSObject.h: ditto.
-        * JSRun.cpp: ditto.
-        * JSRun.h: ditto.
-        * JSUtils.cpp: ditto.
-        * JSUtils.h: ditto.
-        * JSValueWrapper.cpp: ditto.
-        * JSValueWrapper.h: ditto.
-        * JavaScriptGlue.cpp: ditto.
-        * JavaScriptGlue.h: ditto.
-        * UserObjectImp.cpp: ditto.
-        * UserObjectImp.h: ditto.
-
-2005-12-21  Timothy Hatcher  <timothy@apple.com>
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-          Set tab width to 8, indent width to 4 and uses tabs to false per file.
-
-2005-12-19  Darin Adler  <darin@apple.com>
-
-        Reviewed by Geoff Garen and Eric Seidel.
-
-        - fix http://bugs.webkit.org/show_bug.cgi?id=4923
-          stop using <ostream> in WebCore, eliminating the <cmath> troubles it causes
-
-        * kxmlcore/AlwaysInline.h: Added.
-
-2005-12-15  Darin Adler  <darin@apple.com>
-
-        Reviewed by Maciej.
-
-        * JSRun.cpp: (JSRun::Evaluate): Updated for change to Interpreter::evaluate.
-
-2005-12-15  Darin Adler  <darin@apple.com>
-
-        Reviewed by Tim Hatcher.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Removed some redundant build
-        settings, turned off prebinding explicitly for our Development and
-        Deployment builds, remove .exp file from sources. All "clean-up".
-
-=== Safari-521~5 ===
-
-2005-12-13  Geoffrey Garen  <ggaren@apple.com>
-
-    - Fixed build after Anders's last checkin to JavaScriptCore.
-    
-        Reviewed by darin.
-
-        * UserObjectImp.cpp:
-        (UserObjectImp::userObjectGetter): Updated to reflect new argument that 
-    getters take (unused here).
-        * UserObjectImp.h:
-
-2005-12-13  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Eric.
-
-    - added forwarding header for HashCountedSet
-
-        * kxmlcore/HashCountedSet.h: Added.
-
-2005-12-10  Darin Adler  <darin@apple.com>
-
-        Rubber stamped by Maciej.
-
-        - updated for KJS class renaming
-
-        * many files and functions
-
-2005-12-10  Darin Adler  <darin@apple.com>
-
-        Reviewed by Maciej.
-
-        - eliminated the old Undefined(), Null(), Boolean(), Number(), and String()
-
-        Code now uses jsUndefined(), jsNull(), jsBoolean(), jsNumber(), and jsString().
-
-        * JSUtils.cpp:
-        (JSObjectKJSValue):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::toPrimitive):
-
-2005-12-05  Maciej Stachowiak  <mjs@apple.com>
-
-        - added new forwarding headers
-
-        * kxmlcore/PassRefPtr.h: Added.
-        * kxmlcore/RefPtr.h: Added.
-
-2005-12-05  Maciej Stachowiak  <mjs@apple.com>
-
-        * kxmlcore/PassRefPtr.h: Added.
-
-2005-11-26  Maciej Stachowiak  <mjs@apple.com>
-
-        Rubber stamped by Eric.
-
-    - renamed InterpreterLock to JSLock
-
-        * JSUtils.cpp:
-        (CFStringToUString):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-        (JSCollect):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2005-11-16  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Geoff.
-
-    Updated to use new API to drop all locks.
-
-        * JavaScriptGlue.cpp:
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * UserObjectImp.cpp:
-        (UserObjectImp::callAsFunction):
-
-2005-11-14  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by mjs.
-
-        - Part of the fix for <rdar://problem/4342216> Installer crash in 
-          KJS::ValueImp::marked() when garbage collector runs inside call to 
-          ConstantValues::init()
-          
-        Added locking in JSRunCreate, since JSRun::JSRun constructs an object.
-        
-        * JavaScriptGlue.cpp:
-        (JSRunCreate):
-
-2005-11-10  Geoffrey Garen  <ggaren@apple.com>
-
-        Reviewed by Maciej.
-
-        - Fixed <rdar://problem/4334445> installer crashed on my 
-          dual g4 450Mhz after clicking language
-
-        - Reversed backwards NULL check.
-        - Inserted guards against NULL fJSUserObject data member.
-        - Cleaned up some style.
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * UserObjectImp.cpp:
-        (UserObjectImp::~UserObjectImp):
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::userObjectGetter):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::mark):
-
-2005-11-04  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Darin Adler.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-          Fixed the FRAMEWORK_SEARCH_PATHS to look in the WebKit
-          Frameworks for the Default config.
-
-2005-11-03  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Darin and Vicki.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-          Change to use $(SYSTEM_LIBRARY_DIR) consistently and place
-          $(NEXT_ROOT) in a few spots to make build-root work.
-
-2005-11-01  Maciej Stachowiak  <mjs@apple.com>
-
-    Reviewed by: Eric.
-    
-        <rdar://problem/4324107> get JavaScriptGlue working with TOT JavaScriptCore again
-
-    - reverted all this stuff to use ReferenceList instead of IdentifierSequencedSet
-
-        * JSUtils.cpp:
-        (KJSValueToCFTypeInternal):
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        * UserObjectImp.cpp:
-        (UserObjectImp::propList):
-        * UserObjectImp.h:
-
-2005-10-11  Timothy Hatcher  <timothy@apple.com>
-
-        Setup the proper Framework search path for the Default config.
-        Prepping for a TOT submission and build by B&I.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-
-2005-10-10  Darin Adler  <darin@apple.com>
-
-        Reviewed by Eric.
-
-        - converted tabs to spaces, NULL to 0, added some (void), got rid of __ prefixes
-          in headers (reserved for compiler/library)
-
-        * Info.plist:
-        * JSBase.cpp:
-        * JSBase.h:
-        * JSObject.cpp:
-        * JSObject.h:
-        * JSRun.cpp:
-        * JSRun.h:
-        * JSUtils.cpp:
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        * JSValueWrapper.h:
-        * JavaScriptGlue.cpp:
-        * JavaScriptGlue.h:
-        * UserObjectImp.cpp:
-        * UserObjectImp.h:
-
-2005-10-10  Darin Adler  <darin@apple.com>
-
-        * .cvsignore: Added. Ignore Makefile.in and Makefile.
-
-2005-10-07  Timothy Hatcher  <timothy@apple.com>
-
-        Reviewed by Maciej.
-        
-        Build fix, needed to disable RTTI. Upgraded to a native target.
-
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        * Info.plist
-
-2005-10-05  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Eric and Darin.
-
-    <rdar://problem/4260506> Port JavaScriptGlue to TOT JavaScriptCore
-
-        * JSRun.cpp:
-        (JSRun::JSRun):
-        (JSRun::GlobalObject):
-        * JSRun.h:
-        (JSInterpreter::JSInterpreter):
-        * JSUtils.cpp:
-        (KJSValueToJSObject):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (KJSValueToCFType):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectMark):
-        * JSValueWrapper.h:
-        * JavaScriptGlue.cpp:
-        (JSRunCopyGlobalObject):
-        * JavaScriptGlue.xcodeproj/project.pbxproj:
-        * Makefile.am: Added.
-        * UserObjectImp.cpp:
-        (UserObjectPrototypeImp::GlobalUserObjectPrototypeImp):
-        (UserObjectImp::UserObjectImp):
-        (UserObjectImp::callAsFunction):
-        (UserObjectImp::getPropertyNames):
-        (UserObjectImp::userObjectGetter):
-        (UserObjectImp::getOwnPropertySlot):
-        (UserObjectImp::put):
-        (UserObjectImp::toPrimitive):
-        (UserObjectImp::mark):
-        * UserObjectImp.h:
-        * kxmlcore/FastMalloc.h: Added.
-        * kxmlcore/HashSet.h: Added.
-
-2005-09-14  Maciej Stachowiak  <mjs@apple.com>
-
-        Reviewed by Geoff.
-
-    - fixed <rdar://problem/4214783> REGRESSION: kjs_fast_malloc crash due to lack of locking on multiple threads (seen selecting volumes in the installer)
-
-    Make sure to lock using the InterpreterLock class in all places that need it
-    (including anything that uses the collector, the parser, the protect count hash table,
-    and anything that allocates via fast_malloc).
-
-        * JSUtils.cpp:
-        (CFStringToUString):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        * JSUtils.h:
-        * JSValueWrapper.cpp:
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        * JavaScriptGlue.cpp:
-        (JSCollect):
-
-2005-09-27  Adele Peterson  <adele@apple.com>
-
-        Reviewed by Maciej.
-
-        <rdar://problem/4223297> JavaScriptGlue: Submit 64-bit compatible versions of your API and SPIs by September 15
-
-        * JavaScriptGlue.h: Changed UInt32 to CFTypeID for JSTypeID
-
-2005-09-06  Geoffrey Garen  <ggaren@apple.com>
-
-        -upgraded project files to XCode 2.1
-
-        * JavaScriptGlue.pbproj/project.pbxproj: Removed.
-        * JavaScriptGlue.xcodeproj/.cvsignore: Added.
-        * JavaScriptGlue.xcodeproj/project.pbxproj: Added.
-
-2005-09-01  Maciej Stachowiak  <mjs@apple.com>
-
-        Rubber stamped by hyatt.
-
-    - initial import of JavaScriptGlue into our repository
-
-        * English.lproj/InfoPlist.strings: Added.
-        * JSBase.cpp: Added.
-        (JSBase::JSBase):
-        (JSBase::~JSBase):
-        (JSBase::Retain):
-        (JSBase::Release):
-        (JSBase::RetainCount):
-        (JSBase::GetTypeID):
-        (JSBase::CopyDescription):
-        (JSBase::Equal):
-        * JSBase.h: Added.
-        * JSObject.cpp: Added.
-        (JSUserObject::JSUserObject):
-        (JSUserObject::~JSUserObject):
-        (JSUserObject::CopyPropertyNames):
-        (JSUserObject::CopyProperty):
-        (JSUserObject::SetProperty):
-        (JSUserObject::ImplementsCall):
-        (JSUserObject::CallFunction):
-        (JSUserObject::CopyCFValue):
-        (JSUserObject::Equal):
-        (JSUserObject::Mark):
-        (JSUserObject::GetData):
-        * JSObject.h: Added.
-        (JSUserObject::DataType):
-        * JSRun.cpp: Added.
-        (JSRun::JSRun):
-        (JSRun::~JSRun):
-        (JSRun::Flags):
-        (JSRun::GetSource):
-        (JSRun::GlobalObject):
-        (JSRun::GetInterpreter):
-        (JSRun::Evaluate):
-        (JSRun::CheckSyntax):
-        * JSRun.h: Added.
-        (JSInterpreter::JSInterpreter):
-        (JSInterpreter::JSInterpreter::~JSInterpreter):
-        (JSInterpreter::Flags):
-        * JSUtils.cpp: Added.
-        (CFStringToUString):
-        (UStringToCFString):
-        (CFStringToIdentifier):
-        (IdentifierToCFString):
-        (KJSValueToJSObject):
-        (JSObjectKJSValue):
-        (KJSValueToCFTypeInternal):
-        (KJSValueToCFType):
-        (GetCFNull):
-        * JSUtils.h: Added.
-        (RetainCFType):
-        (ReleaseCFType):
-        * JSValueWrapper.cpp: Added.
-        (JSValueWrapper::JSValueWrapper):
-        (JSValueWrapper::~JSValueWrapper):
-        (JSValueWrapper::GetValue):
-        (JSValueWrapper::GetExecState):
-        (JSValueWrapper::GetJSObectCallBacks):
-        (JSValueWrapper::JSObjectDispose):
-        (JSValueWrapper::JSObjectCopyPropertyNames):
-        (JSValueWrapper::JSObjectCopyProperty):
-        (JSValueWrapper::JSObjectSetProperty):
-        (JSValueWrapper::JSObjectCallFunction):
-        (JSValueWrapper::JSObjectCopyCFValue):
-        (JSValueWrapper::JSObjectMark):
-        * JSValueWrapper.h: Added.
-        * JavaScriptGlue.cpp: Added.
-        (JSSetCFNull):
-        (JSGetCFNull):
-        (JSRetain):
-        (JSRelease):
-        (JSCopyDescription):
-        (JSEqual):
-        (JSGetTypeID):
-        (JSGetRetainCount):
-        (JSObjectCreate):
-        (JSObjectCreateInternal):
-        (JSObjectCopyCFValue):
-        (JSObjectGetData):
-        (JSObjectCopyProperty):
-        (JSObjectSetProperty):
-        (JSObjectCallFunction):
-        (JSRunCreate):
-        (JSRunCopySource):
-        (JSRunCopyGlobalObject):
-        (JSRunEvaluate):
-        (JSRunCheckSyntax):
-        (JSCollect):
-        (JSTypeGetCFArrayCallBacks):
-        (JSCFRetain):
-        (JSCFRelease):
-        (JSObjectCreateWithCFType):
-        (CFJSObjectDispose):
-        (JSObjectCopyPropertyNames):
-        (CFJSObjectCopyProperty):
-        (CFJSObjectSetProperty):
-        (CFJSObjectCopyCFValue):
-        (CFJSObjectEqual):
-        (CFJSObjectCopyPropertyNames):
-        (JSCreateCFArrayFromJSArray):
-        (JSCreateJSArrayFromCFArray):
-        (JSLockInterpreter):
-        (JSUnlockInterpreter):
-        * JavaScriptGlue.exp: Added.
-        * JavaScriptGlue.h: Added.
-        * JavaScriptGlue.pbproj/project.pbxproj: Added.
-        * UserObjectImp.cpp: Added.
-        (UserObjectPrototypeImp::UserObjectPrototypeImp):
-        (UserObjectPrototypeImp::GlobalUserObjectPrototypeImp):
-        (UserObjectImp::UserObjectImp):
-        (UserObjectImp::~UserObjectImp):
-        (UserObjectImp::classInfo):
-        (UserObjectImp::implementsCall):
-        (UserObjectImp::call):
-        (UserObjectImp::propList):
-        (UserObjectImp::hasProperty):
-        (UserObjectImp::get):
-        (UserObjectImp::put):
-        (UserObjectImp::GetJSUserObject):
-        (UserObjectImp::toPrimitive):
-        (UserObjectImp::toBoolean):
-        (UserObjectImp::toNumber):
-        (UserObjectImp::toString):
-        (UserObjectImp::mark):
-        * UserObjectImp.h: Added.
-
diff --git a/Source/JavaScriptGlue/Configurations/Base.xcconfig b/Source/JavaScriptGlue/Configurations/Base.xcconfig
deleted file mode 100644
index 9d4a2ee..0000000
--- a/Source/JavaScriptGlue/Configurations/Base.xcconfig
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2009 Apple Inc. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-// 1. Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-// 2. 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.
-//
-// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "CompilerVersion.xcconfig"
-
-COMPILER_SPECIFIC_WARNING_CFLAGS = $(COMPILER_SPECIFIC_WARNING_CFLAGS_$(TARGET_GCC_VERSION));
-COMPILER_SPECIFIC_WARNING_CFLAGS_LLVM_COMPILER = -Wglobal-constructors -Wexit-time-destructors;
-
-DEAD_CODE_STRIPPING = YES;
-DEBUG_INFORMATION_FORMAT = dwarf;
-GCC_C_LANGUAGE_STANDARD = gnu99;
-GCC_DEBUGGING_SYMBOLS = default;
-GCC_DYNAMIC_NO_PIC = NO;
-GCC_ENABLE_CPP_EXCEPTIONS = NO;
-GCC_ENABLE_CPP_RTTI = NO;
-GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-GCC_ENABLE_OBJC_GC = supported;
-GCC_ENABLE_SYMBOL_SEPARATION = NO;
-GCC_FAST_OBJC_DISPATCH = YES;
-GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
-GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
-GCC_MODEL_TUNING = G5;
-GCC_PRECOMPILE_PREFIX_HEADER = YES;
-GCC_STRICT_ALIASING = YES;
-GCC_THREADSAFE_STATICS = NO;
-GCC_TREAT_WARNINGS_AS_ERRORS = YES;
-GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
-GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
-GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
-GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
-LINKER_DISPLAYS_MANGLED_NAMES = YES;
-PREBINDING = NO;
-VALID_ARCHS = i386 ppc x86_64 ppc64;
-WARNING_CFLAGS = $(WARNING_CFLAGS_$(CURRENT_ARCH)) $(COMPILER_SPECIFIC_WARNING_CFLAGS);
-WARNING_CFLAGS_BASE = -Wall -W -Wchar-subscripts -Wformat-security -Wmissing-format-attribute -Wpointer-arith -Wwrite-strings -Wno-format-y2k -Wno-unused-parameter -Wundef -Wno-strict-aliasing;
-WARNING_CFLAGS_ = $(WARNING_CFLAGS_BASE) -Wshorten-64-to-32;
-WARNING_CFLAGS_i386 = $(WARNING_CFLAGS_BASE) -Wshorten-64-to-32;
-WARNING_CFLAGS_ppc = $(WARNING_CFLAGS_BASE) -Wshorten-64-to-32;
-// FIXME: JavaScriptGlue 64-bit builds should build with -Wshorten-64-to-32
-WARNING_CFLAGS_ppc64 = $(WARNING_CFLAGS_BASE);
-WARNING_CFLAGS_x86_64 = $(WARNING_CFLAGS_BASE);
-HEADER_SEARCH_PATHS = . icu $(HEADER_SEARCH_PATHS);
-
-
-REAL_PLATFORM_NAME = $(REAL_PLATFORM_NAME_$(PLATFORM_NAME));
-REAL_PLATFORM_NAME_ = $(REAL_PLATFORM_NAME_macosx);
-REAL_PLATFORM_NAME_iphoneos = iphoneos;
-REAL_PLATFORM_NAME_iphonesimulator = iphonesimulator;
-REAL_PLATFORM_NAME_macosx = macosx;
-
-TARGET_MAC_OS_X_VERSION_MAJOR = $(MAC_OS_X_VERSION_MAJOR);
-
-
-// DEBUG_DEFINES, GCC_OPTIMIZATION_LEVEL and STRIP_INSTALLED_PRODUCT vary between the debug and normal variants.
-// We set up the values for each variant here, and have the Debug configuration in the Xcode project use the _debug variant.
-DEBUG_DEFINES_debug = ;
-DEBUG_DEFINES_normal = NDEBUG;
-DEBUG_DEFINES = $(DEBUG_DEFINES_$(CURRENT_VARIANT));
-
-GCC_OPTIMIZATION_LEVEL = $(GCC_OPTIMIZATION_LEVEL_$(CURRENT_VARIANT));
-GCC_OPTIMIZATION_LEVEL_normal = s;
-GCC_OPTIMIZATION_LEVEL_debug = 0;
-
-STRIP_INSTALLED_PRODUCT = $(STRIP_INSTALLED_PRODUCT_$(CURRENT_VARIANT));
-STRIP_INSTALLED_PRODUCT_normal = YES;
-STRIP_INSTALLED_PRODUCT_debug = NO;
-
-// If the target Mac OS X version does not match the current Mac OS X version then we'll want to build using the target version's SDK.
-SDKROOT = $(SDKROOT_$(MAC_OS_X_VERSION_MAJOR)_$(TARGET_MAC_OS_X_VERSION_MAJOR));
-SDKROOT_1060_1050 = macosx10.5;
-SDKROOT_1070_1050 = macosx10.5;
-SDKROOT_1080_1050 = macosx10.5;
-SDKROOT_1090_1050 = macosx10.5;
-SDKROOT_1070_1060 = macosx10.6;
-SDKROOT_1080_1060 = macosx10.6;
-SDKROOT_1090_1060 = macosx10.6;
-SDKROOT_1080_1070 = macosx10.7;
-SDKROOT_1090_1070 = macosx10.7;
-SDKROOT_1090_1080 = macosx10.8;
diff --git a/Source/JavaScriptGlue/Configurations/CompilerVersion.xcconfig b/Source/JavaScriptGlue/Configurations/CompilerVersion.xcconfig
deleted file mode 100644
index a8c7f75..0000000
--- a/Source/JavaScriptGlue/Configurations/CompilerVersion.xcconfig
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-// 1. Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-// 2. 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.
-//
-// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. 
-
-IS_XCODE_0400 = $(IS_XCODE_0400_$(XCODE_VERSION_MINOR));
-IS_XCODE_0400_0400 = YES;
-
-IS_XCODE_0400_OR_0410 = $(IS_XCODE_0400_OR_0410_$(XCODE_VERSION_MINOR));
-IS_XCODE_0400_OR_0410_0400 = YES;
-IS_XCODE_0400_OR_0410_0410 = YES;
-
-// The version of the LLVM Compiler in Xcode 4.0 and earlier have difficulty compiling our code.
-LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS = $(LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS_$(XCODE_VERSION_MAJOR));
-LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS_0300 = YES;
-LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS_0400 = $(LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS_IS_XCODE_0400_$(IS_XCODE_0400));
-LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS_IS_XCODE_0400_YES = YES;
-
-// The version of the LLVM Compiler in Xcode 4.1 and earlier do not generate fast enough code.
-LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS = $(LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS_$(XCODE_VERSION_MAJOR));
-LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS_0300 = YES;
-LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS_0400 = $(LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS_IS_XCODE_0400_OR_0410_$(IS_XCODE_0400_OR_0410));
-LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS_IS_XCODE_0400_OR_0410_YES = YES;
-
-LLVM_COMPILER_SUITABLE_FOR_DEBUG_BUILDS = $(LLVM_COMPILER_SUITABLE_FOR_DEBUG_BUILDS_$(LLVM_COMPILER_UNSUITABLE_FOR_DEBUG_BUILDS));
-LLVM_COMPILER_SUITABLE_FOR_DEBUG_BUILDS_ = YES;
-LLVM_COMPILER_SUITABLE_FOR_DEBUG_BUILDS_YES = NO;
-
-LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS = $(LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS_$(LLVM_COMPILER_UNSUITABLE_FOR_OPTIMIZED_BUILDS));
-LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS_ = YES;
-LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS_YES = NO;
-
-
-// Use GCC 4.2 with Xcode 3.1, which includes GCC 4.2 but defaults to GCC 4.0.
-// Note that Xcode versions as new as 3.1.2 use XCODE_VERSION_ACTUAL for the minor version
-// number.  Newer versions of Xcode use XCODE_VERSION_MINOR for the minor version, and
-// XCODE_VERSION_ACTUAL for the full version number.
-TARGET_GCC_VERSION = $(TARGET_GCC_VERSION_$(REAL_PLATFORM_NAME));
-TARGET_GCC_VERSION_iphoneos = LLVM_GCC_42;
-TARGET_GCC_VERSION_iphonesimulator = GCC_42;
-TARGET_GCC_VERSION_macosx = $(TARGET_GCC_VERSION_macosx_$(TARGET_MAC_OS_X_VERSION_MAJOR));
-
-TARGET_GCC_VERSION_macosx_1050 = $(TARGET_GCC_VERSION_macosx_1050_$(XCODE_VERSION_MINOR));
-TARGET_GCC_VERSION_macosx_1050_ = $(TARGET_GCC_VERSION_macosx_1050_$(XCODE_VERSION_ACTUAL));
-TARGET_GCC_VERSION_macosx_1050_0310 = GCC_42;
-TARGET_GCC_VERSION_macosx_1050_0320 = GCC_42;
-
-TARGET_GCC_VERSION_macosx_1060 = $(TARGET_GCC_VERSION_macosx_1060_AND_1070_$(CONFIGURATION));
-TARGET_GCC_VERSION_macosx_1070 = $(TARGET_GCC_VERSION_macosx_1060_AND_1070_$(CONFIGURATION));
-TARGET_GCC_VERSION_macosx_1060_AND_1070_Debug = $(TARGET_GCC_VERSION_macosx_USE_LLVM_COMPILER_$(LLVM_COMPILER_SUITABLE_FOR_DEBUG_BUILDS));
-TARGET_GCC_VERSION_macosx_1060_AND_1070_Release = $(TARGET_GCC_VERSION_macosx_USE_LLVM_COMPILER_$(LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS));
-TARGET_GCC_VERSION_macosx_1060_AND_1070_Production = $(TARGET_GCC_VERSION_macosx_USE_LLVM_COMPILER_$(LLVM_COMPILER_SUITABLE_FOR_OPTIMIZED_BUILDS));
-TARGET_GCC_VERSION_macosx_1060_NON_LLVM_FALLBACK = GCC_42;
-TARGET_GCC_VERSION_macosx_1070_NON_LLVM_FALLBACK = LLVM_GCC_42;
-
-TARGET_GCC_VERSION_macosx_USE_LLVM_COMPILER_YES = LLVM_COMPILER;
-TARGET_GCC_VERSION_macosx_USE_LLVM_COMPILER_NO = $(TARGET_GCC_VERSION_macosx_$(TARGET_MAC_OS_X_VERSION_MAJOR)_NON_LLVM_FALLBACK);
-
-TARGET_GCC_VERSION_macosx_1080 = LLVM_COMPILER;
-TARGET_GCC_VERSION_macosx_1090 = LLVM_COMPILER;
-
-GCC_VERSION = $(GCC_VERSION_$(TARGET_GCC_VERSION));
-GCC_VERSION_GCC_40 = 4.0;
-GCC_VERSION_GCC_42 = 4.2;
-GCC_VERSION_LLVM_GCC_42 = com.apple.compilers.llvmgcc42;
-GCC_VERSION_LLVM_COMPILER = com.apple.compilers.llvm.clang.1_0;
diff --git a/Source/JavaScriptGlue/Configurations/DebugRelease.xcconfig b/Source/JavaScriptGlue/Configurations/DebugRelease.xcconfig
deleted file mode 100644
index 486d298..0000000
--- a/Source/JavaScriptGlue/Configurations/DebugRelease.xcconfig
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2009 Apple Inc. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-// 1. Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-// 2. 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.
-//
-// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "Base.xcconfig"
-
-ARCHS = $(ARCHS_$(TARGET_MAC_OS_X_VERSION_MAJOR));
-ARCHS_1050 = $(NATIVE_ARCH);
-ARCHS_1060 = $(ARCHS_STANDARD_32_64_BIT);
-ARCHS_1070 = $(ARCHS_STANDARD_32_64_BIT);
-ARCHS_1080 = $(ARCHS_STANDARD_32_64_BIT);
-ARCHS_1090 = $(ARCHS_STANDARD_32_64_BIT);
-
-ONLY_ACTIVE_ARCH = YES;
-
-MACOSX_DEPLOYMENT_TARGET = $(MACOSX_DEPLOYMENT_TARGET_$(TARGET_MAC_OS_X_VERSION_MAJOR));
-MACOSX_DEPLOYMENT_TARGET_1050 = 10.5;
-MACOSX_DEPLOYMENT_TARGET_1060 = 10.6;
-MACOSX_DEPLOYMENT_TARGET_1070 = 10.7;
-MACOSX_DEPLOYMENT_TARGET_1080 = 10.8;
-MACOSX_DEPLOYMENT_TARGET_1090 = 10.9;
-
-GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES;
diff --git a/Source/JavaScriptGlue/Configurations/JavaScriptGlue.xcconfig b/Source/JavaScriptGlue/Configurations/JavaScriptGlue.xcconfig
deleted file mode 100644
index 8fc997d..0000000
--- a/Source/JavaScriptGlue/Configurations/JavaScriptGlue.xcconfig
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2009 Apple Inc. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-// 1. Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-// 2. 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.
-//
-// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "Version.xcconfig"
-EXPORTED_SYMBOLS_FILE = JavaScriptGlue.exp;
-GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST $(GCC_PREPROCESSOR_DEFINITIONS);
-HEADER_SEARCH_PATHS = ForwardingHeaders $(HEADER_SEARCH_PATHS);
-INFOPLIST_FILE = Info.plist;
-INSTALL_PATH = $(SYSTEM_LIBRARY_DIR)/PrivateFrameworks;
-OTHER_CFLAGS = -Wno-deprecated-declarations;
-PRODUCT_NAME = JavaScriptGlue;
diff --git a/Source/JavaScriptGlue/Configurations/Version.xcconfig b/Source/JavaScriptGlue/Configurations/Version.xcconfig
deleted file mode 100644
index 0510654..0000000
--- a/Source/JavaScriptGlue/Configurations/Version.xcconfig
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 Apple Inc. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-// 1. Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-// 2. 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.
-//
-// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. 
-
-MAJOR_VERSION = 535;
-MINOR_VERSION = 19;
-TINY_VERSION = 0;
-FULL_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION);
-
-// The bundle version and short version string are set based on the current build configuration, see below.
-BUNDLE_VERSION = $(BUNDLE_VERSION_$(CONFIGURATION));
-SHORT_VERSION_STRING = $(SHORT_VERSION_STRING_$(CONFIGURATION))
-
-// The system version prefix is based on the current system version.
-SYSTEM_VERSION_PREFIX = $(SYSTEM_VERSION_PREFIX_$(TARGET_MAC_OS_X_VERSION_MAJOR));
-SYSTEM_VERSION_PREFIX_1050 = 5;
-SYSTEM_VERSION_PREFIX_1060 = 6;
-SYSTEM_VERSION_PREFIX_1070 = 7;
-SYSTEM_VERSION_PREFIX_1080 = 8;
-SYSTEM_VERSION_PREFIX_1090 = 9;
-
-// The production build always uses the full version with a system version prefix.
-BUNDLE_VERSION_Production = $(SYSTEM_VERSION_PREFIX)$(FULL_VERSION);
-BUNDLE_VERSION_ = $(BUNDLE_VERSION_Production);
-
-// The production build always uses the major version with a system version prefix
-SHORT_VERSION_STRING_Production = $(SYSTEM_VERSION_PREFIX)$(MAJOR_VERSION);
-SHORT_VERSION_STRING_ = $(SHORT_VERSION_STRING_Production);
-
-// Local builds are the full version with a plus suffix.
-BUNDLE_VERSION_Release = $(FULL_VERSION)+;
-BUNDLE_VERSION_Debug = $(BUNDLE_VERSION_Release);
-
-// Local builds use the major version with a plus suffix
-SHORT_VERSION_STRING_Release = $(MAJOR_VERSION)+;
-SHORT_VERSION_STRING_Debug = $(SHORT_VERSION_STRING_Release);
-
-DYLIB_COMPATIBILITY_VERSION = 1;
-DYLIB_CURRENT_VERSION = $(FULL_VERSION);
diff --git a/Source/JavaScriptGlue/English.lproj/InfoPlist.strings b/Source/JavaScriptGlue/English.lproj/InfoPlist.strings
deleted file mode 100644
index 5a35b05..0000000
--- a/Source/JavaScriptGlue/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/masm/X86Assembler.h b/Source/JavaScriptGlue/ForwardingHeaders/masm/X86Assembler.h
deleted file mode 100644
index e1f0b4d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/masm/X86Assembler.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/X86Assembler.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/profiler/Profiler.h b/Source/JavaScriptGlue/ForwardingHeaders/profiler/Profiler.h
deleted file mode 100644
index 56c6e0e..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/profiler/Profiler.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Profiler.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/runtime/CallFrame.h b/Source/JavaScriptGlue/ForwardingHeaders/runtime/CallFrame.h
deleted file mode 100644
index c8c60d4..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/runtime/CallFrame.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/CallFrame.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/runtime/JSExportMacros.h b/Source/JavaScriptGlue/ForwardingHeaders/runtime/JSExportMacros.h
deleted file mode 100644
index 7a71add..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/runtime/JSExportMacros.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/JSExportMacros.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ASCIICType.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ASCIICType.h
deleted file mode 100644
index f2258d2..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ASCIICType.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ASCIICType.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Alignment.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Alignment.h
deleted file mode 100644
index e83483e..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Alignment.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Alignment.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/AlwaysInline.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/AlwaysInline.h
deleted file mode 100644
index e591f71..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/AlwaysInline.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/AlwaysInline.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Assertions.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Assertions.h
deleted file mode 100644
index 2144410..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Assertions.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Assertions.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Atomics.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Atomics.h
deleted file mode 100644
index 37b1892..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Atomics.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Atomics.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Bitmap.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Bitmap.h
deleted file mode 100644
index d365065..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Bitmap.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Bitmap.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/BumpPointerAllocator.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/BumpPointerAllocator.h
deleted file mode 100644
index f685611..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/BumpPointerAllocator.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/BumpPointerAllocator.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/CheckedBoolean.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/CheckedBoolean.h
deleted file mode 100644
index 79e051c..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/CheckedBoolean.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/CheckedBoolean.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Compiler.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Compiler.h
deleted file mode 100644
index 340d8c9..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Compiler.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Compiler.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/CurrentTime.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/CurrentTime.h
deleted file mode 100644
index a31a23d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/CurrentTime.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/CurrentTime.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateInstanceCache.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateInstanceCache.h
deleted file mode 100644
index dbc18a0..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateInstanceCache.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/DateInstanceCache.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateMath.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateMath.h
deleted file mode 100644
index becafe1..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DateMath.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/DateMath.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DoublyLinkedList.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/DoublyLinkedList.h
deleted file mode 100644
index e87c862..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DoublyLinkedList.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/DoublyLinkedList.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DynamicAnnotations.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/DynamicAnnotations.h
deleted file mode 100644
index 1280da8..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/DynamicAnnotations.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/DynamicAnnotations.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ExportMacros.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ExportMacros.h
deleted file mode 100644
index 50be070..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ExportMacros.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ExportMacros.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastAllocBase.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastAllocBase.h
deleted file mode 100644
index 421c040..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastAllocBase.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/FastAllocBase.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastMalloc.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastMalloc.h
deleted file mode 100644
index 1701231..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FastMalloc.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/FastMalloc.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FixedArray.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/FixedArray.h
deleted file mode 100644
index cc9f599..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/FixedArray.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/FixedArray.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Forward.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Forward.h
deleted file mode 100644
index 2d707ec..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Forward.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Forward.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashCountedSet.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashCountedSet.h
deleted file mode 100644
index 7388f5a..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashCountedSet.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashCountedSet.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashFunctions.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashFunctions.h
deleted file mode 100644
index 0fa568a..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashFunctions.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashFunctions.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashMap.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashMap.h
deleted file mode 100644
index 9f262e2..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashMap.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashMap.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashSet.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashSet.h
deleted file mode 100644
index cfe2d80..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashSet.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashSet.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTable.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTable.h
deleted file mode 100644
index a5e4d57..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTable.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashTable.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTraits.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTraits.h
deleted file mode 100644
index 412fa98..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/HashTraits.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/HashTraits.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListHashSet.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListHashSet.h
deleted file mode 100644
index 4aef773..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListHashSet.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ListHashSet.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListRefPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListRefPtr.h
deleted file mode 100644
index b766736..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ListRefPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ListRefPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Locker.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Locker.h
deleted file mode 100644
index 75b0acd..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Locker.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Locker.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MainThread.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/MainThread.h
deleted file mode 100644
index ff75971..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MainThread.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/MainThread.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MathExtras.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/MathExtras.h
deleted file mode 100644
index 2955786..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MathExtras.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/MathExtras.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MetaAllocatorHandle.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/MetaAllocatorHandle.h
deleted file mode 100644
index a17b08e..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/MetaAllocatorHandle.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/MetaAllocatorHandle.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Noncopyable.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Noncopyable.h
deleted file mode 100644
index f8484d2..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Noncopyable.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Noncopyable.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/NotFound.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/NotFound.h
deleted file mode 100644
index cfe1896..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/NotFound.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/NotFound.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OSAllocator.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/OSAllocator.h
deleted file mode 100644
index 637611a..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OSAllocator.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/OSAllocator.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnArrayPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnArrayPtr.h
deleted file mode 100644
index 595817d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnArrayPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/OwnArrayPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtr.h
deleted file mode 100644
index 9211d38..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/OwnPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtrCommon.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtrCommon.h
deleted file mode 100644
index 4917541..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/OwnPtrCommon.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/OwnPtrCommon.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocation.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocation.h
deleted file mode 100644
index 54dfcdf..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocation.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PageAllocation.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocationAligned.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocationAligned.h
deleted file mode 100644
index caa8e0d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageAllocationAligned.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PageAllocationAligned.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageBlock.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageBlock.h
deleted file mode 100644
index 49484ff..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageBlock.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PageBlock.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageReservation.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageReservation.h
deleted file mode 100644
index 81581b6..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PageReservation.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PageReservation.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnArrayPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnArrayPtr.h
deleted file mode 100644
index 97f4a9d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnArrayPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PassOwnArrayPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnPtr.h
deleted file mode 100644
index 6064e88..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassOwnPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PassOwnPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassRefPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassRefPtr.h
deleted file mode 100644
index aafd1a2..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PassRefPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PassRefPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Platform.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Platform.h
deleted file mode 100644
index 3b22955..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Platform.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Platform.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PossiblyNull.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PossiblyNull.h
deleted file mode 100644
index af7c120..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PossiblyNull.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PossiblyNull.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PtrAndFlags.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/PtrAndFlags.h
deleted file mode 100644
index 38bdfb4..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/PtrAndFlags.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/PtrAndFlags.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RandomNumber.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/RandomNumber.h
deleted file mode 100644
index 42e148a..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RandomNumber.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/RandomNumber.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefCounted.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefCounted.h
deleted file mode 100644
index 628a63b..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefCounted.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/RefCounted.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefPtr.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefPtr.h
deleted file mode 100644
index 0ff6213..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/RefPtr.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/RefPtr.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Spectrum.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Spectrum.h
deleted file mode 100644
index ccf5032..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Spectrum.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Spectrum.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StackBounds.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/StackBounds.h
deleted file mode 100644
index dfec694..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StackBounds.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/StackBounds.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StdLibExtras.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/StdLibExtras.h
deleted file mode 100644
index 3222ec1..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StdLibExtras.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/StdLibExtras.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StringHasher.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/StringHasher.h
deleted file mode 100644
index 1380335..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/StringHasher.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/StringHasher.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/TemporaryChange.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/TemporaryChange.h
deleted file mode 100644
index 3367eb2..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/TemporaryChange.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/TemporaryChange.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadRestrictionVerifier.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadRestrictionVerifier.h
deleted file mode 100644
index fb7f979..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadRestrictionVerifier.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ThreadRestrictionVerifier.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSafeRefCounted.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSafeRefCounted.h
deleted file mode 100644
index 48a54cc..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSafeRefCounted.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ThreadSafeRefCounted.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSpecific.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSpecific.h
deleted file mode 100644
index 48f1db5..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadSpecific.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ThreadSpecific.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Threading.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Threading.h
deleted file mode 100644
index 17359e5..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Threading.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Threading.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadingPrimitives.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadingPrimitives.h
deleted file mode 100644
index a7ee117..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ThreadingPrimitives.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ThreadingPrimitives.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/UnusedParam.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/UnusedParam.h
deleted file mode 100644
index aa3d3d0..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/UnusedParam.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/UnusedParam.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/VMTags.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/VMTags.h
deleted file mode 100644
index fda3516..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/VMTags.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/VMTags.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ValueCheck.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/ValueCheck.h
deleted file mode 100644
index 904b15d..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/ValueCheck.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ValueCheck.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Vector.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/Vector.h
deleted file mode 100644
index c6d15fd..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/Vector.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Vector.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/VectorTraits.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/VectorTraits.h
deleted file mode 100644
index 2fc1158..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/VectorTraits.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/VectorTraits.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/WTFThreadData.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/WTFThreadData.h
deleted file mode 100644
index 925b698..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/WTFThreadData.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/WTFThreadData.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/ASCIIFastPath.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/ASCIIFastPath.h
deleted file mode 100644
index fa38441..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/ASCIIFastPath.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/ASCIIFastPath.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/CString.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/CString.h
deleted file mode 100644
index 50e766b..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/CString.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/CString.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringHash.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringHash.h
deleted file mode 100644
index 902082f..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringHash.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/StringHash.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringImpl.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringImpl.h
deleted file mode 100644
index 029ea84..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/StringImpl.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/StringImpl.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/TextPosition.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/TextPosition.h
deleted file mode 100644
index bd4f09b..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/TextPosition.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/TextPosition.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/WTFString.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/WTFString.h
deleted file mode 100644
index 8addade..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/text/WTFString.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/WTFString.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/Unicode.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/Unicode.h
deleted file mode 100644
index 623917f..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/Unicode.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/Unicode.h>
diff --git a/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h b/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h
deleted file mode 100644
index 6b64eb5..0000000
--- a/Source/JavaScriptGlue/ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <JavaScriptCore/UnicodeIcu.h>
diff --git a/Source/JavaScriptGlue/Info.plist b/Source/JavaScriptGlue/Info.plist
deleted file mode 100644
index d2733ac..0000000
--- a/Source/JavaScriptGlue/Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundleGetInfoString</key>
-	<string>${BUNDLE_VERSION}, Copyright 2003-2012 Apple Inc.</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.apple.${PRODUCT_NAME}</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleShortVersionString</key>
-	<string>${SHORT_VERSION_STRING}</string>
-	<key>CFBundleVersion</key>
-	<string>${BUNDLE_VERSION}</string>
-</dict>
-</plist>
diff --git a/Source/JavaScriptGlue/JSBase.cpp b/Source/JavaScriptGlue/JSBase.cpp
deleted file mode 100644
index 39f24e5..0000000
--- a/Source/JavaScriptGlue/JSBase.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JSBase.h"
-
-JSBase::JSBase(JSTypeID type) : fTypeID(type), fRetainCount(1)
-{
-}
-
-JSBase::~JSBase()
-{
-}
-
-JSBase* JSBase::Retain()
-{
-    fRetainCount++; return this;
-}
-
-void JSBase::Release()
-{
-    if (--fRetainCount == 0)
-    {
-        JSGlueAPIEntry entry;
-        delete this;
-    }
-}
-
-CFIndex JSBase::RetainCount() const
-{
-    return fRetainCount;
-}
-
-JSTypeID JSBase::GetTypeID() const
-{
-    return fTypeID;
-}
-
-CFStringRef JSBase::CopyDescription()
-{
-    return CFStringCreateWithFormat(
-                0,
-                0,
-                CFSTR("<JSTypeRef- ptr:0x%lx type: %d, retaincount: %ld>"),
-                (long)this,
-                (int)fTypeID,
-                (long)fRetainCount);
-}
-
-UInt8 JSBase::Equal(JSBase* other)
-{
-    return this == other;
-}
diff --git a/Source/JavaScriptGlue/JSBase.h b/Source/JavaScriptGlue/JSBase.h
deleted file mode 100644
index dbb4b94..0000000
--- a/Source/JavaScriptGlue/JSBase.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JSBase_h
-#define JSBase_h
-
-#include "JSUtils.h"
-
-class JSBase {
-    public:
-        JSBase(JSTypeID type);
-        virtual ~JSBase();
-
-        JSBase* Retain();
-        void Release();
-        CFIndex RetainCount() const;
-        JSTypeID GetTypeID() const;
-
-        virtual CFStringRef CopyDescription();
-        virtual UInt8 Equal(JSBase* other);
-
-    private:
-        JSTypeID fTypeID;
-        CFIndex fRetainCount;
-};
-
-#endif
diff --git a/Source/JavaScriptGlue/JSObject.cpp b/Source/JavaScriptGlue/JSObject.cpp
deleted file mode 100644
index d7305cb..0000000
--- a/Source/JavaScriptGlue/JSObject.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JSObject.h"
-
-#include "UserObjectImp.h"
-
-JSUserObject::JSUserObject(JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, void *data, int dataType)
-    : JSBase(kJSObjectTypeID), fCallBacks(*callBacks), fMarkProc(markProc), fData(data), fDataType(dataType)
-{
-}
-
-JSUserObject::~JSUserObject()
-{
-    if (fCallBacks.dispose)
-    {
-        fCallBacks.dispose(fData);
-    }
-}
-
-CFArrayRef JSUserObject::CopyPropertyNames(void)
-{
-    CFArrayRef result = 0;
-    if (fCallBacks.copyPropertyNames)
-    {
-        result = fCallBacks.copyPropertyNames(fData);
-    }
-    return result;
-}
-
-JSUserObject* JSUserObject::CopyProperty(CFStringRef propertyName)
-{
-    JSUserObject* result = 0;
-    if (fCallBacks.copyProperty)
-    {
-        result = (JSUserObject*)fCallBacks.copyProperty(fData, propertyName);
-    }
-    return result;
-}
-
-void JSUserObject::SetProperty(CFStringRef propertyName, JSUserObject* value)
-{
-    if (fCallBacks.setProperty)
-    {
-        fCallBacks.setProperty(fData, propertyName, (JSObjectRef)value);
-    }
-
-}
-
-static EncodedJSValue JSC_HOST_CALL nativeCallFunction(ExecState* exec);
-static EncodedJSValue nativeCallFunction(ExecState* exec)
-{
-    return JSValue::encode(static_cast<UserObjectImp*>(exec->callee())->callAsFunction(exec));
-}
-
-CallType JSUserObject::getCallData(CallData& callData)
-{
-    if (!fCallBacks.callFunction)
-        return CallTypeNone;
-
-    callData.native.function = nativeCallFunction;
-    return CallTypeHost;
-}
-
-JSUserObject* JSUserObject::CallFunction(JSUserObject* thisObj, CFArrayRef args)
-{
-    JSUserObject* result = 0;
-    if (fCallBacks.callFunction)
-    {
-        result = (JSUserObject*)fCallBacks.callFunction(fData, (JSObjectRef)thisObj, args);
-    }
-    return result;
-
-}
-
-CFTypeRef JSUserObject::CopyCFValue() const
-{
-    CFTypeRef result = 0;
-    if (fCallBacks.copyCFValue)
-    {
-        result = (JSUserObject*)fCallBacks.copyCFValue(fData);
-    }
-    return result;
-}
-
-UInt8 JSUserObject::Equal(JSBase* other)
-{
-    UInt8 result = false;
-    JSUserObject* obj = (JSUserObject*)other;
-    if (obj->GetTypeID() == kJSObjectTypeID)
-    {
-        if (fCallBacks.equal)
-        {
-            result = fCallBacks.equal(GetData(), obj->GetData());
-        }
-        else
-        {
-            CFTypeRef cf1 = CopyCFValue();
-            CFTypeRef cf2 = obj->CopyCFValue();
-            if (cf1 && cf2)
-            {
-                result = CFEqual(cf1, cf2);
-            }
-            ReleaseCFType(cf2);
-            ReleaseCFType(cf1);
-        }
-    }
-    return result;
-}
-
-void JSUserObject::Mark()
-{
-    if (fMarkProc)
-    {
-        fMarkProc(fData);
-    }
-}
-
-void *JSUserObject::GetData()
-{
-    return fData;
-}
-
-
diff --git a/Source/JavaScriptGlue/JSObject.h b/Source/JavaScriptGlue/JSObject.h
deleted file mode 100644
index ec00dac..0000000
--- a/Source/JavaScriptGlue/JSObject.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JSGlue_JSObject_h
-#define JSGlue_JSObject_h
-
-#include "JSBase.h"
-#include "JSUtils.h"
-
-typedef void (*JSObjectMarkProcPtr)(void *data);
-JSObjectRef JSObjectCreateInternal(void *data, JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, int dataType);
-
-class JSUserObject : public JSBase {
-    public:
-        JSUserObject(JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, void *data, int dataType);
-        virtual ~JSUserObject();
-
-        CFArrayRef CopyPropertyNames(void);
-        JSUserObject* CopyProperty(CFStringRef propertyName);
-        void SetProperty(CFStringRef propertyName, JSUserObject* value);
-        CallType getCallData(CallData&);
-        JSUserObject* CallFunction(JSUserObject* thisObj, CFArrayRef args);
-        CFTypeRef CopyCFValue() const;
-        virtual UInt8 Equal(JSBase* other);
-        void *GetData();
-        void Mark();
-
-                int DataType() const { return fDataType; }
-    private:
-        JSObjectCallBacks fCallBacks;
-        JSObjectMarkProcPtr fMarkProc;
-        void *fData;
-                int fDataType;
-};
-
-#endif // JSGlue_JSObject_h
diff --git a/Source/JavaScriptGlue/JSRun.cpp b/Source/JavaScriptGlue/JSRun.cpp
deleted file mode 100644
index 64fce1b..0000000
--- a/Source/JavaScriptGlue/JSRun.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JSRun.h"
-
-#include "UserObjectImp.h"
-#include <JavaScriptCore/Completion.h>
-#include <JavaScriptCore/SourceCode.h>
-#include <JavaScriptCore/StrongInlines.h>
-
-JSGlueGlobalObject::JSGlueGlobalObject(JSGlobalData& globalData, Structure* structure, Structure* userObjectStructure, JSFlags flags)
-    : JSGlobalObject(globalData, structure)
-    , m_flags(flags)
-    , m_userObjectStructure(globalData, userObjectStructure)
-{
-}
-
-JSRun::JSRun(CFStringRef source, JSFlags inFlags)
-    :   JSBase(kJSRunTypeID),
-        fSource(CFStringToUString(source)),
-        fGlobalObject(getThreadGlobalExecState()->globalData(), JSGlueGlobalObject::create(getThreadGlobalExecState()->globalData(), JSGlueGlobalObject::createStructure(getThreadGlobalExecState()->globalData(), jsNull()), inFlags)),
-        fFlags(inFlags)
-{
-}
-
-JSRun::~JSRun()
-{
-}
-
-JSFlags JSRun::Flags() const
-{
-    return fFlags;
-}
-
-UString JSRun::GetSource() const
-{
-    return fSource;
-}
-
-JSGlobalObject* JSRun::GlobalObject() const
-{
-    return fGlobalObject.get();
-}
-
-JSValue JSRun::Evaluate(JSValue* expception)
-{
-    return JSC::evaluate(fGlobalObject->globalExec(), fGlobalObject->globalScopeChain(), makeSource(fSource), JSValue(), expception);
-}
-
-bool JSRun::CheckSyntax()
-{
-    return JSC::checkSyntax(fGlobalObject->globalExec(), makeSource(fSource));
-}
diff --git a/Source/JavaScriptGlue/JSRun.h b/Source/JavaScriptGlue/JSRun.h
deleted file mode 100644
index 7925eb6..0000000
--- a/Source/JavaScriptGlue/JSRun.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JSRun_h
-#define JSRun_h
-
-#include <JavaScriptCore/Strong.h>
-#include "JSBase.h"
-#include "JSUtils.h"
-#include "UserObjectImp.h"
-
-class JSGlueGlobalObject : public JSGlobalObject {
-    public:
-        typedef JSGlobalObject Base;
-
-        static JSGlueGlobalObject* create(JSGlobalData& globalData, Structure* structure, JSFlags flags = kJSFlagNone)
-        {
-            Structure* userObjectStructure = UserObjectImp::createStructure(globalData, 0, jsNull());
-            JSGlueGlobalObject* object = new (allocateCell<JSGlueGlobalObject>(globalData.heap)) JSGlueGlobalObject(globalData, structure, userObjectStructure, flags);
-            object->finishCreation(globalData);
-            return object;
-        }
-
-        JSFlags Flags() const { return m_flags; }
-        Structure* userObjectStructure() const { return m_userObjectStructure.get(); }
-
-    private:
-        JSGlueGlobalObject(JSGlobalData&, Structure*, Structure*, JSFlags = kJSFlagNone);
-        
-        JSFlags m_flags;
-        Strong<Structure> m_userObjectStructure;
-};
-
-class JSRun : public JSBase {
-    public:
-        JSRun(CFStringRef source, JSFlags inFlags);
-        virtual ~JSRun();
-
-        UString GetSource() const;
-        JSGlobalObject* GlobalObject() const;
-        JSValue Evaluate(JSValue* exception);
-        bool CheckSyntax();
-        JSFlags Flags() const;
-    private:
-        UString fSource;
-        Strong<JSGlobalObject> fGlobalObject;
-        JSFlags fFlags;
-};
-
-#endif
diff --git a/Source/JavaScriptGlue/JSUtils.cpp b/Source/JavaScriptGlue/JSUtils.cpp
deleted file mode 100644
index 6bf0928..0000000
--- a/Source/JavaScriptGlue/JSUtils.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JSUtils.h"
-
-#include "JSBase.h"
-#include "JSObject.h"
-#include "JSRun.h"
-#include "JSValueWrapper.h"
-#include "UserObjectImp.h"
-#include <JavaScriptCore/JSString.h>
-#include <JavaScriptCore/PropertyNameArray.h>
-#include <JavaScriptCore/WTFThreadData.h>
-
-struct ObjectImpList {
-    JSObject* imp;
-    ObjectImpList* next;
-    CFTypeRef data;
-};
-
-static CFTypeRef KJSValueToCFTypeInternal(JSValue inValue, ExecState *exec, ObjectImpList* inImps);
-static JSGlueGlobalObject* getThreadGlobalObject();
-
-//--------------------------------------------------------------------------
-// CFStringToUString
-//--------------------------------------------------------------------------
-
-UString CFStringToUString(CFStringRef inCFString)
-{
-    UString result;
-    if (inCFString) {
-        CFIndex len = CFStringGetLength(inCFString);
-        UniChar* buffer = (UniChar*)malloc(sizeof(UniChar) * len);
-        if (buffer)
-        {
-            CFStringGetCharacters(inCFString, CFRangeMake(0, len), buffer);
-            result = UString((const UChar *)buffer, len);
-            free(buffer);
-        }
-    }
-    return result;
-}
-
-
-//--------------------------------------------------------------------------
-// UStringToCFString
-//--------------------------------------------------------------------------
-// Caller is responsible for releasing the returned CFStringRef
-CFStringRef UStringToCFString(const UString& inUString)
-{
-    return CFStringCreateWithCharacters(0, (const UniChar*)inUString.characters(), inUString.length());
-}
-
-
-//--------------------------------------------------------------------------
-// CFStringToIdentifier
-//--------------------------------------------------------------------------
-
-Identifier CFStringToIdentifier(CFStringRef inCFString, ExecState* exec)
-{
-    return Identifier(exec, CFStringToUString(inCFString));
-}
-
-
-//--------------------------------------------------------------------------
-// IdentifierToCFString
-//--------------------------------------------------------------------------
-// Caller is responsible for releasing the returned CFStringRef
-CFStringRef IdentifierToCFString(const Identifier& inIdentifier)
-{
-    return UStringToCFString(inIdentifier.ustring());
-}
-
-
-//--------------------------------------------------------------------------
-// KJSValueToJSObject
-//--------------------------------------------------------------------------
-JSUserObject* KJSValueToJSObject(JSValue inValue, ExecState *exec)
-{
-    JSUserObject* result = 0;
-
-    if (inValue.inherits(&UserObjectImp::s_info)) {
-        UserObjectImp* userObjectImp = static_cast<UserObjectImp *>(asObject(inValue));
-        result = userObjectImp->GetJSUserObject();
-        if (result)
-            result->Retain();
-    } else {
-        JSValueWrapper* wrapperValue = new JSValueWrapper(inValue);
-        if (wrapperValue) {
-            JSObjectCallBacks callBacks;
-            JSValueWrapper::GetJSObectCallBacks(callBacks);
-            result = (JSUserObject*)JSObjectCreate(wrapperValue, &callBacks);
-            if (!result) {
-                delete wrapperValue;
-            }
-        }
-    }
-    return result;
-}
-
-//--------------------------------------------------------------------------
-// JSObjectKJSValue
-//--------------------------------------------------------------------------
-JSValue JSObjectKJSValue(JSUserObject* ptr)
-{
-    JSGlueAPIEntry entry;
-
-    JSValue result = jsUndefined();
-    if (ptr)
-    {
-        bool handled = false;
-
-        switch (ptr->DataType())
-        {
-            case kJSUserObjectDataTypeJSValueWrapper:
-            {
-                JSValueWrapper* wrapper = (JSValueWrapper*)ptr->GetData();
-                if (wrapper)
-                {
-                    result = wrapper->GetValue();
-                    handled = true;
-                }
-                break;
-            }
-
-            case kJSUserObjectDataTypeCFType:
-            {
-                CFTypeRef cfType = (CFTypeRef*)ptr->GetData();
-                if (cfType)
-                {
-                    CFTypeID typeID = CFGetTypeID(cfType);
-                    if (typeID == CFStringGetTypeID())
-                    {
-                        result = jsString(getThreadGlobalExecState(), CFStringToUString((CFStringRef)cfType));
-                        handled = true;
-                    }
-                    else if (typeID == CFNumberGetTypeID())
-                    {
-                        double num;
-                        CFNumberGetValue((CFNumberRef)cfType, kCFNumberDoubleType, &num);
-                        result = jsNumber(num);
-                        handled = true;
-                    }
-                    else if (typeID == CFBooleanGetTypeID())
-                    {
-                        result = jsBoolean(CFBooleanGetValue((CFBooleanRef)cfType));
-                        handled = true;
-                    }
-                    else if (typeID == CFNullGetTypeID())
-                    {
-                        result = jsNull();
-                        handled = true;
-                    }
-                }
-                break;
-            }
-        }
-        if (!handled)
-        {
-            ExecState* exec = getThreadGlobalExecState();
-            result = UserObjectImp::create(exec->globalData(), getThreadGlobalObject()->userObjectStructure(), ptr);
-        }
-    }
-    return result;
-}
-
-
-
-
-//--------------------------------------------------------------------------
-// KJSValueToCFTypeInternal
-//--------------------------------------------------------------------------
-// Caller is responsible for releasing the returned CFTypeRef
-CFTypeRef KJSValueToCFTypeInternal(JSValue inValue, ExecState *exec, ObjectImpList* inImps)
-{
-    if (!inValue)
-        return 0;
-
-    CFTypeRef result = 0;
-
-    JSGlueAPIEntry entry;
-
-        if (inValue.isBoolean())
-            {
-                result = inValue.toBoolean(exec) ? kCFBooleanTrue : kCFBooleanFalse;
-                RetainCFType(result);
-                return result;
-            }
-
-        if (inValue.isString())
-            {
-                UString uString = inValue.toString(exec)->value(exec);
-                result = UStringToCFString(uString);
-                return result;
-            }
-
-        if (inValue.isNumber())
-            {
-                double number1 = inValue.toNumber(exec);
-                double number2 = (double)inValue.toInteger(exec);
-                if (number1 ==  number2)
-                {
-                    int intValue = (int)number2;
-                    result = CFNumberCreate(0, kCFNumberIntType, &intValue);
-                }
-                else
-                {
-                    result = CFNumberCreate(0, kCFNumberDoubleType, &number1);
-                }
-                return result;
-            }
-
-        if (inValue.isObject())
-            {
-                if (inValue.inherits(&UserObjectImp::s_info)) {
-                    UserObjectImp* userObjectImp = static_cast<UserObjectImp *>(asObject(inValue));
-                    JSUserObject* ptr = userObjectImp->GetJSUserObject();
-                    if (ptr)
-                    {
-                        result = ptr->CopyCFValue();
-                    }
-                }
-                else
-                {
-                    JSObject *object = inValue.toObject(exec);
-                    UInt8 isArray = false;
-
-                    // if two objects reference each
-                    JSObject* imp = object;
-                    ObjectImpList* temp = inImps;
-                    while (temp) {
-                        if (imp == temp->imp) {
-                            return CFRetain(GetCFNull());
-                        }
-                        temp = temp->next;
-                    }
-
-                    ObjectImpList imps;
-                    imps.next = inImps;
-                    imps.imp = imp;
-
-
-//[...] HACK since we do not have access to the class info we use class name instead
-#if 0
-                    if (object->inherits(&ArrayInstanceImp::s_info))
-#else
-                    if (object->methodTable()->className(object) == "Array")
-#endif
-                    {
-                        isArray = true;
-                        JSGlueGlobalObject* globalObject = static_cast<JSGlueGlobalObject*>(exec->dynamicGlobalObject());
-                        if (globalObject && (globalObject->Flags() & kJSFlagConvertAssociativeArray)) {
-                            PropertyNameArray propNames(exec);
-                            object->methodTable()->getPropertyNames(object, exec, propNames, ExcludeDontEnumProperties);
-                            PropertyNameArray::const_iterator iter = propNames.begin();
-                            PropertyNameArray::const_iterator end = propNames.end();
-                            while(iter != end && isArray)
-                            {
-                                Identifier propName = *iter;
-                                UString ustr = propName.ustring();
-                                const UniChar* uniChars = (const UniChar*)ustr.characters();
-                                int size = ustr.length();
-                                while (size--) {
-                                    if (uniChars[size] < '0' || uniChars[size] > '9') {
-                                        isArray = false;
-                                        break;
-                                    }
-                                }
-                                iter++;
-                            }
-                        }
-                    }
-
-                    if (isArray)
-                    {
-                        // This is an KJS array
-                        unsigned int length = object->get(exec, Identifier(exec, "length")).toUInt32(exec);
-                        result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
-                        if (result)
-                        {
-                            for (unsigned i = 0; i < length; i++)
-                            {
-                                CFTypeRef cfValue = KJSValueToCFTypeInternal(object->get(exec, i), exec, &imps);
-                                CFArrayAppendValue((CFMutableArrayRef)result, cfValue);
-                                ReleaseCFType(cfValue);
-                            }
-                        }
-                    }
-                    else
-                    {
-                        // Not an array, just treat it like a dictionary which contains (property name, property value) pairs
-                        PropertyNameArray propNames(exec);
-                        object->methodTable()->getPropertyNames(object, exec, propNames, ExcludeDontEnumProperties);
-                        {
-                            result = CFDictionaryCreateMutable(0,
-                                                               0,
-                                                               &kCFTypeDictionaryKeyCallBacks,
-                                                               &kCFTypeDictionaryValueCallBacks);
-                            if (result)
-                            {
-                                PropertyNameArray::const_iterator iter = propNames.begin();
-                                PropertyNameArray::const_iterator end = propNames.end();
-                                while(iter != end)
-                                {
-                                    Identifier propName = *iter;
-                                    if (object->hasProperty(exec, propName))
-                                    {
-                                        CFStringRef cfKey = IdentifierToCFString(propName);
-                                        CFTypeRef cfValue = KJSValueToCFTypeInternal(object->get(exec, propName), exec, &imps);
-                                        if (cfKey && cfValue)
-                                        {
-                                            CFDictionaryAddValue((CFMutableDictionaryRef)result, cfKey, cfValue);
-                                        }
-                                        ReleaseCFType(cfKey);
-                                        ReleaseCFType(cfValue);
-                                    }
-                                    iter++;
-                                }
-                            }
-                        }
-                    }
-                }
-                return result;
-            }
-
-    if (inValue.isUndefinedOrNull())
-        {
-            result = RetainCFType(GetCFNull());
-            return result;
-        }
-
-    ASSERT_NOT_REACHED();
-    return 0;
-}
-
-CFTypeRef KJSValueToCFType(JSValue inValue, ExecState *exec)
-{
-    return KJSValueToCFTypeInternal(inValue, exec, 0);
-}
-
-CFTypeRef GetCFNull(void)
-{
-    static CFArrayRef sCFNull = CFArrayCreate(0, 0, 0, 0);
-    CFTypeRef result = JSGetCFNull();
-    if (!result)
-    {
-        result = sCFNull;
-    }
-    return result;
-}
-
-/*
- * This is a slight hack. The JSGlue API has no concept of execution state.
- * However, execution state is an inherent part of JS, and JSCore requires it.
- * So, we keep a single execution state for the whole thread and supply it
- * where necessary.
-
- * The execution state holds two things: (1) exceptions; (2) the global object. 
- * JSGlue has no API for accessing exceptions, so we just discard them. As for
- * the global object, JSGlue includes no calls that depend on it. Its property
- * getters and setters are per-object; they don't walk up the enclosing scope. 
- * Functions called by JSObjectCallFunction may reference values in the enclosing 
- * scope, but they do so through an internally stored scope chain, so we don't 
- * need to supply the global scope.
- */      
-
-static pthread_key_t globalObjectKey;
-static pthread_once_t globalObjectKeyOnce = PTHREAD_ONCE_INIT;
-
-static void unprotectGlobalObject(void* data) 
-{
-    JSGlueAPIEntry entry;
-    gcUnprotect(static_cast<JSGlueGlobalObject*>(data));
-}
-
-static void initializeGlobalObjectKey()
-{
-    pthread_key_create(&globalObjectKey, unprotectGlobalObject);
-}
-
-static JSGlobalData* getThreadGlobalData()
-{
-    return &JSGlobalData::sharedInstance();
-}
-
-static JSGlueGlobalObject* getThreadGlobalObject()
-{
-    pthread_once(&globalObjectKeyOnce, initializeGlobalObjectKey);
-    JSGlueGlobalObject* globalObject = static_cast<JSGlueGlobalObject*>(pthread_getspecific(globalObjectKey));
-    if (!globalObject) {
-        globalObject = JSGlueGlobalObject::create(*getThreadGlobalData(), JSGlueGlobalObject::createStructure(*getThreadGlobalData(), jsNull()));
-        gcProtect(globalObject);
-        pthread_setspecific(globalObjectKey, globalObject);
-    }
-    return globalObject;
-}
-
-ExecState* getThreadGlobalExecState()
-{
-    ExecState* exec = getThreadGlobalObject()->globalExec();
-
-    // Discard exceptions -- otherwise an exception would forestall JS 
-    // evaluation throughout the thread
-    exec->clearException();
-    return exec;
-}
-
-JSGlueAPIEntry::JSGlueAPIEntry()
-    : m_lock(LockForReal)
-    , m_storedIdentifierTable(wtfThreadData().currentIdentifierTable())
-{
-    wtfThreadData().setCurrentIdentifierTable(getThreadGlobalData()->identifierTable);
-}
-
-JSGlueAPIEntry::~JSGlueAPIEntry()
-{
-    wtfThreadData().setCurrentIdentifierTable(m_storedIdentifierTable);
-}
-
-JSGlueAPICallback::JSGlueAPICallback(ExecState* exec)
-    : m_dropLocks(exec)
-{
-    wtfThreadData().resetCurrentIdentifierTable();
-}
-
-JSGlueAPICallback::~JSGlueAPICallback()
-{
-    wtfThreadData().setCurrentIdentifierTable(getThreadGlobalData()->identifierTable);
-}
diff --git a/Source/JavaScriptGlue/JSUtils.h b/Source/JavaScriptGlue/JSUtils.h
deleted file mode 100644
index ec55254..0000000
--- a/Source/JavaScriptGlue/JSUtils.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JSUtils_h
-#define JSUtils_h
-
-#include "JavaScriptGlue.h"
-
-#include <JavaScriptCore/Heap.h>
-#include <JavaScriptCore/JSValue.h>
-#include <JavaScriptCore/Completion.h>
-#include <JavaScriptCore/Identifier.h>
-#include <JavaScriptCore/JSLock.h>
-#include <JavaScriptCore/JSObject.h>
-#include <JavaScriptCore/JSGlobalObject.h>
-#include <JavaScriptCore/Protect.h>
-#include <JavaScriptCore/UString.h>
-
-#include <wtf/RefPtr.h>
-
-using namespace JSC;
-
-class JSBase;
-class JSUserObject;
-class JSRun;
-class JSValueWrapper;
-class JSUserObjectImp;
-
-UString CFStringToUString(CFStringRef inCFString);
-CFStringRef UStringToCFString(const UString& inUString);
-Identifier CFStringToIdentifier(CFStringRef inCFString, ExecState*);
-CFStringRef IdentifierToCFString(const Identifier& inIdentifier);
-JSUserObject *KJSValueToJSObject(JSValue inValue, ExecState *exec);
-CFTypeRef KJSValueToCFType(JSValue inValue, ExecState *exec);
-JSValue JSObjectKJSValue(JSUserObject* ptr);
-CFTypeRef GetCFNull(void);
-
-inline CFTypeRef RetainCFType(CFTypeRef x) { if (x) x = CFRetain(x); return x; }
-inline void ReleaseCFType(CFTypeRef x) { if (x) CFRelease(x);  }
-
-ExecState* getThreadGlobalExecState();
-
-enum {
-    kJSInvalidTypeID = 0,
-    kJSObjectTypeID,
-    kJSRunTypeID
-};
-
-enum {
-    kJSUserObjectDataTypeUnknown,
-    kJSUserObjectDataTypeJSValueWrapper,
-    kJSUserObjectDataTypeCFType
-};
-
-class JSGlueAPIEntry {
-public:
-    JSGlueAPIEntry();
-    JSGlueAPIEntry(JSGlobalObject*); // For use when it's not safe for JSGlueAPIEntry() to call getThreadGlobalObject() -- for example, from a thread-specific data destructor.
-    ~JSGlueAPIEntry();
-
-private:
-    JSLock m_lock;
-    IdentifierTable* m_storedIdentifierTable;
-};
-
-class JSGlueAPICallback {
-public:
-    JSGlueAPICallback(ExecState*);
-    ~JSGlueAPICallback();
-
-private:
-    JSLock::DropAllLocks m_dropLocks;
-};
-
-#endif
diff --git a/Source/JavaScriptGlue/JSValueWrapper.cpp b/Source/JavaScriptGlue/JSValueWrapper.cpp
deleted file mode 100644
index c0acd29..0000000
--- a/Source/JavaScriptGlue/JSValueWrapper.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2005, 2009 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JSValueWrapper.h"
-#include "JSRun.h"
-#include <JavaScriptCore/JSArray.h>
-#include <JavaScriptCore/PropertyNameArray.h>
-#include <JavaScriptCore/StrongInlines.h>
-#include <pthread.h>
-
-JSValueWrapper::JSValueWrapper(JSValue inValue)
-    : fValue(getThreadGlobalExecState()->globalData(), inValue)
-{
-}
-
-JSValueWrapper::~JSValueWrapper()
-{
-}
-
-JSValue JSValueWrapper::GetValue()
-{
-    return fValue.get();
-}
-
-void JSValueWrapper::GetJSObectCallBacks(JSObjectCallBacks& callBacks)
-{
-    callBacks.dispose = (JSObjectDisposeProcPtr)JSValueWrapper::JSObjectDispose;
-    callBacks.equal = (JSObjectEqualProcPtr)0;
-    callBacks.copyPropertyNames = (JSObjectCopyPropertyNamesProcPtr)JSValueWrapper::JSObjectCopyPropertyNames;
-    callBacks.copyCFValue = (JSObjectCopyCFValueProcPtr)JSValueWrapper::JSObjectCopyCFValue;
-    callBacks.copyProperty = (JSObjectCopyPropertyProcPtr)JSValueWrapper::JSObjectCopyProperty;
-    callBacks.setProperty = (JSObjectSetPropertyProcPtr)JSValueWrapper::JSObjectSetProperty;
-    callBacks.callFunction = (JSObjectCallFunctionProcPtr)JSValueWrapper::JSObjectCallFunction;
-}
-
-void JSValueWrapper::JSObjectDispose(void *data)
-{
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    delete ptr;
-}
-
-
-CFArrayRef JSValueWrapper::JSObjectCopyPropertyNames(void *data)
-{
-    JSGlueAPIEntry entry;
-
-    CFMutableArrayRef result = 0;
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    if (ptr)
-    {
-        ExecState* exec = getThreadGlobalExecState();
-        JSObject* object = ptr->GetValue().toObject(exec);
-        PropertyNameArray propNames(exec);
-        object->methodTable()->getPropertyNames(object, exec, propNames, ExcludeDontEnumProperties);
-        PropertyNameArray::const_iterator iterator = propNames.begin();
-
-        while (iterator != propNames.end()) {
-            Identifier name = *iterator;
-            CFStringRef nameStr = IdentifierToCFString(name);
-
-            if (!result)
-            {
-                result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
-            }
-            if (result && nameStr)
-            {
-                CFArrayAppendValue(result, nameStr);
-            }
-            ReleaseCFType(nameStr);
-            iterator++;
-        }
-
-    }
-    return result;
-}
-
-
-JSObjectRef JSValueWrapper::JSObjectCopyProperty(void *data, CFStringRef propertyName)
-{
-    JSGlueAPIEntry entry;
-
-    JSObjectRef result = 0;
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    if (ptr)
-    {
-        ExecState* exec = getThreadGlobalExecState();
-        JSValue propValue = ptr->GetValue().toObject(exec)->get(exec, CFStringToIdentifier(propertyName, exec));
-        JSValueWrapper* wrapperValue = new JSValueWrapper(propValue);
-
-        JSObjectCallBacks callBacks;
-        GetJSObectCallBacks(callBacks);
-        result = JSObjectCreateInternal(wrapperValue, &callBacks, JSValueWrapper::JSObjectMark, kJSUserObjectDataTypeJSValueWrapper);
-
-        if (!result)
-        {
-            delete wrapperValue;
-        }
-    }
-    return result;
-}
-
-void JSValueWrapper::JSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue)
-{
-    JSGlueAPIEntry entry;
-
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    if (ptr)
-    {
-        ExecState* exec = getThreadGlobalExecState();
-        JSValue value = JSObjectKJSValue((JSUserObject*)jsValue);
-        JSObject *objValue = ptr->GetValue().toObject(exec);
-        PutPropertySlot slot;
-        objValue->methodTable()->put(objValue, exec, CFStringToIdentifier(propertyName, exec), value, slot);
-    }
-}
-
-JSObjectRef JSValueWrapper::JSObjectCallFunction(void *data, JSObjectRef thisObj, CFArrayRef args)
-{
-    JSGlueAPIEntry entry;
-
-    JSObjectRef result = 0;
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    if (ptr)
-    {
-        ExecState* exec = getThreadGlobalExecState();
-
-        JSValue value = JSObjectKJSValue((JSUserObject*)thisObj);
-        JSObject* ksjThisObj = value.toObject(exec);
-        JSObject* objValue = ptr->GetValue().toObject(exec);
-
-        MarkedArgumentBuffer listArgs;
-        CFIndex argCount = args ? CFArrayGetCount(args) : 0;
-        for (CFIndex i = 0; i < argCount; i++)
-        {
-            JSObjectRef jsArg = (JSObjectRef)CFArrayGetValueAtIndex(args, i);
-            JSValue kgsArg = JSObjectKJSValue((JSUserObject*)jsArg);
-            listArgs.append(kgsArg);
-        }
-
-        CallData callData;
-        CallType callType = objValue->methodTable()->getCallData(objValue, callData);
-        if (callType == CallTypeNone)
-            return 0;
-        JSValue  resultValue = call(exec, objValue, callType, callData, ksjThisObj, listArgs);
-        JSValueWrapper* wrapperValue = new JSValueWrapper(resultValue);
-        JSObjectCallBacks callBacks;
-        GetJSObectCallBacks(callBacks);
-        result = JSObjectCreate(wrapperValue, &callBacks);
-        if (!result)
-        {
-            delete wrapperValue;
-        }
-    }
-    return result;
-}
-
-CFTypeRef JSValueWrapper::JSObjectCopyCFValue(void *data)
-{
-    JSGlueAPIEntry entry;
-
-    CFTypeRef result = 0;
-    JSValueWrapper* ptr = (JSValueWrapper*)data;
-    if (ptr)
-    {
-        result = KJSValueToCFType(ptr->GetValue(), getThreadGlobalExecState());
-    }
-    return result;
-}
-
-void JSValueWrapper::JSObjectMark(void *data)
-{
-}
diff --git a/Source/JavaScriptGlue/JSValueWrapper.h b/Source/JavaScriptGlue/JSValueWrapper.h
deleted file mode 100644
index 66e0c59..0000000
--- a/Source/JavaScriptGlue/JSValueWrapper.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JSValueWrapper_h
-#define JSValueWrapper_h
-
-#include <JavaScriptCore/Strong.h>
-#include "JSUtils.h"
-#include "JSBase.h"
-#include "JSObject.h"
-
-class JSValueWrapper {
-public:
-    JSValueWrapper(JSValue);
-    virtual ~JSValueWrapper();
-
-    static void GetJSObectCallBacks(JSObjectCallBacks& callBacks);
-
-    JSValue GetValue();
-
-private:
-    Strong<Unknown> fValue;
-    
-    static void JSObjectDispose(void *data);
-    static CFArrayRef JSObjectCopyPropertyNames(void *data);
-    static JSObjectRef JSObjectCopyProperty(void *data, CFStringRef propertyName);
-    static void JSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue);
-    static JSObjectRef JSObjectCallFunction(void *data, JSObjectRef thisObj, CFArrayRef args);
-    static CFTypeRef JSObjectCopyCFValue(void *data);
-    static void JSObjectMark(void *data);
-};
-
-#endif
diff --git a/Source/JavaScriptGlue/JavaScriptGlue.cpp b/Source/JavaScriptGlue/JavaScriptGlue.cpp
deleted file mode 100644
index c226836..0000000
--- a/Source/JavaScriptGlue/JavaScriptGlue.cpp
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "JavaScriptGlue.h"
-#include "JSUtils.h"
-#include "JSBase.h"
-#include "JSObject.h"
-#include "JSRun.h"
-#include <JavaScriptCore/Completion.h>
-#include <JavaScriptCore/InitializeThreading.h>
-
-static CFTypeRef sJSCFNullRef = 0;
-
-static void CFJSObjectDispose(void *data);
-static JSObjectRef CFJSObjectCopyProperty(void *data, CFStringRef propertyName);
-static void CFJSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue);
-static CFTypeRef CFJSObjectCopyCFValue(void *data);
-static UInt8 CFJSObjectEqual(void *data1, void *data2);
-static CFArrayRef CFJSObjectCopyPropertyNames(void *data);
-
-void *JSCFRetain(CFAllocatorRef allocator, const void *value);
-void JSCFRelease(CFAllocatorRef allocator, const void *value);
-
-
-void JSSetCFNull(CFTypeRef nullRef)
-{
-    ReleaseCFType(sJSCFNullRef);
-    sJSCFNullRef = RetainCFType(nullRef);
-}
-
-CFTypeRef JSGetCFNull(void)
-{
-    return sJSCFNullRef;
-}
-
-/*
-    JSRetain
-*/
-JSTypeRef JSRetain(JSTypeRef ref)
-{
-    if (ref)
-    {
-        JSBase* ptr = (JSBase*)ref;
-        ptr->Retain();
-    }
-    return ref;
-}
-
-/*
-    JSRelease
-*/
-void JSRelease(JSTypeRef ref)
-{
-    if (ref)
-    {
-        JSBase* ptr = (JSBase*)ref;
-        ptr->Release();
-    }
-}
-
-/*
-    JSCopyDescription
-*/
-CFStringRef JSCopyDescription(JSTypeRef ref)
-{
-    CFStringRef result = 0;
-    if (ref)
-    {
-        JSBase* ptr = (JSBase*)ref;
-        ptr->CopyDescription();
-    }
-    return result;
-}
-
-/*
-    JSEqual
-*/
-UInt8 JSEqual(JSTypeRef ref1, JSTypeRef ref2)
-{
-    UInt8 result = false;
-    if (ref1 && ref2)
-    {
-        JSBase* ptr = (JSBase*)ref1;
-        result = ptr->Equal((JSBase*)ref2);
-    }
-    return result;
-}
-
-
-/*
-    JSGetTypeID
-*/
-JSTypeID JSGetTypeID(JSTypeRef ref)
-{
-    JSTypeID result = kJSInvalidTypeID;
-    if (ref)
-    {
-        JSBase* ptr = (JSBase*)ref;
-        result = ptr->GetTypeID();
-    }
-    return result;
-}
-
-
-/*
-    JSGetRetainCount
-*/
-CFIndex JSGetRetainCount(JSTypeRef ref)
-{
-    CFIndex result = -1;
-    if (ref)
-    {
-        JSBase* ptr = (JSBase*)ref;
-        result = ptr->RetainCount();
-    }
-    return result;
-}
-
-
-
-/*
-    JSObjectCreate
-*/
-JSObjectRef JSObjectCreate(void *data, JSObjectCallBacksPtr callBacks)
-{
-    JSObjectRef result = JSObjectCreateInternal(data, callBacks, 0, kJSUserObjectDataTypeUnknown);
-    return result;
-}
-
-/*
-    JSObjectCreateInternal
-*/
-JSObjectRef JSObjectCreateInternal(void *data, JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, int type)
-{
-    JSObjectRef result = 0;
-    JSUserObject* ptr = new JSUserObject(callBacks, markProc, data, type);
-    result = (JSObjectRef)ptr;
-    return result;
-}
-
-/*
-    JSObjectCopyCFValue
-*/
-CFTypeRef JSObjectCopyCFValue(JSObjectRef ref)
-{
-    CFTypeRef result = 0;
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        result = ptr->CopyCFValue();
-    }
-    return result;
-}
-
-/*
-    JSObjectGetData
-*/
-void *JSObjectGetData(JSObjectRef ref)
-{
-    void *result = 0;
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        result = ptr->GetData();
-    }
-    return result;
-}
-
-
-/*
-    JSObjectCopyProperty
-*/
-JSObjectRef JSObjectCopyProperty(JSObjectRef ref, CFStringRef propertyName)
-{
-    JSObjectRef result = 0;
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        result = (JSObjectRef)ptr->CopyProperty(propertyName);
-    }
-    return result;
-}
-
-
-/*
-    JSObjectSetProperty
-*/
-void JSObjectSetProperty(JSObjectRef ref, CFStringRef propertyName, JSObjectRef value)
-{
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        ptr->SetProperty(propertyName, (JSUserObject*)value);
-    }
-}
-
-
-/*
-    JSObjectCallFunction
-*/
-JSObjectRef JSObjectCallFunction(JSObjectRef ref, JSObjectRef thisObj, CFArrayRef args)
-{
-    JSObjectRef result = 0;
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        result = (JSObjectRef)ptr->CallFunction((JSUserObject*)thisObj, args);
-    }
-    return result;
-}
-
-
-/*
-    JSRunCreate
-*/
-JSRunRef JSRunCreate(CFStringRef jsSource, JSFlags inFlags)
-{
-    initializeThreading();
-
-    JSRunRef result = 0;
-    if (jsSource)
-    {
-        JSGlueAPIEntry entry;
-        result = (JSRunRef) new JSRun(jsSource, inFlags);
-    }
-    return result;
-}
-
-/*
-    JSRunCopySource
-*/
-CFStringRef JSRunCopySource(JSRunRef ref)
-{
-    CFStringRef result = 0;
-    JSRun* ptr = (JSRun*)ref;
-    if (ptr)
-    {
-        result = UStringToCFString(ptr->GetSource());
-    }
-    return result;
-}
-
-
-/*
-    JSRunCopyGlobalObject
-*/
-JSObjectRef JSRunCopyGlobalObject(JSRunRef ref)
-{
-    JSObjectRef result = 0;
-    JSRun* ptr = (JSRun*)ref;
-    if (ptr)
-    {
-        JSGlobalObject* globalObject = ptr->GlobalObject();
-        result = (JSObjectRef)KJSValueToJSObject(globalObject, globalObject->globalExec());
-    }
-    return result;
-}
-
-/*
-    JSRunEvaluate
-*/
-JSObjectRef JSRunEvaluate(JSRunRef ref)
-{
-    JSObjectRef result = 0;
-    JSRun* ptr = (JSRun*)ref;
-    if (ptr)
-    {
-        JSGlueAPIEntry entry;
-        
-        JSValue evaluationException;
-        JSValue returnValue = ptr->Evaluate(&evaluationException);
-        
-        if (evaluationException)
-        {
-            result = (JSObjectRef)KJSValueToJSObject(evaluationException, ptr->GlobalObject()->globalExec());
-            
-            JSFlags flags = ptr->Flags();
-            if (flags & kJSFlagDebug)
-            {
-                CFTypeRef error = JSObjectCopyCFValue(result);
-                if (error)
-                {
-                    CFShow(error);
-                    CFRelease(error);
-                }
-            }
-        }
-        else
-        {
-            result = (JSObjectRef)KJSValueToJSObject(returnValue, ptr->GlobalObject()->globalExec());
-        }
-    }
-    return result;
-}
-
-/*
-    JSRunCheckSyntax
-    Return true if no syntax error
-*/
-bool JSRunCheckSyntax(JSRunRef ref)
-{
-    bool result = false;
-    JSRun* ptr = (JSRun*)ref;
-    if (ptr)
-    {
-            JSGlueAPIEntry entry;
-            result = ptr->CheckSyntax();
-    }
-    return result;
-}
-
-/*
-    JSCollect - trigger garbage collection
-*/
-void JSCollect()
-{
-    initializeThreading();
-
-    JSGlueAPIEntry entry;
-    Heap* heap = getThreadGlobalExecState()->heap();
-    if (!heap->isBusy())
-        heap->collectAllGarbage();
-}
-
-/*
-    JSTypeGetCFArrayCallBacks
-*/
-void JSTypeGetCFArrayCallBacks(CFArrayCallBacks* outCallBacks)
-{
-    if (outCallBacks)
-    {
-        outCallBacks->version = 1;
-        outCallBacks->retain = (CFArrayRetainCallBack)JSCFRetain;
-        outCallBacks->release = (CFArrayReleaseCallBack)JSCFRelease;
-        outCallBacks->copyDescription = (CFArrayCopyDescriptionCallBack)JSCopyDescription;
-        outCallBacks->equal = (CFArrayEqualCallBack)JSEqual;
-    }
-}
-
-
-/*
-    JSCFRetain
-*/
-void *JSCFRetain(CFAllocatorRef allocator, const void *value)
-{
-    JSRetain((JSTypeRef)value);
-    return (void*)value;
-}
-
-/*
-    JSCFRelease
-*/
-void JSCFRelease(CFAllocatorRef allocator, const void *value)
-{
-    JSRelease((JSTypeRef)value);
-}
-
-
-/*
-    JSObjectCreateWithCFType
-*/
-JSObjectRef JSObjectCreateWithCFType(CFTypeRef inRef)
-{
-    JSObjectCallBacks callBacks;
-    JSObjectRef cfJSObject = nil;
-    if (inRef)
-    {
-        callBacks.dispose = CFJSObjectDispose;
-        callBacks.equal = CFJSObjectEqual;
-        callBacks.copyCFValue = CFJSObjectCopyCFValue;
-        callBacks.copyProperty = CFJSObjectCopyProperty;
-        callBacks.setProperty = CFJSObjectSetProperty;
-        callBacks.callFunction = 0;
-        callBacks.copyPropertyNames = CFJSObjectCopyPropertyNames;
-        cfJSObject = JSObjectCreateInternal((void*)CFRetain(inRef), &callBacks, 0, kJSUserObjectDataTypeCFType );
-    }
-    return cfJSObject;
-}
-
-/*
-    CFJSObjectDispose
-*/
-void CFJSObjectDispose(void *data)
-{
-    if (data)
-    {
-        CFRelease((JSTypeRef)data);
-    }
-}
-
-CFArrayRef JSObjectCopyPropertyNames(JSObjectRef ref)
-{
-    CFArrayRef result = 0;
-    JSUserObject* ptr = (JSUserObject*)ref;
-    if (ptr && (ptr->GetTypeID() == kJSObjectTypeID))
-    {
-        result = ptr->CopyPropertyNames();
-    }
-    return result;
-}
-/*
-    CFJSObjectCopyProperty
-*/
-JSObjectRef CFJSObjectCopyProperty(void *data, CFStringRef propertyName)
-{
-    JSObjectRef result = 0;
-    if (data && propertyName)
-    {
-        CFTypeRef cfResult = 0;
-        if (CFGetTypeID(data) == CFDictionaryGetTypeID())
-        {
-            if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo)
-            {
-                int len = CFDictionaryGetCount((CFDictionaryRef)data);
-                cfResult = CFNumberCreate(0, kCFNumberIntType, &len);
-            }
-            else
-            {
-                cfResult = RetainCFType(CFDictionaryGetValue((CFDictionaryRef)data, propertyName));
-            }
-        }
-        else if (CFGetTypeID(data) == CFArrayGetTypeID())
-        {
-            if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo)
-            {
-                int len = CFArrayGetCount((CFArrayRef)data);
-                cfResult = CFNumberCreate(0, kCFNumberIntType, &len);
-            }
-            else
-            {
-                SInt32 index = CFStringGetIntValue(propertyName);
-                CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data);
-                if (index >= 0 && index < arrayCount)
-                {
-                    cfResult = RetainCFType(CFArrayGetValueAtIndex((CFArrayRef)data, index));
-                }
-            }
-        }
-        else if (CFGetTypeID(data) == CFStringGetTypeID())
-        {
-            if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo)
-            {
-                int len = CFStringGetLength((CFStringRef)data);
-                cfResult = CFNumberCreate(0, kCFNumberIntType, &len);
-            }
-        }
-        if (cfResult)
-        {
-            result = JSObjectCreateWithCFType(cfResult);
-            CFRelease(cfResult);
-        }
-    }
-    return result;
-}
-
-
-/*
-    CFJSObjectSetProperty
-*/
-void CFJSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue)
-{
-    if (data && propertyName)
-    {
-        CFTypeRef cfValue = JSObjectCopyCFValue(jsValue);
-
-        if (cfValue)
-        {
-            if (CFGetTypeID(data) == CFDictionaryGetTypeID())
-            {
-                CFDictionarySetValue((CFMutableDictionaryRef)data, propertyName, cfValue);
-            }
-            else if (CFGetTypeID(data) == CFArrayGetTypeID())
-            {
-                SInt32 index = CFStringGetIntValue(propertyName);
-                CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data);
-                if (index >= 0)
-                {
-                    for (; arrayCount < index; arrayCount++)
-                    {
-                        CFArrayAppendValue((CFMutableArrayRef)data, GetCFNull());
-                    }
-                    CFArraySetValueAtIndex((CFMutableArrayRef)data, index, cfValue);
-                }
-            }
-            CFRelease(cfValue);
-        }
-        else
-        {
-            if (CFGetTypeID(data) == CFDictionaryGetTypeID())
-            {
-                CFDictionaryRemoveValue((CFMutableDictionaryRef)data, propertyName);
-            }
-            else if (CFGetTypeID(data) == CFArrayGetTypeID())
-            {
-                SInt32 index = CFStringGetIntValue(propertyName);
-                CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data);
-                if (index >= 0)
-                {
-                    for (; arrayCount < index; arrayCount++)
-                    {
-                        CFArrayAppendValue((CFMutableArrayRef)data, GetCFNull());
-                    }
-                    CFArraySetValueAtIndex((CFMutableArrayRef)data, index, GetCFNull());
-                }
-            }
-        }
-    }
-}
-
-
-/*
-    CFJSObjectCopyCFValue
-*/
-CFTypeRef CFJSObjectCopyCFValue(void *data)
-{
-    CFTypeRef result = 0;
-    if (data)
-    {
-        result = (CFTypeRef)CFRetain(data);
-    }
-    return result;
-}
-
-/*
-    CFJSObjectCopyCFValue
-*/
-UInt8 CFJSObjectEqual(void *data1, void *data2)
-{
-    UInt8 result = false;
-    if (data1 && data2)
-    {
-        CFEqual((CFTypeRef)data1, (CFTypeRef)data2);
-    }
-    return result;
-}
-
-
-/*
-    CFJSObjectCopyPropertyNames
-*/
-CFArrayRef CFJSObjectCopyPropertyNames(void *data)
-{
-    CFMutableArrayRef result = 0;
-    if (data)
-    {
-        CFTypeID cfType = CFGetTypeID(data);
-        if (cfType == CFDictionaryGetTypeID())
-        {
-            CFIndex count = CFDictionaryGetCount((CFDictionaryRef)data);
-            if (count)
-            {
-                CFTypeRef* keys = (CFTypeRef*)malloc(sizeof(CFTypeRef)*count);
-                if (keys)
-                {
-                    int i;
-                    CFDictionaryGetKeysAndValues((CFDictionaryRef)data, (const void **)keys, 0);
-                    for (i = 0; i < count; i++)
-                    {
-                        CFStringRef key = (CFStringRef)keys[i];
-                        if (CFGetTypeID(key) != CFStringGetTypeID()) continue;
-
-                        if (!result) result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
-                        if (!result) continue;
-
-                        CFArrayAppendValue(result, key);
-                    }
-                    free(keys);
-                }
-            }
-        }
-    }
-    return result;
-}
-
-
-
-
-CFMutableArrayRef JSCreateCFArrayFromJSArray(CFArrayRef array)
-{
-    CFIndex count = array ? CFArrayGetCount(array) : 0;
-    CFMutableArrayRef cfArray = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
-    CFIndex i;
-
-    for (i = 0; cfArray && i <  count; i++)
-    {
-        JSObjectRef jsValue = (JSObjectRef)CFArrayGetValueAtIndex(array, i);
-        CFTypeRef cfvalue = JSObjectCopyCFValue(jsValue);
-        if (cfvalue)
-        {
-            CFArrayAppendValue(cfArray, cfvalue);
-            CFRelease(cfvalue);
-        }
-        else
-        {
-            CFArrayAppendValue(cfArray, GetCFNull());
-        }
-    }
-    return cfArray;
-}
-
-CFMutableArrayRef JSCreateJSArrayFromCFArray(CFArrayRef array)
-{
-    initializeThreading();
-
-    CFIndex count = array ? CFArrayGetCount(array) : 0;
-    CFArrayCallBacks arrayCallbacks;
-    CFMutableArrayRef jsArray;
-    CFIndex i;
-
-    JSTypeGetCFArrayCallBacks(&arrayCallbacks);
-    jsArray = CFArrayCreateMutable(0, 0, &arrayCallbacks);
-
-    for (i = 0; array && i <  count; i++)
-    {
-        CFTypeRef cfValue = (CFTypeRef)CFArrayGetValueAtIndex(array, i);
-        JSObjectRef jsValue = JSObjectCreateWithCFType(cfValue);
-
-        if (!jsValue) jsValue = JSObjectCreateWithCFType(GetCFNull());
-        if (jsValue)
-        {
-            CFArrayAppendValue(jsArray, jsValue);
-            JSRelease(jsValue);
-        }
-    }
-    return jsArray;
-}
-
-
-void JSLockInterpreter()
-{
-    initializeThreading();
-    JSLock::lock(LockForReal);
-}
-
-
-void JSUnlockInterpreter()
-{
-    JSLock::unlock(LockForReal);
-}
diff --git a/Source/JavaScriptGlue/JavaScriptGlue.exp b/Source/JavaScriptGlue/JavaScriptGlue.exp
deleted file mode 100644
index c33f9d8..0000000
--- a/Source/JavaScriptGlue/JavaScriptGlue.exp
+++ /dev/null
@@ -1,35 +0,0 @@
-_JSSetCFNull
-_JSGetCFNull
-
-_JSRetain
-_JSRelease
-_JSGetTypeID
-_JSGetRetainCount
-_JSCopyDescription
-_JSEqual
-
-_JSObjectCreate
-_JSObjectCreateWithCFType
-_JSObjectCopyCFValue
-_JSObjectGetData
-
-_JSObjectCopyProperty
-_JSObjectSetProperty
-_JSObjectCallFunction
-_JSObjectCopyPropertyNames
-
-_JSRunCreate
-_JSRunCopySource
-_JSRunCopyGlobalObject
-_JSRunEvaluate
-
-_JSTypeGetCFArrayCallBacks
-
-_JSCreateCFArrayFromJSArray
-_JSCreateJSArrayFromCFArray
-
-_JSRunCheckSyntax
-
-_JSLockInterpreter
-_JSUnlockInterpreter
-_JSCollect
diff --git a/Source/JavaScriptGlue/JavaScriptGlue.h b/Source/JavaScriptGlue/JavaScriptGlue.h
deleted file mode 100644
index 270c6d4..0000000
--- a/Source/JavaScriptGlue/JavaScriptGlue.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 JAVASCRIPTGLUE_H
-#define JAVASCRIPTGLUE_H
-
-#ifndef __CORESERVICES__
-#include <CoreServices/CoreServices.h>
-#endif
-
-#ifndef DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER
-#define DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* typedefs/structs */
-typedef enum {
-    kJSFlagNone = 0,
-    kJSFlagDebug = 1 << 0,
-    kJSFlagConvertAssociativeArray = 1 << 1 /* associative arrays will be converted to dictionaries */
-} JSFlags;
-
-typedef struct OpaqueJSTypeRef *JSTypeRef DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef JSTypeRef JSObjectRef DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef JSTypeRef JSRunRef DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef CFTypeID JSTypeID DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-typedef void (*JSObjectDisposeProcPtr)(void *data) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef CFArrayRef (*JSObjectCopyPropertyNamesProcPtr)(void *data) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef JSObjectRef (*JSObjectCopyPropertyProcPtr)(void *data, CFStringRef propertyName) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef void (*JSObjectSetPropertyProcPtr)(void *data, CFStringRef propertyName, JSObjectRef jsValue) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef JSObjectRef (*JSObjectCallFunctionProcPtr)(void *data, JSObjectRef thisObj, CFArrayRef args) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef CFTypeRef (*JSObjectCopyCFValueProcPtr)(void *data) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-typedef UInt8 (*JSObjectEqualProcPtr)(void *data1, void *data2) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-struct JSObjectCallBacks {
-    JSObjectDisposeProcPtr dispose;
-    JSObjectEqualProcPtr equal;
-    JSObjectCopyCFValueProcPtr copyCFValue;
-    JSObjectCopyPropertyProcPtr copyProperty;
-    JSObjectSetPropertyProcPtr setProperty;
-    JSObjectCallFunctionProcPtr callFunction;
-    JSObjectCopyPropertyNamesProcPtr copyPropertyNames;
-} DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-typedef struct JSObjectCallBacks JSObjectCallBacks, *JSObjectCallBacksPtr DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-void JSSetCFNull(CFTypeRef nullRef) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFTypeRef JSGetCFNull(void) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-JSTypeRef JSRetain(JSTypeRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-void JSRelease(JSTypeRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSTypeID JSGetTypeID(JSTypeRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFIndex JSGetRetainCount(JSTypeRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFStringRef JSCopyDescription(JSTypeRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-UInt8 JSEqual(JSTypeRef ref1, JSTypeRef ref2) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-JSObjectRef JSObjectCreate(void *data, JSObjectCallBacksPtr callBacks) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSObjectRef JSObjectCreateWithCFType(CFTypeRef inRef) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFTypeRef JSObjectCopyCFValue(JSObjectRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-void *JSObjectGetData(JSObjectRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-CFArrayRef JSObjectCopyPropertyNames(JSObjectRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSObjectRef JSObjectCopyProperty(JSObjectRef ref, CFStringRef propertyName) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-void JSObjectSetProperty(JSObjectRef ref, CFStringRef propertyName, JSObjectRef value) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSObjectRef JSObjectCallFunction(JSObjectRef ref, JSObjectRef thisObj, CFArrayRef args) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-JSRunRef JSRunCreate(CFStringRef jsSource, JSFlags inFlags) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFStringRef JSRunCopySource(JSRunRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSObjectRef JSRunCopyGlobalObject(JSRunRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-JSObjectRef JSRunEvaluate(JSRunRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-bool JSRunCheckSyntax(JSRunRef ref) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-void JSCollect(void) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-void JSTypeGetCFArrayCallBacks(CFArrayCallBacks *outCallBacks) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-CFMutableArrayRef JSCreateCFArrayFromJSArray(CFArrayRef array) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-CFMutableArrayRef JSCreateJSArrayFromCFArray(CFArrayRef array) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-void JSLockInterpreter(void) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-void JSUnlockInterpreter(void) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/Source/JavaScriptGlue/JavaScriptGlue.xcodeproj/project.pbxproj b/Source/JavaScriptGlue/JavaScriptGlue.xcodeproj/project.pbxproj
deleted file mode 100644
index 045ead0..0000000
--- a/Source/JavaScriptGlue/JavaScriptGlue.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,601 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 42;
-	objects = {
-
-/* Begin PBXAggregateTarget section */
-		1422E8C409DE3EA600749B87 /* All */ = {
-			isa = PBXAggregateTarget;
-			buildConfigurationList = 1422E8DD09DE3EF500749B87 /* Build configuration list for PBXAggregateTarget "All" */;
-			buildPhases = (
-			);
-			dependencies = (
-				1422E8CA09DE3EB100749B87 /* PBXTargetDependency */,
-				1422E8C809DE3EAD00749B87 /* PBXTargetDependency */,
-			);
-			name = All;
-			productName = All;
-		};
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
-		1422E87B09DE3BF000749B87 /* testjsglue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1422E86709DE3BCE00749B87 /* testjsglue.cpp */; };
-		1422E88209DE3C0400749B87 /* JavaScriptGlue.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD66F3D608F73ED700C75FD7 /* JavaScriptGlue.framework */; };
-		DD66F3BB08F73ED700C75FD7 /* JavaScriptGlue.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798B30262465703CA149D /* JavaScriptGlue.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		DD66F3BC08F73ED700C75FD7 /* JSBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798B9026246FD03CA149D /* JSBase.h */; };
-		DD66F3BD08F73ED700C75FD7 /* JSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798B7026246FD03CA149D /* JSUtils.h */; };
-		DD66F3BE08F73ED700C75FD7 /* JSObject.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798BB026246FD03CA149D /* JSObject.h */; };
-		DD66F3BF08F73ED700C75FD7 /* JSRun.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798BD026246FD03CA149D /* JSRun.h */; };
-		DD66F3C008F73ED700C75FD7 /* JSValueWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798C90262545403CA149D /* JSValueWrapper.h */; };
-		DD66F3C108F73ED700C75FD7 /* UserObjectImp.h in Headers */ = {isa = PBXBuildFile; fileRef = F11798CF0262579C03CA149D /* UserObjectImp.h */; };
-		DD66F3C308F73ED700C75FD7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
-		DD66F3C608F73ED700C75FD7 /* JavaScriptGlue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798B20262465703CA149D /* JavaScriptGlue.cpp */; };
-		DD66F3C708F73ED700C75FD7 /* JSRun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798BC026246FD03CA149D /* JSRun.cpp */; };
-		DD66F3C808F73ED700C75FD7 /* JSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798B6026246FD03CA149D /* JSUtils.cpp */; };
-		DD66F3C908F73ED700C75FD7 /* JSBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798B8026246FD03CA149D /* JSBase.cpp */; };
-		DD66F3CA08F73ED700C75FD7 /* JSObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798BA026246FD03CA149D /* JSObject.cpp */; };
-		DD66F3CB08F73ED700C75FD7 /* JSValueWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798C80262545403CA149D /* JSValueWrapper.cpp */; };
-		DD66F3CC08F73ED700C75FD7 /* UserObjectImp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F11798CE0262579C03CA149D /* UserObjectImp.cpp */; };
-		DD66F3CE08F73ED700C75FD7 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F14FC9F30258E9A603CA149D /* CoreServices.framework */; };
-		DD66F3F608F7401B00C75FD7 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD66F3F508F7401B00C75FD7 /* JavaScriptCore.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
-		1422E8C709DE3EAD00749B87 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1422E87609DE3BE800749B87;
-			remoteInfo = testjsglue;
-		};
-		1422E8C909DE3EB100749B87 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = DD66F3B908F73ED700C75FD7;
-			remoteInfo = JavaScriptGlue;
-		};
-		5D2F21E20BDFAB9D0082B294 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = DD66F3B908F73ED700C75FD7;
-			remoteInfo = JavaScriptGlue;
-		};
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
-		0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
-		0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
-		089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; indentWidth = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		1422E86709DE3BCE00749B87 /* testjsglue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = testjsglue.cpp; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; };
-		1422E87709DE3BE800749B87 /* testjsglue */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testjsglue; sourceTree = BUILT_PRODUCTS_DIR; };
-		1C90519F0BA9F3050081E9D0 /* Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; };
-		1C9051A00BA9F3050081E9D0 /* DebugRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugRelease.xcconfig; sourceTree = "<group>"; };
-		1C9051A10BA9F3050081E9D0 /* JavaScriptGlue.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = JavaScriptGlue.xcconfig; sourceTree = "<group>"; };
-		1C9051A20BA9F3050081E9D0 /* Version.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
-		DD66F3D508F73ED700C75FD7 /* Info.plist */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		DD66F3D608F73ED700C75FD7 /* JavaScriptGlue.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JavaScriptGlue.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		DD66F3F508F7401B00C75FD7 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JavaScriptCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		F11798B20262465703CA149D /* JavaScriptGlue.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JavaScriptGlue.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798B30262465703CA149D /* JavaScriptGlue.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JavaScriptGlue.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798B6026246FD03CA149D /* JSUtils.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSUtils.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798B7026246FD03CA149D /* JSUtils.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSUtils.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798B8026246FD03CA149D /* JSBase.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSBase.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798B9026246FD03CA149D /* JSBase.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSBase.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798BA026246FD03CA149D /* JSObject.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSObject.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798BB026246FD03CA149D /* JSObject.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSObject.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798BC026246FD03CA149D /* JSRun.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRun.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798BD026246FD03CA149D /* JSRun.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSRun.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798C80262545403CA149D /* JSValueWrapper.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSValueWrapper.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798C90262545403CA149D /* JSValueWrapper.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSValueWrapper.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798CE0262579C03CA149D /* UserObjectImp.cpp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserObjectImp.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F11798CF0262579C03CA149D /* UserObjectImp.h */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = UserObjectImp.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-		F14FC9F30258E9A603CA149D /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
-		F1EB7EAB02621EAF03CA149D /* JavaScriptGlue.exp */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.exports; path = JavaScriptGlue.exp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		1422E87509DE3BE800749B87 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1422E88209DE3C0400749B87 /* JavaScriptGlue.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		DD66F3CD08F73ED700C75FD7 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DD66F3CE08F73ED700C75FD7 /* CoreServices.framework in Frameworks */,
-				DD66F3F608F7401B00C75FD7 /* JavaScriptCore.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		034768DFFF38A50411DB9C8B /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				DD66F3D608F73ED700C75FD7 /* JavaScriptGlue.framework */,
-				1422E87709DE3BE800749B87 /* testjsglue */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-			tabWidth = 4;
-			usesTabs = 0;
-		};
-		0867D691FE84028FC02AAC07 /* JavaScriptGlue */ = {
-			isa = PBXGroup;
-			children = (
-				1422E86709DE3BCE00749B87 /* testjsglue.cpp */,
-				08FB77AEFE84172EC02AAC07 /* Classes */,
-				089C1665FE841158C02AAC07 /* Resources */,
-				0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
-				034768DFFF38A50411DB9C8B /* Products */,
-				1C90519E0BA9F3050081E9D0 /* Configurations */,
-				DD66F3D508F73ED700C75FD7 /* Info.plist */,
-			);
-			name = JavaScriptGlue;
-			sourceTree = "<group>";
-		};
-		0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
-			isa = PBXGroup;
-			children = (
-				1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */,
-				1058C7B2FEA5585E11CA2CBB /* Other Frameworks */,
-			);
-			name = "External Frameworks and Libraries";
-			sourceTree = "<group>";
-			tabWidth = 4;
-			usesTabs = 0;
-		};
-		089C1665FE841158C02AAC07 /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-				089C1666FE841158C02AAC07 /* InfoPlist.strings */,
-			);
-			name = Resources;
-			sourceTree = "<group>";
-			tabWidth = 4;
-			usesTabs = 0;
-		};
-		08FB77AEFE84172EC02AAC07 /* Classes */ = {
-			isa = PBXGroup;
-			children = (
-				F11798B20262465703CA149D /* JavaScriptGlue.cpp */,
-				F1EB7EAB02621EAF03CA149D /* JavaScriptGlue.exp */,
-				F11798B30262465703CA149D /* JavaScriptGlue.h */,
-				F11798B8026246FD03CA149D /* JSBase.cpp */,
-				F11798B9026246FD03CA149D /* JSBase.h */,
-				F11798BA026246FD03CA149D /* JSObject.cpp */,
-				F11798BB026246FD03CA149D /* JSObject.h */,
-				F11798BC026246FD03CA149D /* JSRun.cpp */,
-				F11798BD026246FD03CA149D /* JSRun.h */,
-				F11798B6026246FD03CA149D /* JSUtils.cpp */,
-				F11798B7026246FD03CA149D /* JSUtils.h */,
-				F11798C80262545403CA149D /* JSValueWrapper.cpp */,
-				F11798C90262545403CA149D /* JSValueWrapper.h */,
-				F11798CE0262579C03CA149D /* UserObjectImp.cpp */,
-				F11798CF0262579C03CA149D /* UserObjectImp.h */,
-			);
-			name = Classes;
-			sourceTree = "<group>";
-			tabWidth = 4;
-			usesTabs = 0;
-		};
-		1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				F14FC9F30258E9A603CA149D /* CoreServices.framework */,
-				DD66F3F508F7401B00C75FD7 /* JavaScriptCore.framework */,
-			);
-			name = "Linked Frameworks";
-			sourceTree = "<group>";
-		};
-		1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				0867D6A5FE840307C02AAC07 /* AppKit.framework */,
-				0867D69BFE84028FC02AAC07 /* Foundation.framework */,
-			);
-			name = "Other Frameworks";
-			sourceTree = "<group>";
-		};
-		1C90519E0BA9F3050081E9D0 /* Configurations */ = {
-			isa = PBXGroup;
-			children = (
-				1C90519F0BA9F3050081E9D0 /* Base.xcconfig */,
-				1C9051A00BA9F3050081E9D0 /* DebugRelease.xcconfig */,
-				1C9051A10BA9F3050081E9D0 /* JavaScriptGlue.xcconfig */,
-				1C9051A20BA9F3050081E9D0 /* Version.xcconfig */,
-			);
-			path = Configurations;
-			sourceTree = "<group>";
-			tabWidth = 4;
-			usesTabs = 0;
-		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		DD66F3BA08F73ED700C75FD7 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DD66F3BB08F73ED700C75FD7 /* JavaScriptGlue.h in Headers */,
-				DD66F3BC08F73ED700C75FD7 /* JSBase.h in Headers */,
-				DD66F3BE08F73ED700C75FD7 /* JSObject.h in Headers */,
-				DD66F3BF08F73ED700C75FD7 /* JSRun.h in Headers */,
-				DD66F3BD08F73ED700C75FD7 /* JSUtils.h in Headers */,
-				DD66F3C008F73ED700C75FD7 /* JSValueWrapper.h in Headers */,
-				DD66F3C108F73ED700C75FD7 /* UserObjectImp.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
-		1422E87609DE3BE800749B87 /* testjsglue */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1422E88609DE3C2200749B87 /* Build configuration list for PBXNativeTarget "testjsglue" */;
-			buildPhases = (
-				1422E87409DE3BE800749B87 /* Sources */,
-				1422E87509DE3BE800749B87 /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				5D2F21E30BDFAB9D0082B294 /* PBXTargetDependency */,
-			);
-			name = testjsglue;
-			productName = testjsglue;
-			productReference = 1422E87709DE3BE800749B87 /* testjsglue */;
-			productType = "com.apple.product-type.tool";
-		};
-		DD66F3B908F73ED700C75FD7 /* JavaScriptGlue */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = DD66F3D108F73ED700C75FD7 /* Build configuration list for PBXNativeTarget "JavaScriptGlue" */;
-			buildPhases = (
-				5D2F7D0A0C6878E000B5B72B /* Update Info.plist with version information */,
-				DD66F3BA08F73ED700C75FD7 /* Headers */,
-				DD66F3C208F73ED700C75FD7 /* Resources */,
-				DD66F3C408F73ED700C75FD7 /* Sources */,
-				DD66F3CD08F73ED700C75FD7 /* Frameworks */,
-				939D055E09DA033400984996 /* Check For Global Initializers */,
-				5D0D53490E9862A70029E223 /* Check For Weak VTables and Externals */,
-				5DA0F0C00DC2B48900EA22B4 /* Remove Headers If Needed */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = JavaScriptGlue;
-			productInstallPath = "$(NEXT_ROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
-			productName = JavaScriptGlue;
-			productReference = DD66F3D608F73ED700C75FD7 /* JavaScriptGlue.framework */;
-			productType = "com.apple.product-type.framework";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		0867D690FE84028FC02AAC07 /* Project object */ = {
-			isa = PBXProject;
-			buildConfigurationList = 14AC662B08CE7791006915A8 /* Build configuration list for PBXProject "JavaScriptGlue" */;
-			compatibilityVersion = "Xcode 2.4";
-			developmentRegion = English;
-			hasScannedForEncodings = 1;
-			knownRegions = (
-				English,
-				Japanese,
-				French,
-				German,
-			);
-			mainGroup = 0867D691FE84028FC02AAC07 /* JavaScriptGlue */;
-			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				1422E8C409DE3EA600749B87 /* All */,
-				DD66F3B908F73ED700C75FD7 /* JavaScriptGlue */,
-				1422E87609DE3BE800749B87 /* testjsglue */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		DD66F3C208F73ED700C75FD7 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DD66F3C308F73ED700C75FD7 /* InfoPlist.strings in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		5D0D53490E9862A70029E223 /* Check For Weak VTables and Externals */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-				"$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
-			);
-			name = "Check For Weak VTables and Externals";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ -f ../../Tools/Scripts/check-for-weak-vtables-and-externals ]; then\n    ../../Tools/Scripts/check-for-weak-vtables-and-externals || exit $?\nfi";
-		};
-		5D2F7D0A0C6878E000B5B72B /* Update Info.plist with version information */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-				"$(SRCROOT)/Configurations/Version.xcconfig",
-			);
-			name = "Update Info.plist with version information";
-			outputPaths = (
-				"$(SRCROOT)/Info.plist",
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "# Touch Info.plist to let Xcode know it needs to copy it into the built product\nif [[ \"${CONFIGURATION}\" != \"Production\" ]]; then\n    touch \"$SRCROOT/Info.plist\";\nfi;\n";
-		};
-		5DA0F0C00DC2B48900EA22B4 /* Remove Headers If Needed */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Remove Headers If Needed";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if (( TARGET_MAC_OS_X_VERSION_MAJOR > 1050 )); then\n   rm -rf \"$BUILT_PRODUCTS_DIR/$PUBLIC_HEADERS_FOLDER_PATH\"/*.h;\nfi;\n";
-		};
-		939D055E09DA033400984996 /* Check For Global Initializers */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-				"$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
-			);
-			name = "Check For Global Initializers";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ \"${TARGET_GCC_VERSION}\" = \"LLVM_COMPILER\" ]; then\n    exit 0;\nfi\n\nif [ -f ../../Tools/Scripts/check-for-global-initializers ]; then\n    ../../Tools/Scripts/check-for-global-initializers || exit $?\nfi";
-		};
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		1422E87409DE3BE800749B87 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1422E87B09DE3BF000749B87 /* testjsglue.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		DD66F3C408F73ED700C75FD7 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DD66F3C608F73ED700C75FD7 /* JavaScriptGlue.cpp in Sources */,
-				DD66F3C908F73ED700C75FD7 /* JSBase.cpp in Sources */,
-				DD66F3CA08F73ED700C75FD7 /* JSObject.cpp in Sources */,
-				DD66F3C708F73ED700C75FD7 /* JSRun.cpp in Sources */,
-				DD66F3C808F73ED700C75FD7 /* JSUtils.cpp in Sources */,
-				DD66F3CB08F73ED700C75FD7 /* JSValueWrapper.cpp in Sources */,
-				DD66F3CC08F73ED700C75FD7 /* UserObjectImp.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		1422E8C809DE3EAD00749B87 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1422E87609DE3BE800749B87 /* testjsglue */;
-			targetProxy = 1422E8C709DE3EAD00749B87 /* PBXContainerItemProxy */;
-		};
-		1422E8CA09DE3EB100749B87 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = DD66F3B908F73ED700C75FD7 /* JavaScriptGlue */;
-			targetProxy = 1422E8C909DE3EB100749B87 /* PBXContainerItemProxy */;
-		};
-		5D2F21E30BDFAB9D0082B294 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = DD66F3B908F73ED700C75FD7 /* JavaScriptGlue */;
-			targetProxy = 5D2F21E20BDFAB9D0082B294 /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
-		089C1666FE841158C02AAC07 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				089C1667FE841158C02AAC07 /* English */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		1422E88709DE3C2200749B87 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				OTHER_CFLAGS = "-Wno-deprecated-declarations";
-				OTHER_LDFLAGS = (
-					"-framework",
-					CoreFoundation,
-				);
-				PRODUCT_NAME = testjsglue;
-			};
-			name = Debug;
-		};
-		1422E88809DE3C2200749B87 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				OTHER_CFLAGS = "-Wno-deprecated-declarations";
-				OTHER_LDFLAGS = (
-					"-framework",
-					CoreFoundation,
-				);
-				PRODUCT_NAME = testjsglue;
-			};
-			name = Release;
-		};
-		1422E88909DE3C2200749B87 /* Production */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				OTHER_CFLAGS = "-Wno-deprecated-declarations";
-				OTHER_LDFLAGS = (
-					"-framework",
-					CoreFoundation,
-				);
-				PRODUCT_NAME = testjsglue;
-			};
-			name = Production;
-		};
-		1422E8DE09DE3EF500749B87 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				PRODUCT_NAME = All;
-			};
-			name = Debug;
-		};
-		1422E8DF09DE3EF500749B87 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				PRODUCT_NAME = All;
-			};
-			name = Release;
-		};
-		1422E8E009DE3EF500749B87 /* Production */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = All;
-			};
-			name = Production;
-		};
-		14AC662C08CE7791006915A8 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C9051A00BA9F3050081E9D0 /* DebugRelease.xcconfig */;
-			buildSettings = {
-				DEBUG_DEFINES = "$(DEBUG_DEFINES_debug)";
-				GCC_OPTIMIZATION_LEVEL = "$(GCC_OPTIMIZATION_LEVEL_debug)";
-				STRIP_INSTALLED_PRODUCT = "$(STRIP_INSTALLED_PRODUCT_debug)";
-			};
-			name = Debug;
-		};
-		14AC662D08CE7791006915A8 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C9051A00BA9F3050081E9D0 /* DebugRelease.xcconfig */;
-			buildSettings = {
-				STRIP_INSTALLED_PRODUCT = NO;
-			};
-			name = Release;
-		};
-		14AC662E08CE7791006915A8 /* Production */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C90519F0BA9F3050081E9D0 /* Base.xcconfig */;
-			buildSettings = {
-			};
-			name = Production;
-		};
-		DD66F3D208F73ED700C75FD7 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C9051A10BA9F3050081E9D0 /* JavaScriptGlue.xcconfig */;
-			buildSettings = {
-				INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)";
-			};
-			name = Debug;
-		};
-		DD66F3D308F73ED700C75FD7 /* Release */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C9051A10BA9F3050081E9D0 /* JavaScriptGlue.xcconfig */;
-			buildSettings = {
-				INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)";
-			};
-			name = Release;
-		};
-		DD66F3D408F73ED700C75FD7 /* Production */ = {
-			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1C9051A10BA9F3050081E9D0 /* JavaScriptGlue.xcconfig */;
-			buildSettings = {
-				BUILD_VARIANTS = normal;
-				SECTORDER_FLAGS = (
-					"-sectorder",
-					__TEXT,
-					__text,
-					"$(APPLE_INTERNAL_DIR)/OrderFiles/JavaScriptGlue.order",
-				);
-			};
-			name = Production;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		1422E88609DE3C2200749B87 /* Build configuration list for PBXNativeTarget "testjsglue" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1422E88709DE3C2200749B87 /* Debug */,
-				1422E88809DE3C2200749B87 /* Release */,
-				1422E88909DE3C2200749B87 /* Production */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Production;
-		};
-		1422E8DD09DE3EF500749B87 /* Build configuration list for PBXAggregateTarget "All" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1422E8DE09DE3EF500749B87 /* Debug */,
-				1422E8DF09DE3EF500749B87 /* Release */,
-				1422E8E009DE3EF500749B87 /* Production */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Production;
-		};
-		14AC662B08CE7791006915A8 /* Build configuration list for PBXProject "JavaScriptGlue" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				14AC662C08CE7791006915A8 /* Debug */,
-				14AC662D08CE7791006915A8 /* Release */,
-				14AC662E08CE7791006915A8 /* Production */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Production;
-		};
-		DD66F3D108F73ED700C75FD7 /* Build configuration list for PBXNativeTarget "JavaScriptGlue" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				DD66F3D208F73ED700C75FD7 /* Debug */,
-				DD66F3D308F73ED700C75FD7 /* Release */,
-				DD66F3D408F73ED700C75FD7 /* Production */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Production;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
-}
diff --git a/Source/JavaScriptGlue/LICENSE b/Source/JavaScriptGlue/LICENSE
deleted file mode 100644
index f29b41c..0000000
--- a/Source/JavaScriptGlue/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1.  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-2.  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.
-
-THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
diff --git a/Source/JavaScriptGlue/Makefile b/Source/JavaScriptGlue/Makefile
deleted file mode 100644
index cb4c11a..0000000
--- a/Source/JavaScriptGlue/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-include ../Makefile.shared
diff --git a/Source/JavaScriptGlue/UserObjectImp.cpp b/Source/JavaScriptGlue/UserObjectImp.cpp
deleted file mode 100644
index 6800fdf..0000000
--- a/Source/JavaScriptGlue/UserObjectImp.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2005, 2008, 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "config.h"
-#include "UserObjectImp.h"
-
-#include <JavaScriptCore/JSString.h>
-#include <JavaScriptCore/PropertyNameArray.h>
-
-const ClassInfo UserObjectImp::s_info = { "UserObject", &JSNonFinalObject::s_info, 0, 0, CREATE_METHOD_TABLE(UserObjectImp) };
-
-UserObjectImp::UserObjectImp(JSGlobalData& globalData, Structure* structure, JSUserObject* userObject)
-    : JSNonFinalObject(globalData, structure)
-    , fJSUserObject((JSUserObject*)userObject->Retain())
-{
-}
-
-UserObjectImp::~UserObjectImp()
-{
-    if (fJSUserObject)
-        fJSUserObject->Release();
-}
-
-void UserObjectImp::destroy(JSCell* cell)
-{
-    jsCast<UserObjectImp*>(cell)->UserObjectImp::~UserObjectImp();
-}
-
-CallType UserObjectImp::getCallData(JSCell* cell, CallData& callData)
-{
-    UserObjectImp* thisObject = jsCast<UserObjectImp*>(cell);
-    return thisObject->fJSUserObject ? thisObject->fJSUserObject->getCallData(callData) : CallTypeNone;
-}
-
-JSValue UserObjectImp::callAsFunction(ExecState *exec)
-{
-    JSValue result = jsUndefined();
-    JSUserObject* jsThisObj = KJSValueToJSObject(exec->hostThisValue().toThisObject(exec), exec);
-    if (jsThisObj) {
-        CFIndex argCount = exec->argumentCount();
-        CFArrayCallBacks arrayCallBacks;
-        JSTypeGetCFArrayCallBacks(&arrayCallBacks);
-        CFMutableArrayRef jsArgs = CFArrayCreateMutable(0, 0, &arrayCallBacks);
-        if (jsArgs) {
-            for (CFIndex i = 0; i < argCount; i++) {
-                JSUserObject* jsArg = KJSValueToJSObject(exec->argument(i), exec);
-                CFArrayAppendValue(jsArgs, (void*)jsArg);
-                jsArg->Release();
-            }
-        }
-
-        JSUserObject* jsResult;
-        { // scope
-            JSGlueAPICallback apiCallback(exec);
-
-            // getCallData should have guarded against a NULL fJSUserObject.
-            assert(fJSUserObject);
-            jsResult = fJSUserObject->CallFunction(jsThisObj, jsArgs);
-        }
-
-        if (jsResult) {
-            result = JSObjectKJSValue(jsResult);
-            jsResult->Release();
-        }
-
-        ReleaseCFType(jsArgs);
-        jsThisObj->Release();
-    }
-    return result;
-}
-
-
-void UserObjectImp::getOwnPropertyNames(JSObject* object, ExecState *exec, PropertyNameArray& propertyNames, EnumerationMode mode)
-{
-    UserObjectImp* thisObject = jsCast<UserObjectImp*>(object);
-    JSUserObject* ptr = thisObject->GetJSUserObject();
-    if (ptr) {
-        CFArrayRef cfPropertyNames = ptr->CopyPropertyNames();
-        if (cfPropertyNames) {
-            CFIndex count = CFArrayGetCount(cfPropertyNames);
-            CFIndex i;
-            for (i = 0; i < count; i++) {
-                CFStringRef propertyName = (CFStringRef)CFArrayGetValueAtIndex(cfPropertyNames, i);
-                propertyNames.add(CFStringToIdentifier(propertyName, exec));
-            }
-            CFRelease(cfPropertyNames);
-        }
-    }
-    JSObject::getOwnPropertyNames(thisObject, exec, propertyNames, mode);
-}
-
-JSValue UserObjectImp::userObjectGetter(ExecState*, JSValue slotBase, const Identifier& propertyName)
-{
-    UserObjectImp *thisObj = static_cast<UserObjectImp *>(asObject(slotBase));
-    // getOwnPropertySlot should have guarded against a null fJSUserObject.
-    assert(thisObj->fJSUserObject);
-    
-    CFStringRef cfPropName = IdentifierToCFString(propertyName);
-    JSUserObject *jsResult = thisObj->fJSUserObject->CopyProperty(cfPropName);
-    ReleaseCFType(cfPropName);
-    JSValue result = JSObjectKJSValue(jsResult);
-    jsResult->Release();
-
-    return result;
-}
-
-bool UserObjectImp::getOwnPropertySlot(JSCell* cell, ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
-{
-    UserObjectImp* thisObject = jsCast<UserObjectImp*>(cell);
-    if (!thisObject->fJSUserObject)
-        return false;
-
-    CFStringRef cfPropName = IdentifierToCFString(propertyName);
-    JSUserObject* jsResult = thisObject->fJSUserObject->CopyProperty(cfPropName);
-    ReleaseCFType(cfPropName);
-    if (jsResult) {
-        slot.setCustom(thisObject, userObjectGetter);
-        jsResult->Release();
-        return true;
-    } else {
-        JSValue kjsValue = thisObject->toPrimitive(exec);
-        if (!kjsValue.isUndefinedOrNull()) {
-            JSObject* kjsObject = kjsValue.toObject(exec);
-            if (kjsObject->getPropertySlot(exec, propertyName, slot))
-                return true;
-        }
-    }
-    return JSObject::getOwnPropertySlot(thisObject, exec, propertyName, slot);
-}
-
-void UserObjectImp::put(JSCell* cell, ExecState *exec, const Identifier &propertyName, JSValue value, PutPropertySlot&)
-{
-    UserObjectImp* thisObject = jsCast<UserObjectImp*>(cell);
-    if (!thisObject->fJSUserObject)
-        return;
-    
-    CFStringRef cfPropName = IdentifierToCFString(propertyName);
-    JSUserObject *jsValueObj = KJSValueToJSObject(value, exec);
-
-    thisObject->fJSUserObject->SetProperty(cfPropName, jsValueObj);
-
-    if (jsValueObj) jsValueObj->Release();
-    ReleaseCFType(cfPropName);
-}
-
-JSUserObject* UserObjectImp::GetJSUserObject() const
-{
-    return fJSUserObject;
-}
-
-JSValue UserObjectImp::toPrimitive(ExecState *exec, PreferredPrimitiveType) const
-{
-    JSValue result = jsUndefined();
-    JSUserObject* jsObjPtr = KJSValueToJSObject(toObject(exec, exec->lexicalGlobalObject()), exec);
-    CFTypeRef cfValue = jsObjPtr ? jsObjPtr->CopyCFValue() : 0;
-    if (cfValue) {
-        CFTypeID cfType = CFGetTypeID(cfValue);  // toPrimitive
-        if (cfValue == GetCFNull()) {
-            result = jsNull();
-        }
-        else if (cfType == CFBooleanGetTypeID()) {
-            if (cfValue == kCFBooleanTrue) {
-                result = jsBoolean(true);
-            } else {
-                result = jsBoolean(false);
-            }
-        } else if (cfType == CFStringGetTypeID()) {
-            result = jsString(exec, CFStringToUString((CFStringRef)cfValue));
-        } else if (cfType == CFNumberGetTypeID()) {
-            double d = 0.0;
-            CFNumberGetValue((CFNumberRef)cfValue, kCFNumberDoubleType, &d);
-            result = jsNumber(d);
-        } else if (cfType == CFURLGetTypeID()) {
-            CFURLRef absURL = CFURLCopyAbsoluteURL((CFURLRef)cfValue);
-            if (absURL) {
-                result = jsString(exec, CFStringToUString(CFURLGetString(absURL)));
-                ReleaseCFType(absURL);
-            }
-        }
-        ReleaseCFType(cfValue);
-    }
-    if (jsObjPtr)
-        jsObjPtr->Release();
-    return result;
-}
-
-
-bool UserObjectImp::toBoolean(ExecState *exec) const
-{
-    bool result = false;
-    JSUserObject* jsObjPtr = KJSValueToJSObject(toObject(exec, exec->lexicalGlobalObject()), exec);
-    CFTypeRef cfValue = jsObjPtr ? jsObjPtr->CopyCFValue() : 0;
-    if (cfValue)
-    {
-        CFTypeID cfType = CFGetTypeID(cfValue);  // toPrimitive
-        if (cfValue == GetCFNull())
-        {
-            //
-        }
-        else if (cfType == CFBooleanGetTypeID())
-        {
-            if (cfValue == kCFBooleanTrue)
-            {
-                result = true;
-            }
-        }
-        else if (cfType == CFStringGetTypeID())
-        {
-            if (CFStringGetLength((CFStringRef)cfValue))
-            {
-                result = true;
-            }
-        }
-        else if (cfType == CFNumberGetTypeID())
-        {
-            if (cfValue != kCFNumberNaN)
-            {
-                double d;
-                if (CFNumberGetValue((CFNumberRef)cfValue, kCFNumberDoubleType, &d))
-                {
-                    if (d != 0)
-                    {
-                        result = true;
-                    }
-                }
-            }
-        }
-        else if (cfType == CFArrayGetTypeID())
-        {
-            if (CFArrayGetCount((CFArrayRef)cfValue))
-            {
-                result = true;
-            }
-        }
-        else if (cfType == CFDictionaryGetTypeID())
-        {
-            if (CFDictionaryGetCount((CFDictionaryRef)cfValue))
-            {
-                result = true;
-            }
-        }
-        else if (cfType == CFSetGetTypeID())
-        {
-            if (CFSetGetCount((CFSetRef)cfValue))
-            {
-                result = true;
-            }
-        }
-        else if (cfType == CFURLGetTypeID())
-        {
-            CFURLRef absURL = CFURLCopyAbsoluteURL((CFURLRef)cfValue);
-            if (absURL)
-            {
-                CFStringRef cfStr = CFURLGetString(absURL);
-                if (cfStr && CFStringGetLength(cfStr))
-                {
-                    result = true;
-                }
-                ReleaseCFType(absURL);
-            }
-        }
-    }
-    if (jsObjPtr) jsObjPtr->Release();
-    ReleaseCFType(cfValue);
-    return result;
-}
-
-void UserObjectImp::visitChildren(JSCell* cell, SlotVisitor& visitor)
-{
-    UserObjectImp* thisObject = jsCast<UserObjectImp*>(cell);
-    JSObject::visitChildren(thisObject, visitor);
-    if (thisObject->fJSUserObject)
-        thisObject->fJSUserObject->Mark();
-}
diff --git a/Source/JavaScriptGlue/UserObjectImp.h b/Source/JavaScriptGlue/UserObjectImp.h
deleted file mode 100644
index 49a653e..0000000
--- a/Source/JavaScriptGlue/UserObjectImp.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2005, 2008, 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 UserObjectImp_h
-#define UserObjectImp_h
-
-#include "JSUtils.h"
-#include "JSBase.h"
-#include "JSObject.h"
-#include <JavaScriptCore/JSType.h>
-
-class UserObjectImp : public JSNonFinalObject {
-public:
-    typedef JSNonFinalObject Base;
-
-    static UserObjectImp* create(JSGlobalData& globalData, Structure* structure, JSUserObject* userObject)
-    {
-        UserObjectImp* object = new (allocateCell<UserObjectImp>(globalData.heap)) UserObjectImp(globalData, structure, userObject);
-        object->finishCreation(globalData);
-        return object;
-    }
-    
-    ~UserObjectImp();
-    static void destroy(JSCell*);
-
-    static const ClassInfo s_info;
-
-    static CallType getCallData(JSCell*, CallData&);
-
-    static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
-
-    JSValue callAsFunction(ExecState*); // TODO: Figure out how to re-virtualize this without breaking the fact that we don't allow vptrs in the JSCell hierarchy.
-    static bool getOwnPropertySlot(JSCell*, ExecState *, const Identifier&, PropertySlot&);
-    static void put(JSCell*, ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
-
-    JSValue toPrimitive(ExecState*, PreferredPrimitiveType preferredType = NoPreference) const;
-    bool toBoolean(ExecState*) const; // TODO: Figure out how to re-virtualize this without breaking the fact that we don't allow vptrs in the JSCell hierarchy.
-
-    static void visitChildren(JSCell*, SlotVisitor&);
-
-    JSUserObject *GetJSUserObject() const;
-
-    static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
-    {
-        return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames), &s_info);
-    }
-
-private:
-    UserObjectImp(JSGlobalData&, Structure*, JSUserObject*);
-    static JSValue userObjectGetter(ExecState*, JSValue, const Identifier& propertyName);
-
-    JSUserObject* fJSUserObject;
-};
-
-#endif
diff --git a/Source/JavaScriptGlue/config.h b/Source/JavaScriptGlue/config.h
deleted file mode 100644
index 6973b1e..0000000
--- a/Source/JavaScriptGlue/config.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER
-#define DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER
-#endif
-
-#include <wtf/Platform.h>
-#include <wtf/ExportMacros.h>
-#include <runtime/JSExportMacros.h>
diff --git a/Source/JavaScriptGlue/icu/LICENSE b/Source/JavaScriptGlue/icu/LICENSE
deleted file mode 100644
index 385d130..0000000
--- a/Source/JavaScriptGlue/icu/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright (c) 1995-2006 International Business Machines Corporation and others
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, and/or sell copies of the Software, and to permit persons
-to whom the Software is furnished to do so, provided that the above copyright notice(s)
-and this permission notice appear in all copies of the Software and that both the above
-copyright notice(s) and this permission notice appear in supporting documentation.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER
-OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
-CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not be used in
-advertising or otherwise to promote the sale, use or other dealings in this Software
-without prior written authorization of the copyright holder.
diff --git a/Source/JavaScriptGlue/icu/README b/Source/JavaScriptGlue/icu/README
deleted file mode 100644
index 389e2e8..0000000
--- a/Source/JavaScriptGlue/icu/README
+++ /dev/null
@@ -1,4 +0,0 @@
-The headers in this directory are for compiling on Mac OS X 10.4.
-The Mac OS X 10.4 release includes the ICU binary, but not ICU headers.
-For other platforms, installed ICU headers should be used rather than these.
-They are specific to Mac OS X 10.4.
diff --git a/Source/JavaScriptGlue/icu/unicode/platform.h b/Source/JavaScriptGlue/icu/unicode/platform.h
deleted file mode 100644
index 9595a26..0000000
--- a/Source/JavaScriptGlue/icu/unicode/platform.h
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
-******************************************************************************
-*
-*   Copyright (C) 1997-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-******************************************************************************
-*
-*  FILE NAME : platform.h
-*
-*   Date        Name        Description
-*   05/13/98    nos         Creation (content moved here from ptypes.h).
-*   03/02/99    stephen     Added AS400 support.
-*   03/30/99    stephen     Added Linux support.
-*   04/13/99    stephen     Reworked for autoconf.
-******************************************************************************
-*/
-
-/* Define the platform we're on. */
-#ifndef U_DARWIN
-#define U_DARWIN
-#endif
-
-/* Define whether inttypes.h is available */
-#ifndef U_HAVE_INTTYPES_H
-#define U_HAVE_INTTYPES_H 1
-#endif
-
-/*
- * Define what support for C++ streams is available.
- *     If U_IOSTREAM_SOURCE is set to 199711, then <iostream> is available
- * (1997711 is the date the ISO/IEC C++ FDIS was published), and then
- * one should qualify streams using the std namespace in ICU header
- * files.
- *     If U_IOSTREAM_SOURCE is set to 198506, then <iostream.h> is
- * available instead (198506 is the date when Stroustrup published
- * "An Extensible I/O Facility for C++" at the summer USENIX conference).
- *     If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and
- * support for them will be silently suppressed in ICU.
- *
- */
-
-#ifndef U_IOSTREAM_SOURCE
-#define U_IOSTREAM_SOURCE 199711
-#endif
-
-/* Determines whether specific types are available */
-#ifndef U_HAVE_INT8_T
-#define U_HAVE_INT8_T 1
-#endif
-
-#ifndef U_HAVE_UINT8_T
-#define U_HAVE_UINT8_T 0
-#endif
-
-#ifndef U_HAVE_INT16_T
-#define U_HAVE_INT16_T 1
-#endif
-
-#ifndef U_HAVE_UINT16_T
-#define U_HAVE_UINT16_T 0
-#endif
-
-#ifndef U_HAVE_INT32_T
-#define U_HAVE_INT32_T 1
-#endif
-
-#ifndef U_HAVE_UINT32_T
-#define U_HAVE_UINT32_T 0
-#endif
-
-#ifndef U_HAVE_INT64_T
-#define U_HAVE_INT64_T 1
-#endif
-
-#ifndef U_HAVE_UINT64_T
-#define U_HAVE_UINT64_T 0
-#endif
-
-/*===========================================================================*/
-/* Generic data types                                                        */
-/*===========================================================================*/
-
-#include <sys/types.h>
-
-/* If your platform does not have the <inttypes.h> header, you may
-   need to edit the typedefs below. */
-#if U_HAVE_INTTYPES_H
-
-/* autoconf 2.13 sometimes can't properly find the data types in <inttypes.h> */
-/* os/390 needs <inttypes.h>, but it doesn't have int8_t, and it sometimes */
-/* doesn't have uint8_t depending on the OS version. */
-/* So we have this work around. */
-#ifdef OS390
-/* The features header is needed to get (u)int64_t sometimes. */
-#include <features.h>
-#if ! U_HAVE_INT8_T
-typedef signed char int8_t;
-#endif
-#if !defined(__uint8_t)
-#define __uint8_t 1
-typedef unsigned char uint8_t;
-#endif
-#endif /* OS390 */
-
-#include <inttypes.h>
-
-#else /* U_HAVE_INTTYPES_H */
-
-#if ! U_HAVE_INT8_T
-typedef signed char int8_t;
-#endif
-
-#if ! U_HAVE_UINT8_T
-typedef unsigned char uint8_t;
-#endif
-
-#if ! U_HAVE_INT16_T
-typedef signed short int16_t;
-#endif
-
-#if ! U_HAVE_UINT16_T
-typedef unsigned short uint16_t;
-#endif
-
-#if ! U_HAVE_INT32_T
-typedef signed int int32_t;
-#endif
-
-#if ! U_HAVE_UINT32_T
-typedef unsigned int uint32_t;
-#endif
-
-#if ! U_HAVE_INT64_T
-    typedef signed long long int64_t;
-/* else we may not have a 64-bit type */
-#endif
-
-#if ! U_HAVE_UINT64_T
-    typedef unsigned long long uint64_t;
-/* else we may not have a 64-bit type */
-#endif
-
-#endif
-
-/*===========================================================================*/
-/* Compiler and environment features                                         */
-/*===========================================================================*/
-
-/* Define whether namespace is supported */
-#ifndef U_HAVE_NAMESPACE
-#define U_HAVE_NAMESPACE 1
-#endif
-
-/* Determines the endianness of the platform
-   It's done this way in case multiple architectures are being built at once.
-   For example, Darwin supports fat binaries, which can be both PPC and x86 based. */
-#if defined(BYTE_ORDER) && defined(BIG_ENDIAN)
-#define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN)
-#else
-#define U_IS_BIG_ENDIAN 1
-#endif
-
-/* 1 or 0 to enable or disable threads.  If undefined, default is: enable threads. */
-#define ICU_USE_THREADS 1
-
-#ifndef U_DEBUG
-#define U_DEBUG 0
-#endif
-
-#ifndef U_RELEASE
-#define U_RELEASE 1
-#endif
-
-/* Determine whether to disable renaming or not. This overrides the
-   setting in umachine.h which is for all platforms. */
-#ifndef U_DISABLE_RENAMING
-#define U_DISABLE_RENAMING 1
-#endif
-
-/* Determine whether to override new and delete. */
-#ifndef U_OVERRIDE_CXX_ALLOCATION
-#define U_OVERRIDE_CXX_ALLOCATION 1
-#endif
-/* Determine whether to override placement new and delete for STL. */
-#ifndef U_HAVE_PLACEMENT_NEW
-#define U_HAVE_PLACEMENT_NEW 1
-#endif
-
-/* Determine whether to enable tracing. */
-#ifndef U_ENABLE_TRACING
-#define U_ENABLE_TRACING 1
-#endif
-
-/* Define the library suffix in a C syntax. */
-#define U_HAVE_LIB_SUFFIX 0
-#define U_LIB_SUFFIX_C_NAME 
-#define U_LIB_SUFFIX_C_NAME_STRING ""
-
-/*===========================================================================*/
-/* Character data types                                                      */
-/*===========================================================================*/
-
-#if defined(OS390) || defined(OS400)
-#   define U_CHARSET_FAMILY 1
-#endif
-
-/*===========================================================================*/
-/* Information about wchar support                                           */
-/*===========================================================================*/
-
-#define U_HAVE_WCHAR_H      1
-#define U_SIZEOF_WCHAR_T    4
-
-#define U_HAVE_WCSCPY       1
-
-/*===========================================================================*/
-/* Information about POSIX support                                           */
-/*===========================================================================*/
-
-#define U_HAVE_NL_LANGINFO          1
-#define U_HAVE_NL_LANGINFO_CODESET  1
-#define U_NL_LANGINFO_CODESET       CODESET
-
-#if 1
-#define U_TZSET         tzset
-#endif
-#if 0
-#define U_TIMEZONE      
-#endif
-#if 1
-#define U_TZNAME        tzname
-#endif
-
-#define U_HAVE_MMAP     1
-#define U_HAVE_POPEN    1
-
-/*===========================================================================*/
-/* Symbol import-export control                                              */
-/*===========================================================================*/
-
-#define U_EXPORT
-/* U_CALLCONV is releated to U_EXPORT2 */
-#define U_EXPORT2
-
-/* cygwin needs to export/import data */
-#ifdef U_CYGWIN
-#define U_IMPORT __declspec(dllimport)
-#else
-#define U_IMPORT 
-#endif
-
-/*===========================================================================*/
-/* Code alignment and C function inlining                                    */
-/*===========================================================================*/
-
-#ifndef U_INLINE
-#define U_INLINE inline
-#endif
-
-#define U_ALIGN_CODE(n) 
-
-/*===========================================================================*/
-/* Programs used by ICU code                                                 */
-/*===========================================================================*/
-
-#define U_MAKE  "/usr/bin/gnumake"
diff --git a/Source/JavaScriptGlue/icu/unicode/putil.h b/Source/JavaScriptGlue/icu/unicode/putil.h
deleted file mode 100644
index 685df53..0000000
--- a/Source/JavaScriptGlue/icu/unicode/putil.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-******************************************************************************
-*
-*   Copyright (C) 1997-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-******************************************************************************
-*
-*  FILE NAME : putil.h
-*
-*   Date        Name        Description
-*   05/14/98    nos         Creation (content moved here from utypes.h).
-*   06/17/99    erm         Added IEEE_754
-*   07/22/98    stephen     Added IEEEremainder, max, min, trunc
-*   08/13/98    stephen     Added isNegativeInfinity, isPositiveInfinity
-*   08/24/98    stephen     Added longBitsFromDouble
-*   03/02/99    stephen     Removed openFile().  Added AS400 support.
-*   04/15/99    stephen     Converted to C
-*   11/15/99    helena      Integrated S/390 changes for IEEE support.
-*   01/11/00    helena      Added u_getVersion.
-******************************************************************************
-*/
-
-#ifndef PUTIL_H
-#define PUTIL_H
-
-#include "unicode/utypes.h"
-
-/* Define this to 1 if your platform supports IEEE 754 floating point,
-   to 0 if it does not. */
-#ifndef IEEE_754
-#   define IEEE_754 1
-#endif
-
-/*==========================================================================*/
-/* Platform utilities                                                       */
-/*==========================================================================*/
-
-/**
- * Platform utilities isolates the platform dependencies of the
- * libarary.  For each platform which this code is ported to, these
- * functions may have to be re-implemented.
- */
-
-/**
- * Return the ICU data directory. 
- * The data directory is where common format ICU data files (.dat files)
- *   are loaded from.  Note that normal use of the built-in ICU
- *   facilities does not require loading of an external data file;
- *   unless you are adding custom data to ICU, the data directory
- *   does not need to be set.
- *
- * The data directory is determined as follows:
- *    If u_setDataDirectory() has been called, that is it, otherwise
- *    if the ICU_DATA environment variable is set, use that, otherwise
- *    If a data directory was specifed at ICU build time
- *      (#define ICU_DATA_DIR "path"), use that,
- *    otherwise no data directory is available.
- *
- * @return the data directory, or an empty string ("") if no data directory has
- *         been specified.
- *   
- * @stable ICU 2.0
- */
-U_STABLE const char* U_EXPORT2 u_getDataDirectory(void);
-
-/** 
- * Set the ICU data directory. 
- * The data directory is where common format ICU data files (.dat files)
- *   are loaded from.  Note that normal use of the built-in ICU
- *   facilities does not require loading of an external data file;
- *   unless you are adding custom data to ICU, the data directory
- *   does not need to be set.
- *
- * This function should be called at most once in a process, before the
- * first ICU operation (e.g., u_init()) that will require the loading of an
- * ICU data file.
- * This function is not thread-safe. Use it before calling ICU APIs from
- * multiple threads.
- *
- * @param directory The directory to be set.
- *
- * @see u_init
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 u_setDataDirectory(const char *directory);
-
-/**
- * Please use ucnv_getDefaultName() instead.
- * Return the default codepage for this platform and locale.
- * This function can call setlocale() on Unix platforms. Please read the
- * platform documentation on setlocale() before calling this function.
- * @return the default codepage for this platform 
- * @internal
- */
-U_INTERNAL const char*  U_EXPORT2 uprv_getDefaultCodepage(void);
-
-/**
- * Please use uloc_getDefault() instead.
- * Return the default locale ID string by querying ths system, or
- *     zero if one cannot be found. 
- * This function can call setlocale() on Unix platforms. Please read the
- * platform documentation on setlocale() before calling this function.
- * @return the default locale ID string
- * @internal
- */
-U_INTERNAL const char*  U_EXPORT2 uprv_getDefaultLocaleID(void);
-
-/**
- * Filesystem file and path separator characters.
- * Example: '/' and ':' on Unix, '\\' and ';' on Windows.
- * @stable ICU 2.0
- */
-#ifdef XP_MAC
-#   define U_FILE_SEP_CHAR ':'
-#   define U_FILE_ALT_SEP_CHAR ':'
-#   define U_PATH_SEP_CHAR ';'
-#   define U_FILE_SEP_STRING ":"
-#   define U_FILE_ALT_SEP_STRING ":"
-#   define U_PATH_SEP_STRING ";"
-#elif defined(WIN32) || defined(OS2)
-#   define U_FILE_SEP_CHAR '\\'
-#   define U_FILE_ALT_SEP_CHAR '/'
-#   define U_PATH_SEP_CHAR ';'
-#   define U_FILE_SEP_STRING "\\"
-#   define U_FILE_ALT_SEP_STRING "/"
-#   define U_PATH_SEP_STRING ";"
-#else
-#   define U_FILE_SEP_CHAR '/'
-#   define U_FILE_ALT_SEP_CHAR '/'
-#   define U_PATH_SEP_CHAR ':'
-#   define U_FILE_SEP_STRING "/"
-#   define U_FILE_ALT_SEP_STRING "/"
-#   define U_PATH_SEP_STRING ":"
-#endif
-
-/**
- * Convert char characters to UChar characters.
- * This utility function is useful only for "invariant characters"
- * that are encoded in the platform default encoding.
- * They are a small, constant subset of the encoding and include
- * just the latin letters, digits, and some punctuation.
- * For details, see U_CHARSET_FAMILY.
- *
- * @param cs Input string, points to <code>length</code>
- *           character bytes from a subset of the platform encoding.
- * @param us Output string, points to memory for <code>length</code>
- *           Unicode characters.
- * @param length The number of characters to convert; this may
- *               include the terminating <code>NUL</code>.
- *
- * @see U_CHARSET_FAMILY
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-u_charsToUChars(const char *cs, UChar *us, int32_t length);
-
-/**
- * Convert UChar characters to char characters.
- * This utility function is useful only for "invariant characters"
- * that can be encoded in the platform default encoding.
- * They are a small, constant subset of the encoding and include
- * just the latin letters, digits, and some punctuation.
- * For details, see U_CHARSET_FAMILY.
- *
- * @param us Input string, points to <code>length</code>
- *           Unicode characters that can be encoded with the
- *           codepage-invariant subset of the platform encoding.
- * @param cs Output string, points to memory for <code>length</code>
- *           character bytes.
- * @param length The number of characters to convert; this may
- *               include the terminating <code>NUL</code>.
- *
- * @see U_CHARSET_FAMILY
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-u_UCharsToChars(const UChar *us, char *cs, int32_t length);
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/uchar.h b/Source/JavaScriptGlue/icu/unicode/uchar.h
deleted file mode 100644
index 7fd490c..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uchar.h
+++ /dev/null
@@ -1,2798 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1997-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-* File UCHAR.H
-*
-* Modification History:
-*
-*   Date        Name        Description
-*   04/02/97    aliu        Creation.
-*   03/29/99    helena      Updated for C APIs.
-*   4/15/99     Madhu       Updated for C Implementation and Javadoc
-*   5/20/99     Madhu       Added the function u_getVersion()
-*   8/19/1999   srl         Upgraded scripts to Unicode 3.0
-*   8/27/1999   schererm    UCharDirection constants: U_...
-*   11/11/1999  weiv        added u_isalnum(), cleaned comments
-*   01/11/2000  helena      Renamed u_getVersion to u_getUnicodeVersion().
-******************************************************************************
-*/
-
-#ifndef UCHAR_H
-#define UCHAR_H
-
-#include "unicode/utypes.h"
-
-U_CDECL_BEGIN
-
-/*==========================================================================*/
-/* Unicode version number                                                   */
-/*==========================================================================*/
-/**
- * Unicode version number, default for the current ICU version.
- * The actual Unicode Character Database (UCD) data is stored in uprops.dat
- * and may be generated from UCD files from a different Unicode version.
- * Call u_getUnicodeVersion to get the actual Unicode version of the data.
- *
- * @see u_getUnicodeVersion
- * @stable ICU 2.0
- */
-#define U_UNICODE_VERSION "4.0.1"
-
-/**
- * \file
- * \brief C API: Unicode Properties
- *
- * This C API provides low-level access to the Unicode Character Database.
- * In addition to raw property values, some convenience functions calculate
- * derived properties, for example for Java-style programming.
- *
- * Unicode assigns each code point (not just assigned character) values for
- * many properties.
- * Most of them are simple boolean flags, or constants from a small enumerated list.
- * For some properties, values are strings or other relatively more complex types.
- *
- * For more information see
- * "About the Unicode Character Database" (http://www.unicode.org/ucd/)
- * and the ICU User Guide chapter on Properties (http://oss.software.ibm.com/icu/userguide/properties.html).
- *
- * Many functions are designed to match java.lang.Character functions.
- * See the individual function documentation,
- * and see the JDK 1.4.1 java.lang.Character documentation
- * at http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Character.html
- *
- * There are also functions that provide easy migration from C/POSIX functions
- * like isblank(). Their use is generally discouraged because the C/POSIX
- * standards do not define their semantics beyond the ASCII range, which means
- * that different implementations exhibit very different behavior.
- * Instead, Unicode properties should be used directly.
- *
- * There are also only a few, broad C/POSIX character classes, and they tend
- * to be used for conflicting purposes. For example, the "isalpha()" class
- * is sometimes used to determine word boundaries, while a more sophisticated
- * approach would at least distinguish initial letters from continuation
- * characters (the latter including combining marks).
- * (In ICU, BreakIterator is the most sophisticated API for word boundaries.)
- * Another example: There is no "istitle()" class for titlecase characters.
- *
- * A summary of the behavior of some C/POSIX character classification implementations
- * for Unicode is available at http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/posix_classes.html
- *
- * <strong>Important</strong>:
- * The behavior of the ICU C/POSIX-style character classification
- * functions is subject to change according to discussion of the above summary.
- *
- * Note: There are several ICU whitespace functions.
- * Comparison:
- * - u_isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property;
- *       most of general categories "Z" (separators) + most whitespace ISO controls
- *       (including no-break spaces, but excluding IS1..IS4 and ZWSP)
- * - u_isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces
- * - u_isJavaSpaceChar: Java isSpaceChar; just Z (including no-break spaces)
- * - u_isspace: Z + whitespace ISO controls (including no-break spaces)
- * - u_isblank: "horizontal spaces" = TAB + Zs - ZWSP
- */
-
-/**
- * Constants.
- */
-
-/** The lowest Unicode code point value. Code points are non-negative. @stable ICU 2.0 */
-#define UCHAR_MIN_VALUE 0
-
-/**
- * The highest Unicode code point value (scalar value) according to
- * The Unicode Standard. This is a 21-bit value (20.1 bits, rounded up).
- * For a single character, UChar32 is a simple type that can hold any code point value.
- *
- * @see UChar32
- * @stable ICU 2.0
- */
-#define UCHAR_MAX_VALUE 0x10ffff
-
-/**
- * Get a single-bit bit set (a flag) from a bit number 0..31.
- * @stable ICU 2.1
- */
-#define U_MASK(x) ((uint32_t)1<<(x))
-
-/*
- * !! Note: Several comments in this file are machine-read by the
- * genpname tool.  These comments describe the correspondence between
- * icu enum constants and UCD entities.  Do not delete them.  Update
- * these comments as needed.
- *
- * Any comment of the form "/ *[name]* /" (spaces added) is such
- * a comment.
- *
- * The U_JG_* and U_GC_*_MASK constants are matched by their symbolic
- * name, which must match PropertyValueAliases.txt.
- */
-
-/**
- * Selection constants for Unicode properties.
- * These constants are used in functions like u_hasBinaryProperty to select
- * one of the Unicode properties.
- *
- * The properties APIs are intended to reflect Unicode properties as defined
- * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR).
- * For details about the properties see http://www.unicode.org/ucd/ .
- * For names of Unicode properties see the UCD file PropertyAliases.txt.
- *
- * Important: If ICU is built with UCD files from Unicode versions below, e.g., 3.2,
- * then properties marked with "new in Unicode 3.2" are not or not fully available.
- * Check u_getUnicodeVersion to be sure.
- *
- * @see u_hasBinaryProperty
- * @see u_getIntPropertyValue
- * @see u_getUnicodeVersion
- * @stable ICU 2.1
- */
-typedef enum UProperty {
-    /*  See note !!.  Comments of the form "Binary property Dash",
-        "Enumerated property Script", "Double property Numeric_Value",
-        and "String property Age" are read by genpname. */
-
-    /*  Note: Place UCHAR_ALPHABETIC before UCHAR_BINARY_START so that
-    debuggers display UCHAR_ALPHABETIC as the symbolic name for 0,
-    rather than UCHAR_BINARY_START.  Likewise for other *_START
-    identifiers. */
-
-    /** Binary property Alphabetic. Same as u_isUAlphabetic, different from u_isalpha.
-        Lu+Ll+Lt+Lm+Lo+Nl+Other_Alphabetic @stable ICU 2.1 */
-    UCHAR_ALPHABETIC=0,
-    /** First constant for binary Unicode properties. @stable ICU 2.1 */
-    UCHAR_BINARY_START=UCHAR_ALPHABETIC,
-    /** Binary property ASCII_Hex_Digit. 0-9 A-F a-f @stable ICU 2.1 */
-    UCHAR_ASCII_HEX_DIGIT,
-    /** Binary property Bidi_Control.
-        Format controls which have specific functions
-        in the Bidi Algorithm. @stable ICU 2.1 */
-    UCHAR_BIDI_CONTROL,
-    /** Binary property Bidi_Mirrored.
-        Characters that may change display in RTL text.
-        Same as u_isMirrored.
-        See Bidi Algorithm, UTR 9. @stable ICU 2.1 */
-    UCHAR_BIDI_MIRRORED,
-    /** Binary property Dash. Variations of dashes. @stable ICU 2.1 */
-    UCHAR_DASH,
-    /** Binary property Default_Ignorable_Code_Point (new in Unicode 3.2).
-        Ignorable in most processing.
-        <2060..206F, FFF0..FFFB, E0000..E0FFF>+Other_Default_Ignorable_Code_Point+(Cf+Cc+Cs-White_Space) @stable ICU 2.1 */
-    UCHAR_DEFAULT_IGNORABLE_CODE_POINT,
-    /** Binary property Deprecated (new in Unicode 3.2).
-        The usage of deprecated characters is strongly discouraged. @stable ICU 2.1 */
-    UCHAR_DEPRECATED,
-    /** Binary property Diacritic. Characters that linguistically modify
-        the meaning of another character to which they apply. @stable ICU 2.1 */
-    UCHAR_DIACRITIC,
-    /** Binary property Extender.
-        Extend the value or shape of a preceding alphabetic character,
-        e.g., length and iteration marks. @stable ICU 2.1 */
-    UCHAR_EXTENDER,
-    /** Binary property Full_Composition_Exclusion.
-        CompositionExclusions.txt+Singleton Decompositions+
-        Non-Starter Decompositions. @stable ICU 2.1 */
-    UCHAR_FULL_COMPOSITION_EXCLUSION,
-    /** Binary property Grapheme_Base (new in Unicode 3.2).
-        For programmatic determination of grapheme cluster boundaries.
-        [0..10FFFF]-Cc-Cf-Cs-Co-Cn-Zl-Zp-Grapheme_Link-Grapheme_Extend-CGJ @stable ICU 2.1 */
-    UCHAR_GRAPHEME_BASE,
-    /** Binary property Grapheme_Extend (new in Unicode 3.2).
-        For programmatic determination of grapheme cluster boundaries.
-        Me+Mn+Mc+Other_Grapheme_Extend-Grapheme_Link-CGJ @stable ICU 2.1 */
-    UCHAR_GRAPHEME_EXTEND,
-    /** Binary property Grapheme_Link (new in Unicode 3.2).
-        For programmatic determination of grapheme cluster boundaries. @stable ICU 2.1 */
-    UCHAR_GRAPHEME_LINK,
-    /** Binary property Hex_Digit.
-        Characters commonly used for hexadecimal numbers. @stable ICU 2.1 */
-    UCHAR_HEX_DIGIT,
-    /** Binary property Hyphen. Dashes used to mark connections
-        between pieces of words, plus the Katakana middle dot. @stable ICU 2.1 */
-    UCHAR_HYPHEN,
-    /** Binary property ID_Continue.
-        Characters that can continue an identifier.
-        DerivedCoreProperties.txt also says "NOTE: Cf characters should be filtered out."
-        ID_Start+Mn+Mc+Nd+Pc @stable ICU 2.1 */
-    UCHAR_ID_CONTINUE,
-    /** Binary property ID_Start.
-        Characters that can start an identifier.
-        Lu+Ll+Lt+Lm+Lo+Nl @stable ICU 2.1 */
-    UCHAR_ID_START,
-    /** Binary property Ideographic.
-        CJKV ideographs. @stable ICU 2.1 */
-    UCHAR_IDEOGRAPHIC,
-    /** Binary property IDS_Binary_Operator (new in Unicode 3.2).
-        For programmatic determination of
-        Ideographic Description Sequences. @stable ICU 2.1 */
-    UCHAR_IDS_BINARY_OPERATOR,
-    /** Binary property IDS_Trinary_Operator (new in Unicode 3.2).
-        For programmatic determination of
-        Ideographic Description Sequences. @stable ICU 2.1 */
-    UCHAR_IDS_TRINARY_OPERATOR,
-    /** Binary property Join_Control.
-        Format controls for cursive joining and ligation. @stable ICU 2.1 */
-    UCHAR_JOIN_CONTROL,
-    /** Binary property Logical_Order_Exception (new in Unicode 3.2).
-        Characters that do not use logical order and
-        require special handling in most processing. @stable ICU 2.1 */
-    UCHAR_LOGICAL_ORDER_EXCEPTION,
-    /** Binary property Lowercase. Same as u_isULowercase, different from u_islower.
-        Ll+Other_Lowercase @stable ICU 2.1 */
-    UCHAR_LOWERCASE,
-    /** Binary property Math. Sm+Other_Math @stable ICU 2.1 */
-    UCHAR_MATH,
-    /** Binary property Noncharacter_Code_Point.
-        Code points that are explicitly defined as illegal
-        for the encoding of characters. @stable ICU 2.1 */
-    UCHAR_NONCHARACTER_CODE_POINT,
-    /** Binary property Quotation_Mark. @stable ICU 2.1 */
-    UCHAR_QUOTATION_MARK,
-    /** Binary property Radical (new in Unicode 3.2).
-        For programmatic determination of
-        Ideographic Description Sequences. @stable ICU 2.1 */
-    UCHAR_RADICAL,
-    /** Binary property Soft_Dotted (new in Unicode 3.2).
-        Characters with a "soft dot", like i or j.
-        An accent placed on these characters causes
-        the dot to disappear. @stable ICU 2.1 */
-    UCHAR_SOFT_DOTTED,
-    /** Binary property Terminal_Punctuation.
-        Punctuation characters that generally mark
-        the end of textual units. @stable ICU 2.1 */
-    UCHAR_TERMINAL_PUNCTUATION,
-    /** Binary property Unified_Ideograph (new in Unicode 3.2).
-        For programmatic determination of
-        Ideographic Description Sequences. @stable ICU 2.1 */
-    UCHAR_UNIFIED_IDEOGRAPH,
-    /** Binary property Uppercase. Same as u_isUUppercase, different from u_isupper.
-        Lu+Other_Uppercase @stable ICU 2.1 */
-    UCHAR_UPPERCASE,
-    /** Binary property White_Space.
-        Same as u_isUWhiteSpace, different from u_isspace and u_isWhitespace.
-        Space characters+TAB+CR+LF-ZWSP-ZWNBSP @stable ICU 2.1 */
-    UCHAR_WHITE_SPACE,
-    /** Binary property XID_Continue.
-        ID_Continue modified to allow closure under
-        normalization forms NFKC and NFKD. @stable ICU 2.1 */
-    UCHAR_XID_CONTINUE,
-    /** Binary property XID_Start. ID_Start modified to allow
-        closure under normalization forms NFKC and NFKD. @stable ICU 2.1 */
-    UCHAR_XID_START,
-    /** Binary property Case_Sensitive. Either the source of a case
-        mapping or _in_ the target of a case mapping. Not the same as
-        the general category Cased_Letter. @stable ICU 2.6 */
-    UCHAR_CASE_SENSITIVE,
-    /** Binary property STerm (new in Unicode 4.0.1).
-        Sentence Terminal. Used in UAX #29: Text Boundaries
-        (http://www.unicode.org/reports/tr29/)
-        @draft ICU 3.0 */
-    UCHAR_S_TERM,
-    /** Binary property Variation_Selector (new in Unicode 4.0.1).
-        Indicates all those characters that qualify as Variation Selectors.
-        For details on the behavior of these characters,
-        see StandardizedVariants.html and 15.6 Variation Selectors.
-        @draft ICU 3.0 */
-    UCHAR_VARIATION_SELECTOR,
-    /** Binary property NFD_Inert.
-        ICU-specific property for characters that are inert under NFD,
-        i.e., they do not interact with adjacent characters.
-        Used for example in normalizing transforms in incremental mode
-        to find the boundary of safely normalizable text despite possible
-        text additions.
-
-        There is one such property per normalization form.
-        These properties are computed as follows - an inert character is:
-        a) unassigned, or ALL of the following:
-        b) of combining class 0.
-        c) not decomposed by this normalization form.
-        AND if NFC or NFKC,
-        d) can never compose with a previous character.
-        e) can never compose with a following character.
-        f) can never change if another character is added.
-           Example: a-breve might satisfy all but f, but if you
-           add an ogonek it changes to a-ogonek + breve
-
-        See also com.ibm.text.UCD.NFSkippable in the ICU4J repository,
-        and icu/source/common/unormimp.h .
-        @draft ICU 3.0 */
-    UCHAR_NFD_INERT,
-    /** Binary property NFKD_Inert.
-        ICU-specific property for characters that are inert under NFKD,
-        i.e., they do not interact with adjacent characters.
-        Used for example in normalizing transforms in incremental mode
-        to find the boundary of safely normalizable text despite possible
-        text additions.
-        @see UCHAR_NFD_INERT
-        @draft ICU 3.0 */
-    UCHAR_NFKD_INERT,
-    /** Binary property NFC_Inert.
-        ICU-specific property for characters that are inert under NFC,
-        i.e., they do not interact with adjacent characters.
-        Used for example in normalizing transforms in incremental mode
-        to find the boundary of safely normalizable text despite possible
-        text additions.
-        @see UCHAR_NFD_INERT
-        @draft ICU 3.0 */
-    UCHAR_NFC_INERT,
-    /** Binary property NFKC_Inert.
-        ICU-specific property for characters that are inert under NFKC,
-        i.e., they do not interact with adjacent characters.
-        Used for example in normalizing transforms in incremental mode
-        to find the boundary of safely normalizable text despite possible
-        text additions.
-        @see UCHAR_NFD_INERT
-        @draft ICU 3.0 */
-    UCHAR_NFKC_INERT,
-    /** Binary Property Segment_Starter.
-        ICU-specific property for characters that are starters in terms of
-        Unicode normalization and combining character sequences.
-        They have ccc=0 and do not occur in non-initial position of the
-        canonical decomposition of any character
-        (like " in NFD(a-umlaut) and a Jamo T in an NFD(Hangul LVT)).
-        ICU uses this property for segmenting a string for generating a set of
-        canonically equivalent strings, e.g. for canonical closure while
-        processing collation tailoring rules.
-        @draft ICU 3.0 */
-    UCHAR_SEGMENT_STARTER,
-    /** One more than the last constant for binary Unicode properties. @stable ICU 2.1 */
-    UCHAR_BINARY_LIMIT,
-
-    /** Enumerated property Bidi_Class.
-        Same as u_charDirection, returns UCharDirection values. @stable ICU 2.2 */
-    UCHAR_BIDI_CLASS=0x1000,
-    /** First constant for enumerated/integer Unicode properties. @stable ICU 2.2 */
-    UCHAR_INT_START=UCHAR_BIDI_CLASS,
-    /** Enumerated property Block.
-        Same as ublock_getCode, returns UBlockCode values. @stable ICU 2.2 */
-    UCHAR_BLOCK,
-    /** Enumerated property Canonical_Combining_Class.
-        Same as u_getCombiningClass, returns 8-bit numeric values. @stable ICU 2.2 */
-    UCHAR_CANONICAL_COMBINING_CLASS,
-    /** Enumerated property Decomposition_Type.
-        Returns UDecompositionType values. @stable ICU 2.2 */
-    UCHAR_DECOMPOSITION_TYPE,
-    /** Enumerated property East_Asian_Width.
-        See http://www.unicode.org/reports/tr11/
-        Returns UEastAsianWidth values. @stable ICU 2.2 */
-    UCHAR_EAST_ASIAN_WIDTH,
-    /** Enumerated property General_Category.
-        Same as u_charType, returns UCharCategory values. @stable ICU 2.2 */
-    UCHAR_GENERAL_CATEGORY,
-    /** Enumerated property Joining_Group.
-        Returns UJoiningGroup values. @stable ICU 2.2 */
-    UCHAR_JOINING_GROUP,
-    /** Enumerated property Joining_Type.
-        Returns UJoiningType values. @stable ICU 2.2 */
-    UCHAR_JOINING_TYPE,
-    /** Enumerated property Line_Break.
-        Returns ULineBreak values. @stable ICU 2.2 */
-    UCHAR_LINE_BREAK,
-    /** Enumerated property Numeric_Type.
-        Returns UNumericType values. @stable ICU 2.2 */
-    UCHAR_NUMERIC_TYPE,
-    /** Enumerated property Script.
-        Same as uscript_getScript, returns UScriptCode values. @stable ICU 2.2 */
-    UCHAR_SCRIPT,
-    /** Enumerated property Hangul_Syllable_Type, new in Unicode 4.
-        Returns UHangulSyllableType values. @stable ICU 2.6 */
-    UCHAR_HANGUL_SYLLABLE_TYPE,
-    /** Enumerated property NFD_Quick_Check.
-        Returns UNormalizationCheckResult values. @draft ICU 3.0 */
-    UCHAR_NFD_QUICK_CHECK,
-    /** Enumerated property NFKD_Quick_Check.
-        Returns UNormalizationCheckResult values. @draft ICU 3.0 */
-    UCHAR_NFKD_QUICK_CHECK,
-    /** Enumerated property NFC_Quick_Check.
-        Returns UNormalizationCheckResult values. @draft ICU 3.0 */
-    UCHAR_NFC_QUICK_CHECK,
-    /** Enumerated property NFKC_Quick_Check.
-        Returns UNormalizationCheckResult values. @draft ICU 3.0 */
-    UCHAR_NFKC_QUICK_CHECK,
-    /** Enumerated property Lead_Canonical_Combining_Class.
-        ICU-specific property for the ccc of the first code point
-        of the decomposition, or lccc(c)=ccc(NFD(c)[0]).
-        Useful for checking for canonically ordered text;
-        see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD .
-        Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */
-    UCHAR_LEAD_CANONICAL_COMBINING_CLASS,
-    /** Enumerated property Trail_Canonical_Combining_Class.
-        ICU-specific property for the ccc of the last code point
-        of the decomposition, or tccc(c)=ccc(NFD(c)[last]).
-        Useful for checking for canonically ordered text;
-        see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD .
-        Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */
-    UCHAR_TRAIL_CANONICAL_COMBINING_CLASS,
-    /** One more than the last constant for enumerated/integer Unicode properties. @stable ICU 2.2 */
-    UCHAR_INT_LIMIT,
-
-    /** Bitmask property General_Category_Mask.
-        This is the General_Category property returned as a bit mask.
-        When used in u_getIntPropertyValue(c), same as U_MASK(u_charType(c)),
-        returns bit masks for UCharCategory values where exactly one bit is set.
-        When used with u_getPropertyValueName() and u_getPropertyValueEnum(),
-        a multi-bit mask is used for sets of categories like "Letters".
-        Mask values should be cast to uint32_t.
-        @stable ICU 2.4 */
-    UCHAR_GENERAL_CATEGORY_MASK=0x2000,
-    /** First constant for bit-mask Unicode properties. @stable ICU 2.4 */
-    UCHAR_MASK_START=UCHAR_GENERAL_CATEGORY_MASK,
-    /** One more than the last constant for bit-mask Unicode properties. @stable ICU 2.4 */
-    UCHAR_MASK_LIMIT,
-
-    /** Double property Numeric_Value.
-        Corresponds to u_getNumericValue. @stable ICU 2.4 */
-    UCHAR_NUMERIC_VALUE=0x3000,
-    /** First constant for double Unicode properties. @stable ICU 2.4 */
-    UCHAR_DOUBLE_START=UCHAR_NUMERIC_VALUE,
-    /** One more than the last constant for double Unicode properties. @stable ICU 2.4 */
-    UCHAR_DOUBLE_LIMIT,
-
-    /** String property Age.
-        Corresponds to u_charAge. @stable ICU 2.4 */
-    UCHAR_AGE=0x4000,
-    /** First constant for string Unicode properties. @stable ICU 2.4 */
-    UCHAR_STRING_START=UCHAR_AGE,
-    /** String property Bidi_Mirroring_Glyph.
-        Corresponds to u_charMirror. @stable ICU 2.4 */
-    UCHAR_BIDI_MIRRORING_GLYPH,
-    /** String property Case_Folding.
-        Corresponds to u_strFoldCase in ustring.h. @stable ICU 2.4 */
-    UCHAR_CASE_FOLDING,
-    /** String property ISO_Comment.
-        Corresponds to u_getISOComment. @stable ICU 2.4 */
-    UCHAR_ISO_COMMENT,
-    /** String property Lowercase_Mapping.
-        Corresponds to u_strToLower in ustring.h. @stable ICU 2.4 */
-    UCHAR_LOWERCASE_MAPPING,
-    /** String property Name.
-        Corresponds to u_charName. @stable ICU 2.4 */
-    UCHAR_NAME,
-    /** String property Simple_Case_Folding.
-        Corresponds to u_foldCase. @stable ICU 2.4 */
-    UCHAR_SIMPLE_CASE_FOLDING,
-    /** String property Simple_Lowercase_Mapping.
-        Corresponds to u_tolower. @stable ICU 2.4 */
-    UCHAR_SIMPLE_LOWERCASE_MAPPING,
-    /** String property Simple_Titlecase_Mapping.
-        Corresponds to u_totitle. @stable ICU 2.4 */
-    UCHAR_SIMPLE_TITLECASE_MAPPING,
-    /** String property Simple_Uppercase_Mapping.
-        Corresponds to u_toupper. @stable ICU 2.4 */
-    UCHAR_SIMPLE_UPPERCASE_MAPPING,
-    /** String property Titlecase_Mapping.
-        Corresponds to u_strToTitle in ustring.h. @stable ICU 2.4 */
-    UCHAR_TITLECASE_MAPPING,
-    /** String property Unicode_1_Name.
-        Corresponds to u_charName. @stable ICU 2.4 */
-    UCHAR_UNICODE_1_NAME,
-    /** String property Uppercase_Mapping.
-        Corresponds to u_strToUpper in ustring.h. @stable ICU 2.4 */
-    UCHAR_UPPERCASE_MAPPING,
-    /** One more than the last constant for string Unicode properties. @stable ICU 2.4 */
-    UCHAR_STRING_LIMIT,
-
-    /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */
-    UCHAR_INVALID_CODE = -1
-} UProperty;
-
-/**
- * Data for enumerated Unicode general category types.
- * See http://www.unicode.org/Public/UNIDATA/UnicodeData.html .
- * @stable ICU 2.0
- */
-typedef enum UCharCategory
-{
-    /** See note !!.  Comments of the form "Cn" are read by genpname. */
-
-    /** Non-category for unassigned and non-character code points. @stable ICU 2.0 */
-    U_UNASSIGNED              = 0,
-    /** Cn "Other, Not Assigned (no characters in [UnicodeData.txt] have this property)" (same as U_UNASSIGNED!) @stable ICU 2.0 */
-    U_GENERAL_OTHER_TYPES     = 0,
-    /** Lu @stable ICU 2.0 */
-    U_UPPERCASE_LETTER        = 1,
-    /** Ll @stable ICU 2.0 */
-    U_LOWERCASE_LETTER        = 2,
-    /** Lt @stable ICU 2.0 */
-    U_TITLECASE_LETTER        = 3,
-    /** Lm @stable ICU 2.0 */
-    U_MODIFIER_LETTER         = 4,
-    /** Lo @stable ICU 2.0 */
-    U_OTHER_LETTER            = 5,
-    /** Mn @stable ICU 2.0 */
-    U_NON_SPACING_MARK        = 6,
-    /** Me @stable ICU 2.0 */
-    U_ENCLOSING_MARK          = 7,
-    /** Mc @stable ICU 2.0 */
-    U_COMBINING_SPACING_MARK  = 8,
-    /** Nd @stable ICU 2.0 */
-    U_DECIMAL_DIGIT_NUMBER    = 9,
-    /** Nl @stable ICU 2.0 */
-    U_LETTER_NUMBER           = 10,
-    /** No @stable ICU 2.0 */
-    U_OTHER_NUMBER            = 11,
-    /** Zs @stable ICU 2.0 */
-    U_SPACE_SEPARATOR         = 12,
-    /** Zl @stable ICU 2.0 */
-    U_LINE_SEPARATOR          = 13,
-    /** Zp @stable ICU 2.0 */
-    U_PARAGRAPH_SEPARATOR     = 14,
-    /** Cc @stable ICU 2.0 */
-    U_CONTROL_CHAR            = 15,
-    /** Cf @stable ICU 2.0 */
-    U_FORMAT_CHAR             = 16,
-    /** Co @stable ICU 2.0 */
-    U_PRIVATE_USE_CHAR        = 17,
-    /** Cs @stable ICU 2.0 */
-    U_SURROGATE               = 18,
-    /** Pd @stable ICU 2.0 */
-    U_DASH_PUNCTUATION        = 19,
-    /** Ps @stable ICU 2.0 */
-    U_START_PUNCTUATION       = 20,
-    /** Pe @stable ICU 2.0 */
-    U_END_PUNCTUATION         = 21,
-    /** Pc @stable ICU 2.0 */
-    U_CONNECTOR_PUNCTUATION   = 22,
-    /** Po @stable ICU 2.0 */
-    U_OTHER_PUNCTUATION       = 23,
-    /** Sm @stable ICU 2.0 */
-    U_MATH_SYMBOL             = 24,
-    /** Sc @stable ICU 2.0 */
-    U_CURRENCY_SYMBOL         = 25,
-    /** Sk @stable ICU 2.0 */
-    U_MODIFIER_SYMBOL         = 26,
-    /** So @stable ICU 2.0 */
-    U_OTHER_SYMBOL            = 27,
-    /** Pi @stable ICU 2.0 */
-    U_INITIAL_PUNCTUATION     = 28,
-    /** Pf @stable ICU 2.0 */
-    U_FINAL_PUNCTUATION       = 29,
-    /** One higher than the last enum UCharCategory constant. @stable ICU 2.0 */
-    U_CHAR_CATEGORY_COUNT
-} UCharCategory;
-
-/**
- * U_GC_XX_MASK constants are bit flags corresponding to Unicode
- * general category values.
- * For each category, the nth bit is set if the numeric value of the
- * corresponding UCharCategory constant is n.
- *
- * There are also some U_GC_Y_MASK constants for groups of general categories
- * like L for all letter categories.
- *
- * @see u_charType
- * @see U_GET_GC_MASK
- * @see UCharCategory
- * @stable ICU 2.1
- */
-#define U_GC_CN_MASK    U_MASK(U_GENERAL_OTHER_TYPES)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_LU_MASK    U_MASK(U_UPPERCASE_LETTER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_LL_MASK    U_MASK(U_LOWERCASE_LETTER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_LT_MASK    U_MASK(U_TITLECASE_LETTER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_LM_MASK    U_MASK(U_MODIFIER_LETTER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_LO_MASK    U_MASK(U_OTHER_LETTER)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_MN_MASK    U_MASK(U_NON_SPACING_MARK)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_ME_MASK    U_MASK(U_ENCLOSING_MARK)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_MC_MASK    U_MASK(U_COMBINING_SPACING_MARK)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_ND_MASK    U_MASK(U_DECIMAL_DIGIT_NUMBER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_NL_MASK    U_MASK(U_LETTER_NUMBER)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_NO_MASK    U_MASK(U_OTHER_NUMBER)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_ZS_MASK    U_MASK(U_SPACE_SEPARATOR)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_ZL_MASK    U_MASK(U_LINE_SEPARATOR)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_ZP_MASK    U_MASK(U_PARAGRAPH_SEPARATOR)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_CC_MASK    U_MASK(U_CONTROL_CHAR)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_CF_MASK    U_MASK(U_FORMAT_CHAR)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_CO_MASK    U_MASK(U_PRIVATE_USE_CHAR)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_CS_MASK    U_MASK(U_SURROGATE)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PD_MASK    U_MASK(U_DASH_PUNCTUATION)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PS_MASK    U_MASK(U_START_PUNCTUATION)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PE_MASK    U_MASK(U_END_PUNCTUATION)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PC_MASK    U_MASK(U_CONNECTOR_PUNCTUATION)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PO_MASK    U_MASK(U_OTHER_PUNCTUATION)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_SM_MASK    U_MASK(U_MATH_SYMBOL)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_SC_MASK    U_MASK(U_CURRENCY_SYMBOL)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_SK_MASK    U_MASK(U_MODIFIER_SYMBOL)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_SO_MASK    U_MASK(U_OTHER_SYMBOL)
-
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PI_MASK    U_MASK(U_INITIAL_PUNCTUATION)
-/** Mask constant for a UCharCategory. @stable ICU 2.1 */
-#define U_GC_PF_MASK    U_MASK(U_FINAL_PUNCTUATION)
-
-
-/** Mask constant for multiple UCharCategory bits (L Letters). @stable ICU 2.1 */
-#define U_GC_L_MASK \
-            (U_GC_LU_MASK|U_GC_LL_MASK|U_GC_LT_MASK|U_GC_LM_MASK|U_GC_LO_MASK)
-
-/** Mask constant for multiple UCharCategory bits (LC Cased Letters). @stable ICU 2.1 */
-#define U_GC_LC_MASK \
-            (U_GC_LU_MASK|U_GC_LL_MASK|U_GC_LT_MASK)
-
-/** Mask constant for multiple UCharCategory bits (M Marks). @stable ICU 2.1 */
-#define U_GC_M_MASK (U_GC_MN_MASK|U_GC_ME_MASK|U_GC_MC_MASK)
-
-/** Mask constant for multiple UCharCategory bits (N Numbers). @stable ICU 2.1 */
-#define U_GC_N_MASK (U_GC_ND_MASK|U_GC_NL_MASK|U_GC_NO_MASK)
-
-/** Mask constant for multiple UCharCategory bits (Z Separators). @stable ICU 2.1 */
-#define U_GC_Z_MASK (U_GC_ZS_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK)
-
-/** Mask constant for multiple UCharCategory bits (C Others). @stable ICU 2.1 */
-#define U_GC_C_MASK \
-            (U_GC_CN_MASK|U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CO_MASK|U_GC_CS_MASK)
-
-/** Mask constant for multiple UCharCategory bits (P Punctuation). @stable ICU 2.1 */
-#define U_GC_P_MASK \
-            (U_GC_PD_MASK|U_GC_PS_MASK|U_GC_PE_MASK|U_GC_PC_MASK|U_GC_PO_MASK| \
-             U_GC_PI_MASK|U_GC_PF_MASK)
-
-/** Mask constant for multiple UCharCategory bits (S Symbols). @stable ICU 2.1 */
-#define U_GC_S_MASK (U_GC_SM_MASK|U_GC_SC_MASK|U_GC_SK_MASK|U_GC_SO_MASK)
-
-/**
- * This specifies the language directional property of a character set.
- * @stable ICU 2.0
- */
-typedef enum UCharDirection {
-    /** See note !!.  Comments of the form "EN" are read by genpname. */
-
-    /** L @stable ICU 2.0 */
-    U_LEFT_TO_RIGHT               = 0,
-    /** R @stable ICU 2.0 */
-    U_RIGHT_TO_LEFT               = 1,
-    /** EN @stable ICU 2.0 */
-    U_EUROPEAN_NUMBER             = 2,
-    /** ES @stable ICU 2.0 */
-    U_EUROPEAN_NUMBER_SEPARATOR   = 3,
-    /** ET @stable ICU 2.0 */
-    U_EUROPEAN_NUMBER_TERMINATOR  = 4,
-    /** AN @stable ICU 2.0 */
-    U_ARABIC_NUMBER               = 5,
-    /** CS @stable ICU 2.0 */
-    U_COMMON_NUMBER_SEPARATOR     = 6,
-    /** B @stable ICU 2.0 */
-    U_BLOCK_SEPARATOR             = 7,
-    /** S @stable ICU 2.0 */
-    U_SEGMENT_SEPARATOR           = 8,
-    /** WS @stable ICU 2.0 */
-    U_WHITE_SPACE_NEUTRAL         = 9,
-    /** ON @stable ICU 2.0 */
-    U_OTHER_NEUTRAL               = 10,
-    /** LRE @stable ICU 2.0 */
-    U_LEFT_TO_RIGHT_EMBEDDING     = 11,
-    /** LRO @stable ICU 2.0 */
-    U_LEFT_TO_RIGHT_OVERRIDE      = 12,
-    /** AL @stable ICU 2.0 */
-    U_RIGHT_TO_LEFT_ARABIC        = 13,
-    /** RLE @stable ICU 2.0 */
-    U_RIGHT_TO_LEFT_EMBEDDING     = 14,
-    /** RLO @stable ICU 2.0 */
-    U_RIGHT_TO_LEFT_OVERRIDE      = 15,
-    /** PDF @stable ICU 2.0 */
-    U_POP_DIRECTIONAL_FORMAT      = 16,
-    /** NSM @stable ICU 2.0 */
-    U_DIR_NON_SPACING_MARK        = 17,
-    /** BN @stable ICU 2.0 */
-    U_BOUNDARY_NEUTRAL            = 18,
-    /** @stable ICU 2.0 */
-    U_CHAR_DIRECTION_COUNT
-} UCharDirection;
-
-/**
- * Constants for Unicode blocks, see the Unicode Data file Blocks.txt
- * @stable ICU 2.0
- */
-enum UBlockCode {
-
-    /** New No_Block value in Unicode 4. @stable ICU 2.6 */
-    UBLOCK_NO_BLOCK = 0, /*[none]*/ /* Special range indicating No_Block */
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BASIC_LATIN = 1, /*[0000]*/ /*See note !!*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LATIN_1_SUPPLEMENT=2, /*[0080]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LATIN_EXTENDED_A =3, /*[0100]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LATIN_EXTENDED_B =4, /*[0180]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_IPA_EXTENSIONS =5, /*[0250]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SPACING_MODIFIER_LETTERS =6, /*[02B0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_COMBINING_DIACRITICAL_MARKS =7, /*[0300]*/
-
-    /**
-     * Unicode 3.2 renames this block to "Greek and Coptic".
-     * @stable ICU 2.0
-     */
-    UBLOCK_GREEK =8, /*[0370]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CYRILLIC =9, /*[0400]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ARMENIAN =10, /*[0530]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HEBREW =11, /*[0590]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ARABIC =12, /*[0600]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SYRIAC =13, /*[0700]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_THAANA =14, /*[0780]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_DEVANAGARI =15, /*[0900]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BENGALI =16, /*[0980]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GURMUKHI =17, /*[0A00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GUJARATI =18, /*[0A80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ORIYA =19, /*[0B00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_TAMIL =20, /*[0B80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_TELUGU =21, /*[0C00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_KANNADA =22, /*[0C80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MALAYALAM =23, /*[0D00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SINHALA =24, /*[0D80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_THAI =25, /*[0E00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LAO =26, /*[0E80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_TIBETAN =27, /*[0F00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MYANMAR =28, /*[1000]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GEORGIAN =29, /*[10A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HANGUL_JAMO =30, /*[1100]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ETHIOPIC =31, /*[1200]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CHEROKEE =32, /*[13A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS =33, /*[1400]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_OGHAM =34, /*[1680]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_RUNIC =35, /*[16A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_KHMER =36, /*[1780]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MONGOLIAN =37, /*[1800]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LATIN_EXTENDED_ADDITIONAL =38, /*[1E00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GREEK_EXTENDED =39, /*[1F00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GENERAL_PUNCTUATION =40, /*[2000]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SUPERSCRIPTS_AND_SUBSCRIPTS =41, /*[2070]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CURRENCY_SYMBOLS =42, /*[20A0]*/
-
-    /**
-     * Unicode 3.2 renames this block to "Combining Diacritical Marks for Symbols".
-     * @stable ICU 2.0
-     */
-    UBLOCK_COMBINING_MARKS_FOR_SYMBOLS =43, /*[20D0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LETTERLIKE_SYMBOLS =44, /*[2100]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_NUMBER_FORMS =45, /*[2150]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ARROWS =46, /*[2190]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MATHEMATICAL_OPERATORS =47, /*[2200]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MISCELLANEOUS_TECHNICAL =48, /*[2300]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CONTROL_PICTURES =49, /*[2400]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_OPTICAL_CHARACTER_RECOGNITION =50, /*[2440]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ENCLOSED_ALPHANUMERICS =51, /*[2460]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BOX_DRAWING =52, /*[2500]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BLOCK_ELEMENTS =53, /*[2580]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_GEOMETRIC_SHAPES =54, /*[25A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_MISCELLANEOUS_SYMBOLS =55, /*[2600]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_DINGBATS =56, /*[2700]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BRAILLE_PATTERNS =57, /*[2800]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_RADICALS_SUPPLEMENT =58, /*[2E80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_KANGXI_RADICALS =59, /*[2F00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS =60, /*[2FF0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION =61, /*[3000]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HIRAGANA =62, /*[3040]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_KATAKANA =63, /*[30A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BOPOMOFO =64, /*[3100]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HANGUL_COMPATIBILITY_JAMO =65, /*[3130]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_KANBUN =66, /*[3190]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_BOPOMOFO_EXTENDED =67, /*[31A0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS =68, /*[3200]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_COMPATIBILITY =69, /*[3300]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A =70, /*[3400]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_UNIFIED_IDEOGRAPHS =71, /*[4E00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_YI_SYLLABLES =72, /*[A000]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_YI_RADICALS =73, /*[A490]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HANGUL_SYLLABLES =74, /*[AC00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HIGH_SURROGATES =75, /*[D800]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HIGH_PRIVATE_USE_SURROGATES =76, /*[DB80]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_LOW_SURROGATES =77, /*[DC00]*/
-
-    /**
-     * Same as UBLOCK_PRIVATE_USE_AREA.
-     * Until Unicode 3.1.1, the corresponding block name was "Private Use",
-     * and multiple code point ranges had this block.
-     * Unicode 3.2 renames the block for the BMP PUA to "Private Use Area" and
-     * adds separate blocks for the supplementary PUAs.
-     *
-     * @stable ICU 2.0
-     */
-    UBLOCK_PRIVATE_USE = 78,
-    /**
-     * Same as UBLOCK_PRIVATE_USE.
-     * Until Unicode 3.1.1, the corresponding block name was "Private Use",
-     * and multiple code point ranges had this block.
-     * Unicode 3.2 renames the block for the BMP PUA to "Private Use Area" and
-     * adds separate blocks for the supplementary PUAs.
-     *
-     * @stable ICU 2.0
-     */
-    UBLOCK_PRIVATE_USE_AREA =UBLOCK_PRIVATE_USE, /*[E000]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS =79, /*[F900]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ALPHABETIC_PRESENTATION_FORMS =80, /*[FB00]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ARABIC_PRESENTATION_FORMS_A =81, /*[FB50]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_COMBINING_HALF_MARKS =82, /*[FE20]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_COMPATIBILITY_FORMS =83, /*[FE30]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SMALL_FORM_VARIANTS =84, /*[FE50]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_ARABIC_PRESENTATION_FORMS_B =85, /*[FE70]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_SPECIALS =86, /*[FFF0]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS =87, /*[FF00]*/
-
-    /* New blocks in Unicode 3.1 */
-
-    /** @stable ICU 2.0 */
-    UBLOCK_OLD_ITALIC = 88  , /*[10300]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_GOTHIC = 89 , /*[10330]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_DESERET = 90 , /*[10400]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_BYZANTINE_MUSICAL_SYMBOLS = 91 , /*[1D000]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_MUSICAL_SYMBOLS = 92 , /*[1D100]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_MATHEMATICAL_ALPHANUMERIC_SYMBOLS = 93  , /*[1D400]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B  = 94 , /*[20000]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT = 95 , /*[2F800]*/
-    /** @stable ICU 2.0 */
-    UBLOCK_TAGS = 96, /*[E0000]*/
-
-    /* New blocks in Unicode 3.2 */
-
-    /**
-     * Unicode 4.0.1 renames the "Cyrillic Supplementary" block to "Cyrillic Supplement".
-     * @stable ICU 2.2
-     */
-    UBLOCK_CYRILLIC_SUPPLEMENTARY = 97, 
-    /** @draft ICU 3.0  */
-    UBLOCK_CYRILLIC_SUPPLEMENT = UBLOCK_CYRILLIC_SUPPLEMENTARY, /*[0500]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_TAGALOG = 98, /*[1700]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_HANUNOO = 99, /*[1720]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_BUHID = 100, /*[1740]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_TAGBANWA = 101, /*[1760]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A = 102, /*[27C0]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_SUPPLEMENTAL_ARROWS_A = 103, /*[27F0]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_SUPPLEMENTAL_ARROWS_B = 104, /*[2900]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B = 105, /*[2980]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS = 106, /*[2A00]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_KATAKANA_PHONETIC_EXTENSIONS = 107, /*[31F0]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_VARIATION_SELECTORS = 108, /*[FE00]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A = 109, /*[F0000]*/
-    /** @stable ICU 2.2 */
-    UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B = 110, /*[100000]*/
-
-    /* New blocks in Unicode 4 */
-
-    /** @stable ICU 2.6 */
-    UBLOCK_LIMBU = 111, /*[1900]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_TAI_LE = 112, /*[1950]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_KHMER_SYMBOLS = 113, /*[19E0]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_PHONETIC_EXTENSIONS = 114, /*[1D00]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS = 115, /*[2B00]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_YIJING_HEXAGRAM_SYMBOLS = 116, /*[4DC0]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_LINEAR_B_SYLLABARY = 117, /*[10000]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_LINEAR_B_IDEOGRAMS = 118, /*[10080]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_AEGEAN_NUMBERS = 119, /*[10100]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_UGARITIC = 120, /*[10380]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_SHAVIAN = 121, /*[10450]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_OSMANYA = 122, /*[10480]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_CYPRIOT_SYLLABARY = 123, /*[10800]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_TAI_XUAN_JING_SYMBOLS = 124, /*[1D300]*/
-    /** @stable ICU 2.6 */
-    UBLOCK_VARIATION_SELECTORS_SUPPLEMENT = 125, /*[E0100]*/
-
-    /** @stable ICU 2.0 */
-    UBLOCK_COUNT,
-
-    /** @stable ICU 2.0 */
-    UBLOCK_INVALID_CODE=-1
-};
-
-/** @stable ICU 2.0 */
-typedef enum UBlockCode UBlockCode;
-
-/**
- * East Asian Width constants.
- *
- * @see UCHAR_EAST_ASIAN_WIDTH
- * @see u_getIntPropertyValue
- * @stable ICU 2.2
- */
-typedef enum UEastAsianWidth {
-    U_EA_NEUTRAL,   /*[N]*/ /*See note !!*/
-    U_EA_AMBIGUOUS, /*[A]*/
-    U_EA_HALFWIDTH, /*[H]*/
-    U_EA_FULLWIDTH, /*[F]*/
-    U_EA_NARROW,    /*[Na]*/
-    U_EA_WIDE,      /*[W]*/
-    U_EA_COUNT
-} UEastAsianWidth;
-/*
- * Implementation note:
- * Keep UEastAsianWidth constant values in sync with names list in genprops/props2.c.
- */
-
-/**
- * Selector constants for u_charName().
- * u_charName() returns the "modern" name of a
- * Unicode character; or the name that was defined in
- * Unicode version 1.0, before the Unicode standard merged
- * with ISO-10646; or an "extended" name that gives each
- * Unicode code point a unique name.
- *
- * @see u_charName
- * @stable ICU 2.0
- */
-typedef enum UCharNameChoice {
-    U_UNICODE_CHAR_NAME,
-    U_UNICODE_10_CHAR_NAME,
-    U_EXTENDED_CHAR_NAME,
-    U_CHAR_NAME_CHOICE_COUNT
-} UCharNameChoice;
-
-/**
- * Selector constants for u_getPropertyName() and
- * u_getPropertyValueName().  These selectors are used to choose which
- * name is returned for a given property or value.  All properties and
- * values have a long name.  Most have a short name, but some do not.
- * Unicode allows for additional names, beyond the long and short
- * name, which would be indicated by U_LONG_PROPERTY_NAME + i, where
- * i=1, 2,...
- *
- * @see u_getPropertyName()
- * @see u_getPropertyValueName()
- * @stable ICU 2.4
- */
-typedef enum UPropertyNameChoice {
-    U_SHORT_PROPERTY_NAME,
-    U_LONG_PROPERTY_NAME,
-    U_PROPERTY_NAME_CHOICE_COUNT
-} UPropertyNameChoice;
-
-/**
- * Decomposition Type constants.
- *
- * @see UCHAR_DECOMPOSITION_TYPE
- * @stable ICU 2.2
- */
-typedef enum UDecompositionType {
-    U_DT_NONE,              /*[none]*/ /*See note !!*/
-    U_DT_CANONICAL,         /*[can]*/
-    U_DT_COMPAT,            /*[com]*/
-    U_DT_CIRCLE,            /*[enc]*/
-    U_DT_FINAL,             /*[fin]*/
-    U_DT_FONT,              /*[font]*/
-    U_DT_FRACTION,          /*[fra]*/
-    U_DT_INITIAL,           /*[init]*/
-    U_DT_ISOLATED,          /*[iso]*/
-    U_DT_MEDIAL,            /*[med]*/
-    U_DT_NARROW,            /*[nar]*/
-    U_DT_NOBREAK,           /*[nb]*/
-    U_DT_SMALL,             /*[sml]*/
-    U_DT_SQUARE,            /*[sqr]*/
-    U_DT_SUB,               /*[sub]*/
-    U_DT_SUPER,             /*[sup]*/
-    U_DT_VERTICAL,          /*[vert]*/
-    U_DT_WIDE,              /*[wide]*/
-    U_DT_COUNT /* 18 */
-} UDecompositionType;
-
-/**
- * Joining Type constants.
- *
- * @see UCHAR_JOINING_TYPE
- * @stable ICU 2.2
- */
-typedef enum UJoiningType {
-    U_JT_NON_JOINING,       /*[U]*/ /*See note !!*/
-    U_JT_JOIN_CAUSING,      /*[C]*/
-    U_JT_DUAL_JOINING,      /*[D]*/
-    U_JT_LEFT_JOINING,      /*[L]*/
-    U_JT_RIGHT_JOINING,     /*[R]*/
-    U_JT_TRANSPARENT,       /*[T]*/
-    U_JT_COUNT /* 6 */
-} UJoiningType;
-
-/**
- * Joining Group constants.
- *
- * @see UCHAR_JOINING_GROUP
- * @stable ICU 2.2
- */
-typedef enum UJoiningGroup {
-    U_JG_NO_JOINING_GROUP,
-    U_JG_AIN,
-    U_JG_ALAPH,
-    U_JG_ALEF,
-    U_JG_BEH,
-    U_JG_BETH,
-    U_JG_DAL,
-    U_JG_DALATH_RISH,
-    U_JG_E,
-    U_JG_FEH,
-    U_JG_FINAL_SEMKATH,
-    U_JG_GAF,
-    U_JG_GAMAL,
-    U_JG_HAH,
-    U_JG_HAMZA_ON_HEH_GOAL,
-    U_JG_HE,
-    U_JG_HEH,
-    U_JG_HEH_GOAL,
-    U_JG_HETH,
-    U_JG_KAF,
-    U_JG_KAPH,
-    U_JG_KNOTTED_HEH,
-    U_JG_LAM,
-    U_JG_LAMADH,
-    U_JG_MEEM,
-    U_JG_MIM,
-    U_JG_NOON,
-    U_JG_NUN,
-    U_JG_PE,
-    U_JG_QAF,
-    U_JG_QAPH,
-    U_JG_REH,
-    U_JG_REVERSED_PE,
-    U_JG_SAD,
-    U_JG_SADHE,
-    U_JG_SEEN,
-    U_JG_SEMKATH,
-    U_JG_SHIN,
-    U_JG_SWASH_KAF,
-    U_JG_SYRIAC_WAW,
-    U_JG_TAH,
-    U_JG_TAW,
-    U_JG_TEH_MARBUTA,
-    U_JG_TETH,
-    U_JG_WAW,
-    U_JG_YEH,
-    U_JG_YEH_BARREE,
-    U_JG_YEH_WITH_TAIL,
-    U_JG_YUDH,
-    U_JG_YUDH_HE,
-    U_JG_ZAIN,
-    U_JG_FE,        /**< @stable ICU 2.6 */
-    U_JG_KHAPH,     /**< @stable ICU 2.6 */
-    U_JG_ZHAIN,     /**< @stable ICU 2.6 */
-    U_JG_COUNT
-} UJoiningGroup;
-
-/**
- * Line Break constants.
- *
- * @see UCHAR_LINE_BREAK
- * @stable ICU 2.2
- */
-typedef enum ULineBreak {
-    U_LB_UNKNOWN,           /*[XX]*/ /*See note !!*/
-    U_LB_AMBIGUOUS,         /*[AI]*/
-    U_LB_ALPHABETIC,        /*[AL]*/
-    U_LB_BREAK_BOTH,        /*[B2]*/
-    U_LB_BREAK_AFTER,       /*[BA]*/
-    U_LB_BREAK_BEFORE,      /*[BB]*/
-    U_LB_MANDATORY_BREAK,   /*[BK]*/
-    U_LB_CONTINGENT_BREAK,  /*[CB]*/
-    U_LB_CLOSE_PUNCTUATION, /*[CL]*/
-    U_LB_COMBINING_MARK,    /*[CM]*/
-    U_LB_CARRIAGE_RETURN,   /*[CR]*/
-    U_LB_EXCLAMATION,       /*[EX]*/
-    U_LB_GLUE,              /*[GL]*/
-    U_LB_HYPHEN,            /*[HY]*/
-    U_LB_IDEOGRAPHIC,       /*[ID]*/
-    U_LB_INSEPERABLE,
-    /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @draft ICU 3.0 */
-    U_LB_INSEPARABLE=U_LB_INSEPERABLE,/*[IN]*/
-    U_LB_INFIX_NUMERIC,     /*[IS]*/
-    U_LB_LINE_FEED,         /*[LF]*/
-    U_LB_NONSTARTER,        /*[NS]*/
-    U_LB_NUMERIC,           /*[NU]*/
-    U_LB_OPEN_PUNCTUATION,  /*[OP]*/
-    U_LB_POSTFIX_NUMERIC,   /*[PO]*/
-    U_LB_PREFIX_NUMERIC,    /*[PR]*/
-    U_LB_QUOTATION,         /*[QU]*/
-    U_LB_COMPLEX_CONTEXT,   /*[SA]*/
-    U_LB_SURROGATE,         /*[SG]*/
-    U_LB_SPACE,             /*[SP]*/
-    U_LB_BREAK_SYMBOLS,     /*[SY]*/
-    U_LB_ZWSPACE,           /*[ZW]*/
-    U_LB_NEXT_LINE,         /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */
-    U_LB_WORD_JOINER,       /*[WJ]*/
-    U_LB_COUNT
-} ULineBreak;
-
-/**
- * Numeric Type constants.
- *
- * @see UCHAR_NUMERIC_TYPE
- * @stable ICU 2.2
- */
-typedef enum UNumericType {
-    U_NT_NONE,              /*[None]*/ /*See note !!*/
-    U_NT_DECIMAL,           /*[de]*/
-    U_NT_DIGIT,             /*[di]*/
-    U_NT_NUMERIC,           /*[nu]*/
-    U_NT_COUNT
-} UNumericType;
-
-/**
- * Hangul Syllable Type constants.
- *
- * @see UCHAR_HANGUL_SYLLABLE_TYPE
- * @stable ICU 2.6
- */
-typedef enum UHangulSyllableType {
-    U_HST_NOT_APPLICABLE,   /*[NA]*/ /*See note !!*/
-    U_HST_LEADING_JAMO,     /*[L]*/
-    U_HST_VOWEL_JAMO,       /*[V]*/
-    U_HST_TRAILING_JAMO,    /*[T]*/
-    U_HST_LV_SYLLABLE,      /*[LV]*/
-    U_HST_LVT_SYLLABLE,     /*[LVT]*/
-    U_HST_COUNT
-} UHangulSyllableType;
-
-/**
- * Check a binary Unicode property for a code point.
- *
- * Unicode, especially in version 3.2, defines many more properties than the
- * original set in UnicodeData.txt.
- *
- * The properties APIs are intended to reflect Unicode properties as defined
- * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR).
- * For details about the properties see http://www.unicode.org/ucd/ .
- * For names of Unicode properties see the UCD file PropertyAliases.txt.
- *
- * Important: If ICU is built with UCD files from Unicode versions below 3.2,
- * then properties marked with "new in Unicode 3.2" are not or not fully available.
- *
- * @param c Code point to test.
- * @param which UProperty selector constant, identifies which binary property to check.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT.
- * @return TRUE or FALSE according to the binary Unicode property value for c.
- *         Also FALSE if 'which' is out of bounds or if the Unicode version
- *         does not have data for the property at all, or not for this code point.
- *
- * @see UProperty
- * @see u_getIntPropertyValue
- * @see u_getUnicodeVersion
- * @stable ICU 2.1
- */
-U_STABLE UBool U_EXPORT2
-u_hasBinaryProperty(UChar32 c, UProperty which);
-
-/**
- * Check if a code point has the Alphabetic Unicode property.
- * Same as u_hasBinaryProperty(c, UCHAR_ALPHABETIC).
- * This is different from u_isalpha!
- * @param c Code point to test
- * @return true if the code point has the Alphabetic Unicode property, false otherwise
- *
- * @see UCHAR_ALPHABETIC
- * @see u_isalpha
- * @see u_hasBinaryProperty
- * @stable ICU 2.1
- */
-U_STABLE UBool U_EXPORT2
-u_isUAlphabetic(UChar32 c);
-
-/**
- * Check if a code point has the Lowercase Unicode property.
- * Same as u_hasBinaryProperty(c, UCHAR_LOWERCASE).
- * This is different from u_islower!
- * @param c Code point to test
- * @return true if the code point has the Lowercase Unicode property, false otherwise
- *
- * @see UCHAR_LOWERCASE
- * @see u_islower
- * @see u_hasBinaryProperty
- * @stable ICU 2.1
- */
-U_STABLE UBool U_EXPORT2
-u_isULowercase(UChar32 c);
-
-/**
- * Check if a code point has the Uppercase Unicode property.
- * Same as u_hasBinaryProperty(c, UCHAR_UPPERCASE).
- * This is different from u_isupper!
- * @param c Code point to test
- * @return true if the code point has the Uppercase Unicode property, false otherwise
- *
- * @see UCHAR_UPPERCASE
- * @see u_isupper
- * @see u_hasBinaryProperty
- * @stable ICU 2.1
- */
-U_STABLE UBool U_EXPORT2
-u_isUUppercase(UChar32 c);
-
-/**
- * Check if a code point has the White_Space Unicode property.
- * Same as u_hasBinaryProperty(c, UCHAR_WHITE_SPACE).
- * This is different from both u_isspace and u_isWhitespace!
- *
- * Note: There are several ICU whitespace functions; please see the uchar.h
- * file documentation for a detailed comparison.
- *
- * @param c Code point to test
- * @return true if the code point has the White_Space Unicode property, false otherwise.
- *
- * @see UCHAR_WHITE_SPACE
- * @see u_isWhitespace
- * @see u_isspace
- * @see u_isJavaSpaceChar
- * @see u_hasBinaryProperty
- * @stable ICU 2.1
- */
-U_STABLE UBool U_EXPORT2
-u_isUWhiteSpace(UChar32 c);
-
-/**
- * Get the property value for an enumerated or integer Unicode property for a code point.
- * Also returns binary and mask property values.
- *
- * Unicode, especially in version 3.2, defines many more properties than the
- * original set in UnicodeData.txt.
- *
- * The properties APIs are intended to reflect Unicode properties as defined
- * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR).
- * For details about the properties see http://www.unicode.org/ .
- * For names of Unicode properties see the UCD file PropertyAliases.txt.
- *
- * Sample usage:
- * UEastAsianWidth ea=(UEastAsianWidth)u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH);
- * UBool b=(UBool)u_getIntPropertyValue(c, UCHAR_IDEOGRAPHIC);
- *
- * @param c Code point to test.
- * @param which UProperty selector constant, identifies which property to check.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT
- *        or UCHAR_INT_START<=which<UCHAR_INT_LIMIT
- *        or UCHAR_MASK_START<=which<UCHAR_MASK_LIMIT.
- * @return Numeric value that is directly the property value or,
- *         for enumerated properties, corresponds to the numeric value of the enumerated
- *         constant of the respective property value enumeration type
- *         (cast to enum type if necessary).
- *         Returns 0 or 1 (for FALSE/TRUE) for binary Unicode properties.
- *         Returns a bit-mask for mask properties.
- *         Returns 0 if 'which' is out of bounds or if the Unicode version
- *         does not have data for the property at all, or not for this code point.
- *
- * @see UProperty
- * @see u_hasBinaryProperty
- * @see u_getIntPropertyMinValue
- * @see u_getIntPropertyMaxValue
- * @see u_getUnicodeVersion
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_getIntPropertyValue(UChar32 c, UProperty which);
-
-/**
- * Get the minimum value for an enumerated/integer/binary Unicode property.
- * Can be used together with u_getIntPropertyMaxValue
- * to allocate arrays of UnicodeSet or similar.
- *
- * @param which UProperty selector constant, identifies which binary property to check.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT
- *        or UCHAR_INT_START<=which<UCHAR_INT_LIMIT.
- * @return Minimum value returned by u_getIntPropertyValue for a Unicode property.
- *         0 if the property selector is out of range.
- *
- * @see UProperty
- * @see u_hasBinaryProperty
- * @see u_getUnicodeVersion
- * @see u_getIntPropertyMaxValue
- * @see u_getIntPropertyValue
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_getIntPropertyMinValue(UProperty which);
-
-/**
- * Get the maximum value for an enumerated/integer/binary Unicode property.
- * Can be used together with u_getIntPropertyMinValue
- * to allocate arrays of UnicodeSet or similar.
- *
- * Examples for min/max values (for Unicode 3.2):
- *
- * - UCHAR_BIDI_CLASS:    0/18 (U_LEFT_TO_RIGHT/U_BOUNDARY_NEUTRAL)
- * - UCHAR_SCRIPT:        0/45 (USCRIPT_COMMON/USCRIPT_TAGBANWA)
- * - UCHAR_IDEOGRAPHIC:   0/1  (FALSE/TRUE)
- *
- * For undefined UProperty constant values, min/max values will be 0/-1.
- *
- * @param which UProperty selector constant, identifies which binary property to check.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT
- *        or UCHAR_INT_START<=which<UCHAR_INT_LIMIT.
- * @return Maximum value returned by u_getIntPropertyValue for a Unicode property.
- *         <=0 if the property selector is out of range.
- *
- * @see UProperty
- * @see u_hasBinaryProperty
- * @see u_getUnicodeVersion
- * @see u_getIntPropertyMaxValue
- * @see u_getIntPropertyValue
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_getIntPropertyMaxValue(UProperty which);
-
-/**
- * Get the numeric value for a Unicode code point as defined in the
- * Unicode Character Database.
- *
- * A "double" return type is necessary because
- * some numeric values are fractions, negative, or too large for int32_t.
- *
- * For characters without any numeric values in the Unicode Character Database,
- * this function will return U_NO_NUMERIC_VALUE.
- *
- * Similar to java.lang.Character.getNumericValue(), but u_getNumericValue()
- * also supports negative values, large values, and fractions,
- * while Java's getNumericValue() returns values 10..35 for ASCII letters.
- *
- * @param c Code point to get the numeric value for.
- * @return Numeric value of c, or U_NO_NUMERIC_VALUE if none is defined.
- *
- * @see U_NO_NUMERIC_VALUE
- * @stable ICU 2.2
- */
-U_STABLE double U_EXPORT2
-u_getNumericValue(UChar32 c);
-
-/**
- * Special value that is returned by u_getNumericValue when
- * no numeric value is defined for a code point.
- *
- * @see u_getNumericValue
- * @stable ICU 2.2
- */
-#define U_NO_NUMERIC_VALUE ((double)-123456789.)
-
-/**
- * Determines whether the specified code point has the general category "Ll"
- * (lowercase letter).
- *
- * Same as java.lang.Character.isLowerCase().
- *
- * This misses some characters that are also lowercase but
- * have a different general category value.
- * In order to include those, use UCHAR_LOWERCASE.
- *
- * In addition to being equivalent to a Java function, this also serves
- * as a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is an Ll lowercase letter
- *
- * @see UCHAR_LOWERCASE
- * @see u_isupper
- * @see u_istitle
- * @see u_islower
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_islower(UChar32 c);
-
-/**
- * Determines whether the specified code point has the general category "Lu"
- * (uppercase letter).
- *
- * Same as java.lang.Character.isUpperCase().
- *
- * This misses some characters that are also uppercase but
- * have a different general category value.
- * In order to include those, use UCHAR_UPPERCASE.
- *
- * In addition to being equivalent to a Java function, this also serves
- * as a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is an Lu uppercase letter
- *
- * @see UCHAR_UPPERCASE
- * @see u_islower
- * @see u_istitle
- * @see u_tolower
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isupper(UChar32 c);
-
-/**
- * Determines whether the specified code point is a titlecase letter.
- * True for general category "Lt" (titlecase letter).
- *
- * Same as java.lang.Character.isTitleCase().
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is an Lt titlecase letter
- *
- * @see u_isupper
- * @see u_islower
- * @see u_totitle
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_istitle(UChar32 c);
-
-/**
- * Determines whether the specified code point is a digit character according to Java.
- * True for characters with general category "Nd" (decimal digit numbers).
- * Beginning with Unicode 4, this is the same as
- * testing for the Numeric_Type of Decimal.
- *
- * Same as java.lang.Character.isDigit().
- *
- * In addition to being equivalent to a Java function, this also serves
- * as a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a digit character according to Character.isDigit()
- *
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isdigit(UChar32 c);
-
-/**
- * Determines whether the specified code point is a letter character.
- * True for general categories "L" (letters).
- *
- * Same as java.lang.Character.isLetter().
- *
- * In addition to being equivalent to a Java function, this also serves
- * as a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a letter character
- *
- * @see u_isdigit
- * @see u_isalnum
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isalpha(UChar32 c);
-
-/**
- * Determines whether the specified code point is an alphanumeric character
- * (letter or digit) according to Java.
- * True for characters with general categories
- * "L" (letters) and "Nd" (decimal digit numbers).
- *
- * Same as java.lang.Character.isLetterOrDigit().
- *
- * In addition to being equivalent to a Java function, this also serves
- * as a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is an alphanumeric character according to Character.isLetterOrDigit()
- *
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isalnum(UChar32 c);
-
-/**
- * Determines whether the specified code point is a hexadecimal digit.
- * This is equivalent to u_digit(c, 16)>=0.
- * True for characters with general category "Nd" (decimal digit numbers)
- * as well as Latin letters a-f and A-F in both ASCII and Fullwidth ASCII.
- * (That is, for letters with code points
- * 0041..0046, 0061..0066, FF21..FF26, FF41..FF46.)
- *
- * In order to narrow the definition of hexadecimal digits to only ASCII
- * characters, use (c<=0x7f && u_isxdigit(c)).
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a hexadecimal digit
- *
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_isxdigit(UChar32 c);
-
-/**
- * Determines whether the specified code point is a punctuation character.
- * True for characters with general categories "P" (punctuation).
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a punctuation character
- *
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_ispunct(UChar32 c);
-
-/**
- * Determines whether the specified code point is a "graphic" character
- * (printable, excluding spaces).
- * TRUE for all characters except those with general categories
- * "Cc" (control codes), "Cf" (format controls), "Cs" (surrogates),
- * "Cn" (unassigned), and "Z" (separators).
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a "graphic" character
- *
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_isgraph(UChar32 c);
-
-/**
- * Determines whether the specified code point is a "blank" or "horizontal space",
- * a character that visibly separates words on a line.
- * The following are equivalent definitions:
- *
- * TRUE for Unicode White_Space characters except for "vertical space controls"
- * where "vertical space controls" are the following characters:
- * U+000A (LF) U+000B (VT) U+000C (FF) U+000D (CR) U+0085 (NEL) U+2028 (LS) U+2029 (PS)
- *
- * same as
- *
- * TRUE for U+0009 (TAB) and characters with general category "Zs" (space separators)
- * except Zero Width Space (ZWSP, U+200B).
- *
- * Note: There are several ICU whitespace functions; please see the uchar.h
- * file documentation for a detailed comparison.
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a "blank"
- *
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_isblank(UChar32 c);
-
-/**
- * Determines whether the specified code point is "defined",
- * which usually means that it is assigned a character.
- * True for general categories other than "Cn" (other, not assigned),
- * i.e., true for all code points mentioned in UnicodeData.txt.
- *
- * Note that non-character code points (e.g., U+FDD0) are not "defined"
- * (they are Cn), but surrogate code points are "defined" (Cs).
- *
- * Same as java.lang.Character.isDefined().
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is assigned a character
- *
- * @see u_isdigit
- * @see u_isalpha
- * @see u_isalnum
- * @see u_isupper
- * @see u_islower
- * @see u_istitle
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isdefined(UChar32 c);
-
-/**
- * Determines if the specified character is a space character or not.
- *
- * Note: There are several ICU whitespace functions; please see the uchar.h
- * file documentation for a detailed comparison.
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c    the character to be tested
- * @return  true if the character is a space character; false otherwise.
- *
- * @see u_isJavaSpaceChar
- * @see u_isWhitespace
- * @see u_isUWhiteSpace
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isspace(UChar32 c);
-
-/**
- * Determine if the specified code point is a space character according to Java.
- * True for characters with general categories "Z" (separators),
- * which does not include control codes (e.g., TAB or Line Feed).
- *
- * Same as java.lang.Character.isSpaceChar().
- *
- * Note: There are several ICU whitespace functions; please see the uchar.h
- * file documentation for a detailed comparison.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a space character according to Character.isSpaceChar()
- *
- * @see u_isspace
- * @see u_isWhitespace
- * @see u_isUWhiteSpace
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_isJavaSpaceChar(UChar32 c);
-
-/**
- * Determines if the specified code point is a whitespace character according to Java/ICU.
- * A character is considered to be a Java whitespace character if and only
- * if it satisfies one of the following criteria:
- *
- * - It is a Unicode separator (categories "Z"), but is not
- *      a no-break space (U+00A0 NBSP or U+2007 Figure Space or U+202F Narrow NBSP).
- * - It is U+0009 HORIZONTAL TABULATION.
- * - It is U+000A LINE FEED.
- * - It is U+000B VERTICAL TABULATION.
- * - It is U+000C FORM FEED.
- * - It is U+000D CARRIAGE RETURN.
- * - It is U+001C FILE SEPARATOR.
- * - It is U+001D GROUP SEPARATOR.
- * - It is U+001E RECORD SEPARATOR.
- * - It is U+001F UNIT SEPARATOR.
- * - It is U+0085 NEXT LINE.
- *
- * Same as java.lang.Character.isWhitespace() except that Java omits U+0085.
- *
- * Note: There are several ICU whitespace functions; please see the uchar.h
- * file documentation for a detailed comparison.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a whitespace character according to Java/ICU
- *
- * @see u_isspace
- * @see u_isJavaSpaceChar
- * @see u_isUWhiteSpace
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isWhitespace(UChar32 c);
-
-/**
- * Determines whether the specified code point is a control character
- * (as defined by this function).
- * A control character is one of the following:
- * - ISO 8-bit control character (U+0000..U+001f and U+007f..U+009f)
- * - U_CONTROL_CHAR (Cc)
- * - U_FORMAT_CHAR (Cf)
- * - U_LINE_SEPARATOR (Zl)
- * - U_PARAGRAPH_SEPARATOR (Zp)
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a control character
- *
- * @see UCHAR_DEFAULT_IGNORABLE_CODE_POINT
- * @see u_isprint
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_iscntrl(UChar32 c);
-
-/**
- * Determines whether the specified code point is an ISO control code.
- * True for U+0000..U+001f and U+007f..U+009f (general category "Cc").
- *
- * Same as java.lang.Character.isISOControl().
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is an ISO control code
- *
- * @see u_iscntrl
- * @stable ICU 2.6
- */
-U_STABLE UBool U_EXPORT2
-u_isISOControl(UChar32 c);
-
-/**
- * Determines whether the specified code point is a printable character.
- * True for general categories <em>other</em> than "C" (controls).
- *
- * This is a C/POSIX migration function.
- * See the comments about C/POSIX character classification functions in the
- * documentation at the top of this header file.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a printable character
- *
- * @see UCHAR_DEFAULT_IGNORABLE_CODE_POINT
- * @see u_iscntrl
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isprint(UChar32 c);
-
-/**
- * Determines whether the specified code point is a base character.
- * True for general categories "L" (letters), "N" (numbers),
- * "Mc" (spacing combining marks), and "Me" (enclosing marks).
- *
- * Note that this is different from the Unicode definition in
- * chapter 3.5, conformance clause D13,
- * which defines base characters to be all characters (not Cn)
- * that do not graphically combine with preceding characters (M)
- * and that are neither control (Cc) or format (Cf) characters.
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is a base character according to this function
- *
- * @see u_isalpha
- * @see u_isdigit
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isbase(UChar32 c);
-
-/**
- * Returns the bidirectional category value for the code point,
- * which is used in the Unicode bidirectional algorithm
- * (UAX #9 http://www.unicode.org/reports/tr9/).
- * Note that some <em>unassigned</em> code points have bidi values
- * of R or AL because they are in blocks that are reserved
- * for Right-To-Left scripts.
- *
- * Same as java.lang.Character.getDirectionality()
- *
- * @param c the code point to be tested
- * @return the bidirectional category (UCharDirection) value
- *
- * @see UCharDirection
- * @stable ICU 2.0
- */
-U_STABLE UCharDirection U_EXPORT2
-u_charDirection(UChar32 c);
-
-/**
- * Determines whether the code point has the Bidi_Mirrored property.
- * This property is set for characters that are commonly used in
- * Right-To-Left contexts and need to be displayed with a "mirrored"
- * glyph.
- *
- * Same as java.lang.Character.isMirrored().
- * Same as UCHAR_BIDI_MIRRORED
- *
- * @param c the code point to be tested
- * @return TRUE if the character has the Bidi_Mirrored property
- *
- * @see UCHAR_BIDI_MIRRORED
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isMirrored(UChar32 c);
-
-/**
- * Maps the specified character to a "mirror-image" character.
- * For characters with the Bidi_Mirrored property, implementations
- * sometimes need a "poor man's" mapping to another Unicode
- * character (code point) such that the default glyph may serve
- * as the mirror-image of the default glyph of the specified
- * character. This is useful for text conversion to and from
- * codepages with visual order, and for displays without glyph
- * selecetion capabilities.
- *
- * @param c the code point to be mapped
- * @return another Unicode code point that may serve as a mirror-image
- *         substitute, or c itself if there is no such mapping or c
- *         does not have the Bidi_Mirrored property
- *
- * @see UCHAR_BIDI_MIRRORED
- * @see u_isMirrored
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_charMirror(UChar32 c);
-
-/**
- * Returns the general category value for the code point.
- *
- * Same as java.lang.Character.getType().
- *
- * @param c the code point to be tested
- * @return the general category (UCharCategory) value
- *
- * @see UCharCategory
- * @stable ICU 2.0
- */
-U_STABLE int8_t U_EXPORT2
-u_charType(UChar32 c);
-
-/**
- * Get a single-bit bit set for the general category of a character.
- * This bit set can be compared bitwise with U_GC_SM_MASK, U_GC_L_MASK, etc.
- * Same as U_MASK(u_charType(c)).
- *
- * @param c the code point to be tested
- * @return a single-bit mask corresponding to the general category (UCharCategory) value
- *
- * @see u_charType
- * @see UCharCategory
- * @see U_GC_CN_MASK
- * @stable ICU 2.1
- */
-#define U_GET_GC_MASK(c) U_MASK(u_charType(c))
-
-/**
- * Callback from u_enumCharTypes(), is called for each contiguous range
- * of code points c (where start<=c<limit)
- * with the same Unicode general category ("character type").
- *
- * The callback function can stop the enumeration by returning FALSE.
- *
- * @param context an opaque pointer, as passed into utrie_enum()
- * @param start the first code point in a contiguous range with value
- * @param limit one past the last code point in a contiguous range with value
- * @param type the general category for all code points in [start..limit[
- * @return FALSE to stop the enumeration
- *
- * @stable ICU 2.1
- * @see UCharCategory
- * @see u_enumCharTypes
- */
-typedef UBool U_CALLCONV
-UCharEnumTypeRange(const void *context, UChar32 start, UChar32 limit, UCharCategory type);
-
-/**
- * Enumerate efficiently all code points with their Unicode general categories.
- *
- * This is useful for building data structures (e.g., UnicodeSet's),
- * for enumerating all assigned code points (type!=U_UNASSIGNED), etc.
- *
- * For each contiguous range of code points with a given general category ("character type"),
- * the UCharEnumTypeRange function is called.
- * Adjacent ranges have different types.
- * The Unicode Standard guarantees that the numeric value of the type is 0..31.
- *
- * @param enumRange a pointer to a function that is called for each contiguous range
- *                  of code points with the same general category
- * @param context an opaque pointer that is passed on to the callback function
- *
- * @stable ICU 2.1
- * @see UCharCategory
- * @see UCharEnumTypeRange
- */
-U_STABLE void U_EXPORT2
-u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context);
-
-#if !UCONFIG_NO_NORMALIZATION
-
-/**
- * Returns the combining class of the code point as specified in UnicodeData.txt.
- *
- * @param c the code point of the character
- * @return the combining class of the character
- * @stable ICU 2.0
- */
-U_STABLE uint8_t U_EXPORT2
-u_getCombiningClass(UChar32 c);
-
-#endif
-
-/**
- * Returns the decimal digit value of a decimal digit character.
- * Such characters have the general category "Nd" (decimal digit numbers)
- * and a Numeric_Type of Decimal.
- *
- * Unlike ICU releases before 2.6, no digit values are returned for any
- * Han characters because Han number characters are often used with a special
- * Chinese-style number format (with characters for powers of 10 in between)
- * instead of in decimal-positional notation.
- * Unicode 4 explicitly assigns Han number characters the Numeric_Type
- * Numeric instead of Decimal.
- * See Jitterbug 1483 for more details.
- *
- * Use u_getIntPropertyValue(c, UCHAR_NUMERIC_TYPE) and u_getNumericValue()
- * for complete numeric Unicode properties.
- *
- * @param c the code point for which to get the decimal digit value
- * @return the decimal digit value of c,
- *         or -1 if c is not a decimal digit character
- *
- * @see u_getNumericValue
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_charDigitValue(UChar32 c);
-
-/**
- * Returns the Unicode allocation block that contains the character.
- *
- * @param c the code point to be tested
- * @return the block value (UBlockCode) for c
- *
- * @see UBlockCode
- * @stable ICU 2.0
- */
-U_STABLE UBlockCode U_EXPORT2
-ublock_getCode(UChar32 c);
-
-/**
- * Retrieve the name of a Unicode character.
- * Depending on <code>nameChoice</code>, the character name written
- * into the buffer is the "modern" name or the name that was defined
- * in Unicode version 1.0.
- * The name contains only "invariant" characters
- * like A-Z, 0-9, space, and '-'.
- * Unicode 1.0 names are only retrieved if they are different from the modern
- * names and if the data file contains the data for them. gennames may or may
- * not be called with a command line option to include 1.0 names in unames.dat.
- *
- * @param code The character (code point) for which to get the name.
- *             It must be <code>0<=code<=0x10ffff</code>.
- * @param nameChoice Selector for which name to get.
- * @param buffer Destination address for copying the name.
- *               The name will always be zero-terminated.
- *               If there is no name, then the buffer will be set to the empty string.
- * @param bufferLength <code>==sizeof(buffer)</code>
- * @param pErrorCode Pointer to a UErrorCode variable;
- *        check for <code>U_SUCCESS()</code> after <code>u_charName()</code>
- *        returns.
- * @return The length of the name, or 0 if there is no name for this character.
- *         If the bufferLength is less than or equal to the length, then the buffer
- *         contains the truncated name and the returned length indicates the full
- *         length of the name.
- *         The length does not include the zero-termination.
- *
- * @see UCharNameChoice
- * @see u_charFromName
- * @see u_enumCharNames
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_charName(UChar32 code, UCharNameChoice nameChoice,
-           char *buffer, int32_t bufferLength,
-           UErrorCode *pErrorCode);
-
-/**
- * Get the ISO 10646 comment for a character.
- * The ISO 10646 comment is an informative field in the Unicode Character
- * Database (UnicodeData.txt field 11) and is from the ISO 10646 names list.
- *
- * @param c The character (code point) for which to get the ISO comment.
- *             It must be <code>0<=c<=0x10ffff</code>.
- * @param dest Destination address for copying the comment.
- *             The comment will be zero-terminated if possible.
- *             If there is no comment, then the buffer will be set to the empty string.
- * @param destCapacity <code>==sizeof(dest)</code>
- * @param pErrorCode Pointer to a UErrorCode variable;
- *        check for <code>U_SUCCESS()</code> after <code>u_getISOComment()</code>
- *        returns.
- * @return The length of the comment, or 0 if there is no comment for this character.
- *         If the destCapacity is less than or equal to the length, then the buffer
- *         contains the truncated name and the returned length indicates the full
- *         length of the name.
- *         The length does not include the zero-termination.
- *
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_getISOComment(UChar32 c,
-                char *dest, int32_t destCapacity,
-                UErrorCode *pErrorCode);
-
-/**
- * Find a Unicode character by its name and return its code point value.
- * The name is matched exactly and completely.
- * If the name does not correspond to a code point, <i>pErrorCode</i>
- * is set to <code>U_INVALID_CHAR_FOUND</code>.
- * A Unicode 1.0 name is matched only if it differs from the modern name.
- * Unicode names are all uppercase. Extended names are lowercase followed
- * by an uppercase hexadecimal number, and within angle brackets.
- *
- * @param nameChoice Selector for which name to match.
- * @param name The name to match.
- * @param pErrorCode Pointer to a UErrorCode variable
- * @return The Unicode value of the code point with the given name,
- *         or an undefined value if there is no such code point.
- *
- * @see UCharNameChoice
- * @see u_charName
- * @see u_enumCharNames
- * @stable ICU 1.7
- */
-U_STABLE UChar32 U_EXPORT2
-u_charFromName(UCharNameChoice nameChoice,
-               const char *name,
-               UErrorCode *pErrorCode);
-
-/**
- * Type of a callback function for u_enumCharNames() that gets called
- * for each Unicode character with the code point value and
- * the character name.
- * If such a function returns FALSE, then the enumeration is stopped.
- *
- * @param context The context pointer that was passed to u_enumCharNames().
- * @param code The Unicode code point for the character with this name.
- * @param nameChoice Selector for which kind of names is enumerated.
- * @param name The character's name, zero-terminated.
- * @param length The length of the name.
- * @return TRUE if the enumeration should continue, FALSE to stop it.
- *
- * @see UCharNameChoice
- * @see u_enumCharNames
- * @stable ICU 1.7
- */
-typedef UBool UEnumCharNamesFn(void *context,
-                               UChar32 code,
-                               UCharNameChoice nameChoice,
-                               const char *name,
-                               int32_t length);
-
-/**
- * Enumerate all assigned Unicode characters between the start and limit
- * code points (start inclusive, limit exclusive) and call a function
- * for each, passing the code point value and the character name.
- * For Unicode 1.0 names, only those are enumerated that differ from the
- * modern names.
- *
- * @param start The first code point in the enumeration range.
- * @param limit One more than the last code point in the enumeration range
- *              (the first one after the range).
- * @param fn The function that is to be called for each character name.
- * @param context An arbitrary pointer that is passed to the function.
- * @param nameChoice Selector for which kind of names to enumerate.
- * @param pErrorCode Pointer to a UErrorCode variable
- *
- * @see UCharNameChoice
- * @see UEnumCharNamesFn
- * @see u_charName
- * @see u_charFromName
- * @stable ICU 1.7
- */
-U_STABLE void U_EXPORT2
-u_enumCharNames(UChar32 start, UChar32 limit,
-                UEnumCharNamesFn *fn,
-                void *context,
-                UCharNameChoice nameChoice,
-                UErrorCode *pErrorCode);
-
-/**
- * Return the Unicode name for a given property, as given in the
- * Unicode database file PropertyAliases.txt.
- *
- * In addition, this function maps the property
- * UCHAR_GENERAL_CATEGORY_MASK to the synthetic names "gcm" /
- * "General_Category_Mask".  These names are not in
- * PropertyAliases.txt.
- *
- * @param property UProperty selector other than UCHAR_INVALID_CODE.
- *         If out of range, NULL is returned.
- *
- * @param nameChoice selector for which name to get.  If out of range,
- *         NULL is returned.  All properties have a long name.  Most
- *         have a short name, but some do not.  Unicode allows for
- *         additional names; if present these will be returned by
- *         U_LONG_PROPERTY_NAME + i, where i=1, 2,...
- *
- * @return a pointer to the name, or NULL if either the
- *         property or the nameChoice is out of range.  If a given
- *         nameChoice returns NULL, then all larger values of
- *         nameChoice will return NULL, with one exception: if NULL is
- *         returned for U_SHORT_PROPERTY_NAME, then
- *         U_LONG_PROPERTY_NAME (and higher) may still return a
- *         non-NULL value.  The returned pointer is valid until
- *         u_cleanup() is called.
- *
- * @see UProperty
- * @see UPropertyNameChoice
- * @stable ICU 2.4
- */
-U_STABLE const char* U_EXPORT2
-u_getPropertyName(UProperty property,
-                  UPropertyNameChoice nameChoice);
-
-/**
- * Return the UProperty enum for a given property name, as specified
- * in the Unicode database file PropertyAliases.txt.  Short, long, and
- * any other variants are recognized.
- *
- * In addition, this function maps the synthetic names "gcm" /
- * "General_Category_Mask" to the property
- * UCHAR_GENERAL_CATEGORY_MASK.  These names are not in
- * PropertyAliases.txt.
- *
- * @param alias the property name to be matched.  The name is compared
- *         using "loose matching" as described in PropertyAliases.txt.
- *
- * @return a UProperty enum, or UCHAR_INVALID_CODE if the given name
- *         does not match any property.
- *
- * @see UProperty
- * @stable ICU 2.4
- */
-U_STABLE UProperty U_EXPORT2
-u_getPropertyEnum(const char* alias);
-
-/**
- * Return the Unicode name for a given property value, as given in the
- * Unicode database file PropertyValueAliases.txt.
- *
- * Note: Some of the names in PropertyValueAliases.txt can only be
- * retrieved using UCHAR_GENERAL_CATEGORY_MASK, not
- * UCHAR_GENERAL_CATEGORY.  These include: "C" / "Other", "L" /
- * "Letter", "LC" / "Cased_Letter", "M" / "Mark", "N" / "Number", "P"
- * / "Punctuation", "S" / "Symbol", and "Z" / "Separator".
- *
- * @param property UProperty selector constant.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT
- *        or UCHAR_INT_START<=which<UCHAR_INT_LIMIT
- *        or UCHAR_MASK_START<=which<UCHAR_MASK_LIMIT.
- *        If out of range, NULL is returned.
- *
- * @param value selector for a value for the given property.  If out
- *         of range, NULL is returned.  In general, valid values range
- *         from 0 up to some maximum.  There are a few exceptions:
- *         (1.) UCHAR_BLOCK values begin at the non-zero value
- *         UBLOCK_BASIC_LATIN.  (2.)  UCHAR_CANONICAL_COMBINING_CLASS
- *         values are not contiguous and range from 0..240.  (3.)
- *         UCHAR_GENERAL_CATEGORY_MASK values are not values of
- *         UCharCategory, but rather mask values produced by
- *         U_GET_GC_MASK().  This allows grouped categories such as
- *         [:L:] to be represented.  Mask values range
- *         non-contiguously from 1..U_GC_P_MASK.
- *
- * @param nameChoice selector for which name to get.  If out of range,
- *         NULL is returned.  All values have a long name.  Most have
- *         a short name, but some do not.  Unicode allows for
- *         additional names; if present these will be returned by
- *         U_LONG_PROPERTY_NAME + i, where i=1, 2,...
-
- * @return a pointer to the name, or NULL if either the
- *         property or the nameChoice is out of range.  If a given
- *         nameChoice returns NULL, then all larger values of
- *         nameChoice will return NULL, with one exception: if NULL is
- *         returned for U_SHORT_PROPERTY_NAME, then
- *         U_LONG_PROPERTY_NAME (and higher) may still return a
- *         non-NULL value.  The returned pointer is valid until
- *         u_cleanup() is called.
- *
- * @see UProperty
- * @see UPropertyNameChoice
- * @stable ICU 2.4
- */
-U_STABLE const char* U_EXPORT2
-u_getPropertyValueName(UProperty property,
-                       int32_t value,
-                       UPropertyNameChoice nameChoice);
-
-/**
- * Return the property value integer for a given value name, as
- * specified in the Unicode database file PropertyValueAliases.txt.
- * Short, long, and any other variants are recognized.
- *
- * Note: Some of the names in PropertyValueAliases.txt will only be
- * recognized with UCHAR_GENERAL_CATEGORY_MASK, not
- * UCHAR_GENERAL_CATEGORY.  These include: "C" / "Other", "L" /
- * "Letter", "LC" / "Cased_Letter", "M" / "Mark", "N" / "Number", "P"
- * / "Punctuation", "S" / "Symbol", and "Z" / "Separator".
- *
- * @param property UProperty selector constant.
- *        Must be UCHAR_BINARY_START<=which<UCHAR_BINARY_LIMIT
- *        or UCHAR_INT_START<=which<UCHAR_INT_LIMIT
- *        or UCHAR_MASK_START<=which<UCHAR_MASK_LIMIT.
- *        If out of range, UCHAR_INVALID_CODE is returned.
- *
- * @param alias the value name to be matched.  The name is compared
- *         using "loose matching" as described in
- *         PropertyValueAliases.txt.
- *
- * @return a value integer or UCHAR_INVALID_CODE if the given name
- *         does not match any value of the given property, or if the
- *         property is invalid.  Note: U CHAR_GENERAL_CATEGORY values
- *         are not values of UCharCategory, but rather mask values
- *         produced by U_GET_GC_MASK().  This allows grouped
- *         categories such as [:L:] to be represented.
- *
- * @see UProperty
- * @stable ICU 2.4
- */
-U_STABLE int32_t U_EXPORT2
-u_getPropertyValueEnum(UProperty property,
-                       const char* alias);
-
-/**
- * Determines if the specified character is permissible as the
- * first character in an identifier according to Unicode
- * (The Unicode Standard, Version 3.0, chapter 5.16 Identifiers).
- * True for characters with general categories "L" (letters) and "Nl" (letter numbers).
- *
- * Same as java.lang.Character.isUnicodeIdentifierStart().
- * Same as UCHAR_ID_START
- *
- * @param c the code point to be tested
- * @return TRUE if the code point may start an identifier
- *
- * @see UCHAR_ID_START
- * @see u_isalpha
- * @see u_isIDPart
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isIDStart(UChar32 c);
-
-/**
- * Determines if the specified character is permissible
- * in an identifier according to Java.
- * True for characters with general categories "L" (letters),
- * "Nl" (letter numbers), "Nd" (decimal digits),
- * "Mc" and "Mn" (combining marks), "Pc" (connecting punctuation), and
- * u_isIDIgnorable(c).
- *
- * Same as java.lang.Character.isUnicodeIdentifierPart().
- * Almost the same as Unicode's ID_Continue (UCHAR_ID_CONTINUE)
- * except that Unicode recommends to ignore Cf which is less than
- * u_isIDIgnorable(c).
- *
- * @param c the code point to be tested
- * @return TRUE if the code point may occur in an identifier according to Java
- *
- * @see UCHAR_ID_CONTINUE
- * @see u_isIDStart
- * @see u_isIDIgnorable
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isIDPart(UChar32 c);
-
-/**
- * Determines if the specified character should be regarded
- * as an ignorable character in an identifier,
- * according to Java.
- * True for characters with general category "Cf" (format controls) as well as
- * non-whitespace ISO controls
- * (U+0000..U+0008, U+000E..U+001B, U+007F..U+0084, U+0086..U+009F).
- *
- * Same as java.lang.Character.isIdentifierIgnorable()
- * except that Java also returns TRUE for U+0085 Next Line
- * (it omits U+0085 from whitespace ISO controls).
- *
- * Note that Unicode just recommends to ignore Cf (format controls).
- *
- * @param c the code point to be tested
- * @return TRUE if the code point is ignorable in identifiers according to Java
- *
- * @see UCHAR_DEFAULT_IGNORABLE_CODE_POINT
- * @see u_isIDStart
- * @see u_isIDPart
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isIDIgnorable(UChar32 c);
-
-/**
- * Determines if the specified character is permissible as the
- * first character in a Java identifier.
- * In addition to u_isIDStart(c), true for characters with
- * general categories "Sc" (currency symbols) and "Pc" (connecting punctuation).
- *
- * Same as java.lang.Character.isJavaIdentifierStart().
- *
- * @param c the code point to be tested
- * @return TRUE if the code point may start a Java identifier
- *
- * @see     u_isJavaIDPart
- * @see     u_isalpha
- * @see     u_isIDStart
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isJavaIDStart(UChar32 c);
-
-/**
- * Determines if the specified character is permissible
- * in a Java identifier.
- * In addition to u_isIDPart(c), true for characters with
- * general category "Sc" (currency symbols).
- *
- * Same as java.lang.Character.isJavaIdentifierPart().
- *
- * @param c the code point to be tested
- * @return TRUE if the code point may occur in a Java identifier
- *
- * @see     u_isIDIgnorable
- * @see     u_isJavaIDStart
- * @see     u_isalpha
- * @see     u_isdigit
- * @see     u_isIDPart
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-u_isJavaIDPart(UChar32 c);
-
-/**
- * The given character is mapped to its lowercase equivalent according to
- * UnicodeData.txt; if the character has no lowercase equivalent, the character
- * itself is returned.
- *
- * Same as java.lang.Character.toLowerCase().
- *
- * This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
- * Full case mappings are applied by the string case mapping functions,
- * see ustring.h and the UnicodeString class.
- *
- * @param c the code point to be mapped
- * @return the Simple_Lowercase_Mapping of the code point, if any;
- *         otherwise the code point itself.
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_tolower(UChar32 c);
-
-/**
- * The given character is mapped to its uppercase equivalent according to UnicodeData.txt;
- * if the character has no uppercase equivalent, the character itself is
- * returned.
- *
- * Same as java.lang.Character.toUpperCase().
- *
- * This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
- * Full case mappings are applied by the string case mapping functions,
- * see ustring.h and the UnicodeString class.
- *
- * @param c the code point to be mapped
- * @return the Simple_Uppercase_Mapping of the code point, if any;
- *         otherwise the code point itself.
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_toupper(UChar32 c);
-
-/**
- * The given character is mapped to its titlecase equivalent
- * according to UnicodeData.txt;
- * if none is defined, the character itself is returned.
- *
- * Same as java.lang.Character.toTitleCase().
- *
- * This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
- * Full case mappings are applied by the string case mapping functions,
- * see ustring.h and the UnicodeString class.
- *
- * @param c the code point to be mapped
- * @return the Simple_Titlecase_Mapping of the code point, if any;
- *         otherwise the code point itself.
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_totitle(UChar32 c);
-
-/** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */
-#define U_FOLD_CASE_DEFAULT 0
-
-/**
- * Option value for case folding:
- *
- * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I
- * and dotless i appropriately for Turkic languages (tr, az).
- *
- * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that
- * are to be included for default mappings and
- * excluded for the Turkic-specific mappings.
- *
- * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that
- * are to be excluded for default mappings and
- * included for the Turkic-specific mappings.
- *
- * @stable ICU 2.0
- */
-#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1
-
-/**
- * The given character is mapped to its case folding equivalent according to
- * UnicodeData.txt and CaseFolding.txt;
- * if the character has no case folding equivalent, the character
- * itself is returned.
- *
- * This function only returns the simple, single-code point case mapping.
- * Full case mappings may result in zero, one or more code points and depend
- * on context or language etc.
- * Full case mappings are applied by the string case mapping functions,
- * see ustring.h and the UnicodeString class.
- *
- * @param c the code point to be mapped
- * @param options Either U_FOLD_CASE_DEFAULT or U_FOLD_CASE_EXCLUDE_SPECIAL_I
- * @return the Simple_Case_Folding of the code point, if any;
- *         otherwise the code point itself.
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_foldCase(UChar32 c, uint32_t options);
-
-/**
- * Returns the decimal digit value of the code point in the
- * specified radix.
- *
- * If the radix is not in the range <code>2<=radix<=36</code> or if the
- * value of <code>c</code> is not a valid digit in the specified
- * radix, <code>-1</code> is returned. A character is a valid digit
- * if at least one of the following is true:
- * <ul>
- * <li>The character has a decimal digit value.
- *     Such characters have the general category "Nd" (decimal digit numbers)
- *     and a Numeric_Type of Decimal.
- *     In this case the value is the character's decimal digit value.</li>
- * <li>The character is one of the uppercase Latin letters
- *     <code>'A'</code> through <code>'Z'</code>.
- *     In this case the value is <code>c-'A'+10</code>.</li>
- * <li>The character is one of the lowercase Latin letters
- *     <code>'a'</code> through <code>'z'</code>.
- *     In this case the value is <code>ch-'a'+10</code>.</li>
- * <li>Latin letters from both the ASCII range (0061..007A, 0041..005A)
- *     as well as from the Fullwidth ASCII range (FF41..FF5A, FF21..FF3A)
- *     are recognized.</li>
- * </ul>
- *
- * Same as java.lang.Character.digit().
- *
- * @param   ch      the code point to be tested.
- * @param   radix   the radix.
- * @return  the numeric value represented by the character in the
- *          specified radix,
- *          or -1 if there is no value or if the value exceeds the radix.
- *
- * @see     UCHAR_NUMERIC_TYPE
- * @see     u_forDigit
- * @see     u_charDigitValue
- * @see     u_isdigit
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_digit(UChar32 ch, int8_t radix);
-
-/**
- * Determines the character representation for a specific digit in
- * the specified radix. If the value of <code>radix</code> is not a
- * valid radix, or the value of <code>digit</code> is not a valid
- * digit in the specified radix, the null character
- * (<code>U+0000</code>) is returned.
- * <p>
- * The <code>radix</code> argument is valid if it is greater than or
- * equal to 2 and less than or equal to 36.
- * The <code>digit</code> argument is valid if
- * <code>0 <= digit < radix</code>.
- * <p>
- * If the digit is less than 10, then
- * <code>'0' + digit</code> is returned. Otherwise, the value
- * <code>'a' + digit - 10</code> is returned.
- *
- * Same as java.lang.Character.forDigit().
- *
- * @param   digit   the number to convert to a character.
- * @param   radix   the radix.
- * @return  the <code>char</code> representation of the specified digit
- *          in the specified radix.
- *
- * @see     u_digit
- * @see     u_charDigitValue
- * @see     u_isdigit
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_forDigit(int32_t digit, int8_t radix);
-
-/**
- * Get the "age" of the code point.
- * The "age" is the Unicode version when the code point was first
- * designated (as a non-character or for Private Use)
- * or assigned a character.
- * This can be useful to avoid emitting code points to receiving
- * processes that do not accept newer characters.
- * The data is from the UCD file DerivedAge.txt.
- *
- * @param c The code point.
- * @param versionArray The Unicode version number array, to be filled in.
- *
- * @stable ICU 2.1
- */
-U_STABLE void U_EXPORT2
-u_charAge(UChar32 c, UVersionInfo versionArray);
-
-/**
- * Gets the Unicode version information.
- * The version array is filled in with the version information
- * for the Unicode standard that is currently used by ICU.
- * For example, Unicode version 3.1.1 is represented as an array with
- * the values { 3, 1, 1, 0 }.
- *
- * @param versionArray an output array that will be filled in with
- *                     the Unicode version number
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-u_getUnicodeVersion(UVersionInfo versionArray);
-
-/**
- * Get the FC_NFKC_Closure property string for a character.
- * See Unicode Standard Annex #15 for details, search for "FC_NFKC_Closure"
- * or for "FNC": http://www.unicode.org/reports/tr15/
- *
- * @param c The character (code point) for which to get the FC_NFKC_Closure string.
- *             It must be <code>0<=c<=0x10ffff</code>.
- * @param dest Destination address for copying the string.
- *             The string will be zero-terminated if possible.
- *             If there is no FC_NFKC_Closure string,
- *             then the buffer will be set to the empty string.
- * @param destCapacity <code>==sizeof(dest)</code>
- * @param pErrorCode Pointer to a UErrorCode variable.
- * @return The length of the string, or 0 if there is no FC_NFKC_Closure string for this character.
- *         If the destCapacity is less than or equal to the length, then the buffer
- *         contains the truncated name and the returned length indicates the full
- *         length of the name.
- *         The length does not include the zero-termination.
- *
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode);
-
-U_CDECL_END
-
-#endif /*_UCHAR*/
-/*eof*/
diff --git a/Source/JavaScriptGlue/icu/unicode/ucnv.h b/Source/JavaScriptGlue/icu/unicode/ucnv.h
deleted file mode 100644
index a042f7a..0000000
--- a/Source/JavaScriptGlue/icu/unicode/ucnv.h
+++ /dev/null
@@ -1,1817 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
- *  ucnv.h:
- *  External APIs for the ICU's codeset conversion library
- *  Bertrand A. Damiba
- *
- * Modification History:
- *
- *   Date        Name        Description
- *   04/04/99    helena      Fixed internal header inclusion.
- *   05/11/00    helena      Added setFallback and usesFallback APIs.
- *   06/29/2000  helena      Major rewrite of the callback APIs.
- *   12/07/2000  srl         Update of documentation
- */
-
-/**
- * \file
- * \brief C API: Character conversion 
- *
- * <h2>Character Conversion C API</h2>
- *
- * <p>This API is used to convert codepage or character encoded data to and
- * from UTF-16. You can open a converter with {@link ucnv_open() }. With that
- * converter, you can get its properties, set options, convert your data and
- * close the converter.</p>
- *
- * <p>Since many software programs recogize different converter names for
- * different types of converters, there are other functions in this API to
- * iterate over the converter aliases. The functions {@link ucnv_getAvailableName() },
- * {@link ucnv_getAlias() } and {@link ucnv_getStandardName() } are some of the
- * more frequently used alias functions to get this information.</p>
- *
- * <p>When a converter encounters an illegal, irregular, invalid or unmappable character
- * its default behavior is to use a substitution character to replace the
- * bad byte sequence. This behavior can be changed by using {@link ucnv_getFromUCallBack() }
- * or {@link ucnv_getToUCallBack() } on the converter. The header ucnv_err.h defines
- * many other callback actions that can be used instead of a character substitution.</p>
- *
- * <p>More information about this API can be found in our 
- * <a href="http://oss.software.ibm.com/icu/userguide/conversion.html">User's
- * Guide</a>.</p>
- */
-
-#ifndef UCNV_H
-#define UCNV_H
-
-#include "unicode/ucnv_err.h"
-#include "unicode/uenum.h"
-
-#ifndef __USET_H__
-
-/**
- * USet is the C API type for Unicode sets.
- * It is forward-declared here to avoid including the header file if related
- * conversion APIs are not used.
- * See unicode/uset.h
- *
- * @see ucnv_getUnicodeSet
- * @stable ICU 2.6
- */
-struct USet;
-/** @stable ICU 2.6 */
-typedef struct USet USet;
-
-#endif
-
-#if !UCONFIG_NO_CONVERSION
-
-U_CDECL_BEGIN
-
-/** Maximum length of a converter name including the terminating NULL @stable ICU 2.0 */
-#define UCNV_MAX_CONVERTER_NAME_LENGTH 60
-/** Maximum length of a converter name including path and terminating NULL @stable ICU 2.0 */
-#define UCNV_MAX_FULL_FILE_NAME_LENGTH (600+UCNV_MAX_CONVERTER_NAME_LENGTH)
-
-/** Shift in for EBDCDIC_STATEFUL and iso2022 states @stable ICU 2.0 */
-#define  UCNV_SI 0x0F
-/** Shift out for EBDCDIC_STATEFUL and iso2022 states @stable ICU 2.0 */
-#define  UCNV_SO 0x0E
-
-/**
- * Enum for specifying basic types of converters
- * @see ucnv_getType
- * @stable ICU 2.0
- */
-typedef enum {
-    UCNV_UNSUPPORTED_CONVERTER = -1,
-    UCNV_SBCS = 0,
-    UCNV_DBCS = 1,
-    UCNV_MBCS = 2,
-    UCNV_LATIN_1 = 3,
-    UCNV_UTF8 = 4,
-    UCNV_UTF16_BigEndian = 5,
-    UCNV_UTF16_LittleEndian = 6,
-    UCNV_UTF32_BigEndian = 7,
-    UCNV_UTF32_LittleEndian = 8,
-    UCNV_EBCDIC_STATEFUL = 9,
-    UCNV_ISO_2022 = 10,
-
-    UCNV_LMBCS_1 = 11,
-    UCNV_LMBCS_2, 
-    UCNV_LMBCS_3,
-    UCNV_LMBCS_4,
-    UCNV_LMBCS_5,
-    UCNV_LMBCS_6,
-    UCNV_LMBCS_8,
-    UCNV_LMBCS_11,
-    UCNV_LMBCS_16,
-    UCNV_LMBCS_17,
-    UCNV_LMBCS_18,
-    UCNV_LMBCS_19,
-    UCNV_LMBCS_LAST = UCNV_LMBCS_19,
-    UCNV_HZ,
-    UCNV_SCSU,
-    UCNV_ISCII,
-    UCNV_US_ASCII,
-    UCNV_UTF7,
-    UCNV_BOCU1,
-    UCNV_UTF16,
-    UCNV_UTF32,
-    UCNV_CESU8,
-    UCNV_IMAP_MAILBOX,
-
-    /* Number of converter types for which we have conversion routines. */
-    UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES
-
-} UConverterType;
-
-/**
- * Enum for specifying which platform a converter ID refers to.
- * The use of platform/CCSID is not recommended. See ucnv_openCCSID().
- *
- * @see ucnv_getPlatform
- * @see ucnv_openCCSID
- * @see ucnv_getCCSID
- * @stable ICU 2.0
- */
-typedef enum {
-    UCNV_UNKNOWN = -1,
-    UCNV_IBM = 0
-} UConverterPlatform;
-
-/**
- * Function pointer for error callback in the codepage to unicode direction.
- * Called when an error has occured in conversion to unicode, or on open/close of the callback (see reason).
- * @param context Pointer to the callback's private data
- * @param args Information about the conversion in progress
- * @param codeUnits Points to 'length' bytes of the concerned codepage sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param reason Defines the reason the callback was invoked
- * @see ucnv_setToUCallBack
- * @see UConverterToUnicodeArgs
- * @stable ICU 2.0
- */
-typedef void (U_EXPORT2 *UConverterToUCallback) (
-                  const void* context,
-                  UConverterToUnicodeArgs *args,
-                  const char *codeUnits,
-                  int32_t length,
-                  UConverterCallbackReason reason,
-                  UErrorCode *);
-
-/**
- * Function pointer for error callback in the unicode to codepage direction.
- * Called when an error has occured in conversion from unicode, or on open/close of the callback (see reason).
- * @param context Pointer to the callback's private data
- * @param args Information about the conversion in progress
- * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
- * @param reason Defines the reason the callback was invoked
- * @see ucnv_setFromUCallBack
- * @stable ICU 2.0
- */
-typedef void (U_EXPORT2 *UConverterFromUCallback) (
-                    const void* context,
-                    UConverterFromUnicodeArgs *args,
-                    const UChar* codeUnits,
-                    int32_t length,
-                    UChar32 codePoint,
-                    UConverterCallbackReason reason,
-                    UErrorCode *);
-
-U_CDECL_END
-
-/**
- * Character that separates converter names from options and options from each other.
- * @see ucnv_open
- * @stable ICU 2.0
- */
-#define UCNV_OPTION_SEP_CHAR ','
-
-/**
- * String version of UCNV_OPTION_SEP_CHAR. 
- * @see ucnv_open
- * @stable ICU 2.0
- */
-#define UCNV_OPTION_SEP_STRING ","
-
-/**
- * Character that separates a converter option from its value.
- * @see ucnv_open
- * @stable ICU 2.0
- */
-#define UCNV_VALUE_SEP_CHAR '='
-
-/**
- * String version of UCNV_VALUE_SEP_CHAR. 
- * @see ucnv_open
- * @stable ICU 2.0
- */
-#define UCNV_VALUE_SEP_STRING "="
-
-/**
- * Converter option for specifying a locale.
- * For example, ucnv_open("SCSU,locale=ja", &errorCode);
- * See convrtrs.txt.
- *
- * @see ucnv_open
- * @stable ICU 2.0
- */
-#define UCNV_LOCALE_OPTION_STRING ",locale="
-
-/**
- * Converter option for specifying a version selector (0..9) for some converters.
- * For example, ucnv_open("UTF-7,version=1", &errorCode);
- * See convrtrs.txt.
- *
- * @see ucnv_open
- * @stable ICU 2.4
- */
-#define UCNV_VERSION_OPTION_STRING ",version="
-
-/**
- * Converter option for EBCDIC SBCS or mixed-SBCS/DBCS (stateful) codepages.
- * Swaps Unicode mappings for EBCDIC LF and NL codes, as used on
- * S/390 (z/OS) Unix System Services (Open Edition).
- * For example, ucnv_open("ibm-1047,swaplfnl", &errorCode);
- * See convrtrs.txt.
- *
- * @see ucnv_open
- * @stable ICU 2.4
- */
-#define UCNV_SWAP_LFNL_OPTION_STRING ",swaplfnl"
-
-/**
- * Do a fuzzy compare of a two converter/alias names.  The comparison
- * is case-insensitive.  It also ignores the characters '-', '_', and
- * ' ' (dash, underscore, and space).  Thus the strings "UTF-8",
- * "utf_8", and "Utf 8" are exactly equivalent.
- * 
- * @param name1 a converter name or alias, zero-terminated
- * @param name2 a converter name or alias, zero-terminated
- * @return 0 if the names match, or a negative value if the name1
- * lexically precedes name2, or a positive value if the name1
- * lexically follows name2.
- * @stable ICU 2.0
- */
-U_STABLE int U_EXPORT2
-ucnv_compareNames(const char *name1, const char *name2);
-
-
-/**
- * Creates a UConverter object with the names specified as a C string.
- * The actual name will be resolved with the alias file
- * using a case-insensitive string comparison that ignores
- * the delimiters '-', '_', and ' ' (dash, underscore, and space).
- * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent.
- * If <code>NULL</code> is passed for the converter name, it will create one with the
- * getDefaultName return value.
- *
- * <p>A converter name for ICU 1.5 and above may contain options
- * like a locale specification to control the specific behavior of
- * the newly instantiated converter.
- * The meaning of the options depends on the particular converter.
- * If an option is not defined for or recognized by a given converter, then it is ignored.</p>
- *
- * <p>Options are appended to the converter name string, with a
- * <code>UCNV_OPTION_SEP_CHAR</code> between the name and the first option and
- * also between adjacent options.</p>
- *
- * <p>If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.</p>
- *
- * <p>The conversion behavior and names can vary between platforms. ICU may
- * convert some characters differently from other platforms. Details on this topic
- * are in the <a href="http://oss.software.ibm.com/icu/userguide/conversion.html">User's
- * Guide</a>.</p>
- *
- * @param converterName Name of the uconv table, may have options appended
- * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an error occured
- * @see ucnv_openU
- * @see ucnv_openCCSID
- * @see ucnv_close
- * @stable ICU 2.0
- */
-U_STABLE UConverter* U_EXPORT2 
-ucnv_open(const char *converterName, UErrorCode *err);
-
-
-/**
- * Creates a Unicode converter with the names specified as unicode string. 
- * The name should be limited to the ASCII-7 alphanumerics range.
- * The actual name will be resolved with the alias file
- * using a case-insensitive string comparison that ignores
- * the delimiters '-', '_', and ' ' (dash, underscore, and space).
- * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent.
- * If <TT>NULL</TT> is passed for the converter name, it will create 
- * one with the ucnv_getDefaultName() return value.
- * If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- * @param name : name of the uconv table in a zero terminated 
- *        Unicode string
- * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, 
- *        U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an 
- *        error occured
- * @see ucnv_open
- * @see ucnv_openCCSID
- * @see ucnv_close
- * @see ucnv_getDefaultName
- * @stable ICU 2.0
- */
-U_STABLE UConverter* U_EXPORT2 
-ucnv_openU(const UChar *name,
-           UErrorCode *err);
-
-/**
- * Creates a UConverter object from a CCSID number and platform pair.
- * Note that the usefulness of this function is limited to platforms with numeric
- * encoding IDs. Only IBM and Microsoft platforms use numeric (16-bit) identifiers for
- * encodings.
- *
- * In addition, IBM CCSIDs and Unicode conversion tables are not 1:1 related.
- * For many IBM CCSIDs there are multiple (up to six) Unicode conversion tables, and
- * for some Unicode conversion tables there are multiple CCSIDs.
- * Some "alternate" Unicode conversion tables are provided by the
- * IBM CDRA conversion table registry.
- * The most prominent example of a systematic modification of conversion tables that is
- * not provided in the form of conversion table files in the repository is
- * that S/390 Unix System Services swaps the codes for Line Feed and New Line in all
- * EBCDIC codepages, which requires such a swap in the Unicode conversion tables as well.
- *
- * Only IBM default conversion tables are accessible with ucnv_openCCSID().
- * ucnv_getCCSID() will return the same CCSID for all conversion tables that are associated
- * with that CCSID.
- *
- * Currently, the only "platform" supported in the ICU converter API is UCNV_IBM.
- *
- * In summary, the use of CCSIDs and the associated API functions is not recommended.
- *
- * In order to open a converter with the default IBM CDRA Unicode conversion table,
- * you can use this function or use the prefix "ibm-":
- * \code
- *     char name[20];
- *     sprintf(name, "ibm-%hu", ccsid);
- *     cnv=ucnv_open(name, &errorCode);
- * \endcode
- *
- * In order to open a converter with the IBM S/390 Unix System Services variant
- * of a Unicode/EBCDIC conversion table,
- * you can use the prefix "ibm-" together with the option string UCNV_SWAP_LFNL_OPTION_STRING:
- * \code
- *     char name[20];
- *     sprintf(name, "ibm-%hu" UCNV_SWAP_LFNL_OPTION_STRING, ccsid);
- *     cnv=ucnv_open(name, &errorCode);
- * \endcode
- *
- * In order to open a converter from a Microsoft codepage number, use the prefix "cp":
- * \code
- *     char name[20];
- *     sprintf(name, "cp%hu", codepageID);
- *     cnv=ucnv_open(name, &errorCode);
- * \endcode
- *
- * If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- *
- * @param codepage codepage number to create
- * @param platform the platform in which the codepage number exists
- * @param err error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an error
- *   occured.
- * @see ucnv_open
- * @see ucnv_openU
- * @see ucnv_close
- * @see ucnv_getCCSID
- * @see ucnv_getPlatform
- * @see UConverterPlatform
- * @stable ICU 2.0
- */
-U_STABLE UConverter* U_EXPORT2
-ucnv_openCCSID(int32_t codepage,
-               UConverterPlatform platform,
-               UErrorCode * err);
-
-/**
- * <p>Creates a UConverter object specified from a packageName and a converterName.</p>
- * 
- * <p>The packageName and converterName must point to an ICU udata object, as defined by
- *   <code> udata_open( packageName, "cnv", converterName, err) </code> or equivalent.
- * Typically, packageName will refer to a (.dat) file, or to a package registered with
- * udata_setAppData().</p>
- * 
- * <p>The name will NOT be looked up in the alias mechanism, nor will the converter be
- * stored in the converter cache or the alias table. The only way to open further converters
- * is call this function multiple times, or use the ucnv_safeClone() function to clone a 
- * 'master' converter.</p>
- *
- * <p>A future version of ICU may add alias table lookups and/or caching
- * to this function.</p>
- * 
- * <p>Example Use:
- *      <code>cnv = ucnv_openPackage("myapp", "myconverter", &err);</code>
- * </p>
- *
- * @param packageName name of the package (equivalent to 'path' in udata_open() call)
- * @param converterName name of the data item to be used, without suffix.
- * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an error occured
- * @see udata_open
- * @see ucnv_open
- * @see ucnv_safeClone
- * @see ucnv_close
- * @stable ICU 2.2
- */
-U_STABLE UConverter* U_EXPORT2 
-ucnv_openPackage(const char *packageName, const char *converterName, UErrorCode *err);
-
-/**
- * Thread safe cloning operation
- * @param cnv converter to be cloned
- * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated. 
- *  If buffer is not large enough, new memory will be allocated.
- *  Clients can use the U_CNV_SAFECLONE_BUFFERSIZE. This will probably be enough to avoid memory allocations.
- * @param pBufferSize pointer to size of allocated space. 
- *  If *pBufferSize == 0, a sufficient size for use in cloning will 
- *  be returned ('pre-flighting')
- *  If *pBufferSize is not enough for a stack-based safe clone, 
- *  new memory will be allocated.
- * @param status to indicate whether the operation went on smoothly or there were errors
- *  An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary.
- * @return pointer to the new clone
- * @stable ICU 2.0
- */
-U_STABLE UConverter * U_EXPORT2 
-ucnv_safeClone(const UConverter *cnv, 
-               void             *stackBuffer,
-               int32_t          *pBufferSize, 
-               UErrorCode       *status);
-
-/**
- * \def U_CNV_SAFECLONE_BUFFERSIZE
- * Definition of a buffer size that is designed to be large enough for
- * converters to be cloned with ucnv_safeClone().
- * @stable ICU 2.0
- */
-#define U_CNV_SAFECLONE_BUFFERSIZE  1024
-
-/**
- * Deletes the unicode converter and releases resources associated
- * with just this instance.
- * Does not free up shared converter tables.
- *
- * @param converter the converter object to be deleted
- * @see ucnv_open
- * @see ucnv_openU
- * @see ucnv_openCCSID
- * @stable ICU 2.0
- */
-U_STABLE void  U_EXPORT2
-ucnv_close(UConverter * converter);
-
-/**
- * Fills in the output parameter, subChars, with the substitution characters
- * as multiple bytes.
- *
- * @param converter the Unicode converter
- * @param subChars the subsitution characters
- * @param len on input the capacity of subChars, on output the number 
- * of bytes copied to it
- * @param  err the outgoing error status code.
- * If the substitution character array is too small, an
- * <TT>U_INDEX_OUTOFBOUNDS_ERROR</TT> will be returned.
- * @see ucnv_setSubstChars
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getSubstChars(const UConverter *converter,
-                   char *subChars,
-                   int8_t *len,
-                   UErrorCode *err);
-
-/**
- * Sets the substitution chars when converting from unicode to a codepage. The
- * substitution is specified as a string of 1-4 bytes, and may contain
- *  <TT>NULL</TT> byte.
- * @param converter the Unicode converter
- * @param subChars the substitution character byte sequence we want set
- * @param len the number of bytes in subChars
- * @param err the error status code.  <TT>U_INDEX_OUTOFBOUNDS_ERROR </TT> if
- * len is bigger than the maximum number of bytes allowed in subchars
- * @see ucnv_getSubstChars
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_setSubstChars(UConverter *converter,
-                   const char *subChars,
-                   int8_t len,
-                   UErrorCode *err);
-
-/**
- * Fills in the output parameter, errBytes, with the error characters from the
- * last failing conversion.
- *
- * @param converter the Unicode converter
- * @param errBytes the codepage bytes which were in error
- * @param len on input the capacity of errBytes, on output the number of
- *  bytes which were copied to it
- * @param err the error status code.
- * If the substitution character array is too small, an
- * <TT>U_INDEX_OUTOFBOUNDS_ERROR</TT> will be returned.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getInvalidChars(const UConverter *converter,
-                     char *errBytes,
-                     int8_t *len,
-                     UErrorCode *err);
-
-/**
- * Fills in the output parameter, errChars, with the error characters from the
- * last failing conversion.
- *
- * @param converter the Unicode converter
- * @param errUChars the UChars which were in error
- * @param len on input the capacity of errUChars, on output the number of 
- *  UChars which were copied to it
- * @param err the error status code.
- * If the substitution character array is too small, an
- * <TT>U_INDEX_OUTOFBOUNDS_ERROR</TT> will be returned.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getInvalidUChars(const UConverter *converter,
-                      UChar *errUChars,
-                      int8_t *len,
-                      UErrorCode *err);
-
-/**
- * Resets the state of a converter to the default state. This is used
- * in the case of an error, to restart a conversion from a known default state.
- * It will also empty the internal output buffers.
- * @param converter the Unicode converter
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_reset(UConverter *converter);
-
-/**
- * Resets the to-Unicode part of a converter state to the default state.
- * This is used in the case of an error to restart a conversion to
- * Unicode to a known default state. It will also empty the internal
- * output buffers used for the conversion to Unicode codepoints.
- * @param converter the Unicode converter
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_resetToUnicode(UConverter *converter);
-
-/**
- * Resets the from-Unicode part of a converter state to the default state.
- * This is used in the case of an error to restart a conversion from
- * Unicode to a known default state. It will also empty the internal output
- * buffers used for the conversion from Unicode codepoints.
- * @param converter the Unicode converter
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_resetFromUnicode(UConverter *converter);
-
-/**
- * Returns the maximum number of bytes that are output per UChar in conversion
- * from Unicode using this converter.
- * The returned number can be used with UCNV_GET_MAX_BYTES_FOR_STRING
- * to calculate the size of a target buffer for conversion from Unicode.
- *
- * Note: Before ICU 2.8, this function did not return reliable numbers for
- * some stateful converters (EBCDIC_STATEFUL, ISO-2022) and LMBCS.
- *
- * This number may not be the same as the maximum number of bytes per
- * "conversion unit". In other words, it may not be the intuitively expected
- * number of bytes per character that would be published for a charset,
- * and may not fulfill any other purpose than the allocation of an output
- * buffer of guaranteed sufficient size for a given input length and converter.
- *
- * Examples for special cases that are taken into account:
- * - Supplementary code points may convert to more bytes than BMP code points.
- *   This function returns bytes per UChar (UTF-16 code unit), not per
- *   Unicode code point, for efficient buffer allocation.
- * - State-shifting output (SI/SO, escapes, etc.) from stateful converters.
- * - When m input UChars are converted to n output bytes, then the maximum m/n
- *   is taken into account.
- *
- * The number returned here does not take into account
- * (see UCNV_GET_MAX_BYTES_FOR_STRING):
- * - callbacks which output more than one charset character sequence per call,
- *   like escape callbacks
- * - initial and final non-character bytes that are output by some converters
- *   (automatic BOMs, initial escape sequence, final SI, etc.)
- *
- * Examples for returned values:
- * - SBCS charsets: 1
- * - Shift-JIS: 2
- * - UTF-16: 2 (2 per BMP, 4 per surrogate _pair_, BOM not counted)
- * - UTF-8: 3 (3 per BMP, 4 per surrogate _pair_)
- * - EBCDIC_STATEFUL (EBCDIC mixed SBCS/DBCS): 3 (SO + DBCS)
- * - ISO-2022: 3 (always outputs UTF-8)
- * - ISO-2022-JP: 6 (4-byte escape sequences + DBCS)
- * - ISO-2022-CN: 8 (4-byte designator sequences + 2-byte SS2/SS3 + DBCS)
- *
- * @param converter The Unicode converter.
- * @return The maximum number of bytes per UChar that are output by ucnv_fromUnicode(),
- *         to be used together with UCNV_GET_MAX_BYTES_FOR_STRING for buffer allocation.
- *
- * @see UCNV_GET_MAX_BYTES_FOR_STRING
- * @see ucnv_getMinCharSize
- * @stable ICU 2.0
- */
-U_STABLE int8_t U_EXPORT2
-ucnv_getMaxCharSize(const UConverter *converter);
-
-#ifndef U_HIDE_DRAFT_API
-
-/**
- * Calculates the size of a buffer for conversion from Unicode to a charset.
- * The calculated size is guaranteed to be sufficient for this conversion.
- *
- * It takes into account initial and final non-character bytes that are output
- * by some converters.
- * It does not take into account callbacks which output more than one charset
- * character sequence per call, like escape callbacks.
- * The default (substitution) callback only outputs one charset character sequence.
- *
- * @param length Number of UChars to be converted.
- * @param maxCharSize Return value from ucnv_getMaxCharSize() for the converter
- *                    that will be used.
- * @return Size of a buffer that will be large enough to hold the output bytes of
- *         converting length UChars with the converter that returned the maxCharSize.
- *
- * @see ucnv_getMaxCharSize
- * @draft ICU 2.8
- */
-#define UCNV_GET_MAX_BYTES_FOR_STRING(length, maxCharSize) \
-     (((int32_t)(length)+10)*(int32_t)(maxCharSize))
-
-#endif /*U_HIDE_DRAFT_API*/
-
-/**
- * Returns the minimum byte length for characters in this codepage. 
- * This is usually either 1 or 2.
- * @param converter the Unicode converter
- * @return the minimum number of bytes allowed by this particular converter
- * @see ucnv_getMaxCharSize
- * @stable ICU 2.0
- */
-U_STABLE int8_t U_EXPORT2
-ucnv_getMinCharSize(const UConverter *converter);
-
-/**
- * Returns the display name of the converter passed in based on the Locale 
- * passed in. If the locale contains no display name, the internal ASCII
- * name will be filled in.
- *
- * @param converter the Unicode converter.
- * @param displayLocale is the specific Locale we want to localised for
- * @param displayName user provided buffer to be filled in
- * @param displayNameCapacity size of displayName Buffer
- * @param err error status code
- * @return displayNameLength number of UChar needed in displayName
- * @see ucnv_getName
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_getDisplayName(const UConverter *converter,
-                    const char *displayLocale,
-                    UChar *displayName,
-                    int32_t displayNameCapacity,
-                    UErrorCode *err);
-
-/**
- * Gets the internal, canonical name of the converter (zero-terminated).
- * The lifetime of the returned string will be that of the converter 
- * passed to this function.
- * @param converter the Unicode converter
- * @param err UErrorCode status
- * @return the internal name of the converter
- * @see ucnv_getDisplayName
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2 
-ucnv_getName(const UConverter *converter, UErrorCode *err);
-
-/**
- * Gets a codepage number associated with the converter. This is not guaranteed
- * to be the one used to create the converter. Some converters do not represent
- * platform registered codepages and return zero for the codepage number.
- * The error code fill-in parameter indicates if the codepage number
- * is available.
- * Does not check if the converter is <TT>NULL</TT> or if converter's data
- * table is <TT>NULL</TT>.
- *
- * Important: The use of CCSIDs is not recommended because it is limited
- * to only two platforms in principle and only one (UCNV_IBM) in the current
- * ICU converter API.
- * Also, CCSIDs are insufficient to identify IBM Unicode conversion tables precisely.
- * For more details see ucnv_openCCSID().
- *
- * @param converter the Unicode converter
- * @param err the error status code.
- * @return If any error occurrs, -1 will be returned otherwise, the codepage number
- * will be returned
- * @see ucnv_openCCSID
- * @see ucnv_getPlatform
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_getCCSID(const UConverter *converter,
-              UErrorCode *err);
-
-/**
- * Gets a codepage platform associated with the converter. Currently, 
- * only <TT>UCNV_IBM</TT> will be returned.
- * Does not test if the converter is <TT>NULL</TT> or if converter's data 
- * table is <TT>NULL</TT>. 
- * @param converter the Unicode converter
- * @param err the error status code.
- * @return The codepage platform
- * @stable ICU 2.0
- */
-U_STABLE UConverterPlatform U_EXPORT2
-ucnv_getPlatform(const UConverter *converter,
-                 UErrorCode *err);
-
-/**
- * Gets the type of the converter
- * e.g. SBCS, MBCS, DBCS, UTF8, UTF16_BE, UTF16_LE, ISO_2022, 
- * EBCDIC_STATEFUL, LATIN_1
- * @param converter a valid, opened converter
- * @return the type of the converter
- * @stable ICU 2.0
- */
-U_STABLE UConverterType U_EXPORT2
-ucnv_getType(const UConverter * converter);
-
-/**
- * Gets the "starter" (lead) bytes for converters of type MBCS.
- * Will fill in an <TT>U_ILLEGAL_ARGUMENT_ERROR</TT> if converter passed in
- * is not MBCS. Fills in an array of type UBool, with the value of the byte 
- * as offset to the array. For example, if (starters[0x20] == TRUE) at return,
- * it means that the byte 0x20 is a starter byte in this converter.
- * Context pointers are always owned by the caller.
- * 
- * @param converter a valid, opened converter of type MBCS
- * @param starters an array of size 256 to be filled in
- * @param err error status, <TT>U_ILLEGAL_ARGUMENT_ERROR</TT> if the 
- * converter is not a type which can return starters.
- * @see ucnv_getType
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getStarters(const UConverter* converter, 
-                 UBool starters[256],
-                 UErrorCode* err);
-
-
-/**
- * Selectors for Unicode sets that can be returned by ucnv_getUnicodeSet().
- * @see ucnv_getUnicodeSet
- * @stable ICU 2.6
- */
-typedef enum UConverterUnicodeSet {
-    /** Select the set of roundtrippable Unicode code points. @stable ICU 2.6 */
-    UCNV_ROUNDTRIP_SET,
-    /** Number of UConverterUnicodeSet selectors. @stable ICU 2.6 */
-    UCNV_SET_COUNT
-} UConverterUnicodeSet;
-
-
-/**
- * Returns the set of Unicode code points that can be converted by an ICU converter.
- *
- * The current implementation returns only one kind of set (UCNV_ROUNDTRIP_SET):
- * The set of all Unicode code points that can be roundtrip-converted
- * (converted without any data loss) with the converter.
- * This set will not include code points that have fallback mappings
- * or are only the result of reverse fallback mappings.
- * See UTR #22 "Character Mapping Markup Language"
- * at http://www.unicode.org/reports/tr22/
- *
- * This is useful for example for
- * - checking that a string or document can be roundtrip-converted with a converter,
- *   without/before actually performing the conversion
- * - testing if a converter can be used for text for typical text for a certain locale,
- *   by comparing its roundtrip set with the set of ExemplarCharacters from
- *   ICU's locale data or other sources
- *
- * In the future, there may be more UConverterUnicodeSet choices to select
- * sets with different properties.
- *
- * @param cnv The converter for which a set is requested.
- * @param setFillIn A valid USet *. It will be cleared by this function before
- *            the converter's specific set is filled into the USet.
- * @param whichSet A UConverterUnicodeSet selector;
- *              currently UCNV_ROUNDTRIP_SET is the only supported value.
- * @param pErrorCode ICU error code in/out parameter.
- *                   Must fulfill U_SUCCESS before the function call.
- *
- * @see UConverterUnicodeSet
- * @see uset_open
- * @see uset_close
- * @stable ICU 2.6
- */
-U_STABLE void U_EXPORT2
-ucnv_getUnicodeSet(const UConverter *cnv,
-                   USet *setFillIn,
-                   UConverterUnicodeSet whichSet,
-                   UErrorCode *pErrorCode);
-
-/**
- * Gets the current calback function used by the converter when an illegal
- *  or invalid codepage sequence is found. 
- * Context pointers are always owned by the caller.
- *
- * @param converter the unicode converter
- * @param action fillin: returns the callback function pointer
- * @param context fillin: returns the callback's private void* context
- * @see ucnv_setToUCallBack
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getToUCallBack (const UConverter * converter,
-                     UConverterToUCallback *action,
-                     const void **context);
-
-/**
- * Gets the current callback function used by the converter when illegal 
- * or invalid Unicode sequence is found.
- * Context pointers are always owned by the caller.
- *
- * @param converter the unicode converter
- * @param action fillin: returns the callback function pointer
- * @param context fillin: returns the callback's private void* context
- * @see ucnv_setFromUCallBack
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_getFromUCallBack (const UConverter * converter,
-                       UConverterFromUCallback *action,
-                       const void **context);
-
-/**
- * Changes the callback function used by the converter when
- * an illegal or invalid sequence is found.
- * Context pointers are always owned by the caller.
- * Predefined actions and contexts can be found in the ucnv_err.h header.
- *
- * @param converter the unicode converter
- * @param newAction the new callback function
- * @param newContext the new toUnicode callback context pointer. This can be NULL.
- * @param oldAction fillin: returns the old callback function pointer. This can be NULL.
- * @param oldContext fillin: returns the old callback's private void* context. This can be NULL.
- * @param err The error code status
- * @see ucnv_getToUCallBack
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_setToUCallBack (UConverter * converter,
-                     UConverterToUCallback newAction,
-                     const void* newContext,
-                     UConverterToUCallback *oldAction,
-                     const void** oldContext,
-                     UErrorCode * err);
-
-/**
- * Changes the current callback function used by the converter when
- * an illegal or invalid sequence is found.
- * Context pointers are always owned by the caller.
- * Predefined actions and contexts can be found in the ucnv_err.h header.
- *
- * @param converter the unicode converter
- * @param newAction the new callback function
- * @param newContext the new fromUnicode callback context pointer. This can be NULL.
- * @param oldAction fillin: returns the old callback function pointer. This can be NULL.
- * @param oldContext fillin: returns the old callback's private void* context. This can be NULL.
- * @param err The error code status
- * @see ucnv_getFromUCallBack
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_setFromUCallBack (UConverter * converter,
-                       UConverterFromUCallback newAction,
-                       const void *newContext,
-                       UConverterFromUCallback *oldAction,
-                       const void **oldContext,
-                       UErrorCode * err);
-
-/**
- * Converts an array of unicode characters to an array of codepage
- * characters. This function is optimized for converting a continuous
- * stream of data in buffer-sized chunks, where the entire source and
- * target does not fit in available buffers.
- * 
- * The source pointer is an in/out parameter. It starts out pointing where the 
- * conversion is to begin, and ends up pointing after the last UChar consumed. 
- * 
- * Target similarly starts out pointer at the first available byte in the output
- * buffer, and ends up pointing after the last byte written to the output.
- * 
- * The converter always attempts to consume the entire source buffer, unless 
- * (1.) the target buffer is full, or (2.) a failing error is returned from the
- * current callback function.  When a successful error status has been
- * returned, it means that all of the source buffer has been
- *  consumed. At that point, the caller should reset the source and
- *  sourceLimit pointers to point to the next chunk.
- * 
- * At the end of the stream (flush==TRUE), the input is completely consumed
- * when *source==sourceLimit and no error code is set.
- * The converter object is then automatically reset by this function.
- * (This means that a converter need not be reset explicitly between data
- * streams if it finishes the previous stream without errors.)
- * 
- * This is a <I>stateful</I> conversion. Additionally, even when all source data has
- * been consumed, some data may be in the converters' internal state.
- * Call this function repeatedly, updating the target pointers with
- * the next empty chunk of target in case of a
- * <TT>U_BUFFER_OVERFLOW_ERROR</TT>, and updating the source  pointers
- *  with the next chunk of source when a successful error status is
- * returned, until there are no more chunks of source data.
- * @param converter the Unicode converter
- * @param target I/O parameter. Input : Points to the beginning of the buffer to copy
- *  codepage characters to. Output : points to after the last codepage character copied
- *  to <TT>target</TT>.
- * @param targetLimit the pointer just after last of the <TT>target</TT> buffer
- * @param source I/O parameter, pointer to pointer to the source Unicode character buffer. 
- * @param sourceLimit the pointer just after the last of the source buffer
- * @param offsets if NULL is passed, nothing will happen to it, otherwise it needs to have the same number
- * of allocated cells as <TT>target</TT>. Will fill in offsets from target to source pointer
- * e.g: <TT>offsets[3]</TT> is equal to 6, it means that the <TT>target[3]</TT> was a result of transcoding <TT>source[6]</TT>
- * For output data carried across calls, and other data without a specific source character
- * (such as from escape sequences or callbacks)  -1 will be placed for offsets. 
- * @param flush set to <TT>TRUE</TT> if the current source buffer is the last available
- * chunk of the source, <TT>FALSE</TT> otherwise. Note that if a failing status is returned,
- * this function may have to be called multiple times with flush set to <TT>TRUE</TT> until
- * the source buffer is consumed.
- * @param err the error status.  <TT>U_ILLEGAL_ARGUMENT_ERROR</TT> will be set if the
- * converter is <TT>NULL</TT>.
- * <code>U_BUFFER_OVERFLOW_ERROR</code> will be set if the target is full and there is 
- * still data to be written to the target.
- * @see ucnv_fromUChars
- * @see ucnv_convert
- * @see ucnv_getMinCharSize
- * @see ucnv_setToUCallBack
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_fromUnicode (UConverter * converter,
-                  char **target,
-                  const char *targetLimit,
-                  const UChar ** source,
-                  const UChar * sourceLimit,
-                  int32_t* offsets,
-                  UBool flush,
-                  UErrorCode * err);
-
-/**
- * Converts a buffer of codepage bytes into an array of unicode UChars
- * characters. This function is optimized for converting a continuous
- * stream of data in buffer-sized chunks, where the entire source and
- * target does not fit in available buffers.
- * 
- * The source pointer is an in/out parameter. It starts out pointing where the 
- * conversion is to begin, and ends up pointing after the last byte of source consumed. 
- * 
- * Target similarly starts out pointer at the first available UChar in the output
- * buffer, and ends up pointing after the last UChar written to the output. 
- * It does NOT necessarily keep UChar sequences together.
- * 
- * The converter always attempts to consume the entire source buffer, unless 
- * (1.) the target buffer is full, or (2.) a failing error is returned from the
- * current callback function.  When a successful error status has been
- * returned, it means that all of the source buffer has been
- *  consumed. At that point, the caller should reset the source and
- *  sourceLimit pointers to point to the next chunk.
- *
- * At the end of the stream (flush==TRUE), the input is completely consumed
- * when *source==sourceLimit and no error code is set
- * The converter object is then automatically reset by this function.
- * (This means that a converter need not be reset explicitly between data
- * streams if it finishes the previous stream without errors.)
- * 
- * This is a <I>stateful</I> conversion. Additionally, even when all source data has
- * been consumed, some data may be in the converters' internal state.
- * Call this function repeatedly, updating the target pointers with
- * the next empty chunk of target in case of a
- * <TT>U_BUFFER_OVERFLOW_ERROR</TT>, and updating the source  pointers
- *  with the next chunk of source when a successful error status is
- * returned, until there are no more chunks of source data.
- * @param converter the Unicode converter
- * @param target I/O parameter. Input : Points to the beginning of the buffer to copy
- *  UChars into. Output : points to after the last UChar copied.
- * @param targetLimit the pointer just after the end of the <TT>target</TT> buffer
- * @param source I/O parameter, pointer to pointer to the source codepage buffer. 
- * @param sourceLimit the pointer to the byte after the end of the source buffer
- * @param offsets if NULL is passed, nothing will happen to it, otherwise it needs to have the same number
- * of allocated cells as <TT>target</TT>. Will fill in offsets from target to source pointer
- * e.g: <TT>offsets[3]</TT> is equal to 6, it means that the <TT>target[3]</TT> was a result of transcoding <TT>source[6]</TT>
- * For output data carried across calls, and other data without a specific source character
- * (such as from escape sequences or callbacks)  -1 will be placed for offsets. 
- * @param flush set to <TT>TRUE</TT> if the current source buffer is the last available
- * chunk of the source, <TT>FALSE</TT> otherwise. Note that if a failing status is returned,
- * this function may have to be called multiple times with flush set to <TT>TRUE</TT> until
- * the source buffer is consumed.
- * @param err the error status.  <TT>U_ILLEGAL_ARGUMENT_ERROR</TT> will be set if the
- * converter is <TT>NULL</TT>.
- * <code>U_BUFFER_OVERFLOW_ERROR</code> will be set if the target is full and there is 
- * still data to be written to the target. 
- * @see ucnv_fromUChars
- * @see ucnv_convert
- * @see ucnv_getMinCharSize
- * @see ucnv_setFromUCallBack
- * @see ucnv_getNextUChar
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_toUnicode(UConverter *converter,
-               UChar **target,
-               const UChar *targetLimit,
-               const char **source,
-               const char *sourceLimit,
-               int32_t *offsets,
-               UBool flush,
-               UErrorCode *err);
-
-/**
- * Convert the Unicode string into a codepage string using an existing UConverter.
- * The output string is NUL-terminated if possible.
- *
- * This function is a more convenient but less powerful version of ucnv_fromUnicode().
- * It is only useful for whole strings, not for streaming conversion.
- *
- * The maximum output buffer capacity required (barring output from callbacks) will be
- * UCNV_GET_MAX_BYTES_FOR_STRING(srcLength, ucnv_getMaxCharSize(cnv)).
- *
- * @param cnv the converter object to be used (ucnv_resetFromUnicode() will be called)
- * @param src the input Unicode string
- * @param srcLength the input string length, or -1 if NUL-terminated
- * @param dest destination string buffer, can be NULL if destCapacity==0
- * @param destCapacity the number of chars available at dest
- * @param pErrorCode normal ICU error code;
- *                  common error codes that may be set by this function include
- *                  U_BUFFER_OVERFLOW_ERROR, U_STRING_NOT_TERMINATED_WARNING,
- *                  U_ILLEGAL_ARGUMENT_ERROR, and conversion errors
- * @return the length of the output string, not counting the terminating NUL;
- *         if the length is greater than destCapacity, then the string will not fit
- *         and a buffer of the indicated length would need to be passed in
- * @see ucnv_fromUnicode
- * @see ucnv_convert
- * @see UCNV_GET_MAX_BYTES_FOR_STRING
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_fromUChars(UConverter *cnv,
-                char *dest, int32_t destCapacity,
-                const UChar *src, int32_t srcLength,
-                UErrorCode *pErrorCode);
-
-/**
- * Convert the codepage string into a Unicode string using an existing UConverter.
- * The output string is NUL-terminated if possible.
- *
- * This function is a more convenient but less powerful version of ucnv_toUnicode().
- * It is only useful for whole strings, not for streaming conversion.
- *
- * The maximum output buffer capacity required (barring output from callbacks) will be
- * 2*srcLength (each char may be converted into a surrogate pair).
- *
- * @param cnv the converter object to be used (ucnv_resetToUnicode() will be called)
- * @param src the input codepage string
- * @param srcLength the input string length, or -1 if NUL-terminated
- * @param dest destination string buffer, can be NULL if destCapacity==0
- * @param destCapacity the number of UChars available at dest
- * @param pErrorCode normal ICU error code;
- *                  common error codes that may be set by this function include
- *                  U_BUFFER_OVERFLOW_ERROR, U_STRING_NOT_TERMINATED_WARNING,
- *                  U_ILLEGAL_ARGUMENT_ERROR, and conversion errors
- * @return the length of the output string, not counting the terminating NUL;
- *         if the length is greater than destCapacity, then the string will not fit
- *         and a buffer of the indicated length would need to be passed in
- * @see ucnv_toUnicode
- * @see ucnv_convert
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_toUChars(UConverter *cnv,
-              UChar *dest, int32_t destCapacity,
-              const char *src, int32_t srcLength,
-              UErrorCode *pErrorCode);
-
-/**
- * Convert a codepage buffer into Unicode one character at a time.
- * The input is completely consumed when the U_INDEX_OUTOFBOUNDS_ERROR is set.
- *
- * Advantage compared to ucnv_toUnicode() or ucnv_toUChars():
- * - Faster for small amounts of data, for most converters, e.g.,
- *   US-ASCII, ISO-8859-1, UTF-8/16/32, and most "normal" charsets.
- *   (For complex converters, e.g., SCSU, UTF-7 and ISO 2022 variants,
- *    it uses ucnv_toUnicode() internally.)
- * - Convenient.
- *
- * Limitations compared to ucnv_toUnicode():
- * - Always assumes flush=TRUE.
- *   This makes ucnv_getNextUChar() unsuitable for "streaming" conversion,
- *   that is, for where the input is supplied in multiple buffers,
- *   because ucnv_getNextUChar() will assume the end of the input at the end
- *   of the first buffer.
- * - Does not provide offset output.
- *
- * It is possible to "mix" ucnv_getNextUChar() and ucnv_toUnicode() because
- * ucnv_getNextUChar() uses the current state of the converter
- * (unlike ucnv_toUChars() which always resets first).
- * However, if ucnv_getNextUChar() is called after ucnv_toUnicode()
- * stopped in the middle of a character sequence (with flush=FALSE),
- * then ucnv_getNextUChar() will always use the slower ucnv_toUnicode()
- * internally until the next character boundary.
- * (This is new in ICU 2.6. In earlier releases, ucnv_getNextUChar() had to
- * start at a character boundary.)
- *
- * Instead of using ucnv_getNextUChar(), it is recommended
- * to convert using ucnv_toUnicode() or ucnv_toUChars()
- * and then iterate over the text using U16_NEXT() or a UCharIterator (uiter.h)
- * or a C++ CharacterIterator or similar.
- * This allows streaming conversion and offset output, for example.
- *
- * <p>Handling of surrogate pairs and supplementary-plane code points:<br>
- * There are two different kinds of codepages that provide mappings for surrogate characters:
- * <ul>
- *   <li>Codepages like UTF-8, UTF-32, and GB 18030 provide direct representations for Unicode
- *       code points U+10000-U+10ffff as well as for single surrogates U+d800-U+dfff.
- *       Each valid sequence will result in exactly one returned code point.
- *       If a sequence results in a single surrogate, then that will be returned
- *       by itself, even if a neighboring sequence encodes the matching surrogate.</li>
- *   <li>Codepages like SCSU and LMBCS (and UTF-16) provide direct representations only for BMP code points
- *       including surrogates. Code points in supplementary planes are represented with
- *       two sequences, each encoding a surrogate.
- *       For these codepages, matching pairs of surrogates will be combined into single
- *       code points for returning from this function.
- *       (Note that SCSU is actually a mix of these codepage types.)</li>
- * </ul></p>
- *
- * @param converter an open UConverter
- * @param source the address of a pointer to the codepage buffer, will be
- *  updated to point after the bytes consumed in the conversion call.
- * @param sourceLimit points to the end of the input buffer
- * @param err fills in error status (see ucnv_toUnicode)
- * <code>U_INDEX_OUTOFBOUNDS_ERROR</code> will be set if the input 
- * is empty or does not convert to any output (e.g.: pure state-change 
- * codes SI/SO, escape sequences for ISO 2022,
- * or if the callback did not output anything, ...).
- * This function will not set a <code>U_BUFFER_OVERFLOW_ERROR</code> because
- *  the "buffer" is the return code. However, there might be subsequent output
- *  stored in the converter object
- * that will be returned in following calls to this function.
- * @return a UChar32 resulting from the partial conversion of source
- * @see ucnv_toUnicode
- * @see ucnv_toUChars
- * @see ucnv_convert
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-ucnv_getNextUChar(UConverter * converter,
-                  const char **source,
-                  const char * sourceLimit,
-                  UErrorCode * err);
-
-/**
- * Convert from one external charset to another using two existing UConverters.
- * Internally, two conversions - ucnv_toUnicode() and ucnv_fromUnicode() -
- * are used, "pivoting" through 16-bit Unicode.
- *
- * There is a similar function, ucnv_convert(),
- * which has the following limitations:
- * - it takes charset names, not converter objects, so that
- *   - two converters are opened for each call
- *   - only single-string conversion is possible, not streaming operation
- * - it does not provide enough information to find out,
- *   in case of failure, whether the toUnicode or
- *   the fromUnicode conversion failed
- *
- * By contrast, ucnv_convertEx()
- * - takes UConverter parameters instead of charset names
- * - fully exposes the pivot buffer for complete error handling
- *
- * ucnv_convertEx() also provides further convenience:
- * - an option to reset the converters at the beginning
- *   (if reset==TRUE, see parameters;
- *    also sets *pivotTarget=*pivotSource=pivotStart)
- * - allow NUL-terminated input
- *   (only a single NUL byte, will not work for charsets with multi-byte NULs)
- *   (if sourceLimit==NULL, see parameters)
- * - terminate with a NUL on output
- *   (only a single NUL byte, not useful for charsets with multi-byte NULs),
- *   or set U_STRING_NOT_TERMINATED_WARNING if the output exactly fills
- *   the target buffer
- * - the pivot buffer can be provided internally;
- *   in this case, the caller will not be able to get details about where an
- *   error occurred
- *   (if pivotStart==NULL, see below)
- *
- * The function returns when one of the following is true:
- * - the entire source text has been converted successfully to the target buffer
- * - a target buffer overflow occurred (U_BUFFER_OVERFLOW_ERROR)
- * - a conversion error occurred
- *   (other U_FAILURE(), see description of pErrorCode)
- *
- * Limitation compared to the direct use of
- * ucnv_fromUnicode() and ucnv_toUnicode():
- * ucnv_convertEx() does not provide offset information.
- *
- * Limitation compared to ucnv_fromUChars() and ucnv_toUChars():
- * ucnv_convertEx() does not support preflighting directly.
- *
- * Sample code for converting a single string from
- * one external charset to UTF-8, ignoring the location of errors:
- *
- * \code
- * int32_t
- * myToUTF8(UConverter *cnv,
- *          const char *s, int32_t length,
- *          char *u8, int32_t capacity,
- *          UErrorCode *pErrorCode) {
- *     UConverter *utf8Cnv;
- *     char *target;
- *
- *     if(U_FAILURE(*pErrorCode)) {
- *         return 0;
- *     }
- *
- *     utf8Cnv=myGetCachedUTF8Converter(pErrorCode);
- *     if(U_FAILURE(*pErrorCode)) {
- *         return 0;
- *     }
- *
- *     target=u8;
- *     ucnv_convertEx(cnv, utf8Cnv,
- *                    &target, u8+capacity,
- *                    &s, length>=0 ? s+length : NULL,
- *                    NULL, NULL, NULL, NULL,
- *                    TRUE, TRUE,
- *                    pErrorCode);
- * 
- *     myReleaseCachedUTF8Converter(utf8Cnv);
- *
- *     // return the output string length, but without preflighting
- *     return (int32_t)(target-u8);
- * }
- * \endcode
- *
- * @param targetCnv     Output converter, used to convert from the UTF-16 pivot
- *                      to the target using ucnv_fromUnicode().
- * @param sourceCnv     Input converter, used to convert from the source to
- *                      the UTF-16 pivot using ucnv_toUnicode().
- * @param target        I/O parameter, same as for ucnv_fromUChars().
- *                      Input: *target points to the beginning of the target buffer.
- *                      Output: *target points to the first unit after the last char written.
- * @param targetLimit   Pointer to the first unit after the target buffer.
- * @param source        I/O parameter, same as for ucnv_toUChars().
- *                      Input: *source points to the beginning of the source buffer.
- *                      Output: *source points to the first unit after the last char read.
- * @param sourceLimit   Pointer to the first unit after the source buffer.
- * @param pivotStart    Pointer to the UTF-16 pivot buffer. If pivotStart==NULL,
- *                      then an internal buffer is used and the other pivot
- *                      arguments are ignored and can be NULL as well.
- * @param pivotSource   I/O parameter, same as source in ucnv_fromUChars() for
- *                      conversion from the pivot buffer to the target buffer.
- * @param pivotTarget   I/O parameter, same as target in ucnv_toUChars() for
- *                      conversion from the source buffer to the pivot buffer.
- *                      It must be pivotStart<=*pivotSource<=*pivotTarget<=pivotLimit
- *                      and pivotStart<pivotLimit (unless pivotStart==NULL).
- * @param pivotLimit    Pointer to the first unit after the pivot buffer.
- * @param reset         If TRUE, then ucnv_resetToUnicode(sourceCnv) and
- *                      ucnv_resetFromUnicode(targetCnv) are called, and the
- *                      pivot pointers are reset (*pivotTarget=*pivotSource=pivotStart).
- * @param flush         If true, indicates the end of the input.
- *                      Passed directly to ucnv_toUnicode(), and carried over to
- *                      ucnv_fromUnicode() when the source is empty as well.
- * @param pErrorCode    ICU error code in/out parameter.
- *                      Must fulfill U_SUCCESS before the function call.
- *                      U_BUFFER_OVERFLOW_ERROR always refers to the target buffer
- *                      because overflows into the pivot buffer are handled internally.
- *                      Other conversion errors are from the source-to-pivot
- *                      conversion if *pivotSource==pivotStart, otherwise from
- *                      the pivot-to-target conversion.
- *
- * @see ucnv_convert
- * @see ucnv_fromAlgorithmic
- * @see ucnv_toAlgorithmic
- * @see ucnv_fromUnicode
- * @see ucnv_toUnicode
- * @see ucnv_fromUChars
- * @see ucnv_toUChars
- * @stable ICU 2.6
- */
-U_STABLE void U_EXPORT2
-ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv,
-               char **target, const char *targetLimit,
-               const char **source, const char *sourceLimit,
-               UChar *pivotStart, UChar **pivotSource,
-               UChar **pivotTarget, const UChar *pivotLimit,
-               UBool reset, UBool flush,
-               UErrorCode *pErrorCode);
-
-/**
- * Convert from one external charset to another.
- * Internally, two converters are opened according to the name arguments,
- * then the text is converted to and from the 16-bit Unicode "pivot"
- * using ucnv_convertEx(), then the converters are closed again.
- *
- * This is a convenience function, not an efficient way to convert a lot of text:
- * ucnv_convert()
- * - takes charset names, not converter objects, so that
- *   - two converters are opened for each call
- *   - only single-string conversion is possible, not streaming operation
- * - does not provide enough information to find out,
- *   in case of failure, whether the toUnicode or
- *   the fromUnicode conversion failed
- * - allows NUL-terminated input
- *   (only a single NUL byte, will not work for charsets with multi-byte NULs)
- *   (if sourceLength==-1, see parameters)
- * - terminate with a NUL on output
- *   (only a single NUL byte, not useful for charsets with multi-byte NULs),
- *   or set U_STRING_NOT_TERMINATED_WARNING if the output exactly fills
- *   the target buffer
- * - a pivot buffer is provided internally
- *
- * The function returns when one of the following is true:
- * - the entire source text has been converted successfully to the target buffer
- *   and either the target buffer is terminated with a single NUL byte
- *   or the error code is set to U_STRING_NOT_TERMINATED_WARNING
- * - a target buffer overflow occurred (U_BUFFER_OVERFLOW_ERROR)
- *   and the full output string length is returned ("preflighting")
- * - a conversion error occurred
- *   (other U_FAILURE(), see description of pErrorCode)
- *
- * @param toConverterName   The name of the converter that is used to convert
- *                          from the UTF-16 pivot buffer to the target.
- * @param fromConverterName The name of the converter that is used to convert
- *                          from the source to the UTF-16 pivot buffer.
- * @param target            Pointer to the output buffer.
- * @param targetCapacity    Capacity of the target, in bytes.
- * @param source            Pointer to the input buffer.
- * @param sourceLength      Length of the input text, in bytes, or -1 for NUL-terminated input.
- * @param pErrorCode        ICU error code in/out parameter.
- *                          Must fulfill U_SUCCESS before the function call.
- * @return Length of the complete output text in bytes, even if it exceeds the targetCapacity
- *         and a U_BUFFER_OVERFLOW_ERROR is set.
- *
- * @see ucnv_convertEx
- * @see ucnv_fromAlgorithmic
- * @see ucnv_toAlgorithmic
- * @see ucnv_fromUnicode
- * @see ucnv_toUnicode
- * @see ucnv_fromUChars
- * @see ucnv_toUChars
- * @see ucnv_getNextUChar
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_convert(const char *toConverterName,
-             const char *fromConverterName,
-             char *target,
-             int32_t targetCapacity,
-             const char *source,
-             int32_t sourceLength,
-             UErrorCode *pErrorCode);
-
-/**
- * Convert from one external charset to another.
- * Internally, the text is converted to and from the 16-bit Unicode "pivot"
- * using ucnv_convertEx(). ucnv_toAlgorithmic() works exactly like ucnv_convert()
- * except that the two converters need not be looked up and opened completely.
- *
- * The source-to-pivot conversion uses the cnv converter parameter.
- * The pivot-to-target conversion uses a purely algorithmic converter
- * according to the specified type, e.g., UCNV_UTF8 for a UTF-8 converter.
- *
- * Internally, the algorithmic converter is opened and closed for each
- * function call, which is more efficient than using the public ucnv_open()
- * but somewhat less efficient than only resetting an existing converter
- * and using ucnv_convertEx().
- *
- * This function is more convenient than ucnv_convertEx() for single-string
- * conversions, especially when "preflighting" is desired (returning the length
- * of the complete output even if it does not fit into the target buffer;
- * see the User Guide Strings chapter). See ucnv_convert() for details.
- *
- * @param algorithmicType   UConverterType constant identifying the desired target
- *                          charset as a purely algorithmic converter.
- *                          Those are converters for Unicode charsets like
- *                          UTF-8, BOCU-1, SCSU, UTF-7, IMAP-mailbox-name, etc.,
- *                          as well as US-ASCII and ISO-8859-1.
- * @param cnv               The converter that is used to convert
- *                          from the source to the UTF-16 pivot buffer.
- * @param target            Pointer to the output buffer.
- * @param targetCapacity    Capacity of the target, in bytes.
- * @param source            Pointer to the input buffer.
- * @param sourceLength      Length of the input text, in bytes
- * @param pErrorCode        ICU error code in/out parameter.
- *                          Must fulfill U_SUCCESS before the function call.
- * @return Length of the complete output text in bytes, even if it exceeds the targetCapacity
- *         and a U_BUFFER_OVERFLOW_ERROR is set.
- *
- * @see ucnv_fromAlgorithmic
- * @see ucnv_convert
- * @see ucnv_convertEx
- * @see ucnv_fromUnicode
- * @see ucnv_toUnicode
- * @see ucnv_fromUChars
- * @see ucnv_toUChars
- * @stable ICU 2.6
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_toAlgorithmic(UConverterType algorithmicType,
-                   UConverter *cnv,
-                   char *target, int32_t targetCapacity,
-                   const char *source, int32_t sourceLength,
-                   UErrorCode *pErrorCode);
-
-/**
- * Convert from one external charset to another.
- * Internally, the text is converted to and from the 16-bit Unicode "pivot"
- * using ucnv_convertEx(). ucnv_fromAlgorithmic() works exactly like ucnv_convert()
- * except that the two converters need not be looked up and opened completely.
- *
- * The source-to-pivot conversion uses a purely algorithmic converter
- * according to the specified type, e.g., UCNV_UTF8 for a UTF-8 converter.
- * The pivot-to-target conversion uses the cnv converter parameter.
- *
- * Internally, the algorithmic converter is opened and closed for each
- * function call, which is more efficient than using the public ucnv_open()
- * but somewhat less efficient than only resetting an existing converter
- * and using ucnv_convertEx().
- *
- * This function is more convenient than ucnv_convertEx() for single-string
- * conversions, especially when "preflighting" is desired (returning the length
- * of the complete output even if it does not fit into the target buffer;
- * see the User Guide Strings chapter). See ucnv_convert() for details.
- *
- * @param cnv               The converter that is used to convert
- *                          from the UTF-16 pivot buffer to the target.
- * @param algorithmicType   UConverterType constant identifying the desired source
- *                          charset as a purely algorithmic converter.
- *                          Those are converters for Unicode charsets like
- *                          UTF-8, BOCU-1, SCSU, UTF-7, IMAP-mailbox-name, etc.,
- *                          as well as US-ASCII and ISO-8859-1.
- * @param target            Pointer to the output buffer.
- * @param targetCapacity    Capacity of the target, in bytes.
- * @param source            Pointer to the input buffer.
- * @param sourceLength      Length of the input text, in bytes
- * @param pErrorCode        ICU error code in/out parameter.
- *                          Must fulfill U_SUCCESS before the function call.
- * @return Length of the complete output text in bytes, even if it exceeds the targetCapacity
- *         and a U_BUFFER_OVERFLOW_ERROR is set.
- *
- * @see ucnv_fromAlgorithmic
- * @see ucnv_convert
- * @see ucnv_convertEx
- * @see ucnv_fromUnicode
- * @see ucnv_toUnicode
- * @see ucnv_fromUChars
- * @see ucnv_toUChars
- * @stable ICU 2.6
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_fromAlgorithmic(UConverter *cnv,
-                     UConverterType algorithmicType,
-                     char *target, int32_t targetCapacity,
-                     const char *source, int32_t sourceLength,
-                     UErrorCode *pErrorCode);
-
-/**
- * Frees up memory occupied by unused, cached converter shared data.
- *
- * @return the number of cached converters successfully deleted
- * @see ucnv_close
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_flushCache(void);
-
-/**
- * Returns the number of available converters, as per the alias file.
- *
- * @return the number of available converters
- * @see ucnv_getAvailableName
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-ucnv_countAvailable(void);
-
-/**
- * Gets the canonical converter name of the specified converter from a list of
- * all available converters contaied in the alias file. All converters
- * in this list can be opened.
- *
- * @param n the index to a converter available on the system (in the range <TT>[0..ucnv_countAvaiable()]</TT>)
- * @return a pointer a string (library owned), or <TT>NULL</TT> if the index is out of bounds.
- * @see ucnv_countAvailable
- * @stable ICU 2.0
- */
-U_STABLE const char* U_EXPORT2
-ucnv_getAvailableName(int32_t n);
-
-/**
- * Returns a UEnumeration to enumerate all of the canonical converter
- * names, as per the alias file, regardless of the ability to open each
- * converter.
- *
- * @return A UEnumeration object for getting all the recognized canonical
- *   converter names.
- * @see ucnv_getAvailableName
- * @see uenum_close
- * @see uenum_next
- * @stable ICU 2.4
- */
-U_STABLE UEnumeration * U_EXPORT2
-ucnv_openAllNames(UErrorCode *pErrorCode);
-
-/**
- * Gives the number of aliases for a given converter or alias name.
- * If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- * This method only enumerates the listed entries in the alias file.
- * @param alias alias name
- * @param pErrorCode error status
- * @return number of names on alias list for given alias
- * @stable ICU 2.0
- */
-U_STABLE uint16_t U_EXPORT2 
-ucnv_countAliases(const char *alias, UErrorCode *pErrorCode);
-
-/**
- * Gives the name of the alias at given index of alias list.
- * This method only enumerates the listed entries in the alias file.
- * If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- * @param alias alias name
- * @param n index in alias list
- * @param pErrorCode result of operation
- * @return returns the name of the alias at given index
- * @see ucnv_countAliases
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2 
-ucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode);
-
-/**
- * Fill-up the list of alias names for the given alias.
- * This method only enumerates the listed entries in the alias file.
- * If the alias is ambiguous, then the preferred converter is used
- * and the status is set to U_AMBIGUOUS_ALIAS_WARNING.
- * @param alias alias name
- * @param aliases fill-in list, aliases is a pointer to an array of
- *        <code>ucnv_countAliases()</code> string-pointers
- *        (<code>const char *</code>) that will be filled in.
- *        The strings themselves are owned by the library.
- * @param pErrorCode result of operation
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode);
-
-/**
- * Return a new UEnumeration object for enumerating all the
- * alias names for a given converter that are recognized by a standard.
- * This method only enumerates the listed entries in the alias file.
- * The convrtrs.txt file can be modified to change the results of
- * this function.
- * The first result in this list is the same result given by
- * <code>ucnv_getStandardName</code>, which is the default alias for
- * the specified standard name. The returned object must be closed with
- * <code>uenum_close</code> when you are done with the object.
- *
- * @param convName original converter name
- * @param standard name of the standard governing the names; MIME and IANA
- *      are such standards
- * @param pErrorCode The error code
- * @return A UEnumeration object for getting all aliases that are recognized
- *      by a standard. If any of the parameters are invalid, NULL
- *      is returned.
- * @see ucnv_getStandardName
- * @see uenum_close
- * @see uenum_next
- * @stable ICU 2.2
- */
-U_STABLE UEnumeration * U_EXPORT2
-ucnv_openStandardNames(const char *convName,
-                       const char *standard,
-                       UErrorCode *pErrorCode);
-
-/**
- * Gives the number of standards associated to converter names.
- * @return number of standards
- * @stable ICU 2.0
- */
-U_STABLE uint16_t U_EXPORT2
-ucnv_countStandards(void);
-
-/**
- * Gives the name of the standard at given index of standard list.
- * @param n index in standard list
- * @param pErrorCode result of operation
- * @return returns the name of the standard at given index. Owned by the library.
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2
-ucnv_getStandard(uint16_t n, UErrorCode *pErrorCode);
-
-/**
- * Returns a standard name for a given converter name.
- * <p>
- * Example alias table:<br>
- * conv alias1 { STANDARD1 } alias2 { STANDARD1* }
- * <p>
- * Result of ucnv_getStandardName("conv", "STANDARD1") from example
- * alias table:<br>
- * <b>"alias2"</b>
- *
- * @param name original converter name
- * @param standard name of the standard governing the names; MIME and IANA
- *        are such standards
- * @param pErrorCode result of operation
- * @return returns the standard converter name;
- *         if a standard converter name cannot be determined,
- *         then <code>NULL</code> is returned. Owned by the library.
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2
-ucnv_getStandardName(const char *name, const char *standard, UErrorCode *pErrorCode);
-
-/**
- * This function will return the internal canonical converter name of the
- * tagged alias. This is the opposite of ucnv_openStandardNames, which
- * returns the tagged alias given the canonical name.
- * <p>
- * Example alias table:<br>
- * conv alias1 { STANDARD1 } alias2 { STANDARD1* }
- * <p>
- * Result of ucnv_getStandardName("alias1", "STANDARD1") from example
- * alias table:<br>
- * <b>"conv"</b>
- *
- * @return returns the canonical converter name;
- *         if a standard or alias name cannot be determined,
- *         then <code>NULL</code> is returned. The returned string is
- *         owned by the library.
- * @see ucnv_getStandardName
- * @stable ICU 2.4
- */
-U_STABLE const char * U_EXPORT2
-ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErrorCode);
-
-/**
- * returns the current default converter name.
- *
- * @return returns the current default converter name;
- *         if a default converter name cannot be determined,
- *         then <code>NULL</code> is returned.
- *         Storage owned by the library
- * @see ucnv_setDefaultName
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2
-ucnv_getDefaultName(void);
-
-/**
- * sets the current default converter name. Caller must own the storage for 'name'
- * and preserve it indefinitely. 
- * @param name the converter name to be the default (must exist).
- * @see ucnv_getDefaultName
- * @system SYSTEM API
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_setDefaultName(const char *name);
-
-/**
- * Fixes the backslash character mismapping.  For example, in SJIS, the backslash 
- * character in the ASCII portion is also used to represent the yen currency sign.  
- * When mapping from Unicode character 0x005C, it's unclear whether to map the 
- * character back to yen or backslash in SJIS.  This function will take the input
- * buffer and replace all the yen sign characters with backslash.  This is necessary
- * when the user tries to open a file with the input buffer on Windows.
- * This function will test the converter to see whether such mapping is
- * required.  You can sometimes avoid using this function by using the correct version
- * of Shift-JIS.
- *
- * @param cnv The converter representing the target codepage.
- * @param source the input buffer to be fixed
- * @param sourceLen the length of the input buffer
- * @see ucnv_isAmbiguous
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-ucnv_fixFileSeparator(const UConverter *cnv, UChar *source, int32_t sourceLen);
-
-/**
- * Determines if the converter contains ambiguous mappings of the same
- * character or not.
- * @param cnv the converter to be tested
- * @return TRUE if the converter contains ambiguous mapping of the same 
- * character, FALSE otherwise.
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2
-ucnv_isAmbiguous(const UConverter *cnv);
-
-/**
- * Sets the converter to use fallback mapping or not.
- * @param cnv The converter to set the fallback mapping usage on.
- * @param usesFallback TRUE if the user wants the converter to take advantage of the fallback 
- * mapping, FALSE otherwise.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 
-ucnv_setFallback(UConverter *cnv, UBool usesFallback);
-
-/**
- * Determines if the converter uses fallback mappings or not.
- * @param cnv The converter to be tested
- * @return TRUE if the converter uses fallback, FALSE otherwise.
- * @stable ICU 2.0
- */
-U_STABLE UBool U_EXPORT2 
-ucnv_usesFallback(const UConverter *cnv);
-
-/**
- * Detects Unicode signature byte sequences at the start of the byte stream
- * and returns the charset name of the indicated Unicode charset.
- * NULL is returned when no Unicode signature is recognized.
- * The number of bytes in the signature is output as well.
- *
- * The caller can ucnv_open() a converter using the charset name.
- * The first code unit (UChar) from the start of the stream will be U+FEFF
- * (the Unicode BOM/signature character) and can usually be ignored.
- *
- * For most Unicode charsets it is also possible to ignore the indicated
- * number of initial stream bytes and start converting after them.
- * However, there are stateful Unicode charsets (UTF-7 and BOCU-1) for which
- * this will not work. Therefore, it is best to ignore the first output UChar
- * instead of the input signature bytes.
- * <p>
- * Usage:
- * @code     
- *      UErrorCode err = U_ZERO_ERROR;
- *      char input[] = { '\xEF','\xBB', '\xBF','\x41','\x42','\x43' };
- *      int32_t signatureLength = 0;
- *      char *encoding = ucnv_detectUnicodeSignatures(input,sizeof(input),&signatureLength,&err);
- *      UConverter *conv = NULL;
- *      UChar output[100];
- *      UChar *target = output, *out;
- *      char *source = input;
- *      if(encoding!=NULL && U_SUCCESS(err)){
- *          // should signature be discarded ?
- *          conv = ucnv_open(encoding, &err);
- *          // do the conversion
- *          ucnv_toUnicode(conv,
- *                         target, output + sizeof(output)/U_SIZEOF_UCHAR,
- *                         source, input + sizeof(input),
- *                         NULL, TRUE, &err);
- *          out = output;
- *          if (discardSignature){
- *              ++out; // ignore initial U+FEFF
- *          }
- *          while(out != target) {
- *              printf("%04x ", *out++);
- *          }
- *          puts("");
- *      }
- *     
- * @endcode
- *
- * @param source            The source string in which the signature should be detected.
- * @param sourceLength      Length of the input string, or -1 if terminated with a NUL byte.
- * @param signatureLength   A pointer to int32_t to receive the number of bytes that make up the signature 
- *                          of the detected UTF. 0 if not detected.
- *                          Can be a NULL pointer.
- * @param pErrorCode        A pointer to receive information about any errors that may occur during detection.
- *                          Must be a valid pointer to an error code value, which must not indicate a failure
- *                          before the function call.
- * @return The name of the encoding detected. NULL if encoding is not detected. 
- * @stable ICU 2.4
- */
-U_STABLE const char* U_EXPORT2
-ucnv_detectUnicodeSignature(const char* source,
-                            int32_t sourceLength,
-                            int32_t *signatureLength,
-                            UErrorCode *pErrorCode);
-
-#endif
-
-#endif
-/*_UCNV*/
diff --git a/Source/JavaScriptGlue/icu/unicode/ucnv_err.h b/Source/JavaScriptGlue/icu/unicode/ucnv_err.h
deleted file mode 100644
index 2a6104c..0000000
--- a/Source/JavaScriptGlue/icu/unicode/ucnv_err.h
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
- *
- *
- *   ucnv_err.h:
- */
-
-/**
- * \file
- * \brief C UConverter predefined error callbacks
- *
- *  <h2>Error Behaviour Functions</h2>
- *  Defines some error behaviour functions called by ucnv_{from,to}Unicode
- *  These are provided as part of ICU and many are stable, but they
- *  can also be considered only as an example of what can be done with
- *  callbacks.  You may of course write your own.
- *
- *  If you want to write your own, you may also find the functions from
- *  ucnv_cb.h useful when writing your own callbacks.
- *
- *  These functions, although public, should NEVER be called directly.
- *  They should be used as parameters to the ucnv_setFromUCallback
- *  and ucnv_setToUCallback functions, to set the behaviour of a converter
- *  when it encounters ILLEGAL/UNMAPPED/INVALID sequences.
- *
- *  usage example:  'STOP' doesn't need any context, but newContext
- *    could be set to something other than 'NULL' if needed. The available
- *    contexts in this header can modify the default behavior of the callback.
- *
- *  \code
- *  UErrorCode err = U_ZERO_ERROR;
- *  UConverter *myConverter = ucnv_open("ibm-949", &err);
- *  const void *oldContext;
- *  UConverterFromUCallback oldAction;
- *
- *
- *  if (U_SUCCESS(err))
- *  {
- *      ucnv_setFromUCallBack(myConverter,
- *                       UCNV_FROM_U_CALLBACK_STOP,
- *                       NULL,
- *                       &oldAction,
- *                       &oldContext,
- *                       &status);
- *  }
- *  \endcode
- *
- *  The code above tells "myConverter" to stop when it encounters an
- *  ILLEGAL/TRUNCATED/INVALID sequences when it is used to convert from
- *  Unicode -> Codepage. The behavior from Codepage to Unicode is not changed,
- *  and ucnv_setToUCallBack would need to be called in order to change
- *  that behavior too.
- *
- *  Here is an example with a context:
- *
- *  \code
- *  UErrorCode err = U_ZERO_ERROR;
- *  UConverter *myConverter = ucnv_open("ibm-949", &err);
- *  const void *oldContext;
- *  UConverterFromUCallback oldAction;
- *
- *
- *  if (U_SUCCESS(err))
- *  {
- *      ucnv_setToUCallBack(myConverter,
- *                       UCNV_TO_U_CALLBACK_SUBSTITUTE,
- *                       UCNV_SUB_STOP_ON_ILLEGAL,
- *                       &oldAction,
- *                       &oldContext,
- *                       &status);
- *  }
- *  \endcode
- *
- *  The code above tells "myConverter" to stop when it encounters an
- *  ILLEGAL/TRUNCATED/INVALID sequences when it is used to convert from
- *  Codepage -> Unicode. Any unmapped and legal characters will be
- *  substituted to be the default substitution character.
- */
-
-#ifndef UCNV_ERR_H
-#define UCNV_ERR_H
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_CONVERSION
-
-/** Forward declaring the UConverter structure. @stable ICU 2.0 */
-struct UConverter;
-
-/** @stable ICU 2.0 */
-typedef struct UConverter UConverter;
-
-/**
- * FROM_U, TO_U context options for sub callback
- * @stable ICU 2.0
- */
-#define UCNV_SUB_STOP_ON_ILLEGAL "i"
-
-/**
- * FROM_U, TO_U context options for skip callback
- * @stable ICU 2.0
- */
-#define UCNV_SKIP_STOP_ON_ILLEGAL "i"
-
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to ICU (%UXXXX) 
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_ICU       NULL
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to JAVA (\\uXXXX)
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_JAVA      "J"
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to C (\\uXXXX \\UXXXXXXXX)
- * TO_U_CALLBACK_ESCAPE option to escape the character value accoding to C (\\xXXXX)
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_C         "C"
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Decimal escape (&amp;#DDDD;)
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Decimal escape (&amp;#DDDD;)
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_XML_DEC   "D"
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Hex escape (&amp;#xXXXX;)
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Hex escape (&amp;#xXXXX;)
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_XML_HEX   "X"
-/**
- * FROM_U_CALLBACK_ESCAPE context option to escape teh code unit according to Unicode (U+XXXXX)
- * @stable ICU 2.0
- */
-#define UCNV_ESCAPE_UNICODE   "U"
-
-/** 
- * The process condition code to be used with the callbacks.  
- * Codes which are greater than UCNV_IRREGULAR should be 
- * passed on to any chained callbacks.
- * @stable ICU 2.0
- */
-typedef enum {
-    UCNV_UNASSIGNED = 0,  /**< The code point is unassigned.
-                             The error code U_INVALID_CHAR_FOUND will be set. */
-    UCNV_ILLEGAL = 1,     /**< The code point is illegal. For example, 
-                             \\x81\\x2E is illegal in SJIS because \\x2E
-                             is not a valid trail byte for the \\x81 
-                             lead byte.
-                             Also, starting with Unicode 3.0.1, non-shortest byte sequences
-                             in UTF-8 (like \\xC1\\xA1 instead of \\x61 for U+0061)
-                             are also illegal, not just irregular.
-                             The error code U_ILLEGAL_CHAR_FOUND will be set. */
-    UCNV_IRREGULAR = 2,   /**< The codepoint is not a regular sequence in 
-                             the encoding. For example, \\xED\\xA0\\x80..\\xED\\xBF\\xBF
-                             are irregular UTF-8 byte sequences for single surrogate
-                             code points.
-                             The error code U_INVALID_CHAR_FOUND will be set. */
-    UCNV_RESET = 3,       /**< The callback is called with this reason when a
-                             'reset' has occured. Callback should reset all
-                             state. */
-    UCNV_CLOSE = 4,        /**< Called when the converter is closed. The
-                             callback should release any allocated memory.*/
-    UCNV_CLONE = 5         /**< Called when ucnv_safeClone() is called on the
-                              converter. the pointer available as the
-                              'context' is an alias to the original converters'
-                              context pointer. If the context must be owned
-                              by the new converter, the callback must clone 
-                              the data and call ucnv_setFromUCallback 
-                              (or setToUCallback) with the correct pointer.
-                              @stable ICU 2.2
-                           */
-} UConverterCallbackReason;
-
-
-/**
- * The structure for the fromUnicode callback function parameter.
- * @stable ICU 2.0
- */
-typedef struct {
-    uint16_t size;              /**< The size of this struct. @stable ICU 2.0 */
-    UBool flush;                /**< The internal state of converter will be reset and data flushed if set to TRUE. @stable ICU 2.0    */
-    UConverter *converter;      /**< Pointer to the converter that is opened and to which this struct is passed as an argument. @stable ICU 2.0  */
-    const UChar *source;        /**< Pointer to the source source buffer. @stable ICU 2.0    */
-    const UChar *sourceLimit;   /**< Pointer to the limit (end + 1) of source buffer. @stable ICU 2.0    */
-    char *target;               /**< Pointer to the target buffer. @stable ICU 2.0    */
-    const char *targetLimit;    /**< Pointer to the limit (end + 1) of target buffer. @stable ICU 2.0     */
-    int32_t *offsets;           /**< Pointer to the buffer that recieves the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
-} UConverterFromUnicodeArgs;
-
-
-/**
- * The structure for the toUnicode callback function parameter.
- * @stable ICU 2.0
- */
-typedef struct {
-    uint16_t size;              /**< The size of this struct   @stable ICU 2.0 */
-    UBool flush;                /**< The internal state of converter will be reset and data flushed if set to TRUE. @stable ICU 2.0   */
-    UConverter *converter;      /**< Pointer to the converter that is opened and to which this struct is passed as an argument. @stable ICU 2.0 */
-    const char *source;         /**< Pointer to the source source buffer. @stable ICU 2.0    */
-    const char *sourceLimit;    /**< Pointer to the limit (end + 1) of source buffer. @stable ICU 2.0    */
-    UChar *target;              /**< Pointer to the target buffer. @stable ICU 2.0    */
-    const UChar *targetLimit;   /**< Pointer to the limit (end + 1) of target buffer. @stable ICU 2.0     */
-    int32_t *offsets;           /**< Pointer to the buffer that recieves the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
-} UConverterToUnicodeArgs;
-
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This From Unicode callback STOPS at the ILLEGAL_SEQUENCE,
- * returning the error code back to the caller immediately.
- *
- * @param context Pointer to the callback's private data
- * @param fromUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
- * @param reason Defines the reason the callback was invoked
- * @param err This should always be set to a failure status prior to calling.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_STOP (
-                  const void *context,
-                  UConverterFromUnicodeArgs *fromUArgs,
-                  const UChar* codeUnits,
-                  int32_t length,
-                  UChar32 codePoint,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This To Unicode callback STOPS at the ILLEGAL_SEQUENCE,
- * returning the error code back to the caller immediately.
- *
- * @param context Pointer to the callback's private data
- * @param toUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' bytes of the concerned codepage sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param reason Defines the reason the callback was invoked
- * @param err This should always be set to a failure status prior to calling.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_STOP (
-                  const void *context,
-                  UConverterToUnicodeArgs *toUArgs,
-                  const char* codeUnits,
-                  int32_t length,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This From Unicode callback skips any ILLEGAL_SEQUENCE, or
- * skips only UNASSINGED_SEQUENCE depending on the context parameter
- * simply ignoring those characters. 
- *
- * @param context  The function currently recognizes the callback options:
- *                 UCNV_SKIP_STOP_ON_ILLEGAL: STOPS at the ILLEGAL_SEQUENCE,
- *                      returning the error code back to the caller immediately.
- *                 NULL: Skips any ILLEGAL_SEQUENCE
- * @param fromUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_SKIP (
-                  const void *context,
-                  UConverterFromUnicodeArgs *fromUArgs,
-                  const UChar* codeUnits,
-                  int32_t length,
-                  UChar32 codePoint,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This From Unicode callback will Substitute the ILLEGAL SEQUENCE, or 
- * UNASSIGNED_SEQUENCE depending on context parameter, with the
- * current substitution string for the converter. This is the default
- * callback.
- *
- * @param context The function currently recognizes the callback options:
- *                 UCNV_SUB_STOP_ON_ILLEGAL: STOPS at the ILLEGAL_SEQUENCE,
- *                      returning the error code back to the caller immediately.
- *                 NULL: Substitutes any ILLEGAL_SEQUENCE
- * @param fromUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @see ucnv_setSubstChars
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE (
-                  const void *context,
-                  UConverterFromUnicodeArgs *fromUArgs,
-                  const UChar* codeUnits,
-                  int32_t length,
-                  UChar32 codePoint,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This From Unicode callback will Substitute the ILLEGAL SEQUENCE with the
- * hexadecimal representation of the illegal codepoints
- *
- * @param context The function currently recognizes the callback options:
- *        <ul>
- *        <li>UCNV_ESCAPE_ICU: Substitues the  ILLEGAL SEQUENCE with the hexadecimal 
- *          representation in the format  %UXXXX, e.g. "%uFFFE%u00AC%uC8FE"). 
- *          In the Event the converter doesn't support the characters {%,U}[A-F][0-9], 
- *          it will  substitute  the illegal sequence with the substitution characters.
- *          Note that  codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- *          %UD84D%UDC56</li>
- *        <li>UCNV_ESCAPE_JAVA: Substitues the  ILLEGAL SEQUENCE with the hexadecimal 
- *          representation in the format  \\uXXXX, e.g. "\\uFFFE\\u00AC\\uC8FE"). 
- *          In the Event the converter doesn't support the characters {\,u}[A-F][0-9], 
- *          it will  substitute  the illegal sequence with the substitution characters.
- *          Note that  codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- *          \\uD84D\\uDC56</li>
- *        <li>UCNV_ESCAPE_C: Substitues the  ILLEGAL SEQUENCE with the hexadecimal 
- *          representation in the format  \\uXXXX, e.g. "\\uFFFE\\u00AC\\uC8FE"). 
- *          In the Event the converter doesn't support the characters {\,u,U}[A-F][0-9], 
- *          it will  substitute  the illegal sequence with the substitution characters.
- *          Note that  codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- *          \\U00023456</li>
- *        <li>UCNV_ESCAPE_XML_DEC: Substitues the  ILLEGAL SEQUENCE with the decimal 
- *          representation in the format  &amp;#DDDDDDDD;, e.g. "&amp;#65534;&amp;#172;&amp;#51454;"). 
- *          In the Event the converter doesn't support the characters {&amp;,#}[0-9], 
- *          it will  substitute  the illegal sequence with the substitution characters.
- *          Note that  codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- *          &amp;#144470; and Zero padding is ignored.</li>
- *        <li>UCNV_ESCAPE_XML_HEX:Substitues the  ILLEGAL SEQUENCE with the decimal 
- *          representation in the format  &#xXXXX, e.g. "&amp;#xFFFE;&amp;#x00AC;&amp;#xC8FE;"). 
- *          In the Event the converter doesn't support the characters {&,#,x}[0-9], 
- *          it will  substitute  the illegal sequence with the substitution characters.
- *          Note that  codeUnit(32bit int eg: unit of a surrogate pair) is represented as
- *          &amp;#x23456;</li>
- *        </ul>
- * @param fromUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param codePoint Single UChar32 (UTF-32) containing the concerend Unicode codepoint.
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_ESCAPE (
-                  const void *context,
-                  UConverterFromUnicodeArgs *fromUArgs,
-                  const UChar* codeUnits,
-                  int32_t length,
-                  UChar32 codePoint,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This To Unicode callback skips any ILLEGAL_SEQUENCE, or
- * skips only UNASSINGED_SEQUENCE depending on the context parameter
- * simply ignoring those characters. 
- *
- * @param context  The function currently recognizes the callback options:
- *                 UCNV_SKIP_STOP_ON_ILLEGAL: STOPS at the ILLEGAL_SEQUENCE,
- *                      returning the error code back to the caller immediately.
- *                 NULL: Skips any ILLEGAL_SEQUENCE
- * @param toUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' bytes of the concerned codepage sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_SKIP (
-                  const void *context,
-                  UConverterToUnicodeArgs *toUArgs,
-                  const char* codeUnits,
-                  int32_t length,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This To Unicode callback will Substitute the ILLEGAL SEQUENCE,or 
- * UNASSIGNED_SEQUENCE depending on context parameter,  with the
- * Unicode substitution character, U+FFFD.
- *
- * @param context  The function currently recognizes the callback options:
- *                 UCNV_SUB_STOP_ON_ILLEGAL: STOPS at the ILLEGAL_SEQUENCE,
- *                      returning the error code back to the caller immediately.
- *                 NULL: Substitutes any ILLEGAL_SEQUENCE
- * @param toUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' bytes of the concerned codepage sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_SUBSTITUTE (
-                  const void *context,
-                  UConverterToUnicodeArgs *toUArgs,
-                  const char* codeUnits,
-                  int32_t length,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-/**
- * DO NOT CALL THIS FUNCTION DIRECTLY!
- * This To Unicode callback will Substitute the ILLEGAL SEQUENCE with the
- * hexadecimal representation of the illegal bytes
- *  (in the format  %XNN, e.g. "%XFF%X0A%XC8%X03").
- *
- * @param context This function currently recognizes the callback options:
- *      UCNV_ESCAPE_ICU, UCNV_ESCAPE_JAVA, UCNV_ESCAPE_C, UCNV_ESCAPE_XML_DEC,
- *      UCNV_ESCAPE_XML_HEX and UCNV_ESCAPE_UNICODE.
- * @param toUArgs Information about the conversion in progress
- * @param codeUnits Points to 'length' bytes of the concerned codepage sequence
- * @param length Size (in bytes) of the concerned codepage sequence
- * @param reason Defines the reason the callback was invoked
- * @param err Return value will be set to success if the callback was handled,
- *      otherwise this value will be set to a failure status.
- * @stable ICU 2.0
- */
-
-U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_ESCAPE (
-                  const void *context,
-                  UConverterToUnicodeArgs *toUArgs,
-                  const char* codeUnits,
-                  int32_t length,
-                  UConverterCallbackReason reason,
-                  UErrorCode * err);
-
-#endif
-
-#endif
-
-/*UCNV_ERR_H*/ 
diff --git a/Source/JavaScriptGlue/icu/unicode/uconfig.h b/Source/JavaScriptGlue/icu/unicode/uconfig.h
deleted file mode 100644
index 997cf68..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uconfig.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*  
-**********************************************************************
-*   Copyright (C) 2002-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*   file name:  uconfig.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2002sep19
-*   created by: Markus W. Scherer
-*/
-
-#ifndef __UCONFIG_H__
-#define __UCONFIG_H__
-
-/*!
- * \file
- * \brief Switches for excluding parts of ICU library code modules.
- *
- * Allows to build partial, smaller libraries for special purposes.
- * By default, all modules are built.
- * The switches are fairly coarse, controlling large modules.
- * Basic services cannot be turned off.
- *
- * @stable ICU 2.4
- */
-
-/**
- * \def UCONFIG_ONLY_COLLATION
- * This switch turns off modules that are not needed for collation.
- *
- * It does not turn off legacy conversion because that is necessary
- * for ICU to work on EBCDIC platforms (for the default converter).
- * If you want "only collation" and do not build for EBCDIC,
- * then you can #define UCONFIG_NO_LEGACY_CONVERSION 1 as well.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_ONLY_COLLATION
-#   define UCONFIG_ONLY_COLLATION 0
-#endif
-
-#if UCONFIG_ONLY_COLLATION
-    /* common library */
-#   define UCONFIG_NO_BREAK_ITERATION 1
-#   define UCONFIG_NO_IDNA 1
-
-    /* i18n library */
-#   if UCONFIG_NO_COLLATION
-#       error Contradictory collation switches in uconfig.h.
-#   endif
-#   define UCONFIG_NO_FORMATTING 1
-#   define UCONFIG_NO_TRANSLITERATION 1
-#   define UCONFIG_NO_REGULAR_EXPRESSIONS 1
-#endif
-
-/* common library switches -------------------------------------------------- */
-
-/**
- * \def UCONFIG_NO_CONVERSION
- * ICU will not completely build with this switch turned on.
- * This switch turns off all converters.
- *
- * @draft ICU 3.2
- */
-#ifndef UCONFIG_NO_CONVERSION
-#   define UCONFIG_NO_CONVERSION 0
-#endif
-
-#if UCONFIG_NO_CONVERSION
-#   define UCONFIG_NO_LEGACY_CONVERSION 1
-#endif
-
-/**
- * \def UCONFIG_NO_LEGACY_CONVERSION
- * This switch turns off all converters except for
- * - Unicode charsets (UTF-7/8/16/32, CESU-8, SCSU, BOCU-1)
- * - US-ASCII
- * - ISO-8859-1
- *
- * Turning off legacy conversion is not possible on EBCDIC platforms
- * because they need ibm-37 or ibm-1047 default converters.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_LEGACY_CONVERSION
-#   define UCONFIG_NO_LEGACY_CONVERSION 0
-#endif
-
-/**
- * \def UCONFIG_NO_NORMALIZATION
- * This switch turns off normalization.
- * It implies turning off several other services as well, for example
- * collation and IDNA.
- *
- * @stable ICU 2.6
- */
-#ifndef UCONFIG_NO_NORMALIZATION
-#   define UCONFIG_NO_NORMALIZATION 0
-#elif UCONFIG_NO_NORMALIZATION
-    /* common library */
-#   define UCONFIG_NO_IDNA 1
-
-    /* i18n library */
-#   if UCONFIG_ONLY_COLLATION
-#       error Contradictory collation switches in uconfig.h.
-#   endif
-#   define UCONFIG_NO_COLLATION 1
-#   define UCONFIG_NO_TRANSLITERATION 1
-#endif
-
-/**
- * \def UCONFIG_NO_BREAK_ITERATION
- * This switch turns off break iteration.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_BREAK_ITERATION
-#   define UCONFIG_NO_BREAK_ITERATION 0
-#endif
-
-/**
- * \def UCONFIG_NO_IDNA
- * This switch turns off IDNA.
- *
- * @stable ICU 2.6
- */
-#ifndef UCONFIG_NO_IDNA
-#   define UCONFIG_NO_IDNA 0
-#endif
-
-/* i18n library switches ---------------------------------------------------- */
-
-/**
- * \def UCONFIG_NO_COLLATION
- * This switch turns off collation and collation-based string search.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_COLLATION
-#   define UCONFIG_NO_COLLATION 0
-#endif
-
-/**
- * \def UCONFIG_NO_FORMATTING
- * This switch turns off formatting and calendar/timezone services.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_FORMATTING
-#   define UCONFIG_NO_FORMATTING 0
-#endif
-
-/**
- * \def UCONFIG_NO_TRANSLITERATION
- * This switch turns off transliteration.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_TRANSLITERATION
-#   define UCONFIG_NO_TRANSLITERATION 0
-#endif
-
-/**
- * \def UCONFIG_NO_REGULAR_EXPRESSIONS
- * This switch turns off regular expressions.
- *
- * @stable ICU 2.4
- */
-#ifndef UCONFIG_NO_REGULAR_EXPRESSIONS
-#   define UCONFIG_NO_REGULAR_EXPRESSIONS 0
-#endif
-
-/**
- * \def UCONFIG_NO_SERVICE
- * This switch turns off service registration.
- *
- * @draft ICU 3.2
- */
-#ifndef UCONFIG_NO_SERVICE
-#   define UCONFIG_NO_SERVICE 0
-#endif
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/uenum.h b/Source/JavaScriptGlue/icu/unicode/uenum.h
deleted file mode 100644
index 63690f8..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uenum.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2002-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  uenum.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:2
-*
-*   created on: 2002jul08
-*   created by: Vladimir Weinstein
-*/
-
-#ifndef __UENUM_H
-#define __UENUM_H
-
-#include "unicode/utypes.h"
-
-/**
- * An enumeration object.
- * For usage in C programs.
- * @stable ICU 2.2
- */
-struct UEnumeration;
-/** structure representing an enumeration object instance @stable ICU 2.2 */
-typedef struct UEnumeration UEnumeration;
-
-/**
- * Disposes of resources in use by the iterator.  If en is NULL,
- * does nothing.  After this call, any char* or UChar* pointer
- * returned by uenum_unext() or uenum_next() is invalid.
- * @param en UEnumeration structure pointer
- * @stable ICU 2.2
- */
-U_STABLE void U_EXPORT2
-uenum_close(UEnumeration* en);
-
-/**
- * Returns the number of elements that the iterator traverses.  If
- * the iterator is out-of-sync with its service, status is set to
- * U_ENUM_OUT_OF_SYNC_ERROR.
- * This is a convenience function. It can end up being very
- * expensive as all the items might have to be pre-fetched (depending
- * on the type of data being traversed). Use with caution and only 
- * when necessary.
- * @param en UEnumeration structure pointer
- * @param status error code, can be U_ENUM_OUT_OF_SYNC_ERROR if the
- *               iterator is out of sync.
- * @return number of elements in the iterator
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-uenum_count(UEnumeration* en, UErrorCode* status);
-
-/**
- * Returns the next element in the iterator's list.  If there are
- * no more elements, returns NULL.  If the iterator is out-of-sync
- * with its service, status is set to U_ENUM_OUT_OF_SYNC_ERROR and
- * NULL is returned.  If the native service string is a char* string,
- * it is converted to UChar* with the invariant converter.
- * The result is terminated by (UChar)0.
- * @param en the iterator object
- * @param resultLength pointer to receive the length of the result
- *                     (not including the terminating \\0).
- *                     If the pointer is NULL it is ignored.
- * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if
- *               the iterator is out of sync with its service.
- * @return a pointer to the string.  The string will be
- *         zero-terminated.  The return pointer is owned by this iterator
- *         and must not be deleted by the caller.  The pointer is valid
- *         until the next call to any uenum_... method, including
- *         uenum_next() or uenum_unext().  When all strings have been
- *         traversed, returns NULL.
- * @stable ICU 2.2
- */
-U_STABLE const UChar* U_EXPORT2
-uenum_unext(UEnumeration* en,
-            int32_t* resultLength,
-            UErrorCode* status);
-
-/**
- * Returns the next element in the iterator's list.  If there are
- * no more elements, returns NULL.  If the iterator is out-of-sync
- * with its service, status is set to U_ENUM_OUT_OF_SYNC_ERROR and
- * NULL is returned.  If the native service string is a UChar*
- * string, it is converted to char* with the invariant converter.
- * The result is terminated by (char)0.  If the conversion fails
- * (because a character cannot be converted) then status is set to
- * U_INVARIANT_CONVERSION_ERROR and the return value is undefined
- * (but non-NULL).
- * @param en the iterator object
- * @param resultLength pointer to receive the length of the result
- *                     (not including the terminating \\0).
- *                     If the pointer is NULL it is ignored.
- * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if
- *               the iterator is out of sync with its service.  Set to
- *               U_INVARIANT_CONVERSION_ERROR if the underlying native string is
- *               UChar* and conversion to char* with the invariant converter
- *               fails. This error pertains only to current string, so iteration
- *               might be able to continue successfully.
- * @return a pointer to the string.  The string will be
- *         zero-terminated.  The return pointer is owned by this iterator
- *         and must not be deleted by the caller.  The pointer is valid
- *         until the next call to any uenum_... method, including
- *         uenum_next() or uenum_unext().  When all strings have been
- *         traversed, returns NULL.
- * @stable ICU 2.2
- */
-U_STABLE const char* U_EXPORT2
-uenum_next(UEnumeration* en,
-           int32_t* resultLength,
-           UErrorCode* status);
-
-/**
- * Resets the iterator to the current list of service IDs.  This
- * re-establishes sync with the service and rewinds the iterator
- * to start at the first element.
- * @param en the iterator object
- * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if
- *               the iterator is out of sync with its service.  
- * @stable ICU 2.2
- */
-U_STABLE void U_EXPORT2
-uenum_reset(UEnumeration* en, UErrorCode* status);
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/uiter.h b/Source/JavaScriptGlue/icu/unicode/uiter.h
deleted file mode 100644
index 963df5c..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uiter.h
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2002-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  uiter.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2002jan18
-*   created by: Markus W. Scherer
-*/
-
-#ifndef __UITER_H__
-#define __UITER_H__
-
-/**
- * \file
- * \brief C API: Unicode Character Iteration
- *
- * @see UCharIterator
- */
-
-#include "unicode/utypes.h"
-
-#ifdef XP_CPLUSPLUS
-    U_NAMESPACE_BEGIN
-
-    class CharacterIterator;
-    class Replaceable;
-
-    U_NAMESPACE_END
-#endif
-
-U_CDECL_BEGIN
-
-struct UCharIterator;
-typedef struct UCharIterator UCharIterator; /**< C typedef for struct UCharIterator. @stable ICU 2.1 */
-
-/**
- * Origin constants for UCharIterator.getIndex() and UCharIterator.move().
- * @see UCharIteratorMove
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef enum UCharIteratorOrigin {
-    UITER_START, UITER_CURRENT, UITER_LIMIT, UITER_ZERO, UITER_LENGTH
-} UCharIteratorOrigin;
-
-/** Constants for UCharIterator. @stable ICU 2.6 */
-enum {
-    /**
-     * Constant value that may be returned by UCharIteratorMove
-     * indicating that the final UTF-16 index is not known, but that the move succeeded.
-     * This can occur when moving relative to limit or length, or
-     * when moving relative to the current index after a setState()
-     * when the current UTF-16 index is not known.
-     *
-     * It would be very inefficient to have to count from the beginning of the text
-     * just to get the current/limit/length index after moving relative to it.
-     * The actual index can be determined with getIndex(UITER_CURRENT)
-     * which will count the UChars if necessary.
-     *
-     * @stable ICU 2.6
-     */
-    UITER_UNKNOWN_INDEX=-2
-};
-
-
-/**
- * Constant for UCharIterator getState() indicating an error or
- * an unknown state.
- * Returned by uiter_getState()/UCharIteratorGetState
- * when an error occurs.
- * Also, some UCharIterator implementations may not be able to return
- * a valid state for each position. This will be clearly documented
- * for each such iterator (none of the public ones here).
- *
- * @stable ICU 2.6
- */
-#define UITER_NO_STATE ((uint32_t)0xffffffff)
-
-/**
- * Function type declaration for UCharIterator.getIndex().
- *
- * Gets the current position, or the start or limit of the
- * iteration range.
- *
- * This function may perform slowly for UITER_CURRENT after setState() was called,
- * or for UITER_LENGTH, because an iterator implementation may have to count
- * UChars if the underlying storage is not UTF-16.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @param origin get the 0, start, limit, length, or current index
- * @return the requested index, or U_SENTINEL in an error condition
- *
- * @see UCharIteratorOrigin
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef int32_t U_CALLCONV
-UCharIteratorGetIndex(UCharIterator *iter, UCharIteratorOrigin origin);
-
-/**
- * Function type declaration for UCharIterator.move().
- *
- * Use iter->move(iter, index, UITER_ZERO) like CharacterIterator::setIndex(index).
- *
- * Moves the current position relative to the start or limit of the
- * iteration range, or relative to the current position itself.
- * The movement is expressed in numbers of code units forward
- * or backward by specifying a positive or negative delta.
- * Out of bounds movement will be pinned to the start or limit.
- *
- * This function may perform slowly for moving relative to UITER_LENGTH
- * because an iterator implementation may have to count the rest of the
- * UChars if the native storage is not UTF-16.
- *
- * When moving relative to the limit or length, or
- * relative to the current position after setState() was called,
- * move() may return UITER_UNKNOWN_INDEX (-2) to avoid an inefficient
- * determination of the actual UTF-16 index.
- * The actual index can be determined with getIndex(UITER_CURRENT)
- * which will count the UChars if necessary.
- * See UITER_UNKNOWN_INDEX for details.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @param delta can be positive, zero, or negative
- * @param origin move relative to the 0, start, limit, length, or current index
- * @return the new index, or U_SENTINEL on an error condition,
- *         or UITER_UNKNOWN_INDEX when the index is not known.
- *
- * @see UCharIteratorOrigin
- * @see UCharIterator
- * @see UITER_UNKNOWN_INDEX
- * @stable ICU 2.1
- */
-typedef int32_t U_CALLCONV
-UCharIteratorMove(UCharIterator *iter, int32_t delta, UCharIteratorOrigin origin);
-
-/**
- * Function type declaration for UCharIterator.hasNext().
- *
- * Check if current() and next() can still
- * return another code unit.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return boolean value for whether current() and next() can still return another code unit
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef UBool U_CALLCONV
-UCharIteratorHasNext(UCharIterator *iter);
-
-/**
- * Function type declaration for UCharIterator.hasPrevious().
- *
- * Check if previous() can still return another code unit.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return boolean value for whether previous() can still return another code unit
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef UBool U_CALLCONV
-UCharIteratorHasPrevious(UCharIterator *iter);
- 
-/**
- * Function type declaration for UCharIterator.current().
- *
- * Return the code unit at the current position,
- * or U_SENTINEL if there is none (index is at the limit).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the current code unit
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef UChar32 U_CALLCONV
-UCharIteratorCurrent(UCharIterator *iter);
-
-/**
- * Function type declaration for UCharIterator.next().
- *
- * Return the code unit at the current index and increment
- * the index (post-increment, like s[i++]),
- * or return U_SENTINEL if there is none (index is at the limit).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the current code unit (and post-increment the current index)
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef UChar32 U_CALLCONV
-UCharIteratorNext(UCharIterator *iter);
-
-/**
- * Function type declaration for UCharIterator.previous().
- *
- * Decrement the index and return the code unit from there
- * (pre-decrement, like s[--i]),
- * or return U_SENTINEL if there is none (index is at the start).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the previous code unit (after pre-decrementing the current index)
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef UChar32 U_CALLCONV
-UCharIteratorPrevious(UCharIterator *iter);
-
-/**
- * Function type declaration for UCharIterator.reservedFn().
- * Reserved for future use.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @param something some integer argument
- * @return some integer
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-typedef int32_t U_CALLCONV
-UCharIteratorReserved(UCharIterator *iter, int32_t something);
-
-/**
- * Function type declaration for UCharIterator.getState().
- *
- * Get the "state" of the iterator in the form of a single 32-bit word.
- * It is recommended that the state value be calculated to be as small as
- * is feasible. For strings with limited lengths, fewer than 32 bits may
- * be sufficient.
- *
- * This is used together with setState()/UCharIteratorSetState
- * to save and restore the iterator position more efficiently than with
- * getIndex()/move().
- *
- * The iterator state is defined as a uint32_t value because it is designed
- * for use in ucol_nextSortKeyPart() which provides 32 bits to store the state
- * of the character iterator.
- *
- * With some UCharIterator implementations (e.g., UTF-8),
- * getting and setting the UTF-16 index with existing functions
- * (getIndex(UITER_CURRENT) followed by move(pos, UITER_ZERO)) is possible but
- * relatively slow because the iterator has to "walk" from a known index
- * to the requested one.
- * This takes more time the farther it needs to go.
- *
- * An opaque state value allows an iterator implementation to provide
- * an internal index (UTF-8: the source byte array index) for
- * fast, constant-time restoration.
- *
- * After calling setState(), a getIndex(UITER_CURRENT) may be slow because
- * the UTF-16 index may not be restored as well, but the iterator can deliver
- * the correct text contents and move relative to the current position
- * without performance degradation.
- *
- * Some UCharIterator implementations may not be able to return
- * a valid state for each position, in which case they return UITER_NO_STATE instead.
- * This will be clearly documented for each such iterator (none of the public ones here).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the state word
- *
- * @see UCharIterator
- * @see UCharIteratorSetState
- * @see UITER_NO_STATE
- * @stable ICU 2.6
- */
-typedef uint32_t U_CALLCONV
-UCharIteratorGetState(const UCharIterator *iter);
-
-/**
- * Function type declaration for UCharIterator.setState().
- *
- * Restore the "state" of the iterator using a state word from a getState() call.
- * The iterator object need not be the same one as for which getState() was called,
- * but it must be of the same type (set up using the same uiter_setXYZ function)
- * and it must iterate over the same string
- * (binary identical regardless of memory address).
- * For more about the state word see UCharIteratorGetState.
- *
- * After calling setState(), a getIndex(UITER_CURRENT) may be slow because
- * the UTF-16 index may not be restored as well, but the iterator can deliver
- * the correct text contents and move relative to the current position
- * without performance degradation.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @param state the state word from a getState() call
- *              on a same-type, same-string iterator
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                   which must not indicate a failure before the function call.
- *
- * @see UCharIterator
- * @see UCharIteratorGetState
- * @stable ICU 2.6
- */
-typedef void U_CALLCONV
-UCharIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode);
-
-
-/**
- * C API for code unit iteration.
- * This can be used as a C wrapper around
- * CharacterIterator, Replaceable, or implemented using simple strings, etc.
- *
- * There are two roles for using UCharIterator:
- *
- * A "provider" sets the necessary function pointers and controls the "protected"
- * fields of the UCharIterator structure. A "provider" passes a UCharIterator
- * into C APIs that need a UCharIterator as an abstract, flexible string interface.
- *
- * Implementations of such C APIs are "callers" of UCharIterator functions;
- * they only use the "public" function pointers and never access the "protected"
- * fields directly.
- *
- * The current() and next() functions only check the current index against the
- * limit, and previous() only checks the current index against the start,
- * to see if the iterator already reached the end of the iteration range.
- *
- * The assumption - in all iterators - is that the index is moved via the API,
- * which means it won't go out of bounds, or the index is modified by
- * user code that knows enough about the iterator implementation to set valid
- * index values.
- *
- * UCharIterator functions return code unit values 0..0xffff,
- * or U_SENTINEL if the iteration bounds are reached.
- *
- * @stable ICU 2.1
- */
-struct UCharIterator {
-    /**
-     * (protected) Pointer to string or wrapped object or similar.
-     * Not used by caller.
-     * @stable ICU 2.1
-     */
-    const void *context;
-
-    /**
-     * (protected) Length of string or similar.
-     * Not used by caller.
-     * @stable ICU 2.1
-     */
-    int32_t length;
-
-    /**
-     * (protected) Start index or similar.
-     * Not used by caller.
-     * @stable ICU 2.1
-     */
-    int32_t start;
-
-    /**
-     * (protected) Current index or similar.
-     * Not used by caller.
-     * @stable ICU 2.1
-     */
-    int32_t index;
-
-    /**
-     * (protected) Limit index or similar.
-     * Not used by caller.
-     * @stable ICU 2.1
-     */
-    int32_t limit;
-
-    /**
-     * (protected) Used by UTF-8 iterators and possibly others.
-     * @stable ICU 2.1
-     */
-    int32_t reservedField;
-
-    /**
-     * (public) Returns the current position or the
-     * start or limit index of the iteration range.
-     *
-     * @see UCharIteratorGetIndex
-     * @stable ICU 2.1
-     */
-    UCharIteratorGetIndex *getIndex;
-
-    /**
-     * (public) Moves the current position relative to the start or limit of the
-     * iteration range, or relative to the current position itself.
-     * The movement is expressed in numbers of code units forward
-     * or backward by specifying a positive or negative delta.
-     *
-     * @see UCharIteratorMove
-     * @stable ICU 2.1
-     */
-    UCharIteratorMove *move;
-
-    /**
-     * (public) Check if current() and next() can still
-     * return another code unit.
-     *
-     * @see UCharIteratorHasNext
-     * @stable ICU 2.1
-     */
-    UCharIteratorHasNext *hasNext;
-
-    /**
-     * (public) Check if previous() can still return another code unit.
-     *
-     * @see UCharIteratorHasPrevious
-     * @stable ICU 2.1
-     */
-    UCharIteratorHasPrevious *hasPrevious;
-
-    /**
-     * (public) Return the code unit at the current position,
-     * or U_SENTINEL if there is none (index is at the limit).
-     *
-     * @see UCharIteratorCurrent
-     * @stable ICU 2.1
-     */
-    UCharIteratorCurrent *current;
-
-    /**
-     * (public) Return the code unit at the current index and increment
-     * the index (post-increment, like s[i++]),
-     * or return U_SENTINEL if there is none (index is at the limit).
-     *
-     * @see UCharIteratorNext
-     * @stable ICU 2.1
-     */
-    UCharIteratorNext *next;
-
-    /**
-     * (public) Decrement the index and return the code unit from there
-     * (pre-decrement, like s[--i]),
-     * or return U_SENTINEL if there is none (index is at the start).
-     *
-     * @see UCharIteratorPrevious
-     * @stable ICU 2.1
-     */
-    UCharIteratorPrevious *previous;
-
-    /**
-     * (public) Reserved for future use. Currently NULL.
-     *
-     * @see UCharIteratorReserved
-     * @stable ICU 2.1
-     */
-    UCharIteratorReserved *reservedFn;
-
-    /**
-     * (public) Return the state of the iterator, to be restored later with setState().
-     * This function pointer is NULL if the iterator does not implement it.
-     *
-     * @see UCharIteratorGet
-     * @stable ICU 2.6
-     */
-    UCharIteratorGetState *getState;
-
-    /**
-     * (public) Restore the iterator state from the state word from a call
-     * to getState().
-     * This function pointer is NULL if the iterator does not implement it.
-     *
-     * @see UCharIteratorSet
-     * @stable ICU 2.6
-     */
-    UCharIteratorSetState *setState;
-};
-
-/**
- * Helper function for UCharIterator to get the code point
- * at the current index.
- *
- * Return the code point that includes the code unit at the current position,
- * or U_SENTINEL if there is none (index is at the limit).
- * If the current code unit is a lead or trail surrogate,
- * then the following or preceding surrogate is used to form
- * the code point value.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the current code point
- *
- * @see UCharIterator
- * @see U16_GET
- * @see UnicodeString::char32At()
- * @stable ICU 2.1
- */
-U_STABLE UChar32 U_EXPORT2
-uiter_current32(UCharIterator *iter);
-
-/**
- * Helper function for UCharIterator to get the next code point.
- *
- * Return the code point at the current index and increment
- * the index (post-increment, like s[i++]),
- * or return U_SENTINEL if there is none (index is at the limit).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the current code point (and post-increment the current index)
- *
- * @see UCharIterator
- * @see U16_NEXT
- * @stable ICU 2.1
- */
-U_STABLE UChar32 U_EXPORT2
-uiter_next32(UCharIterator *iter);
-
-/**
- * Helper function for UCharIterator to get the previous code point.
- *
- * Decrement the index and return the code point from there
- * (pre-decrement, like s[--i]),
- * or return U_SENTINEL if there is none (index is at the start).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the previous code point (after pre-decrementing the current index)
- *
- * @see UCharIterator
- * @see U16_PREV
- * @stable ICU 2.1
- */
-U_STABLE UChar32 U_EXPORT2
-uiter_previous32(UCharIterator *iter);
-
-/**
- * Get the "state" of the iterator in the form of a single 32-bit word.
- * This is a convenience function that calls iter->getState(iter)
- * if iter->getState is not NULL;
- * if it is NULL or any other error occurs, then UITER_NO_STATE is returned.
- *
- * Some UCharIterator implementations may not be able to return
- * a valid state for each position, in which case they return UITER_NO_STATE instead.
- * This will be clearly documented for each such iterator (none of the public ones here).
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @return the state word
- *
- * @see UCharIterator
- * @see UCharIteratorGetState
- * @see UITER_NO_STATE
- * @stable ICU 2.6
- */
-U_STABLE uint32_t U_EXPORT2
-uiter_getState(const UCharIterator *iter);
-
-/**
- * Restore the "state" of the iterator using a state word from a getState() call.
- * This is a convenience function that calls iter->setState(iter, state, pErrorCode)
- * if iter->setState is not NULL; if it is NULL, then U_UNSUPPORTED_ERROR is set.
- *
- * @param iter the UCharIterator structure ("this pointer")
- * @param state the state word from a getState() call
- *              on a same-type, same-string iterator
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                   which must not indicate a failure before the function call.
- *
- * @see UCharIterator
- * @see UCharIteratorSetState
- * @stable ICU 2.6
- */
-U_STABLE void U_EXPORT2
-uiter_setState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode);
-
-/**
- * Set up a UCharIterator to iterate over a string.
- *
- * Sets the UCharIterator function pointers for iteration over the string s
- * with iteration boundaries start=index=0 and length=limit=string length.
- * The "provider" may set the start, index, and limit values at any time
- * within the range 0..length.
- * The length field will be ignored.
- *
- * The string pointer s is set into UCharIterator.context without copying
- * or reallocating the string contents.
- *
- * getState() simply returns the current index.
- * move() will always return the final index.
- *
- * @param iter UCharIterator structure to be set for iteration
- * @param s String to iterate over
- * @param length Length of s, or -1 if NUL-terminated
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-U_STABLE void U_EXPORT2
-uiter_setString(UCharIterator *iter, const UChar *s, int32_t length);
-
-/**
- * Set up a UCharIterator to iterate over a UTF-16BE string
- * (byte vector with a big-endian pair of bytes per UChar).
- *
- * Everything works just like with a normal UChar iterator (uiter_setString),
- * except that UChars are assembled from byte pairs,
- * and that the length argument here indicates an even number of bytes.
- *
- * getState() simply returns the current index.
- * move() will always return the final index.
- *
- * @param iter UCharIterator structure to be set for iteration
- * @param s UTF-16BE string to iterate over
- * @param length Length of s as an even number of bytes, or -1 if NUL-terminated
- *               (NUL means pair of 0 bytes at even index from s)
- *
- * @see UCharIterator
- * @see uiter_setString
- * @stable ICU 2.6
- */
-U_STABLE void U_EXPORT2
-uiter_setUTF16BE(UCharIterator *iter, const char *s, int32_t length);
-
-/**
- * Set up a UCharIterator to iterate over a UTF-8 string.
- *
- * Sets the UCharIterator function pointers for iteration over the UTF-8 string s
- * with UTF-8 iteration boundaries 0 and length.
- * The implementation counts the UTF-16 index on the fly and
- * lazily evaluates the UTF-16 length of the text.
- *
- * The start field is used as the UTF-8 offset, the limit field as the UTF-8 length.
- * When the reservedField is not 0, then it contains a supplementary code point
- * and the UTF-16 index is between the two corresponding surrogates.
- * At that point, the UTF-8 index is behind that code point.
- *
- * The UTF-8 string pointer s is set into UCharIterator.context without copying
- * or reallocating the string contents.
- *
- * getState() returns a state value consisting of
- * - the current UTF-8 source byte index (bits 31..1)
- * - a flag (bit 0) that indicates whether the UChar position is in the middle
- *   of a surrogate pair
- *   (from a 4-byte UTF-8 sequence for the corresponding supplementary code point)
- *
- * getState() cannot also encode the UTF-16 index in the state value.
- * move(relative to limit or length), or
- * move(relative to current) after setState(), may return UITER_UNKNOWN_INDEX.
- *
- * @param iter UCharIterator structure to be set for iteration
- * @param s UTF-8 string to iterate over
- * @param length Length of s in bytes, or -1 if NUL-terminated
- *
- * @see UCharIterator
- * @stable ICU 2.6
- */
-U_STABLE void U_EXPORT2
-uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length);
-
-#ifdef XP_CPLUSPLUS
-
-/**
- * Set up a UCharIterator to wrap around a C++ CharacterIterator.
- *
- * Sets the UCharIterator function pointers for iteration using the
- * CharacterIterator charIter.
- *
- * The CharacterIterator pointer charIter is set into UCharIterator.context
- * without copying or cloning the CharacterIterator object.
- * The other "protected" UCharIterator fields are set to 0 and will be ignored.
- * The iteration index and boundaries are controlled by the CharacterIterator.
- *
- * getState() simply returns the current index.
- * move() will always return the final index.
- *
- * @param iter UCharIterator structure to be set for iteration
- * @param charIter CharacterIterator to wrap
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-U_STABLE void U_EXPORT2
-uiter_setCharacterIterator(UCharIterator *iter, CharacterIterator *charIter);
-
-/**
- * Set up a UCharIterator to iterate over a C++ Replaceable.
- *
- * Sets the UCharIterator function pointers for iteration over the
- * Replaceable rep with iteration boundaries start=index=0 and
- * length=limit=rep->length().
- * The "provider" may set the start, index, and limit values at any time
- * within the range 0..length=rep->length().
- * The length field will be ignored.
- *
- * The Replaceable pointer rep is set into UCharIterator.context without copying
- * or cloning/reallocating the Replaceable object.
- *
- * getState() simply returns the current index.
- * move() will always return the final index.
- *
- * @param iter UCharIterator structure to be set for iteration
- * @param rep Replaceable to iterate over
- *
- * @see UCharIterator
- * @stable ICU 2.1
- */
-U_STABLE void U_EXPORT2
-uiter_setReplaceable(UCharIterator *iter, const Replaceable *rep);
-
-#endif
-
-U_CDECL_END
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/umachine.h b/Source/JavaScriptGlue/icu/unicode/umachine.h
deleted file mode 100644
index d841f53..0000000
--- a/Source/JavaScriptGlue/icu/unicode/umachine.h
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
-******************************************************************************
-*
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-******************************************************************************
-*   file name:  umachine.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 1999sep13
-*   created by: Markus W. Scherer
-*
-*   This file defines basic types and constants for utf.h to be
-*   platform-independent. umachine.h and utf.h are included into
-*   utypes.h to provide all the general definitions for ICU.
-*   All of these definitions used to be in utypes.h before
-*   the UTF-handling macros made this unmaintainable.
-*/
-
-#ifndef __UMACHINE_H__
-#define __UMACHINE_H__
-
-
-/**
- * \file
- * \brief Basic types and constants for UTF 
- * 
- * <h2> Basic types and constants for UTF </h2>
- *   This file defines basic types and constants for utf.h to be
- *   platform-independent. umachine.h and utf.h are included into
- *   utypes.h to provide all the general definitions for ICU.
- *   All of these definitions used to be in utypes.h before
- *   the UTF-handling macros made this unmaintainable.
- * 
- */
-/*==========================================================================*/
-/* Include platform-dependent definitions                                   */
-/* which are contained in the platform-specific file platform.h             */
-/*==========================================================================*/
-
-#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
-#   include "unicode/pwin32.h"
-#else
-#   include "unicode/platform.h"
-#endif
-
-/*
- * ANSI C headers:
- * stddef.h defines wchar_t
- */
-#include <stddef.h>
-
-/*==========================================================================*/
-/* XP_CPLUSPLUS is a cross-platform symbol which should be defined when     */
-/* using C++.  It should not be defined when compiling under C.             */
-/*==========================================================================*/
-
-#ifdef __cplusplus
-#   ifndef XP_CPLUSPLUS
-#       define XP_CPLUSPLUS
-#   endif
-#else
-#   undef XP_CPLUSPLUS
-#endif
-
-/*==========================================================================*/
-/* For C wrappers, we use the symbol U_STABLE.                                */
-/* This works properly if the includer is C or C++.                         */
-/* Functions are declared   U_STABLE return-type U_EXPORT2 function-name()... */
-/*==========================================================================*/
-
-/**
- * \def U_CFUNC
- * This is used in a declaration of a library private ICU C function.
- * @stable ICU 2.4
- */
-
-/**
- * \def U_CDECL_BEGIN
- * This is used to begin a declaration of a library private ICU C API.
- * @stable ICU 2.4
- */
-
-/**
- * \def U_CDECL_END
- * This is used to end a declaration of a library private ICU C API 
- * @stable ICU 2.4
- */
-
-#ifdef XP_CPLUSPLUS
-#   define U_CFUNC extern "C"
-#   define U_CDECL_BEGIN extern "C" {
-#   define U_CDECL_END   }
-#else
-#   define U_CFUNC extern
-#   define U_CDECL_BEGIN
-#   define U_CDECL_END
-#endif
-
-/**
- * \def U_NAMESPACE_BEGIN
- * This is used to begin a declaration of a public ICU C++ API.
- * If the compiler doesn't support namespaces, this does nothing.
- * @stable ICU 2.4
- */
-
-/**
- * \def U_NAMESPACE_END
- * This is used to end a declaration of a public ICU C++ API 
- * If the compiler doesn't support namespaces, this does nothing.
- * @stable ICU 2.4
- */
-
-/**
- * \def U_NAMESPACE_USE
- * This is used to specify that the rest of the code uses the
- * public ICU C++ API namespace.
- * If the compiler doesn't support namespaces, this does nothing.
- * @stable ICU 2.4
- */
-
-/**
- * \def U_NAMESPACE_QUALIFIER
- * This is used to qualify that a function or class is part of
- * the public ICU C++ API namespace.
- * If the compiler doesn't support namespaces, this does nothing.
- * @stable ICU 2.4
- */
-
-/* Define namespace symbols if the compiler supports it. */
-#if U_HAVE_NAMESPACE
-#   define U_NAMESPACE_BEGIN namespace U_ICU_NAMESPACE {
-#   define U_NAMESPACE_END  }
-#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
-#   define U_NAMESPACE_QUALIFIER U_ICU_NAMESPACE::
-#else
-#   define U_NAMESPACE_BEGIN
-#   define U_NAMESPACE_END
-#   define U_NAMESPACE_USE
-#   define U_NAMESPACE_QUALIFIER
-#endif
-
-/** This is used to declare a function as a public ICU C API @stable ICU 2.0*/
-#define U_CAPI U_CFUNC U_EXPORT
-#define U_STABLE U_CAPI
-#define U_DRAFT  U_CAPI
-#define U_DEPRECATED U_CAPI
-#define U_OBSOLETE U_CAPI
-#define U_INTERNAL U_CAPI
-
-/*==========================================================================*/
-/* limits for int32_t etc., like in POSIX inttypes.h                        */
-/*==========================================================================*/
-
-#ifndef INT8_MIN
-/** The smallest value an 8 bit signed integer can hold @stable ICU 2.0 */
-#   define INT8_MIN        ((int8_t)(-128))
-#endif
-#ifndef INT16_MIN
-/** The smallest value a 16 bit signed integer can hold @stable ICU 2.0 */
-#   define INT16_MIN       ((int16_t)(-32767-1))
-#endif
-#ifndef INT32_MIN
-/** The smallest value a 32 bit signed integer can hold @stable ICU 2.0 */
-#   define INT32_MIN       ((int32_t)(-2147483647-1))
-#endif
-
-#ifndef INT8_MAX
-/** The largest value an 8 bit signed integer can hold @stable ICU 2.0 */
-#   define INT8_MAX        ((int8_t)(127))
-#endif
-#ifndef INT16_MAX
-/** The largest value a 16 bit signed integer can hold @stable ICU 2.0 */
-#   define INT16_MAX       ((int16_t)(32767))
-#endif
-#ifndef INT32_MAX
-/** The largest value a 32 bit signed integer can hold @stable ICU 2.0 */
-#   define INT32_MAX       ((int32_t)(2147483647))
-#endif
-
-#ifndef UINT8_MAX
-/** The largest value an 8 bit unsigned integer can hold @stable ICU 2.0 */
-#   define UINT8_MAX       ((uint8_t)(255U))
-#endif
-#ifndef UINT16_MAX
-/** The largest value a 16 bit unsigned integer can hold @stable ICU 2.0 */
-#   define UINT16_MAX      ((uint16_t)(65535U))
-#endif
-#ifndef UINT32_MAX
-/** The largest value a 32 bit unsigned integer can hold @stable ICU 2.0 */
-#   define UINT32_MAX      ((uint32_t)(4294967295U))
-#endif
-
-#if defined(U_INT64_T_UNAVAILABLE)
-# error int64_t is required for decimal format and rule-based number format.
-#else
-# ifndef INT64_C
-/**
- * Provides a platform independent way to specify a signed 64-bit integer constant.
- * note: may be wrong for some 64 bit platforms - ensure your compiler provides INT64_C
- * @draft ICU 2.8
- */
-#   define INT64_C(c) c ## LL
-# endif
-# ifndef UINT64_C
-/**
- * Provides a platform independent way to specify an unsigned 64-bit integer constant.
- * note: may be wrong for some 64 bit platforms - ensure your compiler provides UINT64_C
- * @draft ICU 2.8
- */
-#   define UINT64_C(c) c ## ULL
-# endif
-# ifndef U_INT64_MIN
-/** The smallest value a 64 bit signed integer can hold @stable ICU 2.8 */
-#     define U_INT64_MIN       ((int64_t)(INT64_C(-9223372036854775807)-1))
-# endif
-# ifndef U_INT64_MAX
-/** The largest value a 64 bit signed integer can hold @stable ICU 2.8 */
-#     define U_INT64_MAX       ((int64_t)(INT64_C(9223372036854775807)))
-# endif
-# ifndef U_UINT64_MAX
-/** The largest value a 64 bit unsigned integer can hold @stable ICU 2.8 */
-#     define U_UINT64_MAX      ((uint64_t)(UINT64_C(18446744073709551615)))
-# endif
-#endif
-
-/*==========================================================================*/
-/* Boolean data type                                                        */
-/*==========================================================================*/
-
-/** The ICU boolean type @stable ICU 2.0 */
-typedef int8_t UBool;
-
-#ifndef TRUE
-/** The TRUE value of a UBool @stable ICU 2.0 */
-#   define TRUE  1
-#endif
-#ifndef FALSE
-/** The FALSE value of a UBool @stable ICU 2.0 */
-#   define FALSE 0
-#endif
-
-
-/*==========================================================================*/
-/* Unicode data types                                                       */
-/*==========================================================================*/
-
-/* wchar_t-related definitions -------------------------------------------- */
-
-/**
- * \def U_HAVE_WCHAR_H
- * Indicates whether <wchar.h> is available (1) or not (0). Set to 1 by default.
- *
- * @stable ICU 2.0
- */
-#ifndef U_HAVE_WCHAR_H
-#   define U_HAVE_WCHAR_H 1
-#endif
-
-/**
- * \def U_SIZEOF_WCHAR_T
- * U_SIZEOF_WCHAR_T==sizeof(wchar_t) (0 means it is not defined or autoconf could not set it)
- *
- * @stable ICU 2.0
- */
-#if U_SIZEOF_WCHAR_T==0
-#   undef U_SIZEOF_WCHAR_T
-#   define U_SIZEOF_WCHAR_T 4
-#endif
-
-/*
- * \def U_WCHAR_IS_UTF16
- * Defined if wchar_t uses UTF-16.
- *
- * @stable ICU 2.0
- */
-/*
- * \def U_WCHAR_IS_UTF32
- * Defined if wchar_t uses UTF-32.
- *
- * @stable ICU 2.0
- */
-#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32)
-#   ifdef __STDC_ISO_10646__ 
-#       if (U_SIZEOF_WCHAR_T==2)
-#           define U_WCHAR_IS_UTF16
-#       elif (U_SIZEOF_WCHAR_T==4)
-#           define  U_WCHAR_IS_UTF32
-#       endif
-#   elif defined __UCS2__
-#       if (__OS390__ || __OS400__) && (U_SIZEOF_WCHAR_T==2)
-#           define U_WCHAR_IS_UTF16
-#       endif
-#   elif defined __UCS4__
-#       if (U_SIZEOF_WCHAR_T==4)
-#           define U_WCHAR_IS_UTF32
-#       endif
-#   elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
-#       define U_WCHAR_IS_UTF16    
-#   endif
-#endif
-
-/* UChar and UChar32 definitions -------------------------------------------- */
-
-/** Number of bytes in a UChar. @stable ICU 2.0 */
-#define U_SIZEOF_UCHAR 2
-
-/**
- * \var UChar
- * Define UChar to be wchar_t if that is 16 bits wide; always assumed to be unsigned.
- * If wchar_t is not 16 bits wide, then define UChar to be uint16_t.
- * This makes the definition of UChar platform-dependent
- * but allows direct string type compatibility with platforms with
- * 16-bit wchar_t types.
- *
- * @stable ICU 2.0
- */
-
-/* Define UChar to be compatible with wchar_t if possible. */
-#if U_SIZEOF_WCHAR_T==2
-    typedef wchar_t UChar;
-#else
-    typedef uint16_t UChar;
-#endif
-
-/**
- * Define UChar32 as a type for single Unicode code points.
- * UChar32 is a signed 32-bit integer (same as int32_t).
- *
- * The Unicode code point range is 0..0x10ffff.
- * All other values (negative or >=0x110000) are illegal as Unicode code points.
- * They may be used as sentinel values to indicate "done", "error"
- * or similar non-code point conditions.
- *
- * Before ICU 2.4 (Jitterbug 2146), UChar32 was defined
- * to be wchar_t if that is 32 bits wide (wchar_t may be signed or unsigned)
- * or else to be uint32_t.
- * That is, the definition of UChar32 was platform-dependent.
- *
- * @see U_SENTINEL
- * @stable ICU 2.4
- */
-typedef int32_t UChar32;
-
-/*==========================================================================*/
-/* U_INLINE and U_ALIGN_CODE   Set default values if these are not already  */
-/*                             defined.  Definitions normally are in        */
-/*                             platform.h or the corresponding file for     */
-/*                             the OS in use.                               */
-/*==========================================================================*/
-
-/**
- * \def U_ALIGN_CODE
- * This is used to align code fragments to a specific byte boundary.
- * This is useful for getting consistent performance test results.
- * @internal
- */
-#ifndef U_ALIGN_CODE
-#   define U_ALIGN_CODE(n)
-#endif
-
-#ifndef U_INLINE
-#   define U_INLINE
-#endif
-
-#include "unicode/urename.h"
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/urename.h b/Source/JavaScriptGlue/icu/unicode/urename.h
deleted file mode 100644
index 5562592..0000000
--- a/Source/JavaScriptGlue/icu/unicode/urename.h
+++ /dev/null
@@ -1,1468 +0,0 @@
-/*
-*******************************************************************************
-*   Copyright (C) 2002-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*******************************************************************************
-*
-*   file name:  urename.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   Created by: Perl script written by Vladimir Weinstein
-*
-*  Contains data for renaming ICU exports.
-*  Gets included by umachine.h
-*
-*  THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT
-*  YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
-*/
-
-#ifndef URENAME_H
-#define URENAME_H
-
-/* Uncomment the following line to disable renaming on platforms
-   that do not use Autoconf. */
-/* #define U_DISABLE_RENAMING 1 */
-
-#if !U_DISABLE_RENAMING
-
-/* C exports renaming data */
-
-#define T_CString_int64ToString T_CString_int64ToString_3_2
-#define T_CString_integerToString T_CString_integerToString_3_2
-#define T_CString_stricmp T_CString_stricmp_3_2
-#define T_CString_stringToInteger T_CString_stringToInteger_3_2
-#define T_CString_strnicmp T_CString_strnicmp_3_2
-#define T_CString_toLowerCase T_CString_toLowerCase_3_2
-#define T_CString_toUpperCase T_CString_toUpperCase_3_2
-#define T_FileStream_close T_FileStream_close_3_2
-#define T_FileStream_eof T_FileStream_eof_3_2
-#define T_FileStream_error T_FileStream_error_3_2
-#define T_FileStream_file_exists T_FileStream_file_exists_3_2
-#define T_FileStream_getc T_FileStream_getc_3_2
-#define T_FileStream_open T_FileStream_open_3_2
-#define T_FileStream_peek T_FileStream_peek_3_2
-#define T_FileStream_putc T_FileStream_putc_3_2
-#define T_FileStream_read T_FileStream_read_3_2
-#define T_FileStream_readLine T_FileStream_readLine_3_2
-#define T_FileStream_remove T_FileStream_remove_3_2
-#define T_FileStream_rewind T_FileStream_rewind_3_2
-#define T_FileStream_size T_FileStream_size_3_2
-#define T_FileStream_stderr T_FileStream_stderr_3_2
-#define T_FileStream_stdin T_FileStream_stdin_3_2
-#define T_FileStream_stdout T_FileStream_stdout_3_2
-#define T_FileStream_ungetc T_FileStream_ungetc_3_2
-#define T_FileStream_write T_FileStream_write_3_2
-#define T_FileStream_writeLine T_FileStream_writeLine_3_2
-#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_2
-#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_2
-#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_2
-#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_2
-#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_2
-#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_2
-#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_2
-#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_2
-#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_2
-#define UDataMemory_init UDataMemory_init_3_2
-#define UDataMemory_isLoaded UDataMemory_isLoaded_3_2
-#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_2
-#define UDataMemory_setData UDataMemory_setData_3_2
-#define UDatamemory_assign UDatamemory_assign_3_2
-#define _ASCIIData _ASCIIData_3_2
-#define _Bocu1Data _Bocu1Data_3_2
-#define _CESU8Data _CESU8Data_3_2
-#define _HZData _HZData_3_2
-#define _IMAPData _IMAPData_3_2
-#define _ISCIIData _ISCIIData_3_2
-#define _ISO2022Data _ISO2022Data_3_2
-#define _LMBCSData1 _LMBCSData1_3_2
-#define _LMBCSData11 _LMBCSData11_3_2
-#define _LMBCSData16 _LMBCSData16_3_2
-#define _LMBCSData17 _LMBCSData17_3_2
-#define _LMBCSData18 _LMBCSData18_3_2
-#define _LMBCSData19 _LMBCSData19_3_2
-#define _LMBCSData2 _LMBCSData2_3_2
-#define _LMBCSData3 _LMBCSData3_3_2
-#define _LMBCSData4 _LMBCSData4_3_2
-#define _LMBCSData5 _LMBCSData5_3_2
-#define _LMBCSData6 _LMBCSData6_3_2
-#define _LMBCSData8 _LMBCSData8_3_2
-#define _Latin1Data _Latin1Data_3_2
-#define _MBCSData _MBCSData_3_2
-#define _SCSUData _SCSUData_3_2
-#define _UTF16BEData _UTF16BEData_3_2
-#define _UTF16Data _UTF16Data_3_2
-#define _UTF16LEData _UTF16LEData_3_2
-#define _UTF32BEData _UTF32BEData_3_2
-#define _UTF32Data _UTF32Data_3_2
-#define _UTF32LEData _UTF32LEData_3_2
-#define _UTF7Data _UTF7Data_3_2
-#define _UTF8Data _UTF8Data_3_2
-#define cmemory_cleanup cmemory_cleanup_3_2
-#define cmemory_inUse cmemory_inUse_3_2
-#define locale_getKeywords locale_getKeywords_3_2
-#define locale_get_default locale_get_default_3_2
-#define locale_set_default locale_set_default_3_2
-#define res_countArrayItems res_countArrayItems_3_2
-#define res_findResource res_findResource_3_2
-#define res_getAlias res_getAlias_3_2
-#define res_getArrayItem res_getArrayItem_3_2
-#define res_getBinary res_getBinary_3_2
-#define res_getIntVector res_getIntVector_3_2
-#define res_getResource res_getResource_3_2
-#define res_getString res_getString_3_2
-#define res_getTableItemByIndex res_getTableItemByIndex_3_2
-#define res_getTableItemByKey res_getTableItemByKey_3_2
-#define res_load res_load_3_2
-#define res_unload res_unload_3_2
-#define transliterator_cleanup transliterator_cleanup_3_2
-#define u_UCharsToChars u_UCharsToChars_3_2
-#define u_austrcpy u_austrcpy_3_2
-#define u_austrncpy u_austrncpy_3_2
-#define u_catclose u_catclose_3_2
-#define u_catgets u_catgets_3_2
-#define u_catopen u_catopen_3_2
-#define u_charAge u_charAge_3_2
-#define u_charDigitValue u_charDigitValue_3_2
-#define u_charDirection u_charDirection_3_2
-#define u_charFromName u_charFromName_3_2
-#define u_charMirror u_charMirror_3_2
-#define u_charName u_charName_3_2
-#define u_charType u_charType_3_2
-#define u_charsToUChars u_charsToUChars_3_2
-#define u_cleanup u_cleanup_3_2
-#define u_countChar32 u_countChar32_3_2
-#define u_digit u_digit_3_2
-#define u_enumCharNames u_enumCharNames_3_2
-#define u_enumCharTypes u_enumCharTypes_3_2
-#define u_errorName u_errorName_3_2
-#define u_fclose u_fclose_3_2
-#define u_feof u_feof_3_2
-#define u_fflush u_fflush_3_2
-#define u_fgetConverter u_fgetConverter_3_2
-#define u_fgetc u_fgetc_3_2
-#define u_fgetcodepage u_fgetcodepage_3_2
-#define u_fgetcx u_fgetcx_3_2
-#define u_fgetfile u_fgetfile_3_2
-#define u_fgetlocale u_fgetlocale_3_2
-#define u_fgets u_fgets_3_2
-#define u_file_read u_file_read_3_2
-#define u_file_write u_file_write_3_2
-#define u_file_write_flush u_file_write_flush_3_2
-#define u_finit u_finit_3_2
-#define u_foldCase u_foldCase_3_2
-#define u_fopen u_fopen_3_2
-#define u_forDigit u_forDigit_3_2
-#define u_formatMessage u_formatMessage_3_2
-#define u_formatMessageWithError u_formatMessageWithError_3_2
-#define u_fprintf u_fprintf_3_2
-#define u_fprintf_u u_fprintf_u_3_2
-#define u_fputc u_fputc_3_2
-#define u_fputs u_fputs_3_2
-#define u_frewind u_frewind_3_2
-#define u_fscanf u_fscanf_3_2
-#define u_fscanf_u u_fscanf_u_3_2
-#define u_fsetcodepage u_fsetcodepage_3_2
-#define u_fsetlocale u_fsetlocale_3_2
-#define u_fsettransliterator u_fsettransliterator_3_2
-#define u_fstropen u_fstropen_3_2
-#define u_fungetc u_fungetc_3_2
-#define u_getCombiningClass u_getCombiningClass_3_2
-#define u_getDataDirectory u_getDataDirectory_3_2
-#define u_getDefaultConverter u_getDefaultConverter_3_2
-#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_2
-#define u_getISOComment u_getISOComment_3_2
-#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_2
-#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_2
-#define u_getIntPropertyValue u_getIntPropertyValue_3_2
-#define u_getNumericValue u_getNumericValue_3_2
-#define u_getPropertyEnum u_getPropertyEnum_3_2
-#define u_getPropertyName u_getPropertyName_3_2
-#define u_getPropertyValueEnum u_getPropertyValueEnum_3_2
-#define u_getPropertyValueName u_getPropertyValueName_3_2
-#define u_getUnicodeProperties u_getUnicodeProperties_3_2
-#define u_getUnicodeVersion u_getUnicodeVersion_3_2
-#define u_getVersion u_getVersion_3_2
-#define u_growBufferFromStatic u_growBufferFromStatic_3_2
-#define u_hasBinaryProperty u_hasBinaryProperty_3_2
-#define u_init u_init_3_2
-#define u_isIDIgnorable u_isIDIgnorable_3_2
-#define u_isIDPart u_isIDPart_3_2
-#define u_isIDStart u_isIDStart_3_2
-#define u_isISOControl u_isISOControl_3_2
-#define u_isJavaIDPart u_isJavaIDPart_3_2
-#define u_isJavaIDStart u_isJavaIDStart_3_2
-#define u_isJavaSpaceChar u_isJavaSpaceChar_3_2
-#define u_isMirrored u_isMirrored_3_2
-#define u_isUAlphabetic u_isUAlphabetic_3_2
-#define u_isULowercase u_isULowercase_3_2
-#define u_isUUppercase u_isUUppercase_3_2
-#define u_isUWhiteSpace u_isUWhiteSpace_3_2
-#define u_isWhitespace u_isWhitespace_3_2
-#define u_isalnum u_isalnum_3_2
-#define u_isalpha u_isalpha_3_2
-#define u_isbase u_isbase_3_2
-#define u_isblank u_isblank_3_2
-#define u_iscntrl u_iscntrl_3_2
-#define u_isdefined u_isdefined_3_2
-#define u_isdigit u_isdigit_3_2
-#define u_isgraph u_isgraph_3_2
-#define u_islower u_islower_3_2
-#define u_isprint u_isprint_3_2
-#define u_ispunct u_ispunct_3_2
-#define u_isspace u_isspace_3_2
-#define u_istitle u_istitle_3_2
-#define u_isupper u_isupper_3_2
-#define u_isxdigit u_isxdigit_3_2
-#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_2
-#define u_locbund_close u_locbund_close_3_2
-#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_2
-#define u_locbund_init u_locbund_init_3_2
-#define u_memcasecmp u_memcasecmp_3_2
-#define u_memchr u_memchr_3_2
-#define u_memchr32 u_memchr32_3_2
-#define u_memcmp u_memcmp_3_2
-#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_2
-#define u_memcpy u_memcpy_3_2
-#define u_memmove u_memmove_3_2
-#define u_memrchr u_memrchr_3_2
-#define u_memrchr32 u_memrchr32_3_2
-#define u_memset u_memset_3_2
-#define u_parseMessage u_parseMessage_3_2
-#define u_parseMessageWithError u_parseMessageWithError_3_2
-#define u_printf_parse u_printf_parse_3_2
-#define u_releaseDefaultConverter u_releaseDefaultConverter_3_2
-#define u_scanf_parse u_scanf_parse_3_2
-#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_2
-#define u_setDataDirectory u_setDataDirectory_3_2
-#define u_setMemoryFunctions u_setMemoryFunctions_3_2
-#define u_setMutexFunctions u_setMutexFunctions_3_2
-#define u_shapeArabic u_shapeArabic_3_2
-#define u_snprintf u_snprintf_3_2
-#define u_snprintf_u u_snprintf_u_3_2
-#define u_sprintf u_sprintf_3_2
-#define u_sprintf_u u_sprintf_u_3_2
-#define u_sscanf u_sscanf_3_2
-#define u_sscanf_u u_sscanf_u_3_2
-#define u_strCaseCompare u_strCaseCompare_3_2
-#define u_strCompare u_strCompare_3_2
-#define u_strCompareIter u_strCompareIter_3_2
-#define u_strFindFirst u_strFindFirst_3_2
-#define u_strFindLast u_strFindLast_3_2
-#define u_strFoldCase u_strFoldCase_3_2
-#define u_strFromPunycode u_strFromPunycode_3_2
-#define u_strFromUTF32 u_strFromUTF32_3_2
-#define u_strFromUTF8 u_strFromUTF8_3_2
-#define u_strFromWCS u_strFromWCS_3_2
-#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_2
-#define u_strToLower u_strToLower_3_2
-#define u_strToPunycode u_strToPunycode_3_2
-#define u_strToTitle u_strToTitle_3_2
-#define u_strToUTF32 u_strToUTF32_3_2
-#define u_strToUTF8 u_strToUTF8_3_2
-#define u_strToUpper u_strToUpper_3_2
-#define u_strToWCS u_strToWCS_3_2
-#define u_strcasecmp u_strcasecmp_3_2
-#define u_strcat u_strcat_3_2
-#define u_strchr u_strchr_3_2
-#define u_strchr32 u_strchr32_3_2
-#define u_strcmp u_strcmp_3_2
-#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_2
-#define u_strcmpFold u_strcmpFold_3_2
-#define u_strcpy u_strcpy_3_2
-#define u_strcspn u_strcspn_3_2
-#define u_strlen u_strlen_3_2
-#define u_strncasecmp u_strncasecmp_3_2
-#define u_strncat u_strncat_3_2
-#define u_strncmp u_strncmp_3_2
-#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_2
-#define u_strncpy u_strncpy_3_2
-#define u_strpbrk u_strpbrk_3_2
-#define u_strrchr u_strrchr_3_2
-#define u_strrchr32 u_strrchr32_3_2
-#define u_strrstr u_strrstr_3_2
-#define u_strspn u_strspn_3_2
-#define u_strstr u_strstr_3_2
-#define u_strtok_r u_strtok_r_3_2
-#define u_terminateChars u_terminateChars_3_2
-#define u_terminateUChar32s u_terminateUChar32s_3_2
-#define u_terminateUChars u_terminateUChars_3_2
-#define u_terminateWChars u_terminateWChars_3_2
-#define u_tolower u_tolower_3_2
-#define u_totitle u_totitle_3_2
-#define u_toupper u_toupper_3_2
-#define u_uastrcpy u_uastrcpy_3_2
-#define u_uastrncpy u_uastrncpy_3_2
-#define u_unescape u_unescape_3_2
-#define u_unescapeAt u_unescapeAt_3_2
-#define u_versionFromString u_versionFromString_3_2
-#define u_versionToString u_versionToString_3_2
-#define u_vformatMessage u_vformatMessage_3_2
-#define u_vformatMessageWithError u_vformatMessageWithError_3_2
-#define u_vfprintf u_vfprintf_3_2
-#define u_vfprintf_u u_vfprintf_u_3_2
-#define u_vfscanf u_vfscanf_3_2
-#define u_vfscanf_u u_vfscanf_u_3_2
-#define u_vparseMessage u_vparseMessage_3_2
-#define u_vparseMessageWithError u_vparseMessageWithError_3_2
-#define u_vsnprintf u_vsnprintf_3_2
-#define u_vsnprintf_u u_vsnprintf_u_3_2
-#define u_vsprintf u_vsprintf_3_2
-#define u_vsprintf_u u_vsprintf_u_3_2
-#define u_vsscanf u_vsscanf_3_2
-#define u_vsscanf_u u_vsscanf_u_3_2
-#define u_writeDiff u_writeDiff_3_2
-#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_2
-#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_2
-#define ubidi_close ubidi_close_3_2
-#define ubidi_countRuns ubidi_countRuns_3_2
-#define ubidi_getDirection ubidi_getDirection_3_2
-#define ubidi_getLength ubidi_getLength_3_2
-#define ubidi_getLevelAt ubidi_getLevelAt_3_2
-#define ubidi_getLevels ubidi_getLevels_3_2
-#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_2
-#define ubidi_getLogicalMap ubidi_getLogicalMap_3_2
-#define ubidi_getLogicalRun ubidi_getLogicalRun_3_2
-#define ubidi_getMemory ubidi_getMemory_3_2
-#define ubidi_getParaLevel ubidi_getParaLevel_3_2
-#define ubidi_getRuns ubidi_getRuns_3_2
-#define ubidi_getText ubidi_getText_3_2
-#define ubidi_getVisualIndex ubidi_getVisualIndex_3_2
-#define ubidi_getVisualMap ubidi_getVisualMap_3_2
-#define ubidi_getVisualRun ubidi_getVisualRun_3_2
-#define ubidi_invertMap ubidi_invertMap_3_2
-#define ubidi_isInverse ubidi_isInverse_3_2
-#define ubidi_open ubidi_open_3_2
-#define ubidi_openSized ubidi_openSized_3_2
-#define ubidi_reorderLogical ubidi_reorderLogical_3_2
-#define ubidi_reorderVisual ubidi_reorderVisual_3_2
-#define ubidi_setInverse ubidi_setInverse_3_2
-#define ubidi_setLine ubidi_setLine_3_2
-#define ubidi_setPara ubidi_setPara_3_2
-#define ubidi_writeReordered ubidi_writeReordered_3_2
-#define ubidi_writeReverse ubidi_writeReverse_3_2
-#define ublock_getCode ublock_getCode_3_2
-#define ubrk_close ubrk_close_3_2
-#define ubrk_countAvailable ubrk_countAvailable_3_2
-#define ubrk_current ubrk_current_3_2
-#define ubrk_first ubrk_first_3_2
-#define ubrk_following ubrk_following_3_2
-#define ubrk_getAvailable ubrk_getAvailable_3_2
-#define ubrk_getLocaleByType ubrk_getLocaleByType_3_2
-#define ubrk_getRuleStatus ubrk_getRuleStatus_3_2
-#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_2
-#define ubrk_isBoundary ubrk_isBoundary_3_2
-#define ubrk_last ubrk_last_3_2
-#define ubrk_next ubrk_next_3_2
-#define ubrk_open ubrk_open_3_2
-#define ubrk_openRules ubrk_openRules_3_2
-#define ubrk_preceding ubrk_preceding_3_2
-#define ubrk_previous ubrk_previous_3_2
-#define ubrk_safeClone ubrk_safeClone_3_2
-#define ubrk_setText ubrk_setText_3_2
-#define ubrk_swap ubrk_swap_3_2
-#define ucal_add ucal_add_3_2
-#define ucal_clear ucal_clear_3_2
-#define ucal_clearField ucal_clearField_3_2
-#define ucal_close ucal_close_3_2
-#define ucal_countAvailable ucal_countAvailable_3_2
-#define ucal_equivalentTo ucal_equivalentTo_3_2
-#define ucal_get ucal_get_3_2
-#define ucal_getAttribute ucal_getAttribute_3_2
-#define ucal_getAvailable ucal_getAvailable_3_2
-#define ucal_getDSTSavings ucal_getDSTSavings_3_2
-#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_2
-#define ucal_getLimit ucal_getLimit_3_2
-#define ucal_getLocaleByType ucal_getLocaleByType_3_2
-#define ucal_getMillis ucal_getMillis_3_2
-#define ucal_getNow ucal_getNow_3_2
-#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_2
-#define ucal_inDaylightTime ucal_inDaylightTime_3_2
-#define ucal_isSet ucal_isSet_3_2
-#define ucal_open ucal_open_3_2
-#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_2
-#define ucal_openTimeZones ucal_openTimeZones_3_2
-#define ucal_roll ucal_roll_3_2
-#define ucal_set ucal_set_3_2
-#define ucal_setAttribute ucal_setAttribute_3_2
-#define ucal_setDate ucal_setDate_3_2
-#define ucal_setDateTime ucal_setDateTime_3_2
-#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_2
-#define ucal_setMillis ucal_setMillis_3_2
-#define ucal_setTimeZone ucal_setTimeZone_3_2
-#define ucase_addPropertyStarts ucase_addPropertyStarts_3_2
-#define ucase_close ucase_close_3_2
-#define ucase_fold ucase_fold_3_2
-#define ucase_getSingleton ucase_getSingleton_3_2
-#define ucase_getType ucase_getType_3_2
-#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_2
-#define ucase_isCaseSensitive ucase_isCaseSensitive_3_2
-#define ucase_isSoftDotted ucase_isSoftDotted_3_2
-#define ucase_open ucase_open_3_2
-#define ucase_openBinary ucase_openBinary_3_2
-#define ucase_swap ucase_swap_3_2
-#define ucase_toFullFolding ucase_toFullFolding_3_2
-#define ucase_toFullLower ucase_toFullLower_3_2
-#define ucase_toFullTitle ucase_toFullTitle_3_2
-#define ucase_toFullUpper ucase_toFullUpper_3_2
-#define ucase_tolower ucase_tolower_3_2
-#define ucase_totitle ucase_totitle_3_2
-#define ucase_toupper ucase_toupper_3_2
-#define uchar_addPropertyStarts uchar_addPropertyStarts_3_2
-#define uchar_getHST uchar_getHST_3_2
-#define uchar_swapNames uchar_swapNames_3_2
-#define ucln_common_lib_cleanup ucln_common_lib_cleanup_3_2
-#define ucln_common_registerCleanup ucln_common_registerCleanup_3_2
-#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_2
-#define ucln_registerCleanup ucln_registerCleanup_3_2
-#define ucmp8_close ucmp8_close_3_2
-#define ucmp8_compact ucmp8_compact_3_2
-#define ucmp8_expand ucmp8_expand_3_2
-#define ucmp8_flattenMem ucmp8_flattenMem_3_2
-#define ucmp8_getArray ucmp8_getArray_3_2
-#define ucmp8_getCount ucmp8_getCount_3_2
-#define ucmp8_getIndex ucmp8_getIndex_3_2
-#define ucmp8_getkBlockCount ucmp8_getkBlockCount_3_2
-#define ucmp8_getkUnicodeCount ucmp8_getkUnicodeCount_3_2
-#define ucmp8_init ucmp8_init_3_2
-#define ucmp8_initAdopt ucmp8_initAdopt_3_2
-#define ucmp8_initAlias ucmp8_initAlias_3_2
-#define ucmp8_initBogus ucmp8_initBogus_3_2
-#define ucmp8_initFromData ucmp8_initFromData_3_2
-#define ucmp8_isBogus ucmp8_isBogus_3_2
-#define ucmp8_open ucmp8_open_3_2
-#define ucmp8_openAdopt ucmp8_openAdopt_3_2
-#define ucmp8_openAlias ucmp8_openAlias_3_2
-#define ucmp8_set ucmp8_set_3_2
-#define ucmp8_setRange ucmp8_setRange_3_2
-#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_2
-#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_2
-#define ucnv_MBCSGetType ucnv_MBCSGetType_3_2
-#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_2
-#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_2
-#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_2
-#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_2
-#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_2
-#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_2
-#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_2
-#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_2
-#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_2
-#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_2
-#define ucnv_close ucnv_close_3_2
-#define ucnv_compareNames ucnv_compareNames_3_2
-#define ucnv_convert ucnv_convert_3_2
-#define ucnv_convertEx ucnv_convertEx_3_2
-#define ucnv_copyPlatformString ucnv_copyPlatformString_3_2
-#define ucnv_countAliases ucnv_countAliases_3_2
-#define ucnv_countAvailable ucnv_countAvailable_3_2
-#define ucnv_countStandards ucnv_countStandards_3_2
-#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_2
-#define ucnv_createConverter ucnv_createConverter_3_2
-#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_2
-#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_2
-#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_2
-#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_2
-#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_2
-#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_2
-#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_2
-#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_2
-#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_2
-#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_2
-#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_2
-#define ucnv_flushCache ucnv_flushCache_3_2
-#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_2
-#define ucnv_fromUChars ucnv_fromUChars_3_2
-#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_2
-#define ucnv_fromUnicode ucnv_fromUnicode_3_2
-#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_2
-#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_2
-#define ucnv_getAlias ucnv_getAlias_3_2
-#define ucnv_getAliases ucnv_getAliases_3_2
-#define ucnv_getAvailableName ucnv_getAvailableName_3_2
-#define ucnv_getCCSID ucnv_getCCSID_3_2
-#define ucnv_getCanonicalName ucnv_getCanonicalName_3_2
-#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_2
-#define ucnv_getDefaultName ucnv_getDefaultName_3_2
-#define ucnv_getDisplayName ucnv_getDisplayName_3_2
-#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_2
-#define ucnv_getInvalidChars ucnv_getInvalidChars_3_2
-#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_2
-#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_2
-#define ucnv_getMinCharSize ucnv_getMinCharSize_3_2
-#define ucnv_getName ucnv_getName_3_2
-#define ucnv_getNextUChar ucnv_getNextUChar_3_2
-#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_2
-#define ucnv_getPlatform ucnv_getPlatform_3_2
-#define ucnv_getStandard ucnv_getStandard_3_2
-#define ucnv_getStandardName ucnv_getStandardName_3_2
-#define ucnv_getStarters ucnv_getStarters_3_2
-#define ucnv_getSubstChars ucnv_getSubstChars_3_2
-#define ucnv_getToUCallBack ucnv_getToUCallBack_3_2
-#define ucnv_getType ucnv_getType_3_2
-#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_2
-#define ucnv_incrementRefCount ucnv_incrementRefCount_3_2
-#define ucnv_io_countAliases ucnv_io_countAliases_3_2
-#define ucnv_io_countAvailableAliases ucnv_io_countAvailableAliases_3_2
-#define ucnv_io_countAvailableConverters ucnv_io_countAvailableConverters_3_2
-#define ucnv_io_countStandards ucnv_io_countStandards_3_2
-#define ucnv_io_flushAvailableConverterCache ucnv_io_flushAvailableConverterCache_3_2
-#define ucnv_io_getAlias ucnv_io_getAlias_3_2
-#define ucnv_io_getAliases ucnv_io_getAliases_3_2
-#define ucnv_io_getAvailableConverter ucnv_io_getAvailableConverter_3_2
-#define ucnv_io_getConverterName ucnv_io_getConverterName_3_2
-#define ucnv_io_getDefaultConverterName ucnv_io_getDefaultConverterName_3_2
-#define ucnv_io_setDefaultConverterName ucnv_io_setDefaultConverterName_3_2
-#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_2
-#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_2
-#define ucnv_isAmbiguous ucnv_isAmbiguous_3_2
-#define ucnv_load ucnv_load_3_2
-#define ucnv_loadSharedData ucnv_loadSharedData_3_2
-#define ucnv_open ucnv_open_3_2
-#define ucnv_openAllNames ucnv_openAllNames_3_2
-#define ucnv_openCCSID ucnv_openCCSID_3_2
-#define ucnv_openPackage ucnv_openPackage_3_2
-#define ucnv_openStandardNames ucnv_openStandardNames_3_2
-#define ucnv_openU ucnv_openU_3_2
-#define ucnv_reset ucnv_reset_3_2
-#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_2
-#define ucnv_resetToUnicode ucnv_resetToUnicode_3_2
-#define ucnv_safeClone ucnv_safeClone_3_2
-#define ucnv_setDefaultName ucnv_setDefaultName_3_2
-#define ucnv_setFallback ucnv_setFallback_3_2
-#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_2
-#define ucnv_setSubstChars ucnv_setSubstChars_3_2
-#define ucnv_setToUCallBack ucnv_setToUCallBack_3_2
-#define ucnv_swap ucnv_swap_3_2
-#define ucnv_swapAliases ucnv_swapAliases_3_2
-#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_2
-#define ucnv_toUChars ucnv_toUChars_3_2
-#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_2
-#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_2
-#define ucnv_toUnicode ucnv_toUnicode_3_2
-#define ucnv_unload ucnv_unload_3_2
-#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_2
-#define ucnv_usesFallback ucnv_usesFallback_3_2
-#define ucol_allocWeights ucol_allocWeights_3_2
-#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_2
-#define ucol_calcSortKey ucol_calcSortKey_3_2
-#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_2
-#define ucol_cloneBinary ucol_cloneBinary_3_2
-#define ucol_cloneRuleData ucol_cloneRuleData_3_2
-#define ucol_close ucol_close_3_2
-#define ucol_closeElements ucol_closeElements_3_2
-#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_2
-#define ucol_countAvailable ucol_countAvailable_3_2
-#define ucol_createElements ucol_createElements_3_2
-#define ucol_doCE ucol_doCE_3_2
-#define ucol_equal ucol_equal_3_2
-#define ucol_equals ucol_equals_3_2
-#define ucol_getAttribute ucol_getAttribute_3_2
-#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_2
-#define ucol_getAvailable ucol_getAvailable_3_2
-#define ucol_getBound ucol_getBound_3_2
-#define ucol_getCEGenerator ucol_getCEGenerator_3_2
-#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_2
-#define ucol_getContractions ucol_getContractions_3_2
-#define ucol_getDisplayName ucol_getDisplayName_3_2
-#define ucol_getFirstCE ucol_getFirstCE_3_2
-#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_2
-#define ucol_getKeywordValues ucol_getKeywordValues_3_2
-#define ucol_getKeywords ucol_getKeywords_3_2
-#define ucol_getLocale ucol_getLocale_3_2
-#define ucol_getLocaleByType ucol_getLocaleByType_3_2
-#define ucol_getMaxExpansion ucol_getMaxExpansion_3_2
-#define ucol_getNextCE ucol_getNextCE_3_2
-#define ucol_getNextGenerated ucol_getNextGenerated_3_2
-#define ucol_getOffset ucol_getOffset_3_2
-#define ucol_getPrevCE ucol_getPrevCE_3_2
-#define ucol_getRules ucol_getRules_3_2
-#define ucol_getRulesEx ucol_getRulesEx_3_2
-#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_2
-#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_2
-#define ucol_getSortKey ucol_getSortKey_3_2
-#define ucol_getSortKeySize ucol_getSortKeySize_3_2
-#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_2
-#define ucol_getStrength ucol_getStrength_3_2
-#define ucol_getTailoredSet ucol_getTailoredSet_3_2
-#define ucol_getUCAVersion ucol_getUCAVersion_3_2
-#define ucol_getUnsafeSet ucol_getUnsafeSet_3_2
-#define ucol_getVariableTop ucol_getVariableTop_3_2
-#define ucol_getVersion ucol_getVersion_3_2
-#define ucol_greater ucol_greater_3_2
-#define ucol_greaterOrEqual ucol_greaterOrEqual_3_2
-#define ucol_identifierToShortString ucol_identifierToShortString_3_2
-#define ucol_initBuffers ucol_initBuffers_3_2
-#define ucol_initCollator ucol_initCollator_3_2
-#define ucol_initInverseUCA ucol_initInverseUCA_3_2
-#define ucol_initUCA ucol_initUCA_3_2
-#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_2
-#define ucol_inv_getNextCE ucol_inv_getNextCE_3_2
-#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_2
-#define ucol_isTailored ucol_isTailored_3_2
-#define ucol_keyHashCode ucol_keyHashCode_3_2
-#define ucol_mergeSortkeys ucol_mergeSortkeys_3_2
-#define ucol_next ucol_next_3_2
-#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_2
-#define ucol_nextWeight ucol_nextWeight_3_2
-#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_2
-#define ucol_open ucol_open_3_2
-#define ucol_openAvailableLocales ucol_openAvailableLocales_3_2
-#define ucol_openBinary ucol_openBinary_3_2
-#define ucol_openElements ucol_openElements_3_2
-#define ucol_openFromIdentifier ucol_openFromIdentifier_3_2
-#define ucol_openFromShortString ucol_openFromShortString_3_2
-#define ucol_openRules ucol_openRules_3_2
-#define ucol_open_internal ucol_open_internal_3_2
-#define ucol_previous ucol_previous_3_2
-#define ucol_primaryOrder ucol_primaryOrder_3_2
-#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_2
-#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_2
-#define ucol_reset ucol_reset_3_2
-#define ucol_restoreVariableTop ucol_restoreVariableTop_3_2
-#define ucol_safeClone ucol_safeClone_3_2
-#define ucol_secondaryOrder ucol_secondaryOrder_3_2
-#define ucol_setAttribute ucol_setAttribute_3_2
-#define ucol_setOffset ucol_setOffset_3_2
-#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_2
-#define ucol_setReqValidLocales ucol_setReqValidLocales_3_2
-#define ucol_setStrength ucol_setStrength_3_2
-#define ucol_setText ucol_setText_3_2
-#define ucol_setVariableTop ucol_setVariableTop_3_2
-#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_2
-#define ucol_sortKeyToString ucol_sortKeyToString_3_2
-#define ucol_strcoll ucol_strcoll_3_2
-#define ucol_strcollIter ucol_strcollIter_3_2
-#define ucol_swap ucol_swap_3_2
-#define ucol_swapBinary ucol_swapBinary_3_2
-#define ucol_swapInverseUCA ucol_swapInverseUCA_3_2
-#define ucol_tertiaryOrder ucol_tertiaryOrder_3_2
-#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_2
-#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_2
-#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_2
-#define ucol_tok_initTokenList ucol_tok_initTokenList_3_2
-#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_2
-#define ucol_updateInternalState ucol_updateInternalState_3_2
-#define ucurr_forLocale ucurr_forLocale_3_2
-#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_2
-#define ucurr_getName ucurr_getName_3_2
-#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_2
-#define ucurr_register ucurr_register_3_2
-#define ucurr_unregister ucurr_unregister_3_2
-#define udat_applyPattern udat_applyPattern_3_2
-#define udat_clone udat_clone_3_2
-#define udat_close udat_close_3_2
-#define udat_countAvailable udat_countAvailable_3_2
-#define udat_countSymbols udat_countSymbols_3_2
-#define udat_format udat_format_3_2
-#define udat_get2DigitYearStart udat_get2DigitYearStart_3_2
-#define udat_getAvailable udat_getAvailable_3_2
-#define udat_getCalendar udat_getCalendar_3_2
-#define udat_getLocaleByType udat_getLocaleByType_3_2
-#define udat_getNumberFormat udat_getNumberFormat_3_2
-#define udat_getSymbols udat_getSymbols_3_2
-#define udat_isLenient udat_isLenient_3_2
-#define udat_open udat_open_3_2
-#define udat_parse udat_parse_3_2
-#define udat_parseCalendar udat_parseCalendar_3_2
-#define udat_set2DigitYearStart udat_set2DigitYearStart_3_2
-#define udat_setCalendar udat_setCalendar_3_2
-#define udat_setLenient udat_setLenient_3_2
-#define udat_setNumberFormat udat_setNumberFormat_3_2
-#define udat_setSymbols udat_setSymbols_3_2
-#define udat_toPattern udat_toPattern_3_2
-#define udata_checkCommonData udata_checkCommonData_3_2
-#define udata_close udata_close_3_2
-#define udata_closeSwapper udata_closeSwapper_3_2
-#define udata_getHeaderSize udata_getHeaderSize_3_2
-#define udata_getInfo udata_getInfo_3_2
-#define udata_getInfoSize udata_getInfoSize_3_2
-#define udata_getLength udata_getLength_3_2
-#define udata_getMemory udata_getMemory_3_2
-#define udata_getRawMemory udata_getRawMemory_3_2
-#define udata_open udata_open_3_2
-#define udata_openChoice udata_openChoice_3_2
-#define udata_openSwapper udata_openSwapper_3_2
-#define udata_openSwapperForInputData udata_openSwapperForInputData_3_2
-#define udata_printError udata_printError_3_2
-#define udata_readInt16 udata_readInt16_3_2
-#define udata_readInt32 udata_readInt32_3_2
-#define udata_setAppData udata_setAppData_3_2
-#define udata_setCommonData udata_setCommonData_3_2
-#define udata_swapDataHeader udata_swapDataHeader_3_2
-#define udata_swapInvStringBlock udata_swapInvStringBlock_3_2
-#define uenum_close uenum_close_3_2
-#define uenum_count uenum_count_3_2
-#define uenum_next uenum_next_3_2
-#define uenum_nextDefault uenum_nextDefault_3_2
-#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_2
-#define uenum_openStringEnumeration uenum_openStringEnumeration_3_2
-#define uenum_reset uenum_reset_3_2
-#define uenum_unext uenum_unext_3_2
-#define uenum_unextDefault uenum_unextDefault_3_2
-#define ufile_close_translit ufile_close_translit_3_2
-#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_2
-#define ufile_flush_translit ufile_flush_translit_3_2
-#define ufile_getch ufile_getch_3_2
-#define ufile_getch32 ufile_getch32_3_2
-#define ufmt_64tou ufmt_64tou_3_2
-#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_2
-#define ufmt_digitvalue ufmt_digitvalue_3_2
-#define ufmt_isdigit ufmt_isdigit_3_2
-#define ufmt_ptou ufmt_ptou_3_2
-#define ufmt_uto64 ufmt_uto64_3_2
-#define ufmt_utop ufmt_utop_3_2
-#define uhash_close uhash_close_3_2
-#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_2
-#define uhash_compareChars uhash_compareChars_3_2
-#define uhash_compareIChars uhash_compareIChars_3_2
-#define uhash_compareLong uhash_compareLong_3_2
-#define uhash_compareUChars uhash_compareUChars_3_2
-#define uhash_compareUnicodeString uhash_compareUnicodeString_3_2
-#define uhash_count uhash_count_3_2
-#define uhash_deleteHashtable uhash_deleteHashtable_3_2
-#define uhash_deleteUVector uhash_deleteUVector_3_2
-#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_2
-#define uhash_find uhash_find_3_2
-#define uhash_freeBlock uhash_freeBlock_3_2
-#define uhash_get uhash_get_3_2
-#define uhash_geti uhash_geti_3_2
-#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_2
-#define uhash_hashChars uhash_hashChars_3_2
-#define uhash_hashIChars uhash_hashIChars_3_2
-#define uhash_hashLong uhash_hashLong_3_2
-#define uhash_hashUChars uhash_hashUChars_3_2
-#define uhash_hashUCharsN uhash_hashUCharsN_3_2
-#define uhash_hashUnicodeString uhash_hashUnicodeString_3_2
-#define uhash_iget uhash_iget_3_2
-#define uhash_igeti uhash_igeti_3_2
-#define uhash_iput uhash_iput_3_2
-#define uhash_iputi uhash_iputi_3_2
-#define uhash_iremove uhash_iremove_3_2
-#define uhash_iremovei uhash_iremovei_3_2
-#define uhash_nextElement uhash_nextElement_3_2
-#define uhash_open uhash_open_3_2
-#define uhash_openSize uhash_openSize_3_2
-#define uhash_put uhash_put_3_2
-#define uhash_puti uhash_puti_3_2
-#define uhash_remove uhash_remove_3_2
-#define uhash_removeAll uhash_removeAll_3_2
-#define uhash_removeElement uhash_removeElement_3_2
-#define uhash_removei uhash_removei_3_2
-#define uhash_setKeyComparator uhash_setKeyComparator_3_2
-#define uhash_setKeyDeleter uhash_setKeyDeleter_3_2
-#define uhash_setKeyHasher uhash_setKeyHasher_3_2
-#define uhash_setResizePolicy uhash_setResizePolicy_3_2
-#define uhash_setValueDeleter uhash_setValueDeleter_3_2
-#define uhash_toki uhash_toki_3_2
-#define uhash_tokp uhash_tokp_3_2
-#define uhst_addPropertyStarts uhst_addPropertyStarts_3_2
-#define uidna_IDNToASCII uidna_IDNToASCII_3_2
-#define uidna_IDNToUnicode uidna_IDNToUnicode_3_2
-#define uidna_compare uidna_compare_3_2
-#define uidna_toASCII uidna_toASCII_3_2
-#define uidna_toUnicode uidna_toUnicode_3_2
-#define uiter_current32 uiter_current32_3_2
-#define uiter_getState uiter_getState_3_2
-#define uiter_next32 uiter_next32_3_2
-#define uiter_previous32 uiter_previous32_3_2
-#define uiter_setCharacterIterator uiter_setCharacterIterator_3_2
-#define uiter_setReplaceable uiter_setReplaceable_3_2
-#define uiter_setState uiter_setState_3_2
-#define uiter_setString uiter_setString_3_2
-#define uiter_setUTF16BE uiter_setUTF16BE_3_2
-#define uiter_setUTF8 uiter_setUTF8_3_2
-#define uloc_acceptLanguage uloc_acceptLanguage_3_2
-#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_2
-#define uloc_canonicalize uloc_canonicalize_3_2
-#define uloc_countAvailable uloc_countAvailable_3_2
-#define uloc_getAvailable uloc_getAvailable_3_2
-#define uloc_getBaseName uloc_getBaseName_3_2
-#define uloc_getCountry uloc_getCountry_3_2
-#define uloc_getDefault uloc_getDefault_3_2
-#define uloc_getDisplayCountry uloc_getDisplayCountry_3_2
-#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_2
-#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_2
-#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_2
-#define uloc_getDisplayName uloc_getDisplayName_3_2
-#define uloc_getDisplayScript uloc_getDisplayScript_3_2
-#define uloc_getDisplayVariant uloc_getDisplayVariant_3_2
-#define uloc_getISO3Country uloc_getISO3Country_3_2
-#define uloc_getISO3Language uloc_getISO3Language_3_2
-#define uloc_getISOCountries uloc_getISOCountries_3_2
-#define uloc_getISOLanguages uloc_getISOLanguages_3_2
-#define uloc_getKeywordValue uloc_getKeywordValue_3_2
-#define uloc_getLCID uloc_getLCID_3_2
-#define uloc_getLanguage uloc_getLanguage_3_2
-#define uloc_getName uloc_getName_3_2
-#define uloc_getParent uloc_getParent_3_2
-#define uloc_getScript uloc_getScript_3_2
-#define uloc_getVariant uloc_getVariant_3_2
-#define uloc_openKeywordList uloc_openKeywordList_3_2
-#define uloc_openKeywords uloc_openKeywords_3_2
-#define uloc_setDefault uloc_setDefault_3_2
-#define uloc_setKeywordValue uloc_setKeywordValue_3_2
-#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_2
-#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_2
-#define ulocdata_getPaperSize ulocdata_getPaperSize_3_2
-#define umsg_applyPattern umsg_applyPattern_3_2
-#define umsg_clone umsg_clone_3_2
-#define umsg_close umsg_close_3_2
-#define umsg_format umsg_format_3_2
-#define umsg_getLocale umsg_getLocale_3_2
-#define umsg_getLocaleByType umsg_getLocaleByType_3_2
-#define umsg_open umsg_open_3_2
-#define umsg_parse umsg_parse_3_2
-#define umsg_setLocale umsg_setLocale_3_2
-#define umsg_toPattern umsg_toPattern_3_2
-#define umsg_vformat umsg_vformat_3_2
-#define umsg_vparse umsg_vparse_3_2
-#define umtx_atomic_dec umtx_atomic_dec_3_2
-#define umtx_atomic_inc umtx_atomic_inc_3_2
-#define umtx_cleanup umtx_cleanup_3_2
-#define umtx_destroy umtx_destroy_3_2
-#define umtx_init umtx_init_3_2
-#define umtx_lock umtx_lock_3_2
-#define umtx_unlock umtx_unlock_3_2
-#define unorm_addPropertyStarts unorm_addPropertyStarts_3_2
-#define unorm_closeIter unorm_closeIter_3_2
-#define unorm_compare unorm_compare_3_2
-#define unorm_compose unorm_compose_3_2
-#define unorm_concatenate unorm_concatenate_3_2
-#define unorm_decompose unorm_decompose_3_2
-#define unorm_getCanonStartSet unorm_getCanonStartSet_3_2
-#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_2
-#define unorm_getDecomposition unorm_getDecomposition_3_2
-#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_2
-#define unorm_getFCDTrie unorm_getFCDTrie_3_2
-#define unorm_getNX unorm_getNX_3_2
-#define unorm_getQuickCheck unorm_getQuickCheck_3_2
-#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_2
-#define unorm_haveData unorm_haveData_3_2
-#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_2
-#define unorm_internalNormalize unorm_internalNormalize_3_2
-#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_2
-#define unorm_internalQuickCheck unorm_internalQuickCheck_3_2
-#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_2
-#define unorm_isNFSkippable unorm_isNFSkippable_3_2
-#define unorm_isNormalized unorm_isNormalized_3_2
-#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_2
-#define unorm_next unorm_next_3_2
-#define unorm_normalize unorm_normalize_3_2
-#define unorm_openIter unorm_openIter_3_2
-#define unorm_previous unorm_previous_3_2
-#define unorm_quickCheck unorm_quickCheck_3_2
-#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_2
-#define unorm_setIter unorm_setIter_3_2
-#define unorm_swap unorm_swap_3_2
-#define unum_applyPattern unum_applyPattern_3_2
-#define unum_clone unum_clone_3_2
-#define unum_close unum_close_3_2
-#define unum_countAvailable unum_countAvailable_3_2
-#define unum_format unum_format_3_2
-#define unum_formatDouble unum_formatDouble_3_2
-#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_2
-#define unum_formatInt64 unum_formatInt64_3_2
-#define unum_getAttribute unum_getAttribute_3_2
-#define unum_getAvailable unum_getAvailable_3_2
-#define unum_getDoubleAttribute unum_getDoubleAttribute_3_2
-#define unum_getLocaleByType unum_getLocaleByType_3_2
-#define unum_getSymbol unum_getSymbol_3_2
-#define unum_getTextAttribute unum_getTextAttribute_3_2
-#define unum_open unum_open_3_2
-#define unum_parse unum_parse_3_2
-#define unum_parseDouble unum_parseDouble_3_2
-#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_2
-#define unum_parseInt64 unum_parseInt64_3_2
-#define unum_setAttribute unum_setAttribute_3_2
-#define unum_setDoubleAttribute unum_setDoubleAttribute_3_2
-#define unum_setSymbol unum_setSymbol_3_2
-#define unum_setTextAttribute unum_setTextAttribute_3_2
-#define unum_toPattern unum_toPattern_3_2
-#define upname_swap upname_swap_3_2
-#define uprops_getSource uprops_getSource_3_2
-#define uprops_swap uprops_swap_3_2
-#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_2
-#define uprv_asciitolower uprv_asciitolower_3_2
-#define uprv_ceil uprv_ceil_3_2
-#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_2
-#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_2
-#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_2
-#define uprv_cnttab_clone uprv_cnttab_clone_3_2
-#define uprv_cnttab_close uprv_cnttab_close_3_2
-#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_2
-#define uprv_cnttab_findCE uprv_cnttab_findCE_3_2
-#define uprv_cnttab_findCP uprv_cnttab_findCP_3_2
-#define uprv_cnttab_getCE uprv_cnttab_getCE_3_2
-#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_2
-#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_2
-#define uprv_cnttab_open uprv_cnttab_open_3_2
-#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_2
-#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_2
-#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_2
-#define uprv_compareInvAscii uprv_compareInvAscii_3_2
-#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_2
-#define uprv_convertToLCID uprv_convertToLCID_3_2
-#define uprv_convertToPosix uprv_convertToPosix_3_2
-#define uprv_copyAscii uprv_copyAscii_3_2
-#define uprv_copyEbcdic uprv_copyEbcdic_3_2
-#define uprv_dtostr uprv_dtostr_3_2
-#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_2
-#define uprv_ebcdictolower uprv_ebcdictolower_3_2
-#define uprv_fabs uprv_fabs_3_2
-#define uprv_floor uprv_floor_3_2
-#define uprv_fmax uprv_fmax_3_2
-#define uprv_fmin uprv_fmin_3_2
-#define uprv_fmod uprv_fmod_3_2
-#define uprv_free uprv_free_3_2
-#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_2
-#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_2
-#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_2
-#define uprv_getInfinity uprv_getInfinity_3_2
-#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_2
-#define uprv_getMaxValues uprv_getMaxValues_3_2
-#define uprv_getNaN uprv_getNaN_3_2
-#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_2
-#define uprv_getUTCtime uprv_getUTCtime_3_2
-#define uprv_haveProperties uprv_haveProperties_3_2
-#define uprv_init_collIterate uprv_init_collIterate_3_2
-#define uprv_int32Comparator uprv_int32Comparator_3_2
-#define uprv_isInfinite uprv_isInfinite_3_2
-#define uprv_isInvariantString uprv_isInvariantString_3_2
-#define uprv_isInvariantUString uprv_isInvariantUString_3_2
-#define uprv_isNaN uprv_isNaN_3_2
-#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_2
-#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_2
-#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_2
-#define uprv_itou uprv_itou_3_2
-#define uprv_loadPropsData uprv_loadPropsData_3_2
-#define uprv_log uprv_log_3_2
-#define uprv_log10 uprv_log10_3_2
-#define uprv_malloc uprv_malloc_3_2
-#define uprv_mapFile uprv_mapFile_3_2
-#define uprv_max uprv_max_3_2
-#define uprv_maxMantissa uprv_maxMantissa_3_2
-#define uprv_min uprv_min_3_2
-#define uprv_modf uprv_modf_3_2
-#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_2
-#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_2
-#define uprv_pow uprv_pow_3_2
-#define uprv_pow10 uprv_pow10_3_2
-#define uprv_realloc uprv_realloc_3_2
-#define uprv_round uprv_round_3_2
-#define uprv_sortArray uprv_sortArray_3_2
-#define uprv_strCompare uprv_strCompare_3_2
-#define uprv_strdup uprv_strdup_3_2
-#define uprv_strndup uprv_strndup_3_2
-#define uprv_syntaxError uprv_syntaxError_3_2
-#define uprv_timezone uprv_timezone_3_2
-#define uprv_toupper uprv_toupper_3_2
-#define uprv_trunc uprv_trunc_3_2
-#define uprv_tzname uprv_tzname_3_2
-#define uprv_tzset uprv_tzset_3_2
-#define uprv_uca_addAnElement uprv_uca_addAnElement_3_2
-#define uprv_uca_assembleTable uprv_uca_assembleTable_3_2
-#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_2
-#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_2
-#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_2
-#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_2
-#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_2
-#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_2
-#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_2
-#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_2
-#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_2
-#define uprv_uca_initTempTable uprv_uca_initTempTable_3_2
-#define uprv_uint16Comparator uprv_uint16Comparator_3_2
-#define uprv_uint32Comparator uprv_uint32Comparator_3_2
-#define uprv_unmapFile uprv_unmapFile_3_2
-#define uregex_appendReplacement uregex_appendReplacement_3_2
-#define uregex_appendTail uregex_appendTail_3_2
-#define uregex_clone uregex_clone_3_2
-#define uregex_close uregex_close_3_2
-#define uregex_end uregex_end_3_2
-#define uregex_find uregex_find_3_2
-#define uregex_findNext uregex_findNext_3_2
-#define uregex_flags uregex_flags_3_2
-#define uregex_getText uregex_getText_3_2
-#define uregex_group uregex_group_3_2
-#define uregex_groupCount uregex_groupCount_3_2
-#define uregex_lookingAt uregex_lookingAt_3_2
-#define uregex_matches uregex_matches_3_2
-#define uregex_open uregex_open_3_2
-#define uregex_openC uregex_openC_3_2
-#define uregex_pattern uregex_pattern_3_2
-#define uregex_replaceAll uregex_replaceAll_3_2
-#define uregex_replaceFirst uregex_replaceFirst_3_2
-#define uregex_reset uregex_reset_3_2
-#define uregex_setText uregex_setText_3_2
-#define uregex_split uregex_split_3_2
-#define uregex_start uregex_start_3_2
-#define ures_appendResPath ures_appendResPath_3_2
-#define ures_close ures_close_3_2
-#define ures_copyResb ures_copyResb_3_2
-#define ures_countArrayItems ures_countArrayItems_3_2
-#define ures_findResource ures_findResource_3_2
-#define ures_findSubResource ures_findSubResource_3_2
-#define ures_freeResPath ures_freeResPath_3_2
-#define ures_getBinary ures_getBinary_3_2
-#define ures_getByIndex ures_getByIndex_3_2
-#define ures_getByKey ures_getByKey_3_2
-#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_2
-#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_2
-#define ures_getInt ures_getInt_3_2
-#define ures_getIntVector ures_getIntVector_3_2
-#define ures_getKey ures_getKey_3_2
-#define ures_getKeywordValues ures_getKeywordValues_3_2
-#define ures_getLocale ures_getLocale_3_2
-#define ures_getLocaleByType ures_getLocaleByType_3_2
-#define ures_getName ures_getName_3_2
-#define ures_getNextResource ures_getNextResource_3_2
-#define ures_getNextString ures_getNextString_3_2
-#define ures_getPath ures_getPath_3_2
-#define ures_getSize ures_getSize_3_2
-#define ures_getString ures_getString_3_2
-#define ures_getStringByIndex ures_getStringByIndex_3_2
-#define ures_getStringByKey ures_getStringByKey_3_2
-#define ures_getType ures_getType_3_2
-#define ures_getUInt ures_getUInt_3_2
-#define ures_getVersion ures_getVersion_3_2
-#define ures_getVersionNumber ures_getVersionNumber_3_2
-#define ures_hasNext ures_hasNext_3_2
-#define ures_initStackObject ures_initStackObject_3_2
-#define ures_open ures_open_3_2
-#define ures_openAvailableLocales ures_openAvailableLocales_3_2
-#define ures_openDirect ures_openDirect_3_2
-#define ures_openFillIn ures_openFillIn_3_2
-#define ures_openU ures_openU_3_2
-#define ures_resetIterator ures_resetIterator_3_2
-#define ures_swap ures_swap_3_2
-#define uscript_closeRun uscript_closeRun_3_2
-#define uscript_getCode uscript_getCode_3_2
-#define uscript_getName uscript_getName_3_2
-#define uscript_getScript uscript_getScript_3_2
-#define uscript_getShortName uscript_getShortName_3_2
-#define uscript_nextRun uscript_nextRun_3_2
-#define uscript_openRun uscript_openRun_3_2
-#define uscript_resetRun uscript_resetRun_3_2
-#define uscript_setRunText uscript_setRunText_3_2
-#define usearch_close usearch_close_3_2
-#define usearch_first usearch_first_3_2
-#define usearch_following usearch_following_3_2
-#define usearch_getAttribute usearch_getAttribute_3_2
-#define usearch_getBreakIterator usearch_getBreakIterator_3_2
-#define usearch_getCollator usearch_getCollator_3_2
-#define usearch_getMatchedLength usearch_getMatchedLength_3_2
-#define usearch_getMatchedStart usearch_getMatchedStart_3_2
-#define usearch_getMatchedText usearch_getMatchedText_3_2
-#define usearch_getOffset usearch_getOffset_3_2
-#define usearch_getPattern usearch_getPattern_3_2
-#define usearch_getText usearch_getText_3_2
-#define usearch_handleNextCanonical usearch_handleNextCanonical_3_2
-#define usearch_handleNextExact usearch_handleNextExact_3_2
-#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_2
-#define usearch_handlePreviousExact usearch_handlePreviousExact_3_2
-#define usearch_last usearch_last_3_2
-#define usearch_next usearch_next_3_2
-#define usearch_open usearch_open_3_2
-#define usearch_openFromCollator usearch_openFromCollator_3_2
-#define usearch_preceding usearch_preceding_3_2
-#define usearch_previous usearch_previous_3_2
-#define usearch_reset usearch_reset_3_2
-#define usearch_setAttribute usearch_setAttribute_3_2
-#define usearch_setBreakIterator usearch_setBreakIterator_3_2
-#define usearch_setCollator usearch_setCollator_3_2
-#define usearch_setOffset usearch_setOffset_3_2
-#define usearch_setPattern usearch_setPattern_3_2
-#define usearch_setText usearch_setText_3_2
-#define userv_deleteStringPair userv_deleteStringPair_3_2
-#define uset_add uset_add_3_2
-#define uset_addAll uset_addAll_3_2
-#define uset_addRange uset_addRange_3_2
-#define uset_addString uset_addString_3_2
-#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_2
-#define uset_applyPattern uset_applyPattern_3_2
-#define uset_applyPropertyAlias uset_applyPropertyAlias_3_2
-#define uset_charAt uset_charAt_3_2
-#define uset_clear uset_clear_3_2
-#define uset_close uset_close_3_2
-#define uset_compact uset_compact_3_2
-#define uset_complement uset_complement_3_2
-#define uset_complementAll uset_complementAll_3_2
-#define uset_contains uset_contains_3_2
-#define uset_containsAll uset_containsAll_3_2
-#define uset_containsNone uset_containsNone_3_2
-#define uset_containsRange uset_containsRange_3_2
-#define uset_containsSome uset_containsSome_3_2
-#define uset_containsString uset_containsString_3_2
-#define uset_equals uset_equals_3_2
-#define uset_getItem uset_getItem_3_2
-#define uset_getItemCount uset_getItemCount_3_2
-#define uset_getSerializedRange uset_getSerializedRange_3_2
-#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_2
-#define uset_getSerializedSet uset_getSerializedSet_3_2
-#define uset_indexOf uset_indexOf_3_2
-#define uset_isEmpty uset_isEmpty_3_2
-#define uset_open uset_open_3_2
-#define uset_openPattern uset_openPattern_3_2
-#define uset_openPatternOptions uset_openPatternOptions_3_2
-#define uset_remove uset_remove_3_2
-#define uset_removeAll uset_removeAll_3_2
-#define uset_removeRange uset_removeRange_3_2
-#define uset_removeString uset_removeString_3_2
-#define uset_resemblesPattern uset_resemblesPattern_3_2
-#define uset_retain uset_retain_3_2
-#define uset_retainAll uset_retainAll_3_2
-#define uset_serialize uset_serialize_3_2
-#define uset_serializedContains uset_serializedContains_3_2
-#define uset_set uset_set_3_2
-#define uset_setSerializedToOne uset_setSerializedToOne_3_2
-#define uset_size uset_size_3_2
-#define uset_toPattern uset_toPattern_3_2
-#define usprep_close usprep_close_3_2
-#define usprep_open usprep_open_3_2
-#define usprep_prepare usprep_prepare_3_2
-#define usprep_swap usprep_swap_3_2
-#define ustr_foldCase ustr_foldCase_3_2
-#define ustr_toLower ustr_toLower_3_2
-#define ustr_toTitle ustr_toTitle_3_2
-#define ustr_toUpper ustr_toUpper_3_2
-#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_2
-#define utf8_back1SafeBody utf8_back1SafeBody_3_2
-#define utf8_countTrailBytes utf8_countTrailBytes_3_2
-#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_2
-#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_2
-#define utmscale_fromInt64 utmscale_fromInt64_3_2
-#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_2
-#define utmscale_toInt64 utmscale_toInt64_3_2
-#define utrace_cleanup utrace_cleanup_3_2
-#define utrace_data utrace_data_3_2
-#define utrace_entry utrace_entry_3_2
-#define utrace_exit utrace_exit_3_2
-#define utrace_format utrace_format_3_2
-#define utrace_functionName utrace_functionName_3_2
-#define utrace_getFunctions utrace_getFunctions_3_2
-#define utrace_getLevel utrace_getLevel_3_2
-#define utrace_level utrace_level_3_2
-#define utrace_setFunctions utrace_setFunctions_3_2
-#define utrace_setLevel utrace_setLevel_3_2
-#define utrace_vformat utrace_vformat_3_2
-#define utrans_clone utrans_clone_3_2
-#define utrans_close utrans_close_3_2
-#define utrans_countAvailableIDs utrans_countAvailableIDs_3_2
-#define utrans_getAvailableID utrans_getAvailableID_3_2
-#define utrans_getID utrans_getID_3_2
-#define utrans_getUnicodeID utrans_getUnicodeID_3_2
-#define utrans_open utrans_open_3_2
-#define utrans_openIDs utrans_openIDs_3_2
-#define utrans_openInverse utrans_openInverse_3_2
-#define utrans_openU utrans_openU_3_2
-#define utrans_register utrans_register_3_2
-#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_2
-#define utrans_setFilter utrans_setFilter_3_2
-#define utrans_trans utrans_trans_3_2
-#define utrans_transIncremental utrans_transIncremental_3_2
-#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_2
-#define utrans_transUChars utrans_transUChars_3_2
-#define utrans_unregister utrans_unregister_3_2
-#define utrans_unregisterID utrans_unregisterID_3_2
-#define utrie_clone utrie_clone_3_2
-#define utrie_close utrie_close_3_2
-#define utrie_enum utrie_enum_3_2
-#define utrie_get32 utrie_get32_3_2
-#define utrie_getData utrie_getData_3_2
-#define utrie_open utrie_open_3_2
-#define utrie_serialize utrie_serialize_3_2
-#define utrie_set32 utrie_set32_3_2
-#define utrie_setRange32 utrie_setRange32_3_2
-#define utrie_swap utrie_swap_3_2
-#define utrie_unserialize utrie_unserialize_3_2
-/* C++ class names renaming defines */
-
-#ifdef XP_CPLUSPLUS
-#if !U_HAVE_NAMESPACE
-
-#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_2
-#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_2
-#define AnchorTable AnchorTable_3_2
-#define AnyTransliterator AnyTransliterator_3_2
-#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_2
-#define ArabicShaping ArabicShaping_3_2
-#define BasicCalendarFactory BasicCalendarFactory_3_2
-#define BinarySearchLookupTable BinarySearchLookupTable_3_2
-#define BreakDictionary BreakDictionary_3_2
-#define BreakIterator BreakIterator_3_2
-#define BuddhistCalendar BuddhistCalendar_3_2
-#define CFactory CFactory_3_2
-#define Calendar Calendar_3_2
-#define CalendarAstronomer CalendarAstronomer_3_2
-#define CalendarCache CalendarCache_3_2
-#define CalendarData CalendarData_3_2
-#define CalendarService CalendarService_3_2
-#define CanonShaping CanonShaping_3_2
-#define CanonicalIterator CanonicalIterator_3_2
-#define CaseMapTransliterator CaseMapTransliterator_3_2
-#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_2
-#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_2
-#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_2
-#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_2
-#define CharSubstitutionFilter CharSubstitutionFilter_3_2
-#define CharacterIterator CharacterIterator_3_2
-#define ChoiceFormat ChoiceFormat_3_2
-#define ClassDefFormat1Table ClassDefFormat1Table_3_2
-#define ClassDefFormat2Table ClassDefFormat2Table_3_2
-#define ClassDefinitionTable ClassDefinitionTable_3_2
-#define CollationElementIterator CollationElementIterator_3_2
-#define CollationKey CollationKey_3_2
-#define Collator Collator_3_2
-#define CollatorFactory CollatorFactory_3_2
-#define CompoundTransliterator CompoundTransliterator_3_2
-#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_2
-#define ContextualSubstitutionBase ContextualSubstitutionBase_3_2
-#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_2
-#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_2
-#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_2
-#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_2
-#define CoverageFormat1Table CoverageFormat1Table_3_2
-#define CoverageFormat2Table CoverageFormat2Table_3_2
-#define CoverageTable CoverageTable_3_2
-#define CurrencyAmount CurrencyAmount_3_2
-#define CurrencyFormat CurrencyFormat_3_2
-#define CurrencyUnit CurrencyUnit_3_2
-#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_2
-#define DateFormat DateFormat_3_2
-#define DateFormatSymbols DateFormatSymbols_3_2
-#define DecimalFormat DecimalFormat_3_2
-#define DecimalFormatSymbols DecimalFormatSymbols_3_2
-#define DefaultCalendarFactory DefaultCalendarFactory_3_2
-#define DefaultCharMapper DefaultCharMapper_3_2
-#define DeviceTable DeviceTable_3_2
-#define DictionaryBasedBreakIterator DictionaryBasedBreakIterator_3_2
-#define DictionaryBasedBreakIteratorTables DictionaryBasedBreakIteratorTables_3_2
-#define DigitList DigitList_3_2
-#define Entry Entry_3_2
-#define EnumToOffset EnumToOffset_3_2
-#define EscapeTransliterator EscapeTransliterator_3_2
-#define EventListener EventListener_3_2
-#define ExtensionSubtable ExtensionSubtable_3_2
-#define FeatureListTable FeatureListTable_3_2
-#define FieldPosition FieldPosition_3_2
-#define FontRuns FontRuns_3_2
-#define Format Format_3_2
-#define Format1AnchorTable Format1AnchorTable_3_2
-#define Format2AnchorTable Format2AnchorTable_3_2
-#define Format3AnchorTable Format3AnchorTable_3_2
-#define Formattable Formattable_3_2
-#define ForwardCharacterIterator ForwardCharacterIterator_3_2
-#define FractionalPartSubstitution FractionalPartSubstitution_3_2
-#define FunctionReplacer FunctionReplacer_3_2
-#define GDEFMarkFilter GDEFMarkFilter_3_2
-#define GXLayoutEngine GXLayoutEngine_3_2
-#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_2
-#define GlyphIterator GlyphIterator_3_2
-#define GlyphLookupTableHeader GlyphLookupTableHeader_3_2
-#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_2
-#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_2
-#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_2
-#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_2
-#define Grego Grego_3_2
-#define GregorianCalendar GregorianCalendar_3_2
-#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_2
-#define HebrewCalendar HebrewCalendar_3_2
-#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_2
-#define ICUBreakIteratorService ICUBreakIteratorService_3_2
-#define ICUCollatorFactory ICUCollatorFactory_3_2
-#define ICUCollatorService ICUCollatorService_3_2
-#define ICULayoutEngine ICULayoutEngine_3_2
-#define ICULocaleService ICULocaleService_3_2
-#define ICUNotifier ICUNotifier_3_2
-#define ICUNumberFormatFactory ICUNumberFormatFactory_3_2
-#define ICUNumberFormatService ICUNumberFormatService_3_2
-#define ICUResourceBundleFactory ICUResourceBundleFactory_3_2
-#define ICUService ICUService_3_2
-#define ICUServiceFactory ICUServiceFactory_3_2
-#define ICUServiceKey ICUServiceKey_3_2
-#define ICU_Utility ICU_Utility_3_2
-#define IndicClassTable IndicClassTable_3_2
-#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_2
-#define IndicRearrangementProcessor IndicRearrangementProcessor_3_2
-#define IndicReordering IndicReordering_3_2
-#define IntegralPartSubstitution IntegralPartSubstitution_3_2
-#define IslamicCalendar IslamicCalendar_3_2
-#define JapaneseCalendar JapaneseCalendar_3_2
-#define KeywordEnumeration KeywordEnumeration_3_2
-#define LECharMapper LECharMapper_3_2
-#define LEFontInstance LEFontInstance_3_2
-#define LEGlyphFilter LEGlyphFilter_3_2
-#define LEGlyphStorage LEGlyphStorage_3_2
-#define LEInsertionCallback LEInsertionCallback_3_2
-#define LEInsertionList LEInsertionList_3_2
-#define LXUtilities LXUtilities_3_2
-#define LayoutEngine LayoutEngine_3_2
-#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_2
-#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_2
-#define LocDataParser LocDataParser_3_2
-#define Locale Locale_3_2
-#define LocaleBased LocaleBased_3_2
-#define LocaleKey LocaleKey_3_2
-#define LocaleKeyFactory LocaleKeyFactory_3_2
-#define LocaleRuns LocaleRuns_3_2
-#define LocaleUtility LocaleUtility_3_2
-#define LocalizationInfo LocalizationInfo_3_2
-#define LookupListTable LookupListTable_3_2
-#define LookupProcessor LookupProcessor_3_2
-#define LookupSubtable LookupSubtable_3_2
-#define LookupTable LookupTable_3_2
-#define LowercaseTransliterator LowercaseTransliterator_3_2
-#define MPreFixups MPreFixups_3_2
-#define MarkArray MarkArray_3_2
-#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_2
-#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_2
-#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_2
-#define Math Math_3_2
-#define Measure Measure_3_2
-#define MeasureFormat MeasureFormat_3_2
-#define MeasureUnit MeasureUnit_3_2
-#define MessageFormat MessageFormat_3_2
-#define MessageFormatAdapter MessageFormatAdapter_3_2
-#define ModulusSubstitution ModulusSubstitution_3_2
-#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_2
-#define MoonTimeAngleFunc MoonTimeAngleFunc_3_2
-#define MorphSubtableHeader MorphSubtableHeader_3_2
-#define MorphTableHeader MorphTableHeader_3_2
-#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_2
-#define MultiplierSubstitution MultiplierSubstitution_3_2
-#define NFFactory NFFactory_3_2
-#define NFRule NFRule_3_2
-#define NFRuleSet NFRuleSet_3_2
-#define NFSubstitution NFSubstitution_3_2
-#define NameToEnum NameToEnum_3_2
-#define NameUnicodeTransliterator NameUnicodeTransliterator_3_2
-#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_2
-#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_2
-#define NormalizationTransliterator NormalizationTransliterator_3_2
-#define Normalizer Normalizer_3_2
-#define NullSubstitution NullSubstitution_3_2
-#define NullTransliterator NullTransliterator_3_2
-#define NumberFormat NumberFormat_3_2
-#define NumberFormatFactory NumberFormatFactory_3_2
-#define NumeratorSubstitution NumeratorSubstitution_3_2
-#define OlsonTimeZone OlsonTimeZone_3_2
-#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_2
-#define OpenTypeUtilities OpenTypeUtilities_3_2
-#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_2
-#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_2
-#define PairPositioningSubtable PairPositioningSubtable_3_2
-#define ParagraphLayout ParagraphLayout_3_2
-#define ParseData ParseData_3_2
-#define ParsePosition ParsePosition_3_2
-#define PropertyAliases PropertyAliases_3_2
-#define Quantifier Quantifier_3_2
-#define RBBIDataWrapper RBBIDataWrapper_3_2
-#define RBBINode RBBINode_3_2
-#define RBBIRuleBuilder RBBIRuleBuilder_3_2
-#define RBBIRuleScanner RBBIRuleScanner_3_2
-#define RBBISetBuilder RBBISetBuilder_3_2
-#define RBBIStateDescriptor RBBIStateDescriptor_3_2
-#define RBBISymbolTable RBBISymbolTable_3_2
-#define RBBISymbolTableEntry RBBISymbolTableEntry_3_2
-#define RBBITableBuilder RBBITableBuilder_3_2
-#define RangeDescriptor RangeDescriptor_3_2
-#define RegexCompile RegexCompile_3_2
-#define RegexMatcher RegexMatcher_3_2
-#define RegexPattern RegexPattern_3_2
-#define RegexStaticSets RegexStaticSets_3_2
-#define RemoveTransliterator RemoveTransliterator_3_2
-#define Replaceable Replaceable_3_2
-#define ReplaceableGlue ReplaceableGlue_3_2
-#define ResourceBundle ResourceBundle_3_2
-#define RiseSetCoordFunc RiseSetCoordFunc_3_2
-#define RuleBasedBreakIterator RuleBasedBreakIterator_3_2
-#define RuleBasedCollator RuleBasedCollator_3_2
-#define RuleBasedNumberFormat RuleBasedNumberFormat_3_2
-#define RuleBasedTransliterator RuleBasedTransliterator_3_2
-#define RuleCharacterIterator RuleCharacterIterator_3_2
-#define RuleHalf RuleHalf_3_2
-#define RunArray RunArray_3_2
-#define SameValueSubstitution SameValueSubstitution_3_2
-#define ScriptListTable ScriptListTable_3_2
-#define ScriptRunIterator ScriptRunIterator_3_2
-#define ScriptTable ScriptTable_3_2
-#define SearchIterator SearchIterator_3_2
-#define SegmentArrayProcessor SegmentArrayProcessor_3_2
-#define SegmentSingleProcessor SegmentSingleProcessor_3_2
-#define ServiceEnumeration ServiceEnumeration_3_2
-#define ServiceListener ServiceListener_3_2
-#define SimpleArrayProcessor SimpleArrayProcessor_3_2
-#define SimpleDateFormat SimpleDateFormat_3_2
-#define SimpleFactory SimpleFactory_3_2
-#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_2
-#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_2
-#define SimpleTimeZone SimpleTimeZone_3_2
-#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_2
-#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_2
-#define SinglePositioningSubtable SinglePositioningSubtable_3_2
-#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_2
-#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_2
-#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_2
-#define SingleTableProcessor SingleTableProcessor_3_2
-#define Spec Spec_3_2
-#define StateTableProcessor StateTableProcessor_3_2
-#define StringCharacterIterator StringCharacterIterator_3_2
-#define StringEnumeration StringEnumeration_3_2
-#define StringLocalizationInfo StringLocalizationInfo_3_2
-#define StringMatcher StringMatcher_3_2
-#define StringPair StringPair_3_2
-#define StringReplacer StringReplacer_3_2
-#define StringSearch StringSearch_3_2
-#define StyleRuns StyleRuns_3_2
-#define SubstitutionLookup SubstitutionLookup_3_2
-#define SubtableProcessor SubtableProcessor_3_2
-#define SunTimeAngleFunc SunTimeAngleFunc_3_2
-#define SymbolTable SymbolTable_3_2
-#define TZEnumeration TZEnumeration_3_2
-#define ThaiLayoutEngine ThaiLayoutEngine_3_2
-#define ThaiShaping ThaiShaping_3_2
-#define TimeZone TimeZone_3_2
-#define TitlecaseTransliterator TitlecaseTransliterator_3_2
-#define TransliterationRule TransliterationRule_3_2
-#define TransliterationRuleData TransliterationRuleData_3_2
-#define TransliterationRuleSet TransliterationRuleSet_3_2
-#define Transliterator Transliterator_3_2
-#define TransliteratorAlias TransliteratorAlias_3_2
-#define TransliteratorIDParser TransliteratorIDParser_3_2
-#define TransliteratorParser TransliteratorParser_3_2
-#define TransliteratorRegistry TransliteratorRegistry_3_2
-#define TrimmedArrayProcessor TrimmedArrayProcessor_3_2
-#define UCharCharacterIterator UCharCharacterIterator_3_2
-#define UMemory UMemory_3_2
-#define UObject UObject_3_2
-#define UStack UStack_3_2
-#define UStringEnumeration UStringEnumeration_3_2
-#define UVector UVector_3_2
-#define UVector32 UVector32_3_2
-#define UnescapeTransliterator UnescapeTransliterator_3_2
-#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_2
-#define UnicodeFilter UnicodeFilter_3_2
-#define UnicodeFunctor UnicodeFunctor_3_2
-#define UnicodeMatcher UnicodeMatcher_3_2
-#define UnicodeNameTransliterator UnicodeNameTransliterator_3_2
-#define UnicodeReplacer UnicodeReplacer_3_2
-#define UnicodeSet UnicodeSet_3_2
-#define UnicodeSetIterator UnicodeSetIterator_3_2
-#define UnicodeString UnicodeString_3_2
-#define UppercaseTransliterator UppercaseTransliterator_3_2
-#define ValueRecord ValueRecord_3_2
-#define ValueRuns ValueRuns_3_2
-#define locale_set_default_internal locale_set_default_internal_3_2
-#define uprv_parseCurrency uprv_parseCurrency_3_2
-#define util64_fromDouble util64_fromDouble_3_2
-#define util64_pow util64_pow_3_2
-#define util64_tou util64_tou_3_2
-#define util64_utoi util64_utoi_3_2
-
-#endif
-#endif
-
-#endif
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/uscript.h b/Source/JavaScriptGlue/icu/unicode/uscript.h
deleted file mode 100644
index d7cbc38..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uscript.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1997-2006, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-* File USCRIPT.H
-*
-* Modification History:
-*
-*   Date        Name        Description
-*   07/06/2001    Ram         Creation.
-******************************************************************************
-*/
-#ifndef USCRIPT_H
-#define USCRIPT_H
-#include "unicode/utypes.h"
-
-/**
- * \file
- * \brief C API: Unicode Script Information
- */
- 
-/**
- * Constants for ISO 15924 script codes.
- *
- * Many of these script codes - those from Unicode's ScriptNames.txt -
- * are character property values for Unicode's Script property.
- * See UAX #24 Script Names (http://www.unicode.org/reports/tr24/).
- *
- * Starting with ICU 3.6, constants for most ISO 15924 script codes
- * are included (currently excluding private-use codes Qaaa..Qabx).
- * For scripts for which there are codes in ISO 15924 but which are not
- * used in the Unicode Character Database (UCD), there are no Unicode characters
- * associated with those scripts.
- *
- * For example, there are no characters that have a UCD script code of
- * Hans or Hant. All Han ideographs have the Hani script code.
- * The Hans and Hant script codes are used with CLDR data.
- *
- * ISO 15924 script codes are included for use with CLDR and similar.
- *
- * @stable ICU 2.2
- */
-typedef enum UScriptCode {
-      USCRIPT_INVALID_CODE = -1,
-      USCRIPT_COMMON       =  0 , /* Zyyy */
-      USCRIPT_INHERITED    =  1,  /* Qaai */
-      USCRIPT_ARABIC       =  2,  /* Arab */
-      USCRIPT_ARMENIAN     =  3,  /* Armn */
-      USCRIPT_BENGALI      =  4,  /* Beng */
-      USCRIPT_BOPOMOFO     =  5,  /* Bopo */
-      USCRIPT_CHEROKEE     =  6,  /* Cher */
-      USCRIPT_COPTIC       =  7,  /* Copt */
-      USCRIPT_CYRILLIC     =  8,  /* Cyrl */
-      USCRIPT_DESERET      =  9,  /* Dsrt */
-      USCRIPT_DEVANAGARI   = 10,  /* Deva */
-      USCRIPT_ETHIOPIC     = 11,  /* Ethi */
-      USCRIPT_GEORGIAN     = 12,  /* Geor */
-      USCRIPT_GOTHIC       = 13,  /* Goth */
-      USCRIPT_GREEK        = 14,  /* Grek */
-      USCRIPT_GUJARATI     = 15,  /* Gujr */
-      USCRIPT_GURMUKHI     = 16,  /* Guru */
-      USCRIPT_HAN          = 17,  /* Hani */
-      USCRIPT_HANGUL       = 18,  /* Hang */
-      USCRIPT_HEBREW       = 19,  /* Hebr */
-      USCRIPT_HIRAGANA     = 20,  /* Hira */
-      USCRIPT_KANNADA      = 21,  /* Knda */
-      USCRIPT_KATAKANA     = 22,  /* Kana */
-      USCRIPT_KHMER        = 23,  /* Khmr */
-      USCRIPT_LAO          = 24,  /* Laoo */
-      USCRIPT_LATIN        = 25,  /* Latn */
-      USCRIPT_MALAYALAM    = 26,  /* Mlym */
-      USCRIPT_MONGOLIAN    = 27,  /* Mong */
-      USCRIPT_MYANMAR      = 28,  /* Mymr */
-      USCRIPT_OGHAM        = 29,  /* Ogam */
-      USCRIPT_OLD_ITALIC   = 30,  /* Ital */
-      USCRIPT_ORIYA        = 31,  /* Orya */
-      USCRIPT_RUNIC        = 32,  /* Runr */
-      USCRIPT_SINHALA      = 33,  /* Sinh */
-      USCRIPT_SYRIAC       = 34,  /* Syrc */
-      USCRIPT_TAMIL        = 35,  /* Taml */
-      USCRIPT_TELUGU       = 36,  /* Telu */
-      USCRIPT_THAANA       = 37,  /* Thaa */
-      USCRIPT_THAI         = 38,  /* Thai */
-      USCRIPT_TIBETAN      = 39,  /* Tibt */
-      /** Canadian_Aboriginal script. @stable ICU 2.6 */
-      USCRIPT_CANADIAN_ABORIGINAL = 40,  /* Cans */
-      /** Canadian_Aboriginal script (alias). @stable ICU 2.2 */
-      USCRIPT_UCAS         = USCRIPT_CANADIAN_ABORIGINAL,
-      USCRIPT_YI           = 41,  /* Yiii */
-      USCRIPT_TAGALOG      = 42,  /* Tglg */
-      USCRIPT_HANUNOO      = 43,  /* Hano */
-      USCRIPT_BUHID        = 44,  /* Buhd */
-      USCRIPT_TAGBANWA     = 45,  /* Tagb */
-
-      /* New scripts in Unicode 4 @stable ICU 2.6 */
-      USCRIPT_BRAILLE      = 46,  /* Brai */
-      USCRIPT_CYPRIOT      = 47,  /* Cprt */
-      USCRIPT_LIMBU        = 48,  /* Limb */
-      USCRIPT_LINEAR_B     = 49,  /* Linb */
-      USCRIPT_OSMANYA      = 50,  /* Osma */
-      USCRIPT_SHAVIAN      = 51,  /* Shaw */
-      USCRIPT_TAI_LE       = 52,  /* Tale */
-      USCRIPT_UGARITIC     = 53,  /* Ugar */
-
-      /** New script code in Unicode 4.0.1 @stable ICU 3.0 */
-      USCRIPT_KATAKANA_OR_HIRAGANA = 54,/*Hrkt */
-      
-#ifndef U_HIDE_DRAFT_API
-      /* New scripts in Unicode 4.1 @draft ICU 3.4 */
-      USCRIPT_BUGINESE      = 55, /* Bugi */
-      USCRIPT_GLAGOLITIC    = 56, /* Glag */
-      USCRIPT_KHAROSHTHI    = 57, /* Khar */
-      USCRIPT_SYLOTI_NAGRI  = 58, /* Sylo */
-      USCRIPT_NEW_TAI_LUE   = 59, /* Talu */
-      USCRIPT_TIFINAGH      = 60, /* Tfng */
-      USCRIPT_OLD_PERSIAN   = 61, /* Xpeo */
-
-      /* New script codes from ISO 15924 @draft ICU 3.6 */
-      USCRIPT_BALINESE                      = 62, /* Bali */
-      USCRIPT_BATAK                         = 63, /* Batk */
-      USCRIPT_BLISSYMBOLS                   = 64, /* Blis */
-      USCRIPT_BRAHMI                        = 65, /* Brah */
-      USCRIPT_CHAM                          = 66, /* Cham */
-      USCRIPT_CIRTH                         = 67, /* Cirt */
-      USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC  = 68, /* Cyrs */
-      USCRIPT_DEMOTIC_EGYPTIAN              = 69, /* Egyd */
-      USCRIPT_HIERATIC_EGYPTIAN             = 70, /* Egyh */
-      USCRIPT_EGYPTIAN_HIEROGLYPHS          = 71, /* Egyp */
-      USCRIPT_KHUTSURI                      = 72, /* Geok */
-      USCRIPT_SIMPLIFIED_HAN                = 73, /* Hans */
-      USCRIPT_TRADITIONAL_HAN               = 74, /* Hant */
-      USCRIPT_PAHAWH_HMONG                  = 75, /* Hmng */
-      USCRIPT_OLD_HUNGARIAN                 = 76, /* Hung */
-      USCRIPT_HARAPPAN_INDUS                = 77, /* Inds */
-      USCRIPT_JAVANESE                      = 78, /* Java */
-      USCRIPT_KAYAH_LI                      = 79, /* Kali */
-      USCRIPT_LATIN_FRAKTUR                 = 80, /* Latf */
-      USCRIPT_LATIN_GAELIC                  = 81, /* Latg */
-      USCRIPT_LEPCHA                        = 82, /* Lepc */
-      USCRIPT_LINEAR_A                      = 83, /* Lina */
-      USCRIPT_MANDAEAN                      = 84, /* Mand */
-      USCRIPT_MAYAN_HIEROGLYPHS             = 85, /* Maya */
-      USCRIPT_MEROITIC                      = 86, /* Mero */
-      USCRIPT_NKO                           = 87, /* Nkoo */
-      USCRIPT_ORKHON                        = 88, /* Orkh */
-      USCRIPT_OLD_PERMIC                    = 89, /* Perm */
-      USCRIPT_PHAGS_PA                      = 90, /* Phag */
-      USCRIPT_PHOENICIAN                    = 91, /* Phnx */
-      USCRIPT_PHONETIC_POLLARD              = 92, /* Plrd */
-      USCRIPT_RONGORONGO                    = 93, /* Roro */
-      USCRIPT_SARATI                        = 94, /* Sara */
-      USCRIPT_ESTRANGELO_SYRIAC             = 95, /* Syre */
-      USCRIPT_WESTERN_SYRIAC                = 96, /* Syrj */
-      USCRIPT_EASTERN_SYRIAC                = 97, /* Syrn */
-      USCRIPT_TENGWAR                       = 98, /* Teng */
-      USCRIPT_VAI                           = 99, /* Vaii */
-      USCRIPT_VISIBLE_SPEECH                = 100, /* Visp */
-      USCRIPT_CUNEIFORM                     = 101,/* Xsux */
-      USCRIPT_UNWRITTEN_LANGUAGES           = 102,/* Zxxx */
-      USCRIPT_UNKNOWN                       = 103,/* Zzzz */ /* Unknown="Code for uncoded script", for unassigned code points */
-      /* Private use codes from Qaaa - Qabx are not supported*/
-#endif /* U_HIDE_DRAFT_API */
-      USCRIPT_CODE_LIMIT    = 104
-} UScriptCode;
-
-/**
- * Gets script codes associated with the given locale or ISO 15924 abbreviation or name. 
- * Fills in USCRIPT_MALAYALAM given "Malayam" OR "Mlym".
- * Fills in USCRIPT_LATIN given "en" OR "en_US" 
- * If required capacity is greater than capacity of the destination buffer then the error code
- * is set to U_BUFFER_OVERFLOW_ERROR and the required capacity is returned
- *
- * <p>Note: To search by short or long script alias only, use
- * u_getPropertyValueEnum(UCHAR_SCRIPT, alias) instead.  This does
- * a fast lookup with no access of the locale data.
- * @param nameOrAbbrOrLocale name of the script, as given in
- * PropertyValueAliases.txt, or ISO 15924 code or locale
- * @param fillIn the UScriptCode buffer to fill in the script code
- * @param capacity the capacity (size) fo UScriptCode buffer passed in.
- * @param err the error status code.
- * @return The number of script codes filled in the buffer passed in 
- * @stable ICU 2.4
- */
-U_STABLE int32_t  U_EXPORT2 
-uscript_getCode(const char* nameOrAbbrOrLocale,UScriptCode* fillIn,int32_t capacity,UErrorCode *err);
-
-/**
- * Gets a script name associated with the given script code. 
- * Returns  "Malayam" given USCRIPT_MALAYALAM
- * @param scriptCode UScriptCode enum
- * @return script long name as given in
- * PropertyValueAliases.txt, or NULL if scriptCode is invalid
- * @stable ICU 2.4
- */
-U_STABLE const char*  U_EXPORT2 
-uscript_getName(UScriptCode scriptCode);
-
-/**
- * Gets a script name associated with the given script code. 
- * Returns  "Mlym" given USCRIPT_MALAYALAM
- * @param scriptCode UScriptCode enum
- * @return script abbreviated name as given in
- * PropertyValueAliases.txt, or NULL if scriptCode is invalid
- * @stable ICU 2.4
- */
-U_STABLE const char*  U_EXPORT2 
-uscript_getShortName(UScriptCode scriptCode);
-
-/** 
- * Gets the script code associated with the given codepoint.
- * Returns USCRIPT_MALAYALAM given 0x0D02 
- * @param codepoint UChar32 codepoint
- * @param err the error status code.
- * @return The UScriptCode, or 0 if codepoint is invalid 
- * @stable ICU 2.4
- */
-U_STABLE UScriptCode  U_EXPORT2 
-uscript_getScript(UChar32 codepoint, UErrorCode *err);
-
-#endif
-
-
diff --git a/Source/JavaScriptGlue/icu/unicode/ustring.h b/Source/JavaScriptGlue/icu/unicode/ustring.h
deleted file mode 100644
index 6ebb6fb..0000000
--- a/Source/JavaScriptGlue/icu/unicode/ustring.h
+++ /dev/null
@@ -1,1320 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1998-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-* File ustring.h
-*
-* Modification History:
-*
-*   Date        Name        Description
-*   12/07/98    bertrand    Creation.
-******************************************************************************
-*/
-
-#ifndef USTRING_H
-#define USTRING_H
-
-#include "unicode/utypes.h"
-#include "unicode/putil.h"
-#include "unicode/uiter.h"
-
-/** Simple declaration for u_strToTitle() to avoid including unicode/ubrk.h. @stable ICU 2.1*/
-#ifndef UBRK_TYPEDEF_UBREAK_ITERATOR
-#   define UBRK_TYPEDEF_UBREAK_ITERATOR
-    typedef void UBreakIterator;
-#endif
-
-/**
- * \file
- * \brief C API: Unicode string handling functions
- *
- * These C API functions provide general Unicode string handling.
- *
- * Some functions are equivalent in name, signature, and behavior to the ANSI C <string.h>
- * functions. (For example, they do not check for bad arguments like NULL string pointers.)
- * In some cases, only the thread-safe variant of such a function is implemented here
- * (see u_strtok_r()).
- *
- * Other functions provide more Unicode-specific functionality like locale-specific
- * upper/lower-casing and string comparison in code point order.
- *
- * ICU uses 16-bit Unicode (UTF-16) in the form of arrays of UChar code units.
- * UTF-16 encodes each Unicode code point with either one or two UChar code units.
- * (This is the default form of Unicode, and a forward-compatible extension of the original,
- * fixed-width form that was known as UCS-2. UTF-16 superseded UCS-2 with Unicode 2.0
- * in 1996.)
- *
- * Some APIs accept a 32-bit UChar32 value for a single code point.
- *
- * ICU also handles 16-bit Unicode text with unpaired surrogates.
- * Such text is not well-formed UTF-16.
- * Code-point-related functions treat unpaired surrogates as surrogate code points,
- * i.e., as separate units.
- *
- * Although UTF-16 is a variable-width encoding form (like some legacy multi-byte encodings),
- * it is much more efficient even for random access because the code unit values
- * for single-unit characters vs. lead units vs. trail units are completely disjoint.
- * This means that it is easy to determine character (code point) boundaries from
- * random offsets in the string.
- *
- * Unicode (UTF-16) string processing is optimized for the single-unit case.
- * Although it is important to support supplementary characters
- * (which use pairs of lead/trail code units called "surrogates"),
- * their occurrence is rare. Almost all characters in modern use require only
- * a single UChar code unit (i.e., their code point values are <=0xffff).
- *
- * For more details see the User Guide Strings chapter (http://oss.software.ibm.com/icu/userguide/strings.html).
- * For a discussion of the handling of unpaired surrogates see also
- * Jitterbug 2145 and its icu mailing list proposal on 2002-sep-18.
- */
-
-/**
- * Determine the length of an array of UChar.
- *
- * @param s The array of UChars, NULL (U+0000) terminated.
- * @return The number of UChars in <code>chars</code>, minus the terminator.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strlen(const UChar *s);
-
-/**
- * Count Unicode code points in the length UChar code units of the string.
- * A code point may occupy either one or two UChar code units.
- * Counting code points involves reading all code units.
- *
- * This functions is basically the inverse of the U16_FWD_N() macro (see utf.h).
- *
- * @param s The input string.
- * @param length The number of UChar code units to be checked, or -1 to count all
- *               code points before the first NUL (U+0000).
- * @return The number of code points in the specified code units.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_countChar32(const UChar *s, int32_t length);
-
-/**
- * Check if the string contains more Unicode code points than a certain number.
- * This is more efficient than counting all code points in the entire string
- * and comparing that number with a threshold.
- * This function may not need to scan the string at all if the length is known
- * (not -1 for NUL-termination) and falls within a certain range, and
- * never needs to count more than 'number+1' code points.
- * Logically equivalent to (u_countChar32(s, length)>number).
- * A Unicode code point may occupy either one or two UChar code units.
- *
- * @param s The input string.
- * @param length The length of the string, or -1 if it is NUL-terminated.
- * @param number The number of code points in the string is compared against
- *               the 'number' parameter.
- * @return Boolean value for whether the string contains more Unicode code points
- *         than 'number'. Same as (u_countChar32(s, length)>number).
- * @stable ICU 2.4
- */
-U_STABLE UBool U_EXPORT2
-u_strHasMoreChar32Than(const UChar *s, int32_t length, int32_t number);
-
-/**
- * Concatenate two ustrings.  Appends a copy of <code>src</code>,
- * including the null terminator, to <code>dst</code>. The initial copied
- * character from <code>src</code> overwrites the null terminator in <code>dst</code>.
- *
- * @param dst The destination string.
- * @param src The source string.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strcat(UChar     *dst, 
-    const UChar     *src);
-
-/**
- * Concatenate two ustrings.  
- * Appends at most <code>n</code> characters from <code>src</code> to <code>dst</code>.
- * Adds a terminating NUL.
- * If src is too long, then only <code>n-1</code> characters will be copied
- * before the terminating NUL.
- * If <code>n&lt;=0</code> then dst is not modified.
- *
- * @param dst The destination string.
- * @param src The source string.
- * @param n The maximum number of characters to compare.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strncat(UChar     *dst, 
-     const UChar     *src, 
-     int32_t     n);
-
-/**
- * Find the first occurrence of a substring in a string.
- * The substring is found at code point boundaries.
- * That means that if the substring begins with
- * a trail surrogate or ends with a lead surrogate,
- * then it is found only if these surrogates stand alone in the text.
- * Otherwise, the substring edge units would be matched against
- * halves of surrogate pairs.
- *
- * @param s The string to search (NUL-terminated).
- * @param substring The substring to find (NUL-terminated).
- * @return A pointer to the first occurrence of <code>substring</code> in <code>s</code>,
- *         or <code>s</code> itself if the <code>substring</code> is empty,
- *         or <code>NULL</code> if <code>substring</code> is not in <code>s</code>.
- * @stable ICU 2.0
- *
- * @see u_strrstr
- * @see u_strFindFirst
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strstr(const UChar *s, const UChar *substring);
-
-/**
- * Find the first occurrence of a substring in a string.
- * The substring is found at code point boundaries.
- * That means that if the substring begins with
- * a trail surrogate or ends with a lead surrogate,
- * then it is found only if these surrogates stand alone in the text.
- * Otherwise, the substring edge units would be matched against
- * halves of surrogate pairs.
- *
- * @param s The string to search.
- * @param length The length of s (number of UChars), or -1 if it is NUL-terminated.
- * @param substring The substring to find (NUL-terminated).
- * @param subLength The length of substring (number of UChars), or -1 if it is NUL-terminated.
- * @return A pointer to the first occurrence of <code>substring</code> in <code>s</code>,
- *         or <code>s</code> itself if the <code>substring</code> is empty,
- *         or <code>NULL</code> if <code>substring</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strstr
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strFindFirst(const UChar *s, int32_t length, const UChar *substring, int32_t subLength);
-
-/**
- * Find the first occurrence of a BMP code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (NUL-terminated).
- * @param c The BMP code point to find.
- * @return A pointer to the first occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.0
- *
- * @see u_strchr32
- * @see u_memchr
- * @see u_strstr
- * @see u_strFindFirst
- */
-U_STABLE UChar * U_EXPORT2
-u_strchr(const UChar *s, UChar c);
-
-/**
- * Find the first occurrence of a code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (NUL-terminated).
- * @param c The code point to find.
- * @return A pointer to the first occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.0
- *
- * @see u_strchr
- * @see u_memchr32
- * @see u_strstr
- * @see u_strFindFirst
- */
-U_STABLE UChar * U_EXPORT2
-u_strchr32(const UChar *s, UChar32 c);
-
-/**
- * Find the last occurrence of a substring in a string.
- * The substring is found at code point boundaries.
- * That means that if the substring begins with
- * a trail surrogate or ends with a lead surrogate,
- * then it is found only if these surrogates stand alone in the text.
- * Otherwise, the substring edge units would be matched against
- * halves of surrogate pairs.
- *
- * @param s The string to search (NUL-terminated).
- * @param substring The substring to find (NUL-terminated).
- * @return A pointer to the last occurrence of <code>substring</code> in <code>s</code>,
- *         or <code>s</code> itself if the <code>substring</code> is empty,
- *         or <code>NULL</code> if <code>substring</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strstr
- * @see u_strFindFirst
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strrstr(const UChar *s, const UChar *substring);
-
-/**
- * Find the last occurrence of a substring in a string.
- * The substring is found at code point boundaries.
- * That means that if the substring begins with
- * a trail surrogate or ends with a lead surrogate,
- * then it is found only if these surrogates stand alone in the text.
- * Otherwise, the substring edge units would be matched against
- * halves of surrogate pairs.
- *
- * @param s The string to search.
- * @param length The length of s (number of UChars), or -1 if it is NUL-terminated.
- * @param substring The substring to find (NUL-terminated).
- * @param subLength The length of substring (number of UChars), or -1 if it is NUL-terminated.
- * @return A pointer to the last occurrence of <code>substring</code> in <code>s</code>,
- *         or <code>s</code> itself if the <code>substring</code> is empty,
- *         or <code>NULL</code> if <code>substring</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strstr
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strFindLast(const UChar *s, int32_t length, const UChar *substring, int32_t subLength);
-
-/**
- * Find the last occurrence of a BMP code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (NUL-terminated).
- * @param c The BMP code point to find.
- * @return A pointer to the last occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strrchr32
- * @see u_memrchr
- * @see u_strrstr
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strrchr(const UChar *s, UChar c);
-
-/**
- * Find the last occurrence of a code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (NUL-terminated).
- * @param c The code point to find.
- * @return A pointer to the last occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strrchr
- * @see u_memchr32
- * @see u_strrstr
- * @see u_strFindLast
- */
-U_STABLE UChar * U_EXPORT2
-u_strrchr32(const UChar *s, UChar32 c);
-
-/**
- * Locates the first occurrence in the string <code>string</code> of any of the characters
- * in the string <code>matchSet</code>.
- * Works just like C's strpbrk but with Unicode.
- *
- * @param string The string in which to search, NUL-terminated.
- * @param matchSet A NUL-terminated string defining a set of code points
- *                 for which to search in the text string.
- * @return A pointer to the  character in <code>string</code> that matches one of the
- *         characters in <code>matchSet</code>, or NULL if no such character is found.
- * @stable ICU 2.0
- */
-U_STABLE UChar * U_EXPORT2
-u_strpbrk(const UChar *string, const UChar *matchSet);
-
-/**
- * Returns the number of consecutive characters in <code>string</code>,
- * beginning with the first, that do not occur somewhere in <code>matchSet</code>.
- * Works just like C's strcspn but with Unicode.
- *
- * @param string The string in which to search, NUL-terminated.
- * @param matchSet A NUL-terminated string defining a set of code points
- *                 for which to search in the text string.
- * @return The number of initial characters in <code>string</code> that do not
- *         occur in <code>matchSet</code>.
- * @see u_strspn
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strcspn(const UChar *string, const UChar *matchSet);
-
-/**
- * Returns the number of consecutive characters in <code>string</code>,
- * beginning with the first, that occur somewhere in <code>matchSet</code>.
- * Works just like C's strspn but with Unicode.
- *
- * @param string The string in which to search, NUL-terminated.
- * @param matchSet A NUL-terminated string defining a set of code points
- *                 for which to search in the text string.
- * @return The number of initial characters in <code>string</code> that do
- *         occur in <code>matchSet</code>.
- * @see u_strcspn
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strspn(const UChar *string, const UChar *matchSet);
-
-/**
- * The string tokenizer API allows an application to break a string into
- * tokens. Unlike strtok(), the saveState (the current pointer within the
- * original string) is maintained in saveState. In the first call, the
- * argument src is a pointer to the string. In subsequent calls to
- * return successive tokens of that string, src must be specified as
- * NULL. The value saveState is set by this function to maintain the
- * function's position within the string, and on each subsequent call
- * you must give this argument the same variable. This function does
- * handle surrogate pairs. This function is similar to the strtok_r()
- * the POSIX Threads Extension (1003.1c-1995) version.
- *
- * @param src String containing token(s). This string will be modified.
- *            After the first call to u_strtok_r(), this argument must
- *            be NULL to get to the next token.
- * @param delim Set of delimiter characters (Unicode code points).
- * @param saveState The current pointer within the original string,
- *              which is set by this function. The saveState
- *              parameter should the address of a local variable of type
- *              UChar *. (i.e. defined "Uhar *myLocalSaveState" and use
- *              &myLocalSaveState for this parameter).
- * @return A pointer to the next token found in src, or NULL
- *         when there are no more tokens.
- * @stable ICU 2.0
- */
-U_STABLE UChar * U_EXPORT2
-u_strtok_r(UChar    *src, 
-     const UChar    *delim,
-           UChar   **saveState);
-
-/**
- * Compare two Unicode strings for bitwise equality (code unit order).
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @return 0 if <code>s1</code> and <code>s2</code> are bitwise equal; a negative
- * value if <code>s1</code> is bitwise less than <code>s2,</code>; a positive
- * value if <code>s1</code> is bitwise greater than <code>s2</code>.
- * @stable ICU 2.0
- */
-U_STABLE int32_t  U_EXPORT2
-u_strcmp(const UChar     *s1, 
-         const UChar     *s2);
-
-/**
- * Compare two Unicode strings in code point order.
- * See u_strCompare for details.
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @return a negative/zero/positive integer corresponding to whether
- * the first string is less than/equal to/greater than the second one
- * in code point order
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strcmpCodePointOrder(const UChar *s1, const UChar *s2);
-
-/**
- * Compare two Unicode strings (binary order).
- *
- * The comparison can be done in code unit order or in code point order.
- * They differ only in UTF-16 when
- * comparing supplementary code points (U+10000..U+10ffff)
- * to BMP code points near the end of the BMP (i.e., U+e000..U+ffff).
- * In code unit order, high BMP code points sort after supplementary code points
- * because they are stored as pairs of surrogates which are at U+d800..U+dfff.
- *
- * This functions works with strings of different explicitly specified lengths
- * unlike the ANSI C-like u_strcmp() and u_memcmp() etc.
- * NUL-terminated strings are possible with length arguments of -1.
- *
- * @param s1 First source string.
- * @param length1 Length of first source string, or -1 if NUL-terminated.
- *
- * @param s2 Second source string.
- * @param length2 Length of second source string, or -1 if NUL-terminated.
- *
- * @param codePointOrder Choose between code unit order (FALSE)
- *                       and code point order (TRUE).
- *
- * @return <0 or 0 or >0 as usual for string comparisons
- *
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_strCompare(const UChar *s1, int32_t length1,
-             const UChar *s2, int32_t length2,
-             UBool codePointOrder);
-
-/**
- * Compare two Unicode strings (binary order)
- * as presented by UCharIterator objects.
- * Works otherwise just like u_strCompare().
- *
- * Both iterators are reset to their start positions.
- * When the function returns, it is undefined where the iterators
- * have stopped.
- *
- * @param iter1 First source string iterator.
- * @param iter2 Second source string iterator.
- * @param codePointOrder Choose between code unit order (FALSE)
- *                       and code point order (TRUE).
- *
- * @return <0 or 0 or >0 as usual for string comparisons
- *
- * @see u_strCompare
- *
- * @stable ICU 2.6
- */
-U_STABLE int32_t U_EXPORT2
-u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder);
-
-#ifndef U_COMPARE_CODE_POINT_ORDER
-/* see also unistr.h and unorm.h */
-/**
- * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
- * Compare strings in code point order instead of code unit order.
- * @stable ICU 2.2
- */
-#define U_COMPARE_CODE_POINT_ORDER  0x8000
-#endif
-
-/**
- * Compare two strings case-insensitively using full case folding.
- * This is equivalent to
- *   u_strCompare(u_strFoldCase(s1, options),
- *                u_strFoldCase(s2, options),
- *                (options&U_COMPARE_CODE_POINT_ORDER)!=0).
- *
- * The comparison can be done in UTF-16 code unit order or in code point order.
- * They differ only when comparing supplementary code points (U+10000..U+10ffff)
- * to BMP code points near the end of the BMP (i.e., U+e000..U+ffff).
- * In code unit order, high BMP code points sort after supplementary code points
- * because they are stored as pairs of surrogates which are at U+d800..U+dfff.
- *
- * This functions works with strings of different explicitly specified lengths
- * unlike the ANSI C-like u_strcmp() and u_memcmp() etc.
- * NUL-terminated strings are possible with length arguments of -1.
- *
- * @param s1 First source string.
- * @param length1 Length of first source string, or -1 if NUL-terminated.
- *
- * @param s2 Second source string.
- * @param length2 Length of second source string, or -1 if NUL-terminated.
- *
- * @param options A bit set of options:
- *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
- *     Comparison in code unit order with default case folding.
- *
- *   - U_COMPARE_CODE_POINT_ORDER
- *     Set to choose code point order instead of code unit order
- *     (see u_strCompare for details).
- *
- *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
- *
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                  which must not indicate a failure before the function call.
- *
- * @return <0 or 0 or >0 as usual for string comparisons
- *
- * @stable ICU 2.2
- */
-U_STABLE int32_t U_EXPORT2
-u_strCaseCompare(const UChar *s1, int32_t length1,
-                 const UChar *s2, int32_t length2,
-                 uint32_t options,
-                 UErrorCode *pErrorCode);
-
-/**
- * Compare two ustrings for bitwise equality. 
- * Compares at most <code>n</code> characters.
- *
- * @param ucs1 A string to compare.
- * @param ucs2 A string to compare.
- * @param n The maximum number of characters to compare.
- * @return 0 if <code>s1</code> and <code>s2</code> are bitwise equal; a negative
- * value if <code>s1</code> is bitwise less than <code>s2</code>; a positive
- * value if <code>s1</code> is bitwise greater than <code>s2</code>.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strncmp(const UChar     *ucs1, 
-     const UChar     *ucs2, 
-     int32_t     n);
-
-/**
- * Compare two Unicode strings in code point order.
- * This is different in UTF-16 from u_strncmp() if supplementary characters are present.
- * For details, see u_strCompare().
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @param n The maximum number of characters to compare.
- * @return a negative/zero/positive integer corresponding to whether
- * the first string is less than/equal to/greater than the second one
- * in code point order
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strncmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t n);
-
-/**
- * Compare two strings case-insensitively using full case folding.
- * This is equivalent to u_strcmp(u_strFoldCase(s1, options), u_strFoldCase(s2, options)).
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @param options A bit set of options:
- *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
- *     Comparison in code unit order with default case folding.
- *
- *   - U_COMPARE_CODE_POINT_ORDER
- *     Set to choose code point order instead of code unit order
- *     (see u_strCompare for details).
- *
- *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
- *
- * @return A negative, zero, or positive integer indicating the comparison result.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strcasecmp(const UChar *s1, const UChar *s2, uint32_t options);
-
-/**
- * Compare two strings case-insensitively using full case folding.
- * This is equivalent to u_strcmp(u_strFoldCase(s1, at most n, options),
- * u_strFoldCase(s2, at most n, options)).
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @param n The maximum number of characters each string to case-fold and then compare.
- * @param options A bit set of options:
- *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
- *     Comparison in code unit order with default case folding.
- *
- *   - U_COMPARE_CODE_POINT_ORDER
- *     Set to choose code point order instead of code unit order
- *     (see u_strCompare for details).
- *
- *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
- *
- * @return A negative, zero, or positive integer indicating the comparison result.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strncasecmp(const UChar *s1, const UChar *s2, int32_t n, uint32_t options);
-
-/**
- * Compare two strings case-insensitively using full case folding.
- * This is equivalent to u_strcmp(u_strFoldCase(s1, n, options),
- * u_strFoldCase(s2, n, options)).
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @param length The number of characters in each string to case-fold and then compare.
- * @param options A bit set of options:
- *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
- *     Comparison in code unit order with default case folding.
- *
- *   - U_COMPARE_CODE_POINT_ORDER
- *     Set to choose code point order instead of code unit order
- *     (see u_strCompare for details).
- *
- *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
- *
- * @return A negative, zero, or positive integer indicating the comparison result.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_memcasecmp(const UChar *s1, const UChar *s2, int32_t length, uint32_t options);
-
-/**
- * Copy a ustring. Adds a null terminator.
- *
- * @param dst The destination string.
- * @param src The source string.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strcpy(UChar     *dst, 
-    const UChar     *src);
-
-/**
- * Copy a ustring.
- * Copies at most <code>n</code> characters.  The result will be null terminated
- * if the length of <code>src</code> is less than <code>n</code>.
- *
- * @param dst The destination string.
- * @param src The source string.
- * @param n The maximum number of characters to copy.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strncpy(UChar     *dst, 
-     const UChar     *src, 
-     int32_t     n);
-
-#if !UCONFIG_NO_CONVERSION
-
-/**
- * Copy a byte string encoded in the default codepage to a ustring.
- * Adds a null terminator.
- * Performs a host byte to UChar conversion
- *
- * @param dst The destination string.
- * @param src The source string.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2 u_uastrcpy(UChar *dst,
-               const char *src );
-
-/**
- * Copy a byte string encoded in the default codepage to a ustring.
- * Copies at most <code>n</code> characters.  The result will be null terminated
- * if the length of <code>src</code> is less than <code>n</code>.
- * Performs a host byte to UChar conversion
- *
- * @param dst The destination string.
- * @param src The source string.
- * @param n The maximum number of characters to copy.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2 u_uastrncpy(UChar *dst,
-            const char *src,
-            int32_t n);
-
-/**
- * Copy ustring to a byte string encoded in the default codepage.
- * Adds a null terminator.
- * Performs a UChar to host byte conversion
- *
- * @param dst The destination string.
- * @param src The source string.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE char* U_EXPORT2 u_austrcpy(char *dst,
-            const UChar *src );
-
-/**
- * Copy ustring to a byte string encoded in the default codepage.
- * Copies at most <code>n</code> characters.  The result will be null terminated
- * if the length of <code>src</code> is less than <code>n</code>.
- * Performs a UChar to host byte conversion
- *
- * @param dst The destination string.
- * @param src The source string.
- * @param n The maximum number of characters to copy.
- * @return A pointer to <code>dst</code>.
- * @stable ICU 2.0
- */
-U_STABLE char* U_EXPORT2 u_austrncpy(char *dst,
-            const UChar *src,
-            int32_t n );
-
-#endif
-
-/**
- * Synonym for memcpy(), but with UChars only.
- * @param dest The destination string
- * @param src The source string
- * @param count The number of characters to copy
- * @return A pointer to <code>dest</code>
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_memcpy(UChar *dest, const UChar *src, int32_t count);
-
-/**
- * Synonym for memmove(), but with UChars only.
- * @param dest The destination string
- * @param src The source string
- * @param count The number of characters to move
- * @return A pointer to <code>dest</code>
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_memmove(UChar *dest, const UChar *src, int32_t count);
-
-/**
- * Initialize <code>count</code> characters of <code>dest</code> to <code>c</code>.
- *
- * @param dest The destination string.
- * @param c The character to initialize the string.
- * @param count The maximum number of characters to set.
- * @return A pointer to <code>dest</code>.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_memset(UChar *dest, UChar c, int32_t count);
-
-/**
- * Compare the first <code>count</code> UChars of each buffer.
- *
- * @param buf1 The first string to compare.
- * @param buf2 The second string to compare.
- * @param count The maximum number of UChars to compare.
- * @return When buf1 < buf2, a negative number is returned.
- *      When buf1 == buf2, 0 is returned.
- *      When buf1 > buf2, a positive number is returned.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_memcmp(const UChar *buf1, const UChar *buf2, int32_t count);
-
-/**
- * Compare two Unicode strings in code point order.
- * This is different in UTF-16 from u_memcmp() if supplementary characters are present.
- * For details, see u_strCompare().
- *
- * @param s1 A string to compare.
- * @param s2 A string to compare.
- * @param count The maximum number of characters to compare.
- * @return a negative/zero/positive integer corresponding to whether
- * the first string is less than/equal to/greater than the second one
- * in code point order
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_memcmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t count);
-
-/**
- * Find the first occurrence of a BMP code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (contains <code>count</code> UChars).
- * @param c The BMP code point to find.
- * @param count The length of the string.
- * @return A pointer to the first occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.0
- *
- * @see u_strchr
- * @see u_memchr32
- * @see u_strFindFirst
- */
-U_STABLE UChar* U_EXPORT2
-u_memchr(const UChar *s, UChar c, int32_t count);
-
-/**
- * Find the first occurrence of a code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (contains <code>count</code> UChars).
- * @param c The code point to find.
- * @param count The length of the string.
- * @return A pointer to the first occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.0
- *
- * @see u_strchr32
- * @see u_memchr
- * @see u_strFindFirst
- */
-U_STABLE UChar* U_EXPORT2
-u_memchr32(const UChar *s, UChar32 c, int32_t count);
-
-/**
- * Find the last occurrence of a BMP code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (contains <code>count</code> UChars).
- * @param c The BMP code point to find.
- * @param count The length of the string.
- * @return A pointer to the last occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strrchr
- * @see u_memrchr32
- * @see u_strFindLast
- */
-U_STABLE UChar* U_EXPORT2
-u_memrchr(const UChar *s, UChar c, int32_t count);
-
-/**
- * Find the last occurrence of a code point in a string.
- * A surrogate code point is found only if its match in the text is not
- * part of a surrogate pair.
- * A NUL character is found at the string terminator.
- *
- * @param s The string to search (contains <code>count</code> UChars).
- * @param c The code point to find.
- * @param count The length of the string.
- * @return A pointer to the last occurrence of <code>c</code> in <code>s</code>
- *         or <code>NULL</code> if <code>c</code> is not in <code>s</code>.
- * @stable ICU 2.4
- *
- * @see u_strrchr32
- * @see u_memrchr
- * @see u_strFindLast
- */
-U_STABLE UChar* U_EXPORT2
-u_memrchr32(const UChar *s, UChar32 c, int32_t count);
-
-/**
- * Unicode String literals in C.
- * We need one macro to declare a variable for the string
- * and to statically preinitialize it if possible,
- * and a second macro to dynamically intialize such a string variable if necessary.
- *
- * The macros are defined for maximum performance.
- * They work only for strings that contain "invariant characters", i.e.,
- * only latin letters, digits, and some punctuation.
- * See utypes.h for details.
- *
- * A pair of macros for a single string must be used with the same
- * parameters.
- * The string parameter must be a C string literal.
- * The length of the string, not including the terminating
- * <code>NUL</code>, must be specified as a constant.
- * The U_STRING_DECL macro should be invoked exactly once for one
- * such string variable before it is used.
- *
- * Usage:
- * <pre>
- * &#32;   U_STRING_DECL(ustringVar1, "Quick-Fox 2", 11);
- * &#32;   U_STRING_DECL(ustringVar2, "jumps 5%", 8);
- * &#32;   static UBool didInit=FALSE;
- * &#32;
- * &#32;   int32_t function() {
- * &#32;       if(!didInit) {
- * &#32;           U_STRING_INIT(ustringVar1, "Quick-Fox 2", 11);
- * &#32;           U_STRING_INIT(ustringVar2, "jumps 5%", 8);
- * &#32;           didInit=TRUE;
- * &#32;       }
- * &#32;       return u_strcmp(ustringVar1, ustringVar2);
- * &#32;   }
- * </pre>
- * @stable ICU 2.0
- */
-#if U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && U_CHARSET_FAMILY==U_ASCII_FAMILY
-#   define U_STRING_DECL(var, cs, length) static const wchar_t var[(length)+1]={ L ## cs }
-    /**@stable ICU 2.0 */
-#   define U_STRING_INIT(var, cs, length)
-#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY
-#   define U_STRING_DECL(var, cs, length) static const UChar var[(length)+1]={ (const UChar *)cs }
-    /**@stable ICU 2.0 */
-#   define U_STRING_INIT(var, cs, length)
-#else
-#   define U_STRING_DECL(var, cs, length) static UChar var[(length)+1]
-    /**@stable ICU 2.0 */
-#   define U_STRING_INIT(var, cs, length) u_charsToUChars(cs, var, length+1)
-#endif
-
-/**
- * Unescape a string of characters and write the resulting
- * Unicode characters to the destination buffer.  The following escape
- * sequences are recognized:
- *
- * \\uhhhh       4 hex digits; h in [0-9A-Fa-f]
- * \\Uhhhhhhhh   8 hex digits
- * \\xhh         1-2 hex digits
- * \\x{h...}     1-8 hex digits
- * \\ooo         1-3 octal digits; o in [0-7]
- * \\cX          control-X; X is masked with 0x1F
- *
- * as well as the standard ANSI C escapes:
- *
- * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A,
- * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B,
- * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C
- *
- * Anything else following a backslash is generically escaped.  For
- * example, "[a\\-z]" returns "[a-z]".
- *
- * If an escape sequence is ill-formed, this method returns an empty
- * string.  An example of an ill-formed sequence is "\\u" followed by
- * fewer than 4 hex digits.
- *
- * The above characters are recognized in the compiler's codepage,
- * that is, they are coded as 'u', '\\', etc.  Characters that are
- * not parts of escape sequences are converted using u_charsToUChars().
- *
- * This function is similar to UnicodeString::unescape() but not
- * identical to it.  The latter takes a source UnicodeString, so it
- * does escape recognition but no conversion.
- *
- * @param src a zero-terminated string of invariant characters
- * @param dest pointer to buffer to receive converted and unescaped
- * text and, if there is room, a zero terminator.  May be NULL for
- * preflighting, in which case no UChars will be written, but the
- * return value will still be valid.  On error, an empty string is
- * stored here (if possible).
- * @param destCapacity the number of UChars that may be written at
- * dest.  Ignored if dest == NULL.
- * @return the length of unescaped string.
- * @see u_unescapeAt
- * @see UnicodeString#unescape()
- * @see UnicodeString#unescapeAt()
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_unescape(const char *src,
-           UChar *dest, int32_t destCapacity);
-
-U_CDECL_BEGIN
-/**
- * Callback function for u_unescapeAt() that returns a character of
- * the source text given an offset and a context pointer.  The context
- * pointer will be whatever is passed into u_unescapeAt().
- *
- * @param offset pointer to the offset that will be passed to u_unescapeAt().
- * @param context an opaque pointer passed directly into u_unescapeAt()
- * @return the character represented by the escape sequence at
- * offset
- * @see u_unescapeAt
- * @stable ICU 2.0
- */
-typedef UChar (U_CALLCONV *UNESCAPE_CHAR_AT)(int32_t offset, void *context);
-U_CDECL_END
-
-/**
- * Unescape a single sequence. The character at offset-1 is assumed
- * (without checking) to be a backslash.  This method takes a callback
- * pointer to a function that returns the UChar at a given offset.  By
- * varying this callback, ICU functions are able to unescape char*
- * strings, UnicodeString objects, and UFILE pointers.
- *
- * If offset is out of range, or if the escape sequence is ill-formed,
- * (UChar32)0xFFFFFFFF is returned.  See documentation of u_unescape()
- * for a list of recognized sequences.
- *
- * @param charAt callback function that returns a UChar of the source
- * text given an offset and a context pointer.
- * @param offset pointer to the offset that will be passed to charAt.
- * The offset value will be updated upon return to point after the
- * last parsed character of the escape sequence.  On error the offset
- * is unchanged.
- * @param length the number of characters in the source text.  The
- * last character of the source text is considered to be at offset
- * length-1.
- * @param context an opaque pointer passed directly into charAt.
- * @return the character represented by the escape sequence at
- * offset, or (UChar32)0xFFFFFFFF on error.
- * @see u_unescape()
- * @see UnicodeString#unescape()
- * @see UnicodeString#unescapeAt()
- * @stable ICU 2.0
- */
-U_STABLE UChar32 U_EXPORT2
-u_unescapeAt(UNESCAPE_CHAR_AT charAt,
-             int32_t *offset,
-             int32_t length,
-             void *context);
-
-/**
- * Uppercase the characters in a string.
- * Casing is locale-dependent and context-sensitive.
- * The result may be longer or shorter than the original.
- * The source string and the destination buffer are allowed to overlap.
- *
- * @param dest      A buffer for the result string. The result will be zero-terminated if
- *                  the buffer is large enough.
- * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
- *                  dest may be NULL and the function will only return the length of the result
- *                  without writing any of the result string.
- * @param src       The original string
- * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
- * @param locale    The locale to consider, or "" for the root locale or NULL for the default locale.
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                  which must not indicate a failure before the function call.
- * @return The length of the result string. It may be greater than destCapacity. In that case,
- *         only some of the result was written to the destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strToUpper(UChar *dest, int32_t destCapacity,
-             const UChar *src, int32_t srcLength,
-             const char *locale,
-             UErrorCode *pErrorCode);
-
-/**
- * Lowercase the characters in a string.
- * Casing is locale-dependent and context-sensitive.
- * The result may be longer or shorter than the original.
- * The source string and the destination buffer are allowed to overlap.
- *
- * @param dest      A buffer for the result string. The result will be zero-terminated if
- *                  the buffer is large enough.
- * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
- *                  dest may be NULL and the function will only return the length of the result
- *                  without writing any of the result string.
- * @param src       The original string
- * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
- * @param locale    The locale to consider, or "" for the root locale or NULL for the default locale.
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                  which must not indicate a failure before the function call.
- * @return The length of the result string. It may be greater than destCapacity. In that case,
- *         only some of the result was written to the destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strToLower(UChar *dest, int32_t destCapacity,
-             const UChar *src, int32_t srcLength,
-             const char *locale,
-             UErrorCode *pErrorCode);
-
-#if !UCONFIG_NO_BREAK_ITERATION
-
-/**
- * Titlecase a string.
- * Casing is locale-dependent and context-sensitive.
- * Titlecasing uses a break iterator to find the first characters of words
- * that are to be titlecased. It titlecases those characters and lowercases
- * all others.
- *
- * The titlecase break iterator can be provided to customize for arbitrary
- * styles, using rules and dictionaries beyond the standard iterators.
- * It may be more efficient to always provide an iterator to avoid
- * opening and closing one for each string.
- * The standard titlecase iterator for the root locale implements the
- * algorithm of Unicode TR 21.
- *
- * This function uses only the first() and next() methods of the
- * provided break iterator.
- *
- * The result may be longer or shorter than the original.
- * The source string and the destination buffer are allowed to overlap.
- *
- * @param dest      A buffer for the result string. The result will be zero-terminated if
- *                  the buffer is large enough.
- * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
- *                  dest may be NULL and the function will only return the length of the result
- *                  without writing any of the result string.
- * @param src       The original string
- * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
- * @param titleIter A break iterator to find the first characters of words
- *                  that are to be titlecased.
- *                  If none is provided (NULL), then a standard titlecase
- *                  break iterator is opened.
- * @param locale    The locale to consider, or "" for the root locale or NULL for the default locale.
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                  which must not indicate a failure before the function call.
- * @return The length of the result string. It may be greater than destCapacity. In that case,
- *         only some of the result was written to the destination buffer.
- * @stable ICU 2.1
- */
-U_STABLE int32_t U_EXPORT2
-u_strToTitle(UChar *dest, int32_t destCapacity,
-             const UChar *src, int32_t srcLength,
-             UBreakIterator *titleIter,
-             const char *locale,
-             UErrorCode *pErrorCode);
-
-#endif
-
-/**
- * Case-fold the characters in a string.
- * Case-folding is locale-independent and not context-sensitive,
- * but there is an option for whether to include or exclude mappings for dotted I
- * and dotless i that are marked with 'I' in CaseFolding.txt.
- * The result may be longer or shorter than the original.
- * The source string and the destination buffer are allowed to overlap.
- *
- * @param dest      A buffer for the result string. The result will be zero-terminated if
- *                  the buffer is large enough.
- * @param destCapacity The size of the buffer (number of UChars). If it is 0, then
- *                  dest may be NULL and the function will only return the length of the result
- *                  without writing any of the result string.
- * @param src       The original string
- * @param srcLength The length of the original string. If -1, then src must be zero-terminated.
- * @param options   Either U_FOLD_CASE_DEFAULT or U_FOLD_CASE_EXCLUDE_SPECIAL_I
- * @param pErrorCode Must be a valid pointer to an error code value,
- *                  which must not indicate a failure before the function call.
- * @return The length of the result string. It may be greater than destCapacity. In that case,
- *         only some of the result was written to the destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE int32_t U_EXPORT2
-u_strFoldCase(UChar *dest, int32_t destCapacity,
-              const UChar *src, int32_t srcLength,
-              uint32_t options,
-              UErrorCode *pErrorCode);
-
-/**
- * Converts a sequence of UChars to wchar_t units.
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of wchar_t's). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE wchar_t* U_EXPORT2
-u_strToWCS(wchar_t *dest, 
-           int32_t destCapacity,
-           int32_t *pDestLength,
-           const UChar *src, 
-           int32_t srcLength,
-           UErrorCode *pErrorCode);
-/**
- * Converts a sequence of wchar_t units to UChars
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of UChars). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strFromWCS(UChar   *dest,
-             int32_t destCapacity, 
-             int32_t *pDestLength,
-             const wchar_t *src,
-             int32_t srcLength,
-             UErrorCode *pErrorCode);
-/**
- * Converts a sequence of UChars (UTF-16) to UTF-8 bytes
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of chars). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE char* U_EXPORT2 
-u_strToUTF8(char *dest,           
-            int32_t destCapacity,
-            int32_t *pDestLength,
-            const UChar *src, 
-            int32_t srcLength,
-            UErrorCode *pErrorCode);
-
-/**
- * Converts a sequence of UTF-8 bytes to UChars (UTF-16).
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of UChars). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2
-u_strFromUTF8(UChar *dest,             
-              int32_t destCapacity,
-              int32_t *pDestLength,
-              const char *src, 
-              int32_t srcLength,
-              UErrorCode *pErrorCode);
-
-/**
- * Converts a sequence of UChars (UTF-16) to UTF32 units.
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of UChar32s). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE UChar32* U_EXPORT2 
-u_strToUTF32(UChar32 *dest, 
-             int32_t  destCapacity,
-             int32_t  *pDestLength,
-             const UChar *src, 
-             int32_t  srcLength,
-             UErrorCode *pErrorCode);
-
-/**
- * Converts a sequence of UTF32 units to UChars (UTF-16)
- *
- * @param dest          A buffer for the result string. The result will be zero-terminated if
- *                      the buffer is large enough.
- * @param destCapacity  The size of the buffer (number of UChars). If it is 0, then
- *                      dest may be NULL and the function will only return the length of the 
- *                      result without writing any of the result string (pre-flighting).
- * @param pDestLength   A pointer to receive the number of units written to the destination. If 
- *                      pDestLength!=NULL then *pDestLength is always set to the 
- *                      number of output units corresponding to the transformation of 
- *                      all the input units, even in case of a buffer overflow.
- * @param src           The original source string
- * @param srcLength     The length of the original string. If -1, then src must be zero-terminated.
- * @param pErrorCode    Must be a valid pointer to an error code value,
- *                      which must not indicate a failure before the function call.
- * @return The pointer to destination buffer.
- * @stable ICU 2.0
- */
-U_STABLE UChar* U_EXPORT2 
-u_strFromUTF32(UChar   *dest,
-               int32_t destCapacity, 
-               int32_t *pDestLength,
-               const UChar32 *src,
-               int32_t srcLength,
-               UErrorCode *pErrorCode);
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/utf.h b/Source/JavaScriptGlue/icu/unicode/utf.h
deleted file mode 100644
index 201691d..0000000
--- a/Source/JavaScriptGlue/icu/unicode/utf.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  utf.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 1999sep09
-*   created by: Markus W. Scherer
-*/
-
-/**
- * \file
- * \brief C API: Code point macros
- *
- * This file defines macros for checking whether a code point is
- * a surrogate or a non-character etc.
- *
- * The UChar and UChar32 data types for Unicode code units and code points
- * are defined in umachines.h because they can be machine-dependent.
- *
- * utf.h is included by utypes.h and itself includes utf8.h and utf16.h after some
- * common definitions. Those files define macros for efficiently getting code points
- * in and out of UTF-8/16 strings.
- * utf16.h macros have "U16_" prefixes.
- * utf8.h defines similar macros with "U8_" prefixes for UTF-8 string handling.
- *
- * ICU processes 16-bit Unicode strings.
- * Most of the time, such strings are well-formed UTF-16.
- * Single, unpaired surrogates must be handled as well, and are treated in ICU
- * like regular code points where possible.
- * (Pairs of surrogate code points are indistinguishable from supplementary
- * code points encoded as pairs of supplementary code units.)
- *
- * In fact, almost all Unicode code points in normal text (>99%)
- * are on the BMP (<=U+ffff) and even <=U+d7ff.
- * ICU functions handle supplementary code points (U+10000..U+10ffff)
- * but are optimized for the much more frequently occurring BMP code points.
- *
- * utf.h defines UChar to be an unsigned 16-bit integer. If this matches wchar_t, then
- * UChar is defined to be exactly wchar_t, otherwise uint16_t.
- *
- * UChar32 is defined to be a signed 32-bit integer (int32_t), large enough for a 21-bit
- * Unicode code point (Unicode scalar value, 0..0x10ffff).
- * Before ICU 2.4, the definition of UChar32 was similarly platform-dependent as
- * the definition of UChar. For details see the documentation for UChar32 itself.
- *
- * utf.h also defines a small number of C macros for single Unicode code points.
- * These are simple checks for surrogates and non-characters.
- * For actual Unicode character properties see uchar.h.
- *
- * By default, string operations must be done with error checking in case
- * a string is not well-formed UTF-16.
- * The macros will detect if a surrogate code unit is unpaired
- * (lead unit without trail unit or vice versa) and just return the unit itself
- * as the code point.
- * (It is an accidental property of Unicode and UTF-16 that all
- * malformed sequences can be expressed unambiguously with a distinct subrange
- * of Unicode code points.)
- *
- * When it is safe to assume that text is well-formed UTF-16
- * (does not contain single, unpaired surrogates), then one can use
- * U16_..._UNSAFE macros.
- * These do not check for proper code unit sequences or truncated text and may
- * yield wrong results or even cause a crash if they are used with "malformed"
- * text.
- * In practice, U16_..._UNSAFE macros will produce slightly less code but
- * should not be faster because the processing is only different when a
- * surrogate code unit is detected, which will be rare.
- *
- * Similarly for UTF-8, there are "safe" macros without a suffix,
- * and U8_..._UNSAFE versions.
- * The performance differences are much larger here because UTF-8 provides so
- * many opportunities for malformed sequences.
- * The unsafe UTF-8 macros are entirely implemented inside the macro definitions
- * and are fast, while the safe UTF-8 macros call functions for all but the
- * trivial (ASCII) cases.
- *
- * Unlike with UTF-16, malformed sequences cannot be expressed with distinct
- * code point values (0..U+10ffff). They are indicated with negative values instead.
- *
- * For more information see the ICU User Guide Strings chapter
- * (http://oss.software.ibm.com/icu/userguide/).
- *
- * <em>Usage:</em>
- * ICU coding guidelines for if() statements should be followed when using these macros.
- * Compound statements (curly braces {}) must be used  for if-else-while... 
- * bodies and all macro statements should be terminated with semicolon.
- *
- * @stable ICU 2.4
- */
-
-#ifndef __UTF_H__
-#define __UTF_H__
-
-#include "unicode/utypes.h"
-/* include the utfXX.h after the following definitions */
-
-/* single-code point definitions -------------------------------------------- */
-
-/**
- * This value is intended for sentinel values for APIs that
- * (take or) return single code points (UChar32).
- * It is outside of the Unicode code point range 0..0x10ffff.
- * 
- * For example, a "done" or "error" value in a new API
- * could be indicated with U_SENTINEL.
- *
- * ICU APIs designed before ICU 2.4 usually define service-specific "done"
- * values, mostly 0xffff.
- * Those may need to be distinguished from
- * actual U+ffff text contents by calling functions like
- * CharacterIterator::hasNext() or UnicodeString::length().
- *
- * @return -1
- * @see UChar32
- * @stable ICU 2.4
- */
-#define U_SENTINEL (-1)
-
-/**
- * Is this code point a Unicode noncharacter?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_UNICODE_NONCHAR(c) \
-    ((c)>=0xfdd0 && \
-     ((uint32_t)(c)<=0xfdef || ((c)&0xfffe)==0xfffe) && \
-     (uint32_t)(c)<=0x10ffff)
-
-/**
- * Is c a Unicode code point value (0..U+10ffff)
- * that can be assigned a character?
- *
- * Code points that are not characters include:
- * - single surrogate code points (U+d800..U+dfff, 2048 code points)
- * - the last two code points on each plane (U+__fffe and U+__ffff, 34 code points)
- * - U+fdd0..U+fdef (new with Unicode 3.1, 32 code points)
- * - the highest Unicode code point value is U+10ffff
- *
- * This means that all code points below U+d800 are character code points,
- * and that boundary is tested first for performance.
- *
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_UNICODE_CHAR(c) \
-    ((uint32_t)(c)<0xd800 || \
-        ((uint32_t)(c)>0xdfff && \
-         (uint32_t)(c)<=0x10ffff && \
-         !U_IS_UNICODE_NONCHAR(c)))
-
-#ifndef U_HIDE_DRAFT_API
-
-/**
- * Is this code point a BMP code point (U+0000..U+ffff)?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @draft ICU 2.8
- */
-#define U_IS_BMP(c) ((uint32_t)(c)<=0xffff)
-
-/**
- * Is this code point a supplementary code point (U+10000..U+10ffff)?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @draft ICU 2.8
- */
-#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff)
-
-#endif /*U_HIDE_DRAFT_API*/
- 
-/**
- * Is this code point a lead surrogate (U+d800..U+dbff)?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
-
-/**
- * Is this code point a trail surrogate (U+dc00..U+dfff)?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
-
-/**
- * Is this code point a surrogate (U+d800..U+dfff)?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
-
-/**
- * Assuming c is a surrogate code point (U_IS_SURROGATE(c)),
- * is it a lead surrogate?
- * @param c 32-bit code point
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
-
-/* include the utfXX.h ------------------------------------------------------ */
-
-#include "unicode/utf8.h"
-#include "unicode/utf16.h"
-
-/* utf_old.h contains deprecated, pre-ICU 2.4 definitions */
-#include "unicode/utf_old.h"
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/utf16.h b/Source/JavaScriptGlue/icu/unicode/utf16.h
deleted file mode 100644
index 7bf3872..0000000
--- a/Source/JavaScriptGlue/icu/unicode/utf16.h
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  utf16.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 1999sep09
-*   created by: Markus W. Scherer
-*/
-
-/**
- * \file
- * \brief C API: 16-bit Unicode handling macros
- * 
- * This file defines macros to deal with 16-bit Unicode (UTF-16) code units and strings.
- * utf16.h is included by utf.h after unicode/umachine.h
- * and some common definitions.
- *
- * For more information see utf.h and the ICU User Guide Strings chapter
- * (http://oss.software.ibm.com/icu/userguide/).
- *
- * <em>Usage:</em>
- * ICU coding guidelines for if() statements should be followed when using these macros.
- * Compound statements (curly braces {}) must be used  for if-else-while... 
- * bodies and all macro statements should be terminated with semicolon.
- */
-
-#ifndef __UTF16_H__
-#define __UTF16_H__
-
-/* utf.h must be included first. */
-#ifndef __UTF_H__
-#   include "unicode/utf.h"
-#endif
-
-/* single-code point definitions -------------------------------------------- */
-
-/**
- * Does this code unit alone encode a code point (BMP, not a surrogate)?
- * @param c 16-bit code unit
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U16_IS_SINGLE(c) !U_IS_SURROGATE(c)
-
-/**
- * Is this code unit a lead surrogate (U+d800..U+dbff)?
- * @param c 16-bit code unit
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
-
-/**
- * Is this code unit a trail surrogate (U+dc00..U+dfff)?
- * @param c 16-bit code unit
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
-
-/**
- * Is this code unit a surrogate (U+d800..U+dfff)?
- * @param c 16-bit code unit
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
-
-/**
- * Assuming c is a surrogate code point (U16_IS_SURROGATE(c)),
- * is it a lead surrogate?
- * @param c 16-bit code unit
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
-
-/**
- * Helper constant for U16_GET_SUPPLEMENTARY.
- * @internal
- */
-#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
-
-/**
- * Get a supplementary code point value (U+10000..U+10ffff)
- * from its lead and trail surrogates.
- * The result is undefined if the input values are not
- * lead and trail surrogates.
- *
- * @param lead lead surrogate (U+d800..U+dbff)
- * @param trail trail surrogate (U+dc00..U+dfff)
- * @return supplementary code point (U+10000..U+10ffff)
- * @stable ICU 2.4
- */
-#define U16_GET_SUPPLEMENTARY(lead, trail) \
-    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
-
-
-/**
- * Get the lead surrogate (0xd800..0xdbff) for a
- * supplementary code point (0x10000..0x10ffff).
- * @param supplementary 32-bit code point (U+10000..U+10ffff)
- * @return lead surrogate (U+d800..U+dbff) for supplementary
- * @stable ICU 2.4
- */
-#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
-
-/**
- * Get the trail surrogate (0xdc00..0xdfff) for a
- * supplementary code point (0x10000..0x10ffff).
- * @param supplementary 32-bit code point (U+10000..U+10ffff)
- * @return trail surrogate (U+dc00..U+dfff) for supplementary
- * @stable ICU 2.4
- */
-#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
-
-/**
- * How many 16-bit code units are used to encode this Unicode code point? (1 or 2)
- * The result is not defined if c is not a Unicode code point (U+0000..U+10ffff).
- * @param c 32-bit code point
- * @return 1 or 2
- * @stable ICU 2.4
- */
-#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
-
-/**
- * The maximum number of 16-bit code units per Unicode code point (U+0000..U+10ffff).
- * @return 2
- * @stable ICU 2.4
- */
-#define U16_MAX_LENGTH 2
-
-/**
- * Get a code point from a string at a random-access offset,
- * without changing the offset.
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * The offset may point to either the lead or trail surrogate unit
- * for a supplementary code point, in which case the macro will read
- * the adjacent matching surrogate as well.
- * The result is undefined if the offset points to a single, unpaired surrogate.
- * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT.
- *
- * @param s const UChar * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U16_GET
- * @stable ICU 2.4
- */
-#define U16_GET_UNSAFE(s, i, c) { \
-    (c)=(s)[i]; \
-    if(U16_IS_SURROGATE(c)) { \
-        if(U16_IS_SURROGATE_LEAD(c)) { \
-            (c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)+1]); \
-        } else { \
-            (c)=U16_GET_SUPPLEMENTARY((s)[(i)-1], (c)); \
-        } \
-    } \
-}
-
-/**
- * Get a code point from a string at a random-access offset,
- * without changing the offset.
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * The offset may point to either the lead or trail surrogate unit
- * for a supplementary code point, in which case the macro will read
- * the adjacent matching surrogate as well.
- * If the offset points to a single, unpaired surrogate, then that itself
- * will be returned as the code point.
- * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT.
- *
- * @param s const UChar * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i<length
- * @param length string length
- * @param c output UChar32 variable
- * @see U16_GET_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_GET(s, start, i, length, c) { \
-    (c)=(s)[i]; \
-    if(U16_IS_SURROGATE(c)) { \
-        uint16_t __c2; \
-        if(U16_IS_SURROGATE_LEAD(c)) { \
-            if((i)+1<(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
-                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
-            } \
-        } else { \
-            if((i)-1>=(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
-                (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
-            } \
-        } \
-    } \
-}
-
-/* definitions with forward iteration --------------------------------------- */
-
-/**
- * Get a code point from a string at a code point boundary offset,
- * and advance the offset to the next code point boundary.
- * (Post-incrementing forward iteration.)
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * The offset may point to the lead surrogate unit
- * for a supplementary code point, in which case the macro will read
- * the following trail surrogate as well.
- * If the offset points to a trail surrogate, then that itself
- * will be returned as the code point.
- * The result is undefined if the offset points to a single, unpaired lead surrogate.
- *
- * @param s const UChar * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U16_NEXT
- * @stable ICU 2.4
- */
-#define U16_NEXT_UNSAFE(s, i, c) { \
-    (c)=(s)[(i)++]; \
-    if(U16_IS_LEAD(c)) { \
-        (c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)++]); \
-    } \
-}
-
-/**
- * Get a code point from a string at a code point boundary offset,
- * and advance the offset to the next code point boundary.
- * (Post-incrementing forward iteration.)
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * The offset may point to the lead surrogate unit
- * for a supplementary code point, in which case the macro will read
- * the following trail surrogate as well.
- * If the offset points to a trail surrogate or
- * to a single, unpaired lead surrogate, then that itself
- * will be returned as the code point.
- *
- * @param s const UChar * string
- * @param i string offset, i<length
- * @param length string length
- * @param c output UChar32 variable
- * @see U16_NEXT_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_NEXT(s, i, length, c) { \
-    (c)=(s)[(i)++]; \
-    if(U16_IS_LEAD(c)) { \
-        uint16_t __c2; \
-        if((i)<(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \
-            ++(i); \
-            (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
-        } \
-    } \
-}
-
-/**
- * Append a code point to a string, overwriting 1 or 2 code units.
- * The offset points to the current end of the string contents
- * and is advanced (post-increment).
- * "Unsafe" macro, assumes a valid code point and sufficient space in the string.
- * Otherwise, the result is undefined.
- *
- * @param s const UChar * string buffer
- * @param i string offset
- * @param c code point to append
- * @see U16_APPEND
- * @stable ICU 2.4
- */
-#define U16_APPEND_UNSAFE(s, i, c) { \
-    if((uint32_t)(c)<=0xffff) { \
-        (s)[(i)++]=(uint16_t)(c); \
-    } else { \
-        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
-        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
-    } \
-}
-
-/**
- * Append a code point to a string, overwriting 1 or 2 code units.
- * The offset points to the current end of the string contents
- * and is advanced (post-increment).
- * "Safe" macro, checks for a valid code point.
- * If a surrogate pair is written, checks for sufficient space in the string.
- * If the code point is not valid or a trail surrogate does not fit,
- * then isError is set to TRUE.
- *
- * @param s const UChar * string buffer
- * @param i string offset, i<length
- * @param capacity size of the string buffer
- * @param c code point to append
- * @param isError output UBool set to TRUE if an error occurs, otherwise not modified
- * @see U16_APPEND_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_APPEND(s, i, capacity, c, isError) { \
-    if((uint32_t)(c)<=0xffff) { \
-        (s)[(i)++]=(uint16_t)(c); \
-    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
-        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
-        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
-    } else /* c>0x10ffff or not enough space */ { \
-        (isError)=TRUE; \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the next.
- * (Post-incrementing iteration.)
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @see U16_FWD_1
- * @stable ICU 2.4
- */
-#define U16_FWD_1_UNSAFE(s, i) { \
-    if(U16_IS_LEAD((s)[(i)++])) { \
-        ++(i); \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the next.
- * (Post-incrementing iteration.)
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param i string offset, i<length
- * @param length string length
- * @see U16_FWD_1_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_FWD_1(s, i, length) { \
-    if(U16_IS_LEAD((s)[(i)++]) && (i)<(length) && U16_IS_TRAIL((s)[i])) { \
-        ++(i); \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the n-th next one,
- * i.e., move forward by n code points.
- * (Post-incrementing iteration.)
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @param n number of code points to skip
- * @see U16_FWD_N
- * @stable ICU 2.4
- */
-#define U16_FWD_N_UNSAFE(s, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0) { \
-        U16_FWD_1_UNSAFE(s, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the n-th next one,
- * i.e., move forward by n code points.
- * (Post-incrementing iteration.)
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param i string offset, i<length
- * @param length string length
- * @param n number of code points to skip
- * @see U16_FWD_N_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_FWD_N(s, i, length, n) { \
-    int32_t __N=(n); \
-    while(__N>0 && (i)<(length)) { \
-        U16_FWD_1(s, i, length); \
-        --__N; \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary
- * at the start of a code point.
- * If the offset points to the trail surrogate of a surrogate pair,
- * then the offset is decremented.
- * Otherwise, it is not modified.
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @see U16_SET_CP_START
- * @stable ICU 2.4
- */
-#define U16_SET_CP_START_UNSAFE(s, i) { \
-    if(U16_IS_TRAIL((s)[i])) { \
-        --(i); \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary
- * at the start of a code point.
- * If the offset points to the trail surrogate of a surrogate pair,
- * then the offset is decremented.
- * Otherwise, it is not modified.
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @see U16_SET_CP_START_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_SET_CP_START(s, start, i) { \
-    if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
-        --(i); \
-    } \
-}
-
-/* definitions with backward iteration -------------------------------------- */
-
-/**
- * Move the string offset from one code point boundary to the previous one
- * and get the code point between them.
- * (Pre-decrementing backward iteration.)
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * The input offset may be the same as the string length.
- * If the offset is behind a trail surrogate unit
- * for a supplementary code point, then the macro will read
- * the preceding lead surrogate as well.
- * If the offset is behind a lead surrogate, then that itself
- * will be returned as the code point.
- * The result is undefined if the offset is behind a single, unpaired trail surrogate.
- *
- * @param s const UChar * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U16_PREV
- * @stable ICU 2.4
- */
-#define U16_PREV_UNSAFE(s, i, c) { \
-    (c)=(s)[--(i)]; \
-    if(U16_IS_TRAIL(c)) { \
-        (c)=U16_GET_SUPPLEMENTARY((s)[--(i)], (c)); \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one
- * and get the code point between them.
- * (Pre-decrementing backward iteration.)
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * The input offset may be the same as the string length.
- * If the offset is behind a trail surrogate unit
- * for a supplementary code point, then the macro will read
- * the preceding lead surrogate as well.
- * If the offset is behind a lead surrogate or behind a single, unpaired
- * trail surrogate, then that itself
- * will be returned as the code point.
- *
- * @param s const UChar * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @param c output UChar32 variable
- * @see U16_PREV_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_PREV(s, start, i, c) { \
-    (c)=(s)[--(i)]; \
-    if(U16_IS_TRAIL(c)) { \
-        uint16_t __c2; \
-        if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
-            --(i); \
-            (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
-        } \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @see U16_BACK_1
- * @stable ICU 2.4
- */
-#define U16_BACK_1_UNSAFE(s, i) { \
-    if(U16_IS_TRAIL((s)[--(i)])) { \
-        --(i); \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @see U16_BACK_1_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_BACK_1(s, start, i) { \
-    if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
-        --(i); \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the n-th one before it,
- * i.e., move backward by n code points.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @param n number of code points to skip
- * @see U16_BACK_N
- * @stable ICU 2.4
- */
-#define U16_BACK_N_UNSAFE(s, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0) { \
-        U16_BACK_1_UNSAFE(s, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the n-th one before it,
- * i.e., move backward by n code points.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param start start of string
- * @param i string offset, i<length
- * @param n number of code points to skip
- * @see U16_BACK_N_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_BACK_N(s, start, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0 && (i)>(start)) { \
-        U16_BACK_1(s, start, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary after a code point.
- * If the offset is behind the lead surrogate of a surrogate pair,
- * then the offset is incremented.
- * Otherwise, it is not modified.
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-16.
- *
- * @param s const UChar * string
- * @param i string offset
- * @see U16_SET_CP_LIMIT
- * @stable ICU 2.4
- */
-#define U16_SET_CP_LIMIT_UNSAFE(s, i) { \
-    if(U16_IS_LEAD((s)[(i)-1])) { \
-        ++(i); \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary after a code point.
- * If the offset is behind the lead surrogate of a surrogate pair,
- * then the offset is incremented.
- * Otherwise, it is not modified.
- * The input offset may be the same as the string length.
- * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
- *
- * @param s const UChar * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i<=length
- * @param length string length
- * @see U16_SET_CP_LIMIT_UNSAFE
- * @stable ICU 2.4
- */
-#define U16_SET_CP_LIMIT(s, start, i, length) { \
-    if((start)<(i) && (i)<(length) && U16_IS_LEAD((s)[(i)-1]) && U16_IS_TRAIL((s)[i])) { \
-        ++(i); \
-    } \
-}
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/utf8.h b/Source/JavaScriptGlue/icu/unicode/utf8.h
deleted file mode 100644
index f83662b..0000000
--- a/Source/JavaScriptGlue/icu/unicode/utf8.h
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 1999-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  utf8.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 1999sep13
-*   created by: Markus W. Scherer
-*/
-
-/**
- * \file
- * \brief C API: 8-bit Unicode handling macros
- * 
- * This file defines macros to deal with 8-bit Unicode (UTF-8) code units (bytes) and strings.
- * utf8.h is included by utf.h after unicode/umachine.h
- * and some common definitions.
- *
- * For more information see utf.h and the ICU User Guide Strings chapter
- * (http://oss.software.ibm.com/icu/userguide/).
- *
- * <em>Usage:</em>
- * ICU coding guidelines for if() statements should be followed when using these macros.
- * Compound statements (curly braces {}) must be used  for if-else-while... 
- * bodies and all macro statements should be terminated with semicolon.
- */
-
-#ifndef __UTF8_H__
-#define __UTF8_H__
-
-/* utf.h must be included first. */
-#ifndef __UTF_H__
-#   include "unicode/utf.h"
-#endif
-
-/* internal definitions ----------------------------------------------------- */
-
-/**
- * \var utf8_countTrailBytes
- * Internal array with numbers of trail bytes for any given byte used in
- * lead byte position.
- * @internal
- */
-#ifdef U_UTF8_IMPL
-U_INTERNAL const uint8_t 
-#elif defined(U_STATIC_IMPLEMENTATION)
-U_CFUNC const uint8_t
-#else
-U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/ 
-#endif
-utf8_countTrailBytes[256];
-
-/**
- * Count the trail bytes for a UTF-8 lead byte.
- * @internal
- */
-#define U8_COUNT_TRAIL_BYTES(leadByte) (utf8_countTrailBytes[(uint8_t)leadByte])
-
-/**
- * Mask a UTF-8 lead byte, leave only the lower bits that form part of the code point value.
- * @internal
- */
-#define U8_MASK_LEAD_BYTE(leadByte, countTrailBytes) ((leadByte)&=(1<<(6-(countTrailBytes)))-1)
-
-/**
- * Function for handling "next code point" with error-checking.
- * @internal
- */
-U_INTERNAL UChar32 U_EXPORT2
-utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict);
-
-/**
- * Function for handling "append code point" with error-checking.
- * @internal
- */
-U_INTERNAL int32_t U_EXPORT2
-utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool *pIsError);
-
-/**
- * Function for handling "previous code point" with error-checking.
- * @internal
- */
-U_INTERNAL UChar32 U_EXPORT2
-utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict);
-
-/**
- * Function for handling "skip backward one code point" with error-checking.
- * @internal
- */
-U_INTERNAL int32_t U_EXPORT2
-utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
-
-/* single-code point definitions -------------------------------------------- */
-
-/**
- * Does this code unit (byte) encode a code point by itself (US-ASCII 0..0x7f)?
- * @param c 8-bit code unit (byte)
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U8_IS_SINGLE(c) (((c)&0x80)==0)
-
-/**
- * Is this code unit (byte) a UTF-8 lead byte?
- * @param c 8-bit code unit (byte)
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc0)<0x3e)
-
-/**
- * Is this code unit (byte) a UTF-8 trail byte?
- * @param c 8-bit code unit (byte)
- * @return TRUE or FALSE
- * @stable ICU 2.4
- */
-#define U8_IS_TRAIL(c) (((c)&0xc0)==0x80)
-
-/**
- * How many code units (bytes) are used for the UTF-8 encoding
- * of this Unicode code point?
- * @param c 32-bit code point
- * @return 1..4, or 0 if c is a surrogate or not a Unicode code point
- * @stable ICU 2.4
- */
-#define U8_LENGTH(c) \
-    ((uint32_t)(c)<=0x7f ? 1 : \
-        ((uint32_t)(c)<=0x7ff ? 2 : \
-            ((uint32_t)(c)<=0xd7ff ? 3 : \
-                ((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
-                    ((uint32_t)(c)<=0xffff ? 3 : 4)\
-                ) \
-            ) \
-        ) \
-    )
-
-/**
- * The maximum number of UTF-8 code units (bytes) per Unicode code point (U+0000..U+10ffff).
- * @return 4
- * @stable ICU 2.4
- */
-#define U8_MAX_LENGTH 4
-
-/**
- * Get a code point from a string at a random-access offset,
- * without changing the offset.
- * The offset may point to either the lead byte or one of the trail bytes
- * for a code point, in which case the macro will read all of the bytes
- * for the code point.
- * The result is undefined if the offset points to an illegal UTF-8
- * byte sequence.
- * Iteration through a string is more efficient with U8_NEXT_UNSAFE or U8_NEXT.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U8_GET
- * @stable ICU 2.4
- */
-#define U8_GET_UNSAFE(s, i, c) { \
-    int32_t _u8_get_unsafe_index=(int32_t)(i); \
-    U8_SET_CP_START_UNSAFE(s, _u8_get_unsafe_index); \
-    U8_NEXT_UNSAFE(s, _u8_get_unsafe_index, c); \
-}
-
-/**
- * Get a code point from a string at a random-access offset,
- * without changing the offset.
- * The offset may point to either the lead byte or one of the trail bytes
- * for a code point, in which case the macro will read all of the bytes
- * for the code point.
- * If the offset points to an illegal UTF-8 byte sequence, then
- * c is set to a negative value.
- * Iteration through a string is more efficient with U8_NEXT_UNSAFE or U8_NEXT.
- *
- * @param s const uint8_t * string
- * @param start starting string offset
- * @param i string offset, start<=i<length
- * @param length string length
- * @param c output UChar32 variable, set to <0 in case of an error
- * @see U8_GET_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_GET(s, start, i, length, c) { \
-    int32_t _u8_get_index=(int32_t)(i); \
-    U8_SET_CP_START(s, start, _u8_get_index); \
-    U8_NEXT(s, _u8_get_index, length, c); \
-}
-
-/* definitions with forward iteration --------------------------------------- */
-
-/**
- * Get a code point from a string at a code point boundary offset,
- * and advance the offset to the next code point boundary.
- * (Post-incrementing forward iteration.)
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * The offset may point to the lead byte of a multi-byte sequence,
- * in which case the macro will read the whole sequence.
- * The result is undefined if the offset points to a trail byte
- * or an illegal UTF-8 sequence.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U8_NEXT
- * @stable ICU 2.4
- */
-#define U8_NEXT_UNSAFE(s, i, c) { \
-    (c)=(s)[(i)++]; \
-    if((uint8_t)((c)-0xc0)<0x35) { \
-        uint8_t __count=U8_COUNT_TRAIL_BYTES(c); \
-        U8_MASK_LEAD_BYTE(c, __count); \
-        switch(__count) { \
-        /* each following branch falls through to the next one */ \
-        case 3: \
-            (c)=((c)<<6)|((s)[(i)++]&0x3f); \
-        case 2: \
-            (c)=((c)<<6)|((s)[(i)++]&0x3f); \
-        case 1: \
-            (c)=((c)<<6)|((s)[(i)++]&0x3f); \
-        /* no other branches to optimize switch() */ \
-            break; \
-        } \
-    } \
-}
-
-/**
- * Get a code point from a string at a code point boundary offset,
- * and advance the offset to the next code point boundary.
- * (Post-incrementing forward iteration.)
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * The offset may point to the lead byte of a multi-byte sequence,
- * in which case the macro will read the whole sequence.
- * If the offset points to a trail byte or an illegal UTF-8 sequence, then
- * c is set to a negative value.
- *
- * @param s const uint8_t * string
- * @param i string offset, i<length
- * @param length string length
- * @param c output UChar32 variable, set to <0 in case of an error
- * @see U8_NEXT_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_NEXT(s, i, length, c) { \
-    (c)=(s)[(i)++]; \
-    if(((uint8_t)(c))>=0x80) { \
-        if(U8_IS_LEAD(c)) { \
-            (c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (int32_t)(length), c, -1); \
-        } else { \
-            (c)=U_SENTINEL; \
-        } \
-    } \
-}
-
-/**
- * Append a code point to a string, overwriting 1 to 4 bytes.
- * The offset points to the current end of the string contents
- * and is advanced (post-increment).
- * "Unsafe" macro, assumes a valid code point and sufficient space in the string.
- * Otherwise, the result is undefined.
- *
- * @param s const uint8_t * string buffer
- * @param i string offset
- * @param c code point to append
- * @see U8_APPEND
- * @stable ICU 2.4
- */
-#define U8_APPEND_UNSAFE(s, i, c) { \
-    if((uint32_t)(c)<=0x7f) { \
-        (s)[(i)++]=(uint8_t)(c); \
-    } else { \
-        if((uint32_t)(c)<=0x7ff) { \
-            (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); \
-        } else { \
-            if((uint32_t)(c)<=0xffff) { \
-                (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \
-            } else { \
-                (s)[(i)++]=(uint8_t)(((c)>>18)|0xf0); \
-                (s)[(i)++]=(uint8_t)((((c)>>12)&0x3f)|0x80); \
-            } \
-            (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \
-        } \
-        (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
-    } \
-}
-
-/**
- * Append a code point to a string, overwriting 1 or 2 code units.
- * The offset points to the current end of the string contents
- * and is advanced (post-increment).
- * "Safe" macro, checks for a valid code point.
- * If a non-ASCII code point is written, checks for sufficient space in the string.
- * If the code point is not valid or trail bytes do not fit,
- * then isError is set to TRUE.
- *
- * @param s const uint8_t * string buffer
- * @param i string offset, i<length
- * @param length size of the string buffer
- * @param c code point to append
- * @param isError output UBool set to TRUE if an error occurs, otherwise not modified
- * @see U8_APPEND_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_APPEND(s, i, length, c, isError) { \
-    if((uint32_t)(c)<=0x7f) { \
-        (s)[(i)++]=(uint8_t)(c); \
-    } else { \
-        (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(length), c, &(isError)); \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the next.
- * (Post-incrementing iteration.)
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @see U8_FWD_1
- * @stable ICU 2.4
- */
-#define U8_FWD_1_UNSAFE(s, i) { \
-    (i)+=1+U8_COUNT_TRAIL_BYTES((s)[i]); \
-}
-
-/**
- * Advance the string offset from one code point boundary to the next.
- * (Post-incrementing iteration.)
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param i string offset, i<length
- * @param length string length
- * @see U8_FWD_1_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_FWD_1(s, i, length) { \
-    uint8_t __b=(s)[(i)++]; \
-    if(U8_IS_LEAD(__b)) { \
-        uint8_t __count=U8_COUNT_TRAIL_BYTES(__b); \
-        if((i)+__count>(length)) { \
-            __count=(uint8_t)((length)-(i)); \
-        } \
-        while(__count>0 && U8_IS_TRAIL((s)[i])) { \
-            ++(i); \
-            --__count; \
-        } \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the n-th next one,
- * i.e., move forward by n code points.
- * (Post-incrementing iteration.)
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @param n number of code points to skip
- * @see U8_FWD_N
- * @stable ICU 2.4
- */
-#define U8_FWD_N_UNSAFE(s, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0) { \
-        U8_FWD_1_UNSAFE(s, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Advance the string offset from one code point boundary to the n-th next one,
- * i.e., move forward by n code points.
- * (Post-incrementing iteration.)
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param i string offset, i<length
- * @param length string length
- * @param n number of code points to skip
- * @see U8_FWD_N_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_FWD_N(s, i, length, n) { \
-    int32_t __N=(n); \
-    while(__N>0 && (i)<(length)) { \
-        U8_FWD_1(s, i, length); \
-        --__N; \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary
- * at the start of a code point.
- * If the offset points to a UTF-8 trail byte,
- * then the offset is moved backward to the corresponding lead byte.
- * Otherwise, it is not modified.
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @see U8_SET_CP_START
- * @stable ICU 2.4
- */
-#define U8_SET_CP_START_UNSAFE(s, i) { \
-    while(U8_IS_TRAIL((s)[i])) { --(i); } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary
- * at the start of a code point.
- * If the offset points to a UTF-8 trail byte,
- * then the offset is moved backward to the corresponding lead byte.
- * Otherwise, it is not modified.
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @see U8_SET_CP_START_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_SET_CP_START(s, start, i) { \
-    if(U8_IS_TRAIL((s)[(i)])) { \
-        (i)=utf8_back1SafeBody(s, start, (int32_t)(i)); \
-    } \
-}
-
-/* definitions with backward iteration -------------------------------------- */
-
-/**
- * Move the string offset from one code point boundary to the previous one
- * and get the code point between them.
- * (Pre-decrementing backward iteration.)
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * The input offset may be the same as the string length.
- * If the offset is behind a multi-byte sequence, then the macro will read
- * the whole sequence.
- * If the offset is behind a lead byte, then that itself
- * will be returned as the code point.
- * The result is undefined if the offset is behind an illegal UTF-8 sequence.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @param c output UChar32 variable
- * @see U8_PREV
- * @stable ICU 2.4
- */
-#define U8_PREV_UNSAFE(s, i, c) { \
-    (c)=(s)[--(i)]; \
-    if(U8_IS_TRAIL(c)) { \
-        uint8_t __b, __count=1, __shift=6; \
-\
-        /* c is a trail byte */ \
-        (c)&=0x3f; \
-        for(;;) { \
-            __b=(s)[--(i)]; \
-            if(__b>=0xc0) { \
-                U8_MASK_LEAD_BYTE(__b, __count); \
-                (c)|=(UChar32)__b<<__shift; \
-                break; \
-            } else { \
-                (c)|=(UChar32)(__b&0x3f)<<__shift; \
-                ++__count; \
-                __shift+=6; \
-            } \
-        } \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one
- * and get the code point between them.
- * (Pre-decrementing backward iteration.)
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * The input offset may be the same as the string length.
- * If the offset is behind a multi-byte sequence, then the macro will read
- * the whole sequence.
- * If the offset is behind a lead byte, then that itself
- * will be returned as the code point.
- * If the offset is behind an illegal UTF-8 sequence, then c is set to a negative value.
- *
- * @param s const uint8_t * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @param c output UChar32 variable, set to <0 in case of an error
- * @see U8_PREV_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_PREV(s, start, i, c) { \
-    (c)=(s)[--(i)]; \
-    if((c)>=0x80) { \
-        if((c)<=0xbf) { \
-            (c)=utf8_prevCharSafeBody(s, start, &(i), c, -1); \
-        } else { \
-            (c)=U_SENTINEL; \
-        } \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @see U8_BACK_1
- * @stable ICU 2.4
- */
-#define U8_BACK_1_UNSAFE(s, i) { \
-    while(U8_IS_TRAIL((s)[--(i)])) {} \
-}
-
-/**
- * Move the string offset from one code point boundary to the previous one.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i
- * @see U8_BACK_1_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_BACK_1(s, start, i) { \
-    if(U8_IS_TRAIL((s)[--(i)])) { \
-        (i)=utf8_back1SafeBody(s, start, (int32_t)(i)); \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the n-th one before it,
- * i.e., move backward by n code points.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @param n number of code points to skip
- * @see U8_BACK_N
- * @stable ICU 2.4
- */
-#define U8_BACK_N_UNSAFE(s, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0) { \
-        U8_BACK_1_UNSAFE(s, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Move the string offset from one code point boundary to the n-th one before it,
- * i.e., move backward by n code points.
- * (Pre-decrementing backward iteration.)
- * The input offset may be the same as the string length.
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param start index of the start of the string
- * @param i string offset, i<length
- * @param n number of code points to skip
- * @see U8_BACK_N_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_BACK_N(s, start, i, n) { \
-    int32_t __N=(n); \
-    while(__N>0 && (i)>(start)) { \
-        U8_BACK_1(s, start, i); \
-        --__N; \
-    } \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary after a code point.
- * If the offset is behind a partial multi-byte sequence,
- * then the offset is incremented to behind the whole sequence.
- * Otherwise, it is not modified.
- * The input offset may be the same as the string length.
- * "Unsafe" macro, assumes well-formed UTF-8.
- *
- * @param s const uint8_t * string
- * @param i string offset
- * @see U8_SET_CP_LIMIT
- * @stable ICU 2.4
- */
-#define U8_SET_CP_LIMIT_UNSAFE(s, i) { \
-    U8_BACK_1_UNSAFE(s, i); \
-    U8_FWD_1_UNSAFE(s, i); \
-}
-
-/**
- * Adjust a random-access offset to a code point boundary after a code point.
- * If the offset is behind a partial multi-byte sequence,
- * then the offset is incremented to behind the whole sequence.
- * Otherwise, it is not modified.
- * The input offset may be the same as the string length.
- * "Safe" macro, checks for illegal sequences and for string boundaries.
- *
- * @param s const uint8_t * string
- * @param start starting string offset (usually 0)
- * @param i string offset, start<=i<=length
- * @param length string length
- * @see U8_SET_CP_LIMIT_UNSAFE
- * @stable ICU 2.4
- */
-#define U8_SET_CP_LIMIT(s, start, i, length) { \
-    if((start)<(i) && (i)<(length)) { \
-        U8_BACK_1(s, start, i); \
-        U8_FWD_1(s, i, length); \
-    } \
-}
-
-#endif
diff --git a/Source/JavaScriptGlue/icu/unicode/utf_old.h b/Source/JavaScriptGlue/icu/unicode/utf_old.h
deleted file mode 100644
index 8504a03..0000000
--- a/Source/JavaScriptGlue/icu/unicode/utf_old.h
+++ /dev/null
@@ -1 +0,0 @@
-/* This file is intentionally left blank. */
diff --git a/Source/JavaScriptGlue/icu/unicode/utypes.h b/Source/JavaScriptGlue/icu/unicode/utypes.h
deleted file mode 100644
index e20cd79..0000000
--- a/Source/JavaScriptGlue/icu/unicode/utypes.h
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 1996-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-*  FILE NAME : UTYPES.H (formerly ptypes.h)
-*
-*   Date        Name        Description
-*   12/11/96    helena      Creation.
-*   02/27/97    aliu        Added typedefs for UClassID, int8, int16, int32,
-*                           uint8, uint16, and uint32.
-*   04/01/97    aliu        Added XP_CPLUSPLUS and modified to work under C as
-*                            well as C++.
-*                           Modified to use memcpy() for uprv_arrayCopy() fns.
-*   04/14/97    aliu        Added TPlatformUtilities.
-*   05/07/97    aliu        Added import/export specifiers (replacing the old
-*                           broken EXT_CLASS).  Added version number for our
-*                           code.  Cleaned up header.
-*    6/20/97    helena      Java class name change.
-*   08/11/98    stephen     UErrorCode changed from typedef to enum
-*   08/12/98    erm         Changed T_ANALYTIC_PACKAGE_VERSION to 3
-*   08/14/98    stephen     Added uprv_arrayCopy() for int8_t, int16_t, int32_t
-*   12/09/98    jfitz       Added BUFFER_OVERFLOW_ERROR (bug 1100066)
-*   04/20/99    stephen     Cleaned up & reworked for autoconf.
-*                           Renamed to utypes.h.
-*   05/05/99    stephen     Changed to use <inttypes.h>
-*   12/07/99    helena      Moved copyright notice string from ucnv_bld.h here.
-*******************************************************************************
-*/
-
-#ifndef UTYPES_H
-#define UTYPES_H
-
-
-#include "unicode/umachine.h"
-#include "unicode/utf.h"
-#include "unicode/uversion.h"
-#include "unicode/uconfig.h"
-
-#ifdef U_HIDE_DRAFT_API
-#include "unicode/udraft.h"
-#endif
-
-#ifdef U_HIDE_DEPRECATED_API
-#include "unicode/udeprctd.h"
-#endif
-
-#ifdef U_HIDE_DEPRECATED_API
-#include "unicode/uobslete.h"
-#endif
-
-
-/*!
- * \file
- * \brief Basic definitions for ICU, for both C and C++ APIs
- *
- * This file defines basic types, constants, and enumerations directly or
- * indirectly by including other header files, especially utf.h for the
- * basic character and string definitions and umachine.h for consistent
- * integer and other types.
- */
-
-/*===========================================================================*/
-/* char Character set family                                                 */
-/*===========================================================================*/
-
-/**
- * U_CHARSET_FAMILY is equal to this value when the platform is an ASCII based platform.
- * @stable ICU 2.0
- */
-#define U_ASCII_FAMILY 0
-
-/**
- * U_CHARSET_FAMILY is equal to this value when the platform is an EBCDIC based platform.
- * @stable ICU 2.0
- */
-#define U_EBCDIC_FAMILY 1
-
-/**
- * \def U_CHARSET_FAMILY
- *
- * <p>These definitions allow to specify the encoding of text
- * in the char data type as defined by the platform and the compiler.
- * It is enough to determine the code point values of "invariant characters",
- * which are the ones shared by all encodings that are in use
- * on a given platform.</p>
- *
- * <p>Those "invariant characters" should be all the uppercase and lowercase
- * latin letters, the digits, the space, and "basic punctuation".
- * Also, '\\n', '\\r', '\\t' should be available.</p>
- *
- * <p>The list of "invariant characters" is:<br>
- * \code
- *    A-Z  a-z  0-9  SPACE  "  %  &amp;  '  (  )  *  +  ,  -  .  /  :  ;  <  =  >  ?  _
- * \endcode
- * <br>
- * (52 letters + 10 numbers + 20 punc/sym/space = 82 total)</p>
- *
- * <p>This matches the IBM Syntactic Character Set (CS 640).</p>
- *
- * <p>In other words, all the graphic characters in 7-bit ASCII should
- * be safely accessible except the following:</p>
- *
- * \code
- *    '\' <backslash>
- *    '[' <left bracket>
- *    ']' <right bracket>
- *    '{' <left brace>
- *    '}' <right brace>
- *    '^' <circumflex>
- *    '~' <tilde>
- *    '!' <exclamation mark>
- *    '#' <number sign>
- *    '|' <vertical line>
- *    '$' <dollar sign>
- *    '@' <commercial at>
- *    '`' <grave accent>
- * \endcode
- * @stable ICU 2.0
- */
-
-#ifndef U_CHARSET_FAMILY
-#   define U_CHARSET_FAMILY 0
-#endif
-
-/*===========================================================================*/
-/* ICUDATA naming scheme                                                     */
-/*===========================================================================*/
-
-/**
- * \def U_ICUDATA_TYPE_LETTER
- *
- * This is a platform-dependent string containing one letter:
- * - b for big-endian, ASCII-family platforms
- * - l for little-endian, ASCII-family platforms
- * - e for big-endian, EBCDIC-family platforms
- * This letter is part of the common data file name.
- * @stable ICU 2.0
- */
-
-/**
- * \def U_ICUDATA_TYPE_LITLETTER
- * The non-string form of U_ICUDATA_TYPE_LETTER
- * @stable ICU 2.0
- */
-#if U_CHARSET_FAMILY
-#   if U_IS_BIG_ENDIAN
-   /* EBCDIC - should always be BE */
-#     define U_ICUDATA_TYPE_LETTER "e"
-#     define U_ICUDATA_TYPE_LITLETTER e
-#   else
-#     error "Don't know what to do with little endian EBCDIC!"
-#     define U_ICUDATA_TYPE_LETTER "x"
-#     define U_ICUDATA_TYPE_LITLETTER x
-#   endif
-#else
-#   if U_IS_BIG_ENDIAN
-      /* Big-endian ASCII */
-#     define U_ICUDATA_TYPE_LETTER "b"
-#     define U_ICUDATA_TYPE_LITLETTER b
-#   else
-      /* Little-endian ASCII */
-#     define U_ICUDATA_TYPE_LETTER "l"
-#     define U_ICUDATA_TYPE_LITLETTER l
-#   endif
-#endif
-
-/**
- * A single string literal containing the icudata stub name. i.e. 'icudt18e' for
- * ICU 1.8.x on EBCDIC, etc..
- * @stable ICU 2.0
- */
-#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
-
-
-/**
- *  U_ICU_ENTRY_POINT is the name of the DLL entry point to the ICU data library.
- *    Defined as a literal, not a string.
- *    Tricky Preprocessor use - ## operator replaces macro paramters with the literal string
- *                              from the corresponding macro invocation, _before_ other macro substitutions.
- *                              Need a nested #defines to get the actual version numbers rather than
- *                              the literal text U_ICU_VERSION_MAJOR_NUM into the name.
- *                              The net result will be something of the form
- *                                  #define U_ICU_ENTRY_POINT icudt19_dat
- * @stable ICU 2.4
- */
-#define U_ICUDATA_ENTRY_POINT  U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM)
-/**
- * @internal
- */
-#define U_DEF2_ICUDATA_ENTRY_POINT(major, minor) U_DEF_ICUDATA_ENTRY_POINT(major, minor)
-/**
- * @internal
- */
-#define U_DEF_ICUDATA_ENTRY_POINT(major, minor) icudt##major##minor##_dat
-
-/**
- * \def U_CALLCONV
- * Similar to U_CDECL_BEGIN/U_CDECL_END, this qualifier is necessary
- * in callback function typedefs to make sure that the calling convention
- * is compatible.
- *
- * This is only used for non-ICU-API functions.
- * When a function is a public ICU API,
- * you must use the U_CAPI and U_EXPORT2 qualifiers.
- * @stable ICU 2.0
- */
-#if defined(OS390) && (__COMPILER_VER__ < 0x41020000) && defined(XP_CPLUSPLUS)
-#    define U_CALLCONV __cdecl
-#else
-#    define U_CALLCONV U_EXPORT2
-#endif
-
-/**
- * \def NULL
- * Define NULL if necessary, to 0 for C++ and to ((void *)0) for C.
- * @stable ICU 2.0
- */
-#ifndef NULL
-#ifdef XP_CPLUSPLUS
-#define NULL    0
-#else
-#define NULL    ((void *)0)
-#endif
-#endif
-
-/*===========================================================================*/
-/* Calendar/TimeZone data types                                              */
-/*===========================================================================*/
-
-/**
- * Date and Time data type.
- * This is a primitive data type that holds the date and time
- * as the number of milliseconds since 1970-jan-01, 00:00 UTC.
- * UTC leap seconds are ignored.
- * @stable ICU 2.0
- */
-typedef double UDate;
-
-/** The number of milliseconds per second @stable ICU 2.0 */
-#define U_MILLIS_PER_SECOND        (1000)
-/** The number of milliseconds per minute @stable ICU 2.0 */
-#define U_MILLIS_PER_MINUTE       (60000)
-/** The number of milliseconds per hour @stable ICU 2.0 */
-#define U_MILLIS_PER_HOUR       (3600000)
-/** The number of milliseconds per day @stable ICU 2.0 */
-#define U_MILLIS_PER_DAY       (86400000)
-
-
-/*===========================================================================*/
-/* UClassID-based RTTI */
-/*===========================================================================*/
-
-/**
- * UClassID is used to identify classes without using RTTI, since RTTI
- * is not yet supported by all C++ compilers.  Each class hierarchy which needs
- * to implement polymorphic clone() or operator==() defines two methods,
- * described in detail below.  UClassID values can be compared using
- * operator==(). Nothing else should be done with them.
- *
- * \par
- * getDynamicClassID() is declared in the base class of the hierarchy as
- * a pure virtual.  Each concrete subclass implements it in the same way:
- *
- * \code
- *      class Base {
- *      public:
- *          virtual UClassID getDynamicClassID() const = 0;
- *      }
- *
- *      class Derived {
- *      public:
- *          virtual UClassID getDynamicClassID() const
- *            { return Derived::getStaticClassID(); }
- *      }
- * \endcode
- *
- * Each concrete class implements getStaticClassID() as well, which allows
- * clients to test for a specific type.
- *
- * \code
- *      class Derived {
- *      public:
- *          static UClassID U_EXPORT2 getStaticClassID();
- *      private:
- *          static char fgClassID;
- *      }
- *
- *      // In Derived.cpp:
- *      UClassID Derived::getStaticClassID()
- *        { return (UClassID)&Derived::fgClassID; }
- *      char Derived::fgClassID = 0; // Value is irrelevant
- * \endcode
- * @stable ICU 2.0
- */
-typedef void* UClassID;
-
-/*===========================================================================*/
-/* Shared library/DLL import-export API control                              */
-/*===========================================================================*/
-
-/*
- * Control of symbol import/export.
- * ICU is separated into three libraries.
- */
-
-/*
- * \def U_COMBINED_IMPLEMENTATION
- * Set to export library symbols from inside the ICU library
- * when all of ICU is in a single library.
- * This can be set as a compiler option while building ICU, and it
- * needs to be the first one tested to override U_COMMON_API, U_I18N_API, etc.
- * @stable ICU 2.0
- */
-
-/**
- * \def U_DATA_API
- * Set to export library symbols from inside the stubdata library,
- * and to import them from outside.
- * @draft ICU 3.0
- */
-
-/**
- * \def U_COMMON_API
- * Set to export library symbols from inside the common library,
- * and to import them from outside.
- * @stable ICU 2.0
- */
-
-/**
- * \def U_I18N_API
- * Set to export library symbols from inside the i18n library,
- * and to import them from outside.
- * @stable ICU 2.0
- */
-
-/**
- * \def U_LAYOUT_API
- * Set to export library symbols from inside the layout engine library,
- * and to import them from outside.
- * @stable ICU 2.0
- */
-
-/**
- * \def U_LAYOUTEX_API
- * Set to export library symbols from inside the layout extensions library,
- * and to import them from outside.
- * @stable ICU 2.6
- */
-
-/**
- * \def U_IO_API
- * Set to export library symbols from inside the ustdio library,
- * and to import them from outside.
- * @stable ICU 2.0
- */
-
-#if defined(U_COMBINED_IMPLEMENTATION)
-#define U_DATA_API     U_EXPORT
-#define U_COMMON_API   U_EXPORT
-#define U_I18N_API     U_EXPORT
-#define U_LAYOUT_API   U_EXPORT
-#define U_LAYOUTEX_API U_EXPORT
-#define U_IO_API       U_EXPORT
-#elif defined(U_STATIC_IMPLEMENTATION)
-#define U_DATA_API
-#define U_COMMON_API
-#define U_I18N_API
-#define U_LAYOUT_API
-#define U_LAYOUTEX_API
-#define U_IO_API
-#elif defined(U_COMMON_IMPLEMENTATION)
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_EXPORT
-#define U_I18N_API     U_IMPORT
-#define U_LAYOUT_API   U_IMPORT
-#define U_LAYOUTEX_API U_IMPORT
-#define U_IO_API       U_IMPORT
-#elif defined(U_I18N_IMPLEMENTATION)
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_IMPORT
-#define U_I18N_API     U_EXPORT
-#define U_LAYOUT_API   U_IMPORT
-#define U_LAYOUTEX_API U_IMPORT
-#define U_IO_API       U_IMPORT
-#elif defined(U_LAYOUT_IMPLEMENTATION)
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_IMPORT
-#define U_I18N_API     U_IMPORT
-#define U_LAYOUT_API   U_EXPORT
-#define U_LAYOUTEX_API U_IMPORT
-#define U_IO_API       U_IMPORT
-#elif defined(U_LAYOUTEX_IMPLEMENTATION)
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_IMPORT
-#define U_I18N_API     U_IMPORT
-#define U_LAYOUT_API   U_IMPORT
-#define U_LAYOUTEX_API U_EXPORT
-#define U_IO_API       U_IMPORT
-#elif defined(U_IO_IMPLEMENTATION)
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_IMPORT
-#define U_I18N_API     U_IMPORT
-#define U_LAYOUT_API   U_IMPORT
-#define U_LAYOUTEX_API U_IMPORT
-#define U_IO_API       U_EXPORT
-#else
-#define U_DATA_API     U_IMPORT
-#define U_COMMON_API   U_IMPORT
-#define U_I18N_API     U_IMPORT
-#define U_LAYOUT_API   U_IMPORT
-#define U_LAYOUTEX_API U_IMPORT
-#define U_IO_API       U_IMPORT
-#endif
-
-/**
- * \def U_STANDARD_CPP_NAMESPACE
- * Control of C++ Namespace
- * @stable ICU 2.0
- */
-#ifdef __cplusplus
-#define U_STANDARD_CPP_NAMESPACE        ::
-#else
-#define U_STANDARD_CPP_NAMESPACE
-#endif
-
-
-/*===========================================================================*/
-/* Global delete operator                                                    */
-/*===========================================================================*/
-
-/*
- * The ICU4C library must not use the global new and delete operators.
- * These operators here are defined to enable testing for this.
- * See Jitterbug 2581 for details of why this is necessary.
- *
- * Verification that ICU4C's memory usage is correct, i.e.,
- * that global new/delete are not used:
- *
- * a) Check for imports of global new/delete (see uobject.cpp for details)
- * b) Verify that new is never imported.
- * c) Verify that delete is only imported from object code for interface/mixin classes.
- * d) Add global delete and delete[] only for the ICU4C library itself
- *    and define them in a way that crashes or otherwise easily shows a problem.
- *
- * The following implements d).
- * The operator implementations crash; this is intentional and used for library debugging.
- *
- * Note: This is currently only done on Windows because
- * some Linux/Unix compilers have problems with defining global new/delete.
- * On Windows, WIN32 is defined, and it is _MSC_Ver>=1200 for MSVC 6.0 and higher.
- */
-#if defined(XP_CPLUSPLUS) && defined(WIN32) && (_MSC_Ver>=1200) && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION))
-
-/**
- * Global operator new, defined only inside ICU4C, must not be used.
- * Crashes intentionally.
- * @internal
- */
-inline void *
-operator new(size_t /*size*/) {
-    char *q=NULL;
-    *q=5; /* break it */
-    return q;
-}
-
-/**
- * Global operator new[], defined only inside ICU4C, must not be used.
- * Crashes intentionally.
- * @internal
- */
-inline void *
-operator new[](size_t /*size*/) {
-    char *q=NULL;
-    *q=5; /* break it */
-    return q;
-}
-
-/**
- * Global operator delete, defined only inside ICU4C, must not be used.
- * Crashes intentionally.
- * @internal
- */
-inline void
-operator delete(void * /*p*/) {
-    char *q=NULL;
-    *q=5; /* break it */
-}
-
-/**
- * Global operator delete[], defined only inside ICU4C, must not be used.
- * Crashes intentionally.
- * @internal
- */
-inline void
-operator delete[](void * /*p*/) {
-    char *q=NULL;
-    *q=5; /* break it */
-}
-
-#endif
-
-/*===========================================================================*/
-/* UErrorCode */
-/*===========================================================================*/
-
-/**
- * Error code to replace exception handling, so that the code is compatible with all C++ compilers,
- * and to use the same mechanism for C and C++.
- *
- * \par
- * ICU functions that take a reference (C++) or a pointer (C) to a UErrorCode
- * first test if(U_FAILURE(errorCode)) { return immediately; }
- * so that in a chain of such functions the first one that sets an error code
- * causes the following ones to not perform any operations.
- *
- * \par
- * Error codes should be tested using U_FAILURE() and U_SUCCESS().
- * @stable ICU 2.0
- */
-typedef enum UErrorCode {
-    /* The ordering of U_ERROR_INFO_START Vs U_USING_FALLBACK_WARNING looks weird
-     * and is that way because VC++ debugger displays first encountered constant,
-     * which is not the what the code is used for
-     */
-
-    U_USING_FALLBACK_WARNING  = -128,   /**< A resource bundle lookup returned a fallback result (not an error) */
-
-    U_ERROR_WARNING_START     = -128,   /**< Start of information results (semantically successful) */
-
-    U_USING_DEFAULT_WARNING   = -127,   /**< A resource bundle lookup returned a result from the root locale (not an error) */
-
-    U_SAFECLONE_ALLOCATED_WARNING = -126, /**< A SafeClone operation required allocating memory (informational only) */
-
-    U_STATE_OLD_WARNING       = -125,   /**< ICU has to use compatibility layer to construct the service. Expect performance/memory usage degradation. Consider upgrading */
-
-    U_STRING_NOT_TERMINATED_WARNING = -124,/**< An output string could not be NUL-terminated because output length==destCapacity. */
-
-    U_SORT_KEY_TOO_SHORT_WARNING = -123, /**< Number of levels requested in getBound is higher than the number of levels in the sort key */
-
-    U_AMBIGUOUS_ALIAS_WARNING = -122,   /**< This converter alias can go to different converter implementations */
-
-    U_DIFFERENT_UCA_VERSION = -121,     /**< ucol_open encountered a mismatch between UCA version and collator image version, so the collator was constructed from rules. No impact to further function */
-
-    U_ERROR_WARNING_LIMIT,              /**< This must always be the last warning value to indicate the limit for UErrorCode warnings (last warning code +1) */
-
-
-    U_ZERO_ERROR              =  0,     /**< No error, no warning. */
-
-    U_ILLEGAL_ARGUMENT_ERROR  =  1,     /**< Start of codes indicating failure */
-    U_MISSING_RESOURCE_ERROR  =  2,     /**< The requested resource cannot be found */
-    U_INVALID_FORMAT_ERROR    =  3,     /**< Data format is not what is expected */
-    U_FILE_ACCESS_ERROR       =  4,     /**< The requested file cannot be found */
-    U_INTERNAL_PROGRAM_ERROR  =  5,     /**< Indicates a bug in the library code */
-    U_MESSAGE_PARSE_ERROR     =  6,     /**< Unable to parse a message (message format) */
-    U_MEMORY_ALLOCATION_ERROR =  7,     /**< Memory allocation error */
-    U_INDEX_OUTOFBOUNDS_ERROR =  8,     /**< Trying to access the index that is out of bounds */
-    U_PARSE_ERROR             =  9,     /**< Equivalent to Java ParseException */
-    U_INVALID_CHAR_FOUND      = 10,     /**< Character conversion: Unmappable input sequence. In other APIs: Invalid character. */
-    U_TRUNCATED_CHAR_FOUND    = 11,     /**< Character conversion: Incomplete input sequence. */
-    U_ILLEGAL_CHAR_FOUND      = 12,     /**< Character conversion: Illegal input sequence/combination of input units.. */
-    U_INVALID_TABLE_FORMAT    = 13,     /**< Conversion table file found, but corrupted */
-    U_INVALID_TABLE_FILE      = 14,     /**< Conversion table file not found */
-    U_BUFFER_OVERFLOW_ERROR   = 15,     /**< A result would not fit in the supplied buffer */
-    U_UNSUPPORTED_ERROR       = 16,     /**< Requested operation not supported in current context */
-    U_RESOURCE_TYPE_MISMATCH  = 17,     /**< an operation is requested over a resource that does not support it */
-    U_ILLEGAL_ESCAPE_SEQUENCE = 18,     /**< ISO-2022 illlegal escape sequence */
-    U_UNSUPPORTED_ESCAPE_SEQUENCE = 19, /**< ISO-2022 unsupported escape sequence */
-    U_NO_SPACE_AVAILABLE      = 20,     /**< No space available for in-buffer expansion for Arabic shaping */
-    U_CE_NOT_FOUND_ERROR      = 21,     /**< Currently used only while setting variable top, but can be used generally */
-    U_PRIMARY_TOO_LONG_ERROR  = 22,     /**< User tried to set variable top to a primary that is longer than two bytes */
-    U_STATE_TOO_OLD_ERROR     = 23,     /**< ICU cannot construct a service from this state, as it is no longer supported */
-    U_TOO_MANY_ALIASES_ERROR  = 24,     /**< There are too many aliases in the path to the requested resource.
-                                             It is very possible that a circular alias definition has occured */
-    U_ENUM_OUT_OF_SYNC_ERROR  = 25,     /**< UEnumeration out of sync with underlying collection */
-    U_INVARIANT_CONVERSION_ERROR = 26,  /**< Unable to convert a UChar* string to char* with the invariant converter. */
-    U_INVALID_STATE_ERROR     = 27,     /**< Requested operation can not be completed with ICU in its current state */
-    U_COLLATOR_VERSION_MISMATCH = 28,   /**< Collator version is not compatible with the base version */
-    U_USELESS_COLLATOR_ERROR  = 29,     /**< Collator is options only and no base is specified */
-
-    U_STANDARD_ERROR_LIMIT,             /**< This must always be the last value to indicate the limit for standard errors */
-    /*
-     * the error code range 0x10000 0x10100 are reserved for Transliterator
-     */
-    U_BAD_VARIABLE_DEFINITION=0x10000,/**< Missing '$' or duplicate variable name */
-    U_PARSE_ERROR_START = 0x10000,    /**< Start of Transliterator errors */
-    U_MALFORMED_RULE,                 /**< Elements of a rule are misplaced */
-    U_MALFORMED_SET,                  /**< A UnicodeSet pattern is invalid*/
-    U_MALFORMED_SYMBOL_REFERENCE,     /**< UNUSED as of ICU 2.4 */
-    U_MALFORMED_UNICODE_ESCAPE,       /**< A Unicode escape pattern is invalid*/
-    U_MALFORMED_VARIABLE_DEFINITION,  /**< A variable definition is invalid */
-    U_MALFORMED_VARIABLE_REFERENCE,   /**< A variable reference is invalid */
-    U_MISMATCHED_SEGMENT_DELIMITERS,  /**< UNUSED as of ICU 2.4 */
-    U_MISPLACED_ANCHOR_START,         /**< A start anchor appears at an illegal position */
-    U_MISPLACED_CURSOR_OFFSET,        /**< A cursor offset occurs at an illegal position */
-    U_MISPLACED_QUANTIFIER,           /**< A quantifier appears after a segment close delimiter */
-    U_MISSING_OPERATOR,               /**< A rule contains no operator */
-    U_MISSING_SEGMENT_CLOSE,          /**< UNUSED as of ICU 2.4 */
-    U_MULTIPLE_ANTE_CONTEXTS,         /**< More than one ante context */
-    U_MULTIPLE_CURSORS,               /**< More than one cursor */
-    U_MULTIPLE_POST_CONTEXTS,         /**< More than one post context */
-    U_TRAILING_BACKSLASH,             /**< A dangling backslash */
-    U_UNDEFINED_SEGMENT_REFERENCE,    /**< A segment reference does not correspond to a defined segment */
-    U_UNDEFINED_VARIABLE,             /**< A variable reference does not correspond to a defined variable */
-    U_UNQUOTED_SPECIAL,               /**< A special character was not quoted or escaped */
-    U_UNTERMINATED_QUOTE,             /**< A closing single quote is missing */
-    U_RULE_MASK_ERROR,                /**< A rule is hidden by an earlier more general rule */
-    U_MISPLACED_COMPOUND_FILTER,      /**< A compound filter is in an invalid location */
-    U_MULTIPLE_COMPOUND_FILTERS,      /**< More than one compound filter */
-    U_INVALID_RBT_SYNTAX,             /**< A "::id" rule was passed to the RuleBasedTransliterator parser */
-    U_INVALID_PROPERTY_PATTERN,       /**< UNUSED as of ICU 2.4 */
-    U_MALFORMED_PRAGMA,               /**< A 'use' pragma is invlalid */
-    U_UNCLOSED_SEGMENT,               /**< A closing ')' is missing */
-    U_ILLEGAL_CHAR_IN_SEGMENT,        /**< UNUSED as of ICU 2.4 */
-    U_VARIABLE_RANGE_EXHAUSTED,       /**< Too many stand-ins generated for the given variable range */
-    U_VARIABLE_RANGE_OVERLAP,         /**< The variable range overlaps characters used in rules */
-    U_ILLEGAL_CHARACTER,              /**< A special character is outside its allowed context */
-    U_INTERNAL_TRANSLITERATOR_ERROR,  /**< Internal transliterator system error */
-    U_INVALID_ID,                     /**< A "::id" rule specifies an unknown transliterator */
-    U_INVALID_FUNCTION,               /**< A "&fn()" rule specifies an unknown transliterator */
-    U_PARSE_ERROR_LIMIT,              /**< The limit for Transliterator errors */
-
-    /*
-     * the error code range 0x10100 0x10200 are reserved for formatting API parsing error
-     */
-    U_UNEXPECTED_TOKEN=0x10100,       /**< Syntax error in format pattern */
-    U_FMT_PARSE_ERROR_START=0x10100,  /**< Start of format library errors */
-    U_MULTIPLE_DECIMAL_SEPARATORS,    /**< More than one decimal separator in number pattern */
-    U_MULTIPLE_DECIMAL_SEPERATORS = U_MULTIPLE_DECIMAL_SEPARATORS, /**< Typo: kept for backward compatibility. Use U_MULTIPLE_DECIMAL_SEPARATORS */
-    U_MULTIPLE_EXPONENTIAL_SYMBOLS,   /**< More than one exponent symbol in number pattern */
-    U_MALFORMED_EXPONENTIAL_PATTERN,  /**< Grouping symbol in exponent pattern */
-    U_MULTIPLE_PERCENT_SYMBOLS,       /**< More than one percent symbol in number pattern */
-    U_MULTIPLE_PERMILL_SYMBOLS,       /**< More than one permill symbol in number pattern */
-    U_MULTIPLE_PAD_SPECIFIERS,        /**< More than one pad symbol in number pattern */
-    U_PATTERN_SYNTAX_ERROR,           /**< Syntax error in format pattern */
-    U_ILLEGAL_PAD_POSITION,           /**< Pad symbol misplaced in number pattern */
-    U_UNMATCHED_BRACES,               /**< Braces do not match in message pattern */
-    U_UNSUPPORTED_PROPERTY,           /**< UNUSED as of ICU 2.4 */
-    U_UNSUPPORTED_ATTRIBUTE,          /**< UNUSED as of ICU 2.4 */
-    U_FMT_PARSE_ERROR_LIMIT,          /**< The limit for format library errors */
-
-    /*
-     * the error code range 0x10200 0x102ff are reserved for Break Iterator related error
-     */
-    U_BRK_ERROR_START=0x10200,             /**< Start of codes indicating Break Iterator failures */
-    U_BRK_INTERNAL_ERROR,                  /**< An internal error (bug) was detected.             */
-    U_BRK_HEX_DIGITS_EXPECTED,             /**< Hex digits expected as part of a escaped char in a rule. */
-    U_BRK_SEMICOLON_EXPECTED,              /**< Missing ';' at the end of a RBBI rule.            */
-    U_BRK_RULE_SYNTAX,                     /**< Syntax error in RBBI rule.                        */
-    U_BRK_UNCLOSED_SET,                    /**< UnicodeSet witing an RBBI rule missing a closing ']'.  */
-    U_BRK_ASSIGN_ERROR,                    /**< Syntax error in RBBI rule assignment statement.   */
-    U_BRK_VARIABLE_REDFINITION,            /**< RBBI rule $Variable redefined.                    */
-    U_BRK_MISMATCHED_PAREN,                /**< Mis-matched parentheses in an RBBI rule.          */
-    U_BRK_NEW_LINE_IN_QUOTED_STRING,       /**< Missing closing quote in an RBBI rule.            */
-    U_BRK_UNDEFINED_VARIABLE,              /**< Use of an undefined $Variable in an RBBI rule.    */
-    U_BRK_INIT_ERROR,                      /**< Initialization failure.  Probable missing ICU Data. */
-    U_BRK_RULE_EMPTY_SET,                  /**< Rule contains an empty Unicode Set.               */
-    U_BRK_UNRECOGNIZED_OPTION,             /**< !!option in RBBI rules not recognized.            */
-    U_BRK_MALFORMED_RULE_TAG,              /**< The {nnn} tag on a rule is mal formed             */
-    U_BRK_ERROR_LIMIT,                     /**< This must always be the last value to indicate the limit for Break Iterator failures */
-
-    /*
-     * The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs
-     */
-    U_REGEX_ERROR_START=0x10300,          /**< Start of codes indicating Regexp failures          */
-    U_REGEX_INTERNAL_ERROR,               /**< An internal error (bug) was detected.              */
-    U_REGEX_RULE_SYNTAX,                  /**< Syntax error in regexp pattern.                    */
-    U_REGEX_INVALID_STATE,                /**< RegexMatcher in invalid state for requested operation */
-    U_REGEX_BAD_ESCAPE_SEQUENCE,          /**< Unrecognized backslash escape sequence in pattern  */
-    U_REGEX_PROPERTY_SYNTAX,              /**< Incorrect Unicode property                         */
-    U_REGEX_UNIMPLEMENTED,                /**< Use of regexp feature that is not yet implemented. */
-    U_REGEX_MISMATCHED_PAREN,             /**< Incorrectly nested parentheses in regexp pattern.  */
-    U_REGEX_NUMBER_TOO_BIG,               /**< Decimal number is too large.                       */
-    U_REGEX_BAD_INTERVAL,                 /**< Error in {min,max} interval                        */
-    U_REGEX_MAX_LT_MIN,                   /**< In {min,max}, max is less than min.                */
-    U_REGEX_INVALID_BACK_REF,             /**< Back-reference to a non-existent capture group.    */
-    U_REGEX_INVALID_FLAG,                 /**< Invalid value for match mode flags.                */
-    U_REGEX_LOOK_BEHIND_LIMIT,            /**< Look-Behind pattern matches must have a bounded maximum length.    */
-    U_REGEX_SET_CONTAINS_STRING,          /**< Regexps cannot have UnicodeSets containing strings.*/
-    U_REGEX_ERROR_LIMIT,                  /**< This must always be the last value to indicate the limit for regexp errors */
-
-    /*
-     * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes
-     */
-    U_IDNA_ERROR_START=0x10400,
-    U_IDNA_PROHIBITED_ERROR,
-    U_IDNA_UNASSIGNED_ERROR,
-    U_IDNA_CHECK_BIDI_ERROR,
-    U_IDNA_STD3_ASCII_RULES_ERROR,
-    U_IDNA_ACE_PREFIX_ERROR,
-    U_IDNA_VERIFICATION_ERROR,
-    U_IDNA_LABEL_TOO_LONG_ERROR,
-    U_IDNA_ERROR_LIMIT,
-    /*
-     * Aliases for StringPrep
-     */
-    U_STRINGPREP_PROHIBITED_ERROR = U_IDNA_PROHIBITED_ERROR,
-    U_STRINGPREP_UNASSIGNED_ERROR = U_IDNA_UNASSIGNED_ERROR,
-    U_STRINGPREP_CHECK_BIDI_ERROR = U_IDNA_CHECK_BIDI_ERROR,
-
-
-    U_ERROR_LIMIT=U_IDNA_ERROR_LIMIT      /**< This must always be the last value to indicate the limit for UErrorCode (last error code +1) */
-} UErrorCode;
-
-/* Use the following to determine if an UErrorCode represents */
-/* operational success or failure. */
-
-#ifdef XP_CPLUSPLUS
-    /**
-     * Does the error code indicate success?
-     * @stable ICU 2.0
-     */
-    static
-    inline UBool U_SUCCESS(UErrorCode code) { return (UBool)(code<=U_ZERO_ERROR); }
-    /**
-     * Does the error code indicate a failure?
-     * @stable ICU 2.0
-     */
-    static
-    inline UBool U_FAILURE(UErrorCode code) { return (UBool)(code>U_ZERO_ERROR); }
-#else
-    /**
-     * Does the error code indicate success?
-     * @stable ICU 2.0
-     */
-#   define U_SUCCESS(x) ((x)<=U_ZERO_ERROR)
-    /**
-     * Does the error code indicate a failure?
-     * @stable ICU 2.0
-     */
-#   define U_FAILURE(x) ((x)>U_ZERO_ERROR)
-#endif
-
-/**
- * Return a string for a UErrorCode value.
- * The string will be the same as the name of the error code constant
- * in the UErrorCode enum above.
- * @stable ICU 2.0
- */
-U_STABLE const char * U_EXPORT2
-u_errorName(UErrorCode code);
-
-
-#endif /* _UTYPES */
diff --git a/Source/JavaScriptGlue/icu/unicode/uversion.h b/Source/JavaScriptGlue/icu/unicode/uversion.h
deleted file mode 100644
index f9a7755..0000000
--- a/Source/JavaScriptGlue/icu/unicode/uversion.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
-*******************************************************************************
-*   Copyright (C) 2000-2004, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*******************************************************************************
-*
-*   file name:  uversion.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   Created by: Vladimir Weinstein
-*
-*  Contains all the important version numbers for ICU. 
-*  Gets included by utypes.h and Windows .rc files
-*/
-
-/*===========================================================================*/
-/* Main ICU version information                                              */
-/*===========================================================================*/
-
-#ifndef UVERSION_H
-#define UVERSION_H
-
-/** IMPORTANT: When updating version, the following things need to be done:   */
-/** source/common/unicode/uversion.h - this file: update major, minor,        */
-/**        patchlevel, suffix, version, short version constants, namespace,   */
-/**                                                             and copyright */
-/** source/common/common.dsp - update 'Output file name' on the link tab so   */
-/**                   that it contains the new major/minor combination        */
-/** source/i18n/i18n.dsp - same as for the common.dsp                         */
-/** source/layout/layout.dsp - same as for the common.dsp                     */
-/** source/stubdata/stubdata.dsp - same as for the common.dsp                 */
-/** source/extra/ustdio/ustdio.dsp - same as for the common.dsp               */
-/** source/data/makedata.mak - change U_ICUDATA_NAME so that it contains      */
-/**                            the new major/minor combination                */
-/** source/tools/genren/genren.pl - use this script according to the README   */
-/**                    in that folder                                         */
-
-#include "unicode/umachine.h"
-
-/** The standard copyright notice that gets compiled into each library. 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.4
- */
-#define U_COPYRIGHT_STRING \
-  " Copyright (C) 2004, International Business Machines Corporation and others. All Rights Reserved. "
-
-/** Maximum length of the copyright string.
- *  @stable ICU 2.4
- */
-#define U_COPYRIGHT_STRING_LENGTH  128
-
-/** The current ICU major version as an integer. 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.4
- */
-#define U_ICU_VERSION_MAJOR_NUM 3
-
-/** The current ICU minor version as an integer. 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.6
- */
-#define U_ICU_VERSION_MINOR_NUM 2
-
-/** The current ICU patchlevel version as an integer.  
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.4
- */
-#define U_ICU_VERSION_PATCHLEVEL_NUM 0
-
-/** Glued version suffix for renamers 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.6
- */
-#define U_ICU_VERSION_SUFFIX _3_2
-
-/** The current ICU library version as a dotted-decimal string. The patchlevel
- *  only appears in this string if it non-zero. 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.4
- */
-#define U_ICU_VERSION "3.2"
-
-/** The current ICU library major/minor version as a string without dots, for library name suffixes. 
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.6
- */
-#define U_ICU_VERSION_SHORT "32"
-
-/** An ICU version consists of up to 4 numbers from 0..255.
- *  @stable ICU 2.4
- */
-#define U_MAX_VERSION_LENGTH 4
-
-/** In a string, ICU version fields are delimited by dots.
- *  @stable ICU 2.4
- */
-#define U_VERSION_DELIMITER '.'
-
-/** The maximum length of an ICU version string.
- *  @stable ICU 2.4
- */
-#define U_MAX_VERSION_STRING_LENGTH 20
-
-/** The binary form of a version on ICU APIs is an array of 4 uint8_t.
- *  @stable ICU 2.4
- */
-typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
-
-#if U_HAVE_NAMESPACE && defined(XP_CPLUSPLUS)
-#if U_DISABLE_RENAMING
-#define U_ICU_NAMESPACE icu
-namespace U_ICU_NAMESPACE { }
-#else
-#define U_ICU_NAMESPACE icu_3_2
-namespace U_ICU_NAMESPACE { }
-namespace icu = U_ICU_NAMESPACE;
-#endif
-U_NAMESPACE_USE
-#endif
-
-
-/*===========================================================================*/
-/* General version helper functions. Definitions in putil.c                  */
-/*===========================================================================*/
-
-/**
- * Parse a string with dotted-decimal version information and
- * fill in a UVersionInfo structure with the result.
- * Definition of this function lives in putil.c
- *
- * @param versionArray The destination structure for the version information.
- * @param versionString A string with dotted-decimal version information,
- *                      with up to four non-negative number fields with
- *                      values of up to 255 each.
- * @stable ICU 2.4
- */
-U_STABLE void U_EXPORT2
-u_versionFromString(UVersionInfo versionArray, const char *versionString);
-
-/**
- * Write a string with dotted-decimal version information according
- * to the input UVersionInfo.
- * Definition of this function lives in putil.c
- *
- * @param versionArray The version information to be written as a string.
- * @param versionString A string buffer that will be filled in with
- *                      a string corresponding to the numeric version
- *                      information in versionArray.
- *                      The buffer size must be at least U_MAX_VERSION_STRING_LENGTH.
- * @stable ICU 2.4
- */
-U_STABLE void U_EXPORT2
-u_versionToString(UVersionInfo versionArray, char *versionString);
-
-/**
- * Gets the ICU release version.  The version array stores the version information
- * for ICU.  For example, release "1.3.31.2" is then represented as 0x01031F02.
- * Definition of this function lives in putil.c
- *
- * @param versionArray the version # information, the result will be filled in
- * @stable ICU 2.0
- */
-U_STABLE void U_EXPORT2
-u_getVersion(UVersionInfo versionArray);
-
-
-/*===========================================================================
- * ICU collation framework version information                               
- * Version info that can be obtained from a collator is affected by these    
- * numbers in a secret and magic way. Please use collator version as whole
- *===========================================================================
- */
-
-/** Collation runtime version (sort key generator, strcoll). 
- * If the version is different, sortkeys for the same string could be different 
- * version 2 was in ICU 1.8.1. changed is: compression intervals, French secondary 
- * compression, generating quad level always when strength is quad or more 
- * version 4 - ICU 2.2 - tracking UCA changes, ignore completely ignorables 
- * in contractions, ignore primary ignorables after shifted 
- * version 5 - ICU 2.8 - changed implicit generation code
- * This value may change in the subsequent releases of ICU
- * @stable ICU 2.4
- */
-#define UCOL_RUNTIME_VERSION 5
-
-/** Builder code version. When this is different, same tailoring might result
- * in assigning different collation elements to code points                  
- * version 2 was in ICU 1.8.1. added support for prefixes, tweaked canonical 
- * closure. However, the tailorings should probably get same CEs assigned    
- * version 5 - ICU 2.2 - fixed some bugs, renamed some indirect values.      
- * version 6 - ICU 2.8 - fixed bug in builder that allowed 0xFF in primary values
- * Backward compatible with the old rules. 
- * This value may change in the subsequent releases of ICU
- * @stable ICU 2.4
- */
-#define UCOL_BUILDER_VERSION 6
-
-/** *** Removed *** Instead we use the data we read from FractionalUCA.txt
- * This is the version of FractionalUCA.txt tailoring rules
- * Version 1 was in ICU 1.8.1. Version two contains canonical closure for
- * supplementary code points 
- * Version 4 in ICU 2.2, following UCA=3.1.1d6, UCD=3.2.0 
- * This value may change in the subsequent releases of ICU
- * @stable ICU 2.4
- */
-/*#define UCOL_FRACTIONAL_UCA_VERSION 4*/
-
-/** This is the version of the tailorings 
- *  This value may change in the subsequent releases of ICU
- *  @stable ICU 2.4
- */
-#define UCOL_TAILORINGS_VERSION 1
-
-#endif
diff --git a/Source/JavaScriptGlue/testjsglue.cpp b/Source/JavaScriptGlue/testjsglue.cpp
deleted file mode 100644
index bc5f664..0000000
--- a/Source/JavaScriptGlue/testjsglue.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "CoreFoundation/CoreFoundation.h"
-#include "JavaScriptGlue.h"
-
-CFStringRef script = 
-CFSTR("\
-x = 1; \n\
-function getX() \n\
-{ \n\
-    return x; \n\
-} \n\
-");
-
-int main(int argc, char* argv[])
-{
-    JSRunRef jsRun = JSRunCreate(script, kJSFlagNone);
-    if (!JSRunCheckSyntax(jsRun)) {
-        return -1;
-    }
-    JSObjectRef globalObject = JSRunCopyGlobalObject(jsRun);
-    JSRunEvaluate(jsRun);
-    JSObjectRef getX = JSObjectCopyProperty(globalObject, CFSTR("getX"));
-    JSObjectRef jsResult = JSObjectCallFunction(getX, globalObject, 0);
-
-    if (jsResult) {
-        CFTypeRef cfResult = JSObjectCopyCFValue(jsResult);
-        CFShow(cfResult);
-        
-        CFRelease(cfResult);
-        JSRelease(jsResult);
-    }
-    
-    JSRelease(jsRun);
-    
-    return 0;
-}
diff --git a/Source/Makefile b/Source/Makefile
index 47475b4..5227393 100644
--- a/Source/Makefile
+++ b/Source/Makefile
@@ -1,4 +1,4 @@
-MODULES = JavaScriptCore JavaScriptGlue ThirdParty/ANGLE WebCore WebKit WebKit2
+MODULES = JavaScriptCore ThirdParty/ANGLE WebCore WebKit WebKit2
 
 all:
 	@for dir in $(MODULES); do ${MAKE} $@ -C $$dir; exit_status=$$?; \
diff --git a/Tools/BuildSlaveSupport/build-launcher-app b/Tools/BuildSlaveSupport/build-launcher-app
index 117b008..35520c5 100755
--- a/Tools/BuildSlaveSupport/build-launcher-app
+++ b/Tools/BuildSlaveSupport/build-launcher-app
@@ -104,7 +104,7 @@
     print OUT "$branch\n";
     close(OUT);
 
-    my @frameworks = ("JavaScriptCore", "JavaScriptGlue", "WebCore", "WebKit");
+    my @frameworks = ("JavaScriptCore", "WebCore", "WebKit");
     for my $framework (@frameworks) {
         system("ditto", productDir() . "/$framework.framework", "$nightlyLauncherStagingPath/Contents/Resources/$framework.framework") == 0 or die "Failed copying $framework.framework into $nightlyLauncherStagingPath";
     }
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 043604c..6530fb1 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,20 @@
+2012-01-24  Mark Rowe  <mrowe@apple.com>
+
+        Death to JavaScriptGlue.
+
+        Rubber-stamped by Geoffrey Garen.
+
+        * BuildSlaveSupport/build-launcher-app:
+        (copyNightlyLauncher):
+        * Scripts/build-webkit:
+        * Scripts/do-file-rename:
+        * Scripts/do-webcore-rename:
+        * Scripts/webkitpy/common/config/build.py:
+        (_should_file_trigger_build):
+        * Scripts/webkitpy/common/config/build_unittest.py: Update the test to use another Mac-specific
+        path in conjunction with a cross-platform path.
+        (ShouldBuildTest):
+
 2012-01-24  Kentaro Hara  <haraken@chromium.org>
 
         webkitperl/prepare-ChangeLog_unittest/parser_unittests.pl should test stdout and stderr
diff --git a/Tools/Scripts/build-webkit b/Tools/Scripts/build-webkit
index 0c4d9a3..b9b9972 100755
--- a/Tools/Scripts/build-webkit
+++ b/Tools/Scripts/build-webkit
@@ -515,9 +515,6 @@
         }
     }
 
-    # Apple builds JavaScriptGlue, and only on the Mac.
-    splice @projects, 1, 0, "Source/JavaScriptGlue";
-
     # ANGLE must come before WebCore
     splice @projects, 0, 0, "Source/ThirdParty/ANGLE";
 
@@ -683,7 +680,7 @@
     } elsif (isAppleMacWebKit()) {
         my @local_options = @options;
         push @local_options, XcodeCoverageSupportOptions() if $coverageSupport && $project ne "ANGLE";
-        my $useGYPProject = $useGYP && ($project =~ "WebCore|JavaScriptCore|JavaScriptGlue");
+        my $useGYPProject = $useGYP && ($project =~ "WebCore|JavaScriptCore");
         my $projectPath = $useGYPProject ? "gyp/$project" : $project;
         $result = buildXCodeProject($projectPath, $clean, @local_options, @ARGV);
     } elsif (isAppleWinWebKit()) {
diff --git a/Tools/Scripts/do-file-rename b/Tools/Scripts/do-file-rename
index afb72d8..dbc94a0 100755
--- a/Tools/Scripts/do-file-rename
+++ b/Tools/Scripts/do-file-rename
@@ -44,7 +44,6 @@
 
 my @paths;
 find(\&wanted, "Source/JavaScriptCore");
-find(\&wanted, "Source/JavaScriptGlue");
 find(\&wanted, "Source/WebCore");
 find(\&wanted, "WebKit");
 find(\&wanted, "Source/WebKit2");
diff --git a/Tools/Scripts/do-webcore-rename b/Tools/Scripts/do-webcore-rename
index 4829f39..c93f0f5 100755
--- a/Tools/Scripts/do-webcore-rename
+++ b/Tools/Scripts/do-webcore-rename
@@ -70,7 +70,6 @@
 
 my @paths;
 find(\&wanted, "Source/JavaScriptCore");
-find(\&wanted, "Source/JavaScriptGlue");
 find(\&wanted, "Source/WebCore");
 find(\&wanted, "Source/WebKit");
 find(\&wanted, "Source/WebKit2");
diff --git a/Tools/Scripts/webkitpy/common/config/build.py b/Tools/Scripts/webkitpy/common/config/build.py
index ac9a136..fcb5e62 100644
--- a/Tools/Scripts/webkitpy/common/config/build.py
+++ b/Tools/Scripts/webkitpy/common/config/build.py
@@ -55,7 +55,6 @@
         ("wx", []),
 
         # Directories that should trigger builds on only some bots.
-        ("Source/JavaScriptGlue", ["mac"]),
         ("Source/WebCore/image-decoders", ["chromium"]),
         ("LayoutTests/platform/mac", ["mac", "win"]),
         ("cairo", ["gtk", "wincairo"]),
diff --git a/Tools/Scripts/webkitpy/common/config/build_unittest.py b/Tools/Scripts/webkitpy/common/config/build_unittest.py
index 7e76bef..bdc3404 100644
--- a/Tools/Scripts/webkitpy/common/config/build_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/build_unittest.py
@@ -33,8 +33,7 @@
         (["Websites/bugs.webkit.org/foo"], []),
         (["Source/JavaScriptCore/JavaScriptCore.xcodeproj/foo"], ["mac-leopard", "mac-lion", "mac-snowleopard"]),
         (["Source/JavaScriptCore/JavaScriptCore.vcproj/foo", "Source/WebKit2/win/WebKit2.vcproj", "Source/WebKit/win/WebKit.sln", "Tools/WebKitTestRunner/Configurations/WebKitTestRunnerCommon.vsprops"], ["win"]),
-        (["Source/JavaScriptGlue/foo", "Source/WebCore/bar"], ["*"]),
-        (["Source/JavaScriptGlue/foo"], ["mac-leopard", "mac-lion", "mac-snowleopard"]),
+        (["LayoutTests/platform/mac/foo", "Source/WebCore/bar"], ["*"]),
         (["LayoutTests/foo"], ["*"]),
         (["LayoutTests/canvas/philip/tests/size.attributes.parse.exp-expected.txt", "LayoutTests/canvas/philip/tests/size.attributes.parse.exp.html"], ["*"]),
         (["LayoutTests/platform/chromium-linux/foo"], ["chromium-linux"]),
