From 4090fbf0b7d14d03c879dd921fe4b7c03cf5fdc6 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 1 Jul 2013 10:25:46 -0700 Subject: [PATCH] Squashed 'Subtrees/leveldb/' changes from ab82e57..ae6c262 ae6c262 Merge branch 'leveldb' into ripple-fork 28fa222 Looks like a bit more delay is needed to smooth the latency. a18f3e6 Tidy up JobQueue, add ripple_core module 18b245c Added GNU/kFreeBSD kernel name (TARGET_OS) git-subtree-dir: Subtrees/leveldb git-subtree-split: ae6c2620b2ef3d5c69e63dc0eda865d6a39fa061 --- .dir-locals.el | 10 - .gitattributes | 13 - .gitignore | 53 +- Subtrees/leveldb/AUTHORS => AUTHORS | 0 BeastConfig.h | 23 - Builds/VisualStudio2010/RippleD.props | 30 - Builds/VisualStudio2010/RippleD.sln | 20 - Builds/VisualStudio2010/RippleD.vcxproj | 98 - .../VisualStudio2010/RippleD.vcxproj.filters | 37 - Builds/VisualStudio2012/Ripple.sln | 34 - Builds/VisualStudio2012/RippleD.props | 34 - Builds/VisualStudio2012/RippleD.vcxproj | 1927 - .../VisualStudio2012/RippleD.vcxproj.filters | 1733 - Builds/XCode/README.txt | 1 - CHANGELOG | 17 - CheatSheet.md | 18 - CodingStyle.md | 217 - Doxyfile | 1890 - LEVELDB.txt | 14 - LICENSE | Bin 3417 -> 1484 bytes Subtrees/leveldb/Makefile => Makefile | 0 Subtrees/leveldb/NEWS => NEWS | 0 Subtrees/leveldb/README => README | 0 README.md | 16 - RippleD.props | 34 - SConstruct | 197 - Subtrees/README.md | 52 - Subtrees/beast/.gitattributes | 12 - Subtrees/beast/.gitignore | 26 - .../Builds/VisualStudio2012/BeastConfig.h | 59 - .../Builds/VisualStudio2012/beast.vcxproj | 716 - .../VisualStudio2012/beast.vcxproj.filters | 956 - Subtrees/beast/CodingStyle.md | 217 - Subtrees/beast/Doxyfile | 303 - Subtrees/beast/ReadMe.md | 14 - .../modules/beast_basics/beast_basics.cpp | 89 - .../beast/modules/beast_basics/beast_basics.h | 470 - .../beast_basics/containers/beast_List.h | 796 - .../containers/beast_LockFreeQueue.h | 226 - .../containers/beast_LockFreeStack.h | 166 - .../containers/beast_SharedTable.h | 213 - .../containers/beast_SortedLookupTable.h | 156 - .../diagnostic/beast_CatchAny.cpp | 276 - .../beast_basics/diagnostic/beast_CatchAny.h | 56 - .../beast_basics/diagnostic/beast_Debug.cpp | 255 - .../beast_basics/diagnostic/beast_Debug.h | 56 - .../beast_basics/diagnostic/beast_Error.cpp | 243 - .../beast_basics/diagnostic/beast_Error.h | 126 - .../diagnostic/beast_FPUFlags.cpp | 40 - .../beast_basics/diagnostic/beast_FPUFlags.h | 335 - .../diagnostic/beast_LeakChecked.cpp | 91 - .../diagnostic/beast_LeakChecked.h | 171 - .../beast_basics/diagnostic/beast_SafeBool.h | 91 - .../beast_basics/diagnostic/beast_Throw.h | 38 - .../events/beast_OncePerSecond.cpp | 111 - .../beast_basics/events/beast_OncePerSecond.h | 64 - .../events/beast_PerformedAtExit.cpp | 66 - .../events/beast_PerformedAtExit.h | 50 - .../modules/beast_basics/functor/beast_Bind.h | 96 - .../beast_basics/functor/beast_Function.h | 266 - .../beast_basics/math/beast_Interval.h | 387 - .../modules/beast_basics/math/beast_Math.h | 84 - .../beast_basics/math/beast_MurmurHash.cpp | 487 - .../beast_basics/math/beast_MurmurHash.h | 66 - .../beast_basics/memory/beast_AllocatedBy.h | 63 - .../beast_basics/memory/beast_AtomicCounter.h | 83 - .../beast_basics/memory/beast_AtomicFlag.h | 102 - .../beast_basics/memory/beast_AtomicPointer.h | 133 - .../beast_basics/memory/beast_AtomicState.h | 101 - .../beast_basics/memory/beast_CacheLine.h | 478 - .../beast_basics/memory/beast_FifoFreeStore.h | 41 - .../memory/beast_FifoFreeStoreWithTLS.cpp | 194 - .../memory/beast_FifoFreeStoreWithTLS.h | 67 - .../memory/beast_FifoFreeStoreWithoutTLS.cpp | 241 - .../memory/beast_FifoFreeStoreWithoutTLS.h | 67 - .../memory/beast_GlobalFifoFreeStore.h | 65 - .../memory/beast_GlobalPagedFreeStore.cpp | 42 - .../memory/beast_GlobalPagedFreeStore.h | 61 - .../memory/beast_MemoryAlignment.h | 60 - .../memory/beast_PagedFreeStore.cpp | 226 - .../memory/beast_PagedFreeStore.h | 93 - .../memory/beast_RefCountedSingleton.h | 199 - .../beast_basics/memory/beast_StaticObject.h | 187 - .../beast_basics/memory/beast_Uncopyable.h | 38 - .../native/beast_posix_FPUFlags.cpp | 29 - .../native/beast_posix_Threads.cpp | 18 - .../native/beast_win32_FPUFlags.cpp | 176 - .../native/beast_win32_Threads.cpp | 18 - .../beast_basics/threads/beast_CallQueue.cpp | 153 - .../beast_basics/threads/beast_CallQueue.h | 542 - .../threads/beast_ConcurrentObject.cpp | 76 - .../threads/beast_ConcurrentObject.h | 79 - .../threads/beast_ConcurrentState.h | 298 - .../threads/beast_GlobalThreadGroup.h | 49 - .../threads/beast_InterruptibleThread.cpp | 225 - .../threads/beast_InterruptibleThread.h | 188 - .../beast_basics/threads/beast_Listeners.cpp | 765 - .../beast_basics/threads/beast_Listeners.h | 887 - .../threads/beast_ManualCallQueue.cpp | 54 - .../threads/beast_ManualCallQueue.h | 108 - .../threads/beast_ParallelFor.cpp | 63 - .../beast_basics/threads/beast_ParallelFor.h | 491 - .../threads/beast_ReadWriteMutex.cpp | 98 - .../threads/beast_ReadWriteMutex.h | 146 - .../beast_basics/threads/beast_Semaphore.cpp | 117 - .../beast_basics/threads/beast_Semaphore.h | 78 - .../beast_basics/threads/beast_SerialFor.h | 71 - .../threads/beast_SharedObject.cpp | 36 - .../beast_basics/threads/beast_SharedObject.h | 310 - .../beast_basics/threads/beast_SpinDelay.h | 44 - .../threads/beast_ThreadGroup.cpp | 105 - .../beast_basics/threads/beast_ThreadGroup.h | 233 - .../threads/beast_ThreadWithCallQueue.cpp | 145 - .../threads/beast_ThreadWithCallQueue.h | 144 - .../beast/modules/beast_core/beast_core.cpp | 216 - .../beast/modules/beast_core/beast_core.h | 440 - .../beast/modules/beast_core/beast_core.mm | 24 - .../containers/beast_AbstractFifo.cpp | 229 - .../containers/beast_AbstractFifo.h | 217 - .../beast_core/containers/beast_Array.h | 1047 - .../containers/beast_ArrayAllocationBase.h | 133 - .../containers/beast_DynamicObject.cpp | 74 - .../containers/beast_DynamicObject.h | 121 - .../containers/beast_ElementComparator.h | 274 - .../beast_core/containers/beast_HashMap.h | 447 - .../containers/beast_LinkedListPointer.h | 366 - .../containers/beast_NamedValueSet.cpp | 304 - .../containers/beast_NamedValueSet.h | 164 - .../beast_core/containers/beast_OwnedArray.h | 865 - .../containers/beast_PropertySet.cpp | 218 - .../beast_core/containers/beast_PropertySet.h | 214 - .../containers/beast_ReferenceCountedArray.h | 855 - .../containers/beast_ScopedValueSetter.h | 95 - .../beast_core/containers/beast_SortedSet.h | 494 - .../beast_core/containers/beast_SparseSet.h | 296 - .../beast_core/containers/beast_Variant.cpp | 704 - .../beast_core/containers/beast_Variant.h | 302 - .../files/beast_DirectoryIterator.cpp | 154 - .../files/beast_DirectoryIterator.h | 154 - .../modules/beast_core/files/beast_File.cpp | 1086 - .../modules/beast_core/files/beast_File.h | 955 - .../files/beast_FileInputStream.cpp | 90 - .../beast_core/files/beast_FileInputStream.h | 94 - .../files/beast_FileOutputStream.cpp | 131 - .../beast_core/files/beast_FileOutputStream.h | 114 - .../beast_core/files/beast_FileSearchPath.cpp | 166 - .../beast_core/files/beast_FileSearchPath.h | 164 - .../beast_core/files/beast_MemoryMappedFile.h | 111 - .../beast_core/files/beast_TemporaryFile.cpp | 112 - .../beast_core/files/beast_TemporaryFile.h | 166 - .../modules/beast_core/json/beast_JSON.cpp | 645 - .../modules/beast_core/json/beast_JSON.h | 113 - .../beast_core/logging/beast_FileLogger.cpp | 129 - .../beast_core/logging/beast_FileLogger.h | 134 - .../beast_core/logging/beast_Logger.cpp | 58 - .../modules/beast_core/logging/beast_Logger.h | 94 - .../beast_core/maths/beast_BigInteger.cpp | 1016 - .../beast_core/maths/beast_BigInteger.h | 329 - .../beast_core/maths/beast_Expression.cpp | 1180 - .../beast_core/maths/beast_Expression.h | 269 - .../beast_core/maths/beast_MathsFunctions.h | 515 - .../modules/beast_core/maths/beast_Random.cpp | 171 - .../modules/beast_core/maths/beast_Random.h | 135 - .../modules/beast_core/maths/beast_Range.h | 259 - .../modules/beast_core/memory/beast_Atomic.h | 388 - .../beast_core/memory/beast_ByteOrder.h | 181 - .../beast_core/memory/beast_HeapBlock.h | 303 - .../memory/beast_LeakedObjectDetector.h | 144 - .../modules/beast_core/memory/beast_Memory.h | 121 - .../beast_core/memory/beast_MemoryBlock.cpp | 416 - .../beast_core/memory/beast_MemoryBlock.h | 255 - .../memory/beast_OptionalScopedPointer.h | 183 - .../memory/beast_ReferenceCountedObject.h | 395 - .../beast_core/memory/beast_ScopedPointer.h | 248 - .../beast_core/memory/beast_Singleton.h | 287 - .../beast_core/memory/beast_WeakReference.h | 209 - .../modules/beast_core/misc/beast_Result.cpp | 81 - .../modules/beast_core/misc/beast_Result.h | 119 - .../modules/beast_core/misc/beast_Uuid.cpp | 109 - .../modules/beast_core/misc/beast_Uuid.h | 109 - .../beast_core/misc/beast_WindowsRegistry.h | 119 - .../native/beast_BasicNativeHeaders.h | 227 - .../beast_core/native/beast_android_Files.cpp | 236 - .../native/beast_android_JNIHelpers.h | 402 - .../beast_core/native/beast_android_Misc.cpp | 27 - .../native/beast_android_Network.cpp | 171 - .../native/beast_android_SystemStats.cpp | 307 - .../native/beast_android_Threads.cpp | 77 - .../beast_core/native/beast_linux_Files.cpp | 373 - .../beast_core/native/beast_linux_Network.cpp | 457 - .../native/beast_linux_SystemStats.cpp | 177 - .../beast_core/native/beast_linux_Threads.cpp | 85 - .../beast_core/native/beast_mac_Files.mm | 480 - .../beast_core/native/beast_mac_Network.mm | 427 - .../beast_core/native/beast_mac_Strings.mm | 91 - .../native/beast_mac_SystemStats.mm | 291 - .../beast_core/native/beast_mac_Threads.mm | 86 - .../beast_core/native/beast_osx_ObjCHelpers.h | 153 - .../native/beast_posix_NamedPipe.cpp | 214 - .../native/beast_posix_SharedCode.h | 1256 - .../native/beast_win32_ComSmartPtr.h | 165 - .../beast_core/native/beast_win32_Files.cpp | 956 - .../beast_core/native/beast_win32_Network.cpp | 464 - .../native/beast_win32_Registry.cpp | 216 - .../native/beast_win32_SystemStats.cpp | 413 - .../beast_core/native/beast_win32_Threads.cpp | 634 - .../native/java/BeastAppActivity.java | 697 - .../beast_core/network/beast_IPAddress.cpp | 144 - .../beast_core/network/beast_IPAddress.h | 77 - .../beast_core/network/beast_MACAddress.cpp | 73 - .../beast_core/network/beast_MACAddress.h | 84 - .../beast_core/network/beast_NamedPipe.cpp | 61 - .../beast_core/network/beast_NamedPipe.h | 100 - .../beast_core/network/beast_Socket.cpp | 585 - .../modules/beast_core/network/beast_Socket.h | 302 - .../modules/beast_core/network/beast_URL.cpp | 468 - .../modules/beast_core/network/beast_URL.h | 345 - .../streams/beast_BufferedInputStream.cpp | 193 - .../streams/beast_BufferedInputStream.h | 91 - .../streams/beast_FileInputSource.cpp | 51 - .../streams/beast_FileInputSource.h | 64 - .../beast_core/streams/beast_InputSource.h | 74 - .../beast_core/streams/beast_InputStream.cpp | 231 - .../beast_core/streams/beast_InputStream.h | 293 - .../streams/beast_MemoryInputStream.cpp | 155 - .../streams/beast_MemoryInputStream.h | 95 - .../streams/beast_MemoryOutputStream.cpp | 165 - .../streams/beast_MemoryOutputStream.h | 131 - .../beast_core/streams/beast_OutputStream.cpp | 320 - .../beast_core/streams/beast_OutputStream.h | 262 - .../streams/beast_SubregionStream.cpp | 77 - .../streams/beast_SubregionStream.h | 87 - .../beast_core/system/beast_PlatformDefs.h | 352 - .../beast_core/system/beast_StandardHeader.h | 166 - .../beast_core/system/beast_SystemStats.cpp | 152 - .../beast_core/system/beast_SystemStats.h | 201 - .../beast_core/system/beast_TargetPlatform.h | 216 - .../beast_core/text/beast_CharPointer_ASCII.h | 382 - .../beast_core/text/beast_CharPointer_UTF16.h | 496 - .../beast_core/text/beast_CharPointer_UTF32.h | 373 - .../beast_core/text/beast_CharPointer_UTF8.h | 560 - .../text/beast_CharacterFunctions.cpp | 149 - .../text/beast_CharacterFunctions.h | 585 - .../beast_core/text/beast_Identifier.cpp | 69 - .../beast_core/text/beast_Identifier.h | 106 - .../text/beast_LocalisedStrings.cpp | 182 - .../beast_core/text/beast_LocalisedStrings.h | 219 - .../modules/beast_core/text/beast_NewLine.h | 73 - .../modules/beast_core/text/beast_String.cpp | 2406 - .../modules/beast_core/text/beast_String.h | 1346 - .../beast_core/text/beast_StringArray.cpp | 505 - .../beast_core/text/beast_StringArray.h | 406 - .../beast_core/text/beast_StringPairArray.cpp | 137 - .../beast_core/text/beast_StringPairArray.h | 158 - .../beast_core/text/beast_StringPool.cpp | 109 - .../beast_core/text/beast_StringPool.h | 90 - .../beast_core/text/beast_TextDiff.cpp | 236 - .../modules/beast_core/text/beast_TextDiff.h | 75 - .../beast_core/threads/beast_ChildProcess.cpp | 88 - .../beast_core/threads/beast_ChildProcess.h | 100 - .../threads/beast_CriticalSection.h | 252 - .../beast_core/threads/beast_DynamicLibrary.h | 80 - .../threads/beast_HighResolutionTimer.cpp | 31 - .../threads/beast_HighResolutionTimer.h | 104 - .../threads/beast_InterProcessLock.h | 126 - .../beast_core/threads/beast_Process.h | 147 - .../threads/beast_ReadWriteLock.cpp | 153 - .../beast_core/threads/beast_ReadWriteLock.h | 154 - .../beast_core/threads/beast_ScopedLock.h | 232 - .../beast_core/threads/beast_ScopedReadLock.h | 87 - .../threads/beast_ScopedWriteLock.h | 87 - .../beast_core/threads/beast_SpinLock.h | 88 - .../beast_core/threads/beast_Thread.cpp | 358 - .../modules/beast_core/threads/beast_Thread.h | 287 - .../threads/beast_ThreadLocalValue.h | 194 - .../beast_core/threads/beast_ThreadPool.cpp | 375 - .../beast_core/threads/beast_ThreadPool.h | 313 - .../threads/beast_TimeSliceThread.cpp | 166 - .../threads/beast_TimeSliceThread.h | 147 - .../beast_core/threads/beast_WaitableEvent.h | 114 - .../time/beast_PerformanceCounter.cpp | 90 - .../time/beast_PerformanceCounter.h | 103 - .../beast_core/time/beast_RelativeTime.cpp | 133 - .../beast_core/time/beast_RelativeTime.h | 176 - .../modules/beast_core/time/beast_Time.cpp | 441 - .../modules/beast_core/time/beast_Time.h | 401 - .../beast_core/unit_tests/beast_UnitTest.cpp | 232 - .../beast_core/unit_tests/beast_UnitTest.h | 285 - .../beast_core/xml/beast_XmlDocument.cpp | 848 - .../beast_core/xml/beast_XmlDocument.h | 181 - .../beast_core/xml/beast_XmlElement.cpp | 824 - .../modules/beast_core/xml/beast_XmlElement.h | 734 - .../zip/beast_GZIPCompressorOutputStream.cpp | 213 - .../zip/beast_GZIPCompressorOutputStream.h | 105 - .../zip/beast_GZIPDecompressorInputStream.cpp | 290 - .../zip/beast_GZIPDecompressorInputStream.h | 102 - .../modules/beast_core/zip/beast_ZipFile.cpp | 597 - .../modules/beast_core/zip/beast_ZipFile.h | 249 - .../beast/modules/beast_core/zip/zlib/README | 125 - .../modules/beast_core/zip/zlib/adler32.c | 143 - .../modules/beast_core/zip/zlib/compress.c | 70 - .../beast/modules/beast_core/zip/zlib/crc32.c | 407 - .../beast/modules/beast_core/zip/zlib/crc32.h | 441 - .../modules/beast_core/zip/zlib/deflate.c | 1679 - .../modules/beast_core/zip/zlib/deflate.h | 333 - .../modules/beast_core/zip/zlib/infback.c | 611 - .../modules/beast_core/zip/zlib/inffast.c | 316 - .../modules/beast_core/zip/zlib/inffast.h | 11 - .../modules/beast_core/zip/zlib/inffixed.h | 94 - .../modules/beast_core/zip/zlib/inflate.c | 1339 - .../modules/beast_core/zip/zlib/inflate.h | 121 - .../modules/beast_core/zip/zlib/inftrees.c | 328 - .../modules/beast_core/zip/zlib/inftrees.h | 61 - .../beast/modules/beast_core/zip/zlib/trees.c | 1191 - .../beast/modules/beast_core/zip/zlib/trees.h | 127 - .../modules/beast_core/zip/zlib/uncompr.c | 60 - .../beast/modules/beast_core/zip/zlib/zconf.h | 345 - .../modules/beast_core/zip/zlib/zconf.in.h | 332 - .../beast/modules/beast_core/zip/zlib/zlib.h | 1358 - .../beast/modules/beast_core/zip/zlib/zutil.c | 311 - .../beast/modules/beast_core/zip/zlib/zutil.h | 271 - Subtrees/leveldb/.gitignore | 12 - Subtrees/leveldb/LICENSE | Bin 1484 -> 0 bytes Subtrees/sqlite/sqlite3.c | 140461 --------------- Subtrees/sqlite/sqlite3.h | 7245 - Subtrees/sqlite/sqlite3ext.h | 484 - Subtrees/websocket/.gitattributes | 18 - Subtrees/websocket/.gitignore | 53 - Subtrees/websocket/Makefile | 249 - Subtrees/websocket/SConstruct | 146 - Subtrees/websocket/dependencies.txt | 17 - Subtrees/websocket/doc/uri.txt | 0 Subtrees/websocket/examples/Makefile | 18 - .../examples/broadcast_server_tls/Makefile | 17 - .../broadcast_server_tls/broadcast_admin.html | 348 - .../broadcast_admin_handler.hpp | 200 - .../broadcast_handler.hpp | 202 - .../broadcast_server_handler.hpp | 141 - .../broadcast_server_tls.cpp | 128 - .../broadcast_server_tls/vendor/flot/API.txt | 1201 - .../broadcast_server_tls/vendor/flot/FAQ.txt | 76 - .../vendor/flot/LICENSE.txt | 22 - .../broadcast_server_tls/vendor/flot/Makefile | 9 - .../broadcast_server_tls/vendor/flot/NEWS.txt | 508 - .../vendor/flot/PLUGINS.txt | 137 - .../vendor/flot/README.txt | 90 - .../vendor/flot/examples/ajax.html | 143 - .../vendor/flot/examples/annotating.html | 75 - .../vendor/flot/examples/arrow-down.gif | Bin 916 -> 0 bytes .../vendor/flot/examples/arrow-left.gif | Bin 891 -> 0 bytes .../vendor/flot/examples/arrow-right.gif | Bin 897 -> 0 bytes .../vendor/flot/examples/arrow-up.gif | Bin 916 -> 0 bytes .../vendor/flot/examples/basic.html | 38 - .../flot/examples/data-eu-gdp-growth-1.json | 4 - .../flot/examples/data-eu-gdp-growth-2.json | 4 - .../flot/examples/data-eu-gdp-growth-3.json | 4 - .../flot/examples/data-eu-gdp-growth-4.json | 4 - .../flot/examples/data-eu-gdp-growth-5.json | 4 - .../flot/examples/data-eu-gdp-growth.json | 4 - .../flot/examples/data-japan-gdp-growth.json | 4 - .../flot/examples/data-usa-gdp-growth.json | 4 - .../vendor/flot/examples/graph-types.html | 75 - .../flot/examples/hs-2004-27-a-large_web.jpg | Bin 34489 -> 0 bytes .../vendor/flot/examples/image.html | 45 - .../vendor/flot/examples/index.html | 44 - .../flot/examples/interacting-axes.html | 97 - .../vendor/flot/examples/interacting.html | 93 - .../vendor/flot/examples/layout.css | 6 - .../vendor/flot/examples/multiple-axes.html | 60 - .../vendor/flot/examples/navigate.html | 118 - .../vendor/flot/examples/percentiles.html | 57 - .../vendor/flot/examples/pie.html | 756 - .../vendor/flot/examples/realtime.html | 83 - .../vendor/flot/examples/resize.html | 61 - .../vendor/flot/examples/selection.html | 114 - .../vendor/flot/examples/setting-options.html | 61 - .../vendor/flot/examples/stacking.html | 77 - .../vendor/flot/examples/symbols.html | 49 - .../vendor/flot/examples/thresholding.html | 54 - .../vendor/flot/examples/time.html | 71 - .../vendor/flot/examples/tracking.html | 95 - .../vendor/flot/examples/turning-series.html | 98 - .../vendor/flot/examples/visitors.html | 90 - .../vendor/flot/examples/zooming.html | 98 - .../vendor/flot/excanvas.js | 1427 - .../vendor/flot/excanvas.min.js | 1 - .../vendor/flot/jquery.colorhelpers.js | 179 - .../vendor/flot/jquery.colorhelpers.min.js | 1 - .../vendor/flot/jquery.flot.crosshair.js | 167 - .../vendor/flot/jquery.flot.crosshair.min.js | 1 - .../vendor/flot/jquery.flot.fillbetween.js | 183 - .../flot/jquery.flot.fillbetween.min.js | 1 - .../vendor/flot/jquery.flot.image.js | 238 - .../vendor/flot/jquery.flot.image.min.js | 1 - .../vendor/flot/jquery.flot.js | 2599 - .../vendor/flot/jquery.flot.min.js | 6 - .../vendor/flot/jquery.flot.navigate.js | 336 - .../vendor/flot/jquery.flot.navigate.min.js | 1 - .../vendor/flot/jquery.flot.pie.js | 750 - .../vendor/flot/jquery.flot.pie.min.js | 1 - .../vendor/flot/jquery.flot.resize.js | 60 - .../vendor/flot/jquery.flot.resize.min.js | 1 - .../vendor/flot/jquery.flot.selection.js | 344 - .../vendor/flot/jquery.flot.selection.min.js | 1 - .../vendor/flot/jquery.flot.stack.js | 184 - .../vendor/flot/jquery.flot.stack.min.js | 1 - .../vendor/flot/jquery.flot.symbol.js | 70 - .../vendor/flot/jquery.flot.symbol.min.js | 1 - .../vendor/flot/jquery.flot.threshold.js | 103 - .../vendor/flot/jquery.flot.threshold.min.js | 1 - .../vendor/flot/jquery.js | 8316 - .../vendor/flot/jquery.min.js | 23 - .../broadcast_server_tls/vendor/md5.js | 379 - .../examples/broadcast_server_tls/wscmd.hpp | 99 - .../websocket/examples/chat_client/Makefile | 17 - .../websocket/examples/chat_client/SConscript | 21 - .../examples/chat_client/chat_client.cpp | 86 - .../examples/chat_client/chat_client.html | 177 - .../chat_client/chat_client_handler.cpp | 154 - .../chat_client/chat_client_handler.hpp | 86 - .../chat_client/vendor/jquery-1.6.3.min.js | 4 - .../websocket/examples/chat_server/Makefile | 17 - .../websocket/examples/chat_server/SConscript | 20 - .../websocket/examples/chat_server/chat.cpp | 197 - .../websocket/examples/chat_server/chat.hpp | 76 - .../examples/chat_server/chat_server.cpp | 73 - Subtrees/websocket/examples/common.mk | 19 - .../examples/concurrent_server/Makefile | 17 - .../examples/concurrent_server/SConscript | 20 - .../concurrent_server/concurrent_client.html | 94 - .../concurrent_server/concurrent_server.cpp | 222 - .../websocket/examples/echo_client/Makefile | 17 - .../websocket/examples/echo_client/SConscript | 21 - .../examples/echo_client/echo_client.cpp | 97 - .../websocket/examples/echo_server/Makefile | 17 - .../websocket/examples/echo_server/SConscript | 20 - .../examples/echo_server/echo_client.html | 94 - .../examples/echo_server/echo_server.cpp | 73 - .../examples/echo_server_tls/Makefile | 17 - .../examples/echo_server_tls/SConscript | 21 - .../examples/echo_server_tls/echo.cpp | 27 - .../examples/echo_server_tls/echo.hpp | 66 - .../examples/echo_server_tls/echo_client.html | 94 - .../echo_server_tls/echo_server_tls.cpp | 119 - .../examples/fuzzing_client/Makefile | 17 - .../fuzzing_client/fuzzing_client.cpp | 346 - .../examples/fuzzing_server_tls/Makefile | 17 - .../fuzzing_server_tls/echo_client.html | 94 - .../fuzzing_server_tls/fuzzing_server_tls.cpp | 251 - .../websocket/examples/stress_client/Makefile | 17 - .../examples/stress_client/stress_client.cpp | 238 - .../examples/telemetry_server/Makefile | 17 - .../examples/telemetry_server/SConscript | 20 - .../telemetry_server/telemetry_server.cpp | 158 - Subtrees/websocket/examples/wsperf/Makefile | 24 - Subtrees/websocket/examples/wsperf/SConscript | 29 - Subtrees/websocket/examples/wsperf/case.cpp | 271 - Subtrees/websocket/examples/wsperf/case.hpp | 148 - .../websocket/examples/wsperf/generic.cpp | 142 - .../websocket/examples/wsperf/generic.hpp | 65 - .../examples/wsperf/message_test.html | 277 - .../websocket/examples/wsperf/request.cpp | 200 - .../websocket/examples/wsperf/request.hpp | 194 - .../examples/wsperf/stress_aggregate.cpp | 96 - .../examples/wsperf/stress_aggregate.hpp | 59 - .../examples/wsperf/stress_handler.cpp | 358 - .../examples/wsperf/stress_handler.hpp | 204 - .../examples/wsperf/stress_test.html | 492 - .../wsperf/vendor/backbone-localstorage.js | 84 - .../examples/wsperf/vendor/backbone.js | 1290 - .../examples/wsperf/vendor/jquery.min.js | 4 - .../examples/wsperf/vendor/underscore.js | 999 - Subtrees/websocket/examples/wsperf/wscmd.cpp | 78 - Subtrees/websocket/examples/wsperf/wscmd.hpp | 77 - Subtrees/websocket/examples/wsperf/wsperf.cfg | 18 - Subtrees/websocket/examples/wsperf/wsperf.cpp | 294 - .../examples/wsperf/wsperf_commander.html | 387 - Subtrees/websocket/license.txt | 23 - Subtrees/websocket/readme.txt | 15 - Subtrees/websocket/src/SConscript | 20 - Subtrees/websocket/src/base64/base64.cpp | 123 - Subtrees/websocket/src/base64/base64.h | 4 - Subtrees/websocket/src/common.hpp | 223 - Subtrees/websocket/src/connection.hpp | 1605 - Subtrees/websocket/src/endpoint.hpp | 606 - Subtrees/websocket/src/http/constants.hpp | 213 - Subtrees/websocket/src/http/parser.hpp | 300 - Subtrees/websocket/src/logger/logger.hpp | 168 - Subtrees/websocket/src/md5/md5.c | 381 - Subtrees/websocket/src/md5/md5.h | 93 - Subtrees/websocket/src/md5/md5.hpp | 69 - Subtrees/websocket/src/messages/control.hpp | 182 - Subtrees/websocket/src/messages/data.cpp | 221 - Subtrees/websocket/src/messages/data.hpp | 274 - Subtrees/websocket/src/network_utilities.cpp | 112 - Subtrees/websocket/src/network_utilities.hpp | 54 - Subtrees/websocket/src/processors/hybi.hpp | 630 - .../websocket/src/processors/hybi_header.cpp | 298 - .../websocket/src/processors/hybi_header.hpp | 147 - .../websocket/src/processors/hybi_legacy.hpp | 360 - .../websocket/src/processors/hybi_util.cpp | 65 - .../websocket/src/processors/hybi_util.hpp | 70 - .../websocket/src/processors/processor.hpp | 148 - Subtrees/websocket/src/rng/blank_rng.cpp | 28 - Subtrees/websocket/src/rng/blank_rng.hpp | 46 - Subtrees/websocket/src/rng/boost_rng.cpp | 39 - Subtrees/websocket/src/rng/boost_rng.hpp | 54 - Subtrees/websocket/src/roles/client.hpp | 714 - Subtrees/websocket/src/roles/server.hpp | 958 - Subtrees/websocket/src/sha1/Makefile | 41 - Subtrees/websocket/src/sha1/Makefile.nt | 48 - Subtrees/websocket/src/sha1/license.txt | 14 - Subtrees/websocket/src/sha1/sha.cpp | 176 - Subtrees/websocket/src/sha1/sha1.cpp | 591 - Subtrees/websocket/src/sha1/sha1.h | 92 - Subtrees/websocket/src/sha1/shacmp.cpp | 169 - Subtrees/websocket/src/sha1/shatest.cpp | 149 - .../websocket/src/shared_const_buffer.hpp | 56 - Subtrees/websocket/src/sockets/autotls.hpp | 173 - Subtrees/websocket/src/sockets/plain.hpp | 131 - .../websocket/src/sockets/socket_base.hpp | 60 - Subtrees/websocket/src/sockets/tls.hpp | 175 - Subtrees/websocket/src/ssl/client.pem | 58 - Subtrees/websocket/src/ssl/dh512.pem | 12 - Subtrees/websocket/src/ssl/server.cer | 40 - Subtrees/websocket/src/ssl/server.pem | 58 - Subtrees/websocket/src/uri.cpp | 320 - Subtrees/websocket/src/uri.hpp | 101 - .../src/utf8_validator/utf8_validator.hpp | 90 - Subtrees/websocket/src/websocket_frame.hpp | 639 - Subtrees/websocket/src/websocketpp.hpp | 63 - Subtrees/websocket/test/basic/Makefile | 29 - Subtrees/websocket/test/basic/hybi_util.cpp | 98 - Subtrees/websocket/test/basic/logging.cpp | 40 - Subtrees/websocket/test/basic/parsing.cpp | 312 - Subtrees/websocket/test/basic/uri_perf.cpp | 51 - Subtrees/websocket/todo.txt | 11 - .../websocketpp.bbprojectd/Scratchpad.txt | 0 .../Unix Worksheet.worksheet | 0 .../project.bbprojectdata | 342 - .../zaphoyd.bbprojectsettings | 1301 - .../websocketpp.xcodeproj/project.pbxproj | 2050 - .../contents.xcworkspacedata | 7 - .../WebSocket++ Dynamic Library.xcscheme | 59 - .../WebSocket++ Static Library.xcscheme | 59 - .../xcschemes/broadcast_server.xcscheme | 86 - .../xcschemes/chat_client.xcscheme | 86 - .../xcschemes/concurrent_server.xcscheme | 86 - .../xcschemes/echo_client.xcscheme | 86 - .../xcschemes/echo_server.xcscheme | 86 - .../xcschemes/echo_server_tls.xcscheme | 86 - .../xcschemes/fuzzing_client.xcscheme | 86 - .../xcschemes/fuzzing_server.xcscheme | 86 - .../xcschemes/policy_test.xcscheme | 86 - .../xcschemes/stress_client.xcscheme | 86 - .../xcschemes/wsperf.xcscheme | 86 - .../xcschemes/xcschememanagement.plist | 142 - .../websocket/windows/vcpp2008/.gitignore | 9 - .../websocket/windows/vcpp2008/common.vsprops | 15 - .../vcpp2008/examples/chatclient.vcproj | 201 - .../vcpp2008/examples/chatserver.vcproj | 201 - .../examples/concurrent_server.vcproj | 189 - .../vcpp2008/examples/echoserver.vcproj | 188 - Subtrees/websocket/windows/vcpp2008/stdint.h | 44 - .../windows/vcpp2008/websocketpp.sln | 64 - .../windows/vcpp2008/websocketpp.vcproj | 397 - .../websocket/windows/vcpp2010/.gitignore | 17 - .../vcpp2010/examples/chatclient.vcxproj | 179 - .../examples/chatclient.vcxproj.filters | 26 - .../vcpp2010/examples/chatserver.vcxproj | 179 - .../examples/chatserver.vcxproj.filters | 26 - .../vcpp2010/examples/echoclient.vcxproj | 167 - .../examples/echoclient.vcxproj.filters | 27 - .../vcpp2010/examples/echoserver.vcxproj | 177 - .../examples/echoserver.vcxproj.filters | 18 - .../vcpp2010/examples/wsperf/wsperf.vcxproj | 151 - .../examples/wsperf/wsperf.vcxproj.filters | 22 - .../websocket/windows/vcpp2010/readme.txt | 35 - .../windows/vcpp2010/websocketpp.sln | 82 - .../windows/vcpp2010/websocketpp.vcxproj | 170 - .../vcpp2010/websocketpp.vcxproj.filters | 92 - Subtrees/leveldb/TODO => TODO | 0 TODO.txt | 113 - Subtrees/leveldb/WINDOWS.md => WINDOWS.md | 0 artwork/LogoForDocumentation.png | Bin 11413 -> 0 bytes bin/browser.js | 470 - bin/debug_local_sign.js | 64 - bin/email_hash.js | 18 - bin/flash_policy.js | 31 - bin/hexify.js | 23 - bin/jsonrpc_request.js | 42 - bin/jsonrpc_server.js | 68 - bin/network-build | 6 - bin/network-init | 10 - bin/network-restart | 5 - bin/network-start | 6 - bin/network-stop | 6 - bin/network-update | 5 - bin/nx | 7 - bin/rlint.js | 252 - bin/update_binformat.js | 119 - ...d_detect_platform => build_detect_platform | 6 + {Subtrees/leveldb/db => db}/builder.cc | 0 {Subtrees/leveldb/db => db}/builder.h | 0 {Subtrees/leveldb/db => db}/c.cc | 0 {Subtrees/leveldb/db => db}/c_test.c | 0 .../leveldb/db => db}/corruption_test.cc | 0 {Subtrees/leveldb/db => db}/db_bench.cc | 0 {Subtrees/leveldb/db => db}/db_impl.cc | 5 +- {Subtrees/leveldb/db => db}/db_impl.h | 0 {Subtrees/leveldb/db => db}/db_iter.cc | 0 {Subtrees/leveldb/db => db}/db_iter.h | 0 {Subtrees/leveldb/db => db}/db_test.cc | 0 {Subtrees/leveldb/db => db}/dbformat.cc | 0 {Subtrees/leveldb/db => db}/dbformat.h | 0 {Subtrees/leveldb/db => db}/dbformat_test.cc | 0 {Subtrees/leveldb/db => db}/filename.cc | 0 {Subtrees/leveldb/db => db}/filename.h | 0 {Subtrees/leveldb/db => db}/filename_test.cc | 0 {Subtrees/leveldb/db => db}/leveldb_main.cc | 0 {Subtrees/leveldb/db => db}/log_format.h | 0 {Subtrees/leveldb/db => db}/log_reader.cc | 0 {Subtrees/leveldb/db => db}/log_reader.h | 0 {Subtrees/leveldb/db => db}/log_test.cc | 0 {Subtrees/leveldb/db => db}/log_writer.cc | 0 {Subtrees/leveldb/db => db}/log_writer.h | 0 {Subtrees/leveldb/db => db}/memtable.cc | 0 {Subtrees/leveldb/db => db}/memtable.h | 0 {Subtrees/leveldb/db => db}/repair.cc | 0 {Subtrees/leveldb/db => db}/skiplist.h | 0 {Subtrees/leveldb/db => db}/skiplist_test.cc | 0 {Subtrees/leveldb/db => db}/snapshot.h | 0 {Subtrees/leveldb/db => db}/table_cache.cc | 0 {Subtrees/leveldb/db => db}/table_cache.h | 0 {Subtrees/leveldb/db => db}/version_edit.cc | 0 {Subtrees/leveldb/db => db}/version_edit.h | 0 .../leveldb/db => db}/version_edit_test.cc | 0 {Subtrees/leveldb/db => db}/version_set.cc | 0 {Subtrees/leveldb/db => db}/version_set.h | 0 .../leveldb/db => db}/version_set_test.cc | 0 {Subtrees/leveldb/db => db}/write_batch.cc | 0 .../leveldb/db => db}/write_batch_internal.h | 0 .../leveldb/db => db}/write_batch_test.cc | 0 deploy/rippled.nsi | 39 - deploy/start rippled.bat | 3 - deploy/validators.txt | 26 - .../doc => doc}/bench/db_bench_sqlite3.cc | 0 .../doc => doc}/bench/db_bench_tree_db.cc | 0 {Subtrees/leveldb/doc => doc}/benchmark.html | 0 {Subtrees/leveldb/doc => doc}/doc.css | 0 {Subtrees/leveldb/doc => doc}/impl.html | 0 {Subtrees/leveldb/doc => doc}/index.html | 0 {Subtrees/leveldb/doc => doc}/log_format.txt | 0 .../leveldb/doc => doc}/table_format.txt | 0 .../helpers => helpers}/memenv/memenv.cc | 0 .../helpers => helpers}/memenv/memenv.h | 0 .../helpers => helpers}/memenv/memenv_test.cc | 0 .../leveldb/include => include}/leveldb/c.h | 0 .../include => include}/leveldb/cache.h | 0 .../include => include}/leveldb/comparator.h | 0 .../leveldb/include => include}/leveldb/db.h | 0 .../leveldb/include => include}/leveldb/env.h | 0 .../leveldb/filter_policy.h | 0 .../include => include}/leveldb/iterator.h | 0 .../include => include}/leveldb/options.h | 0 .../include => include}/leveldb/slice.h | 0 .../include => include}/leveldb/status.h | 0 .../include => include}/leveldb/table.h | 0 .../leveldb/table_builder.h | 0 .../include => include}/leveldb/write_batch.h | 0 issues/issue178_test.cc | 92 - modules/ripple_app/ripple_app.cpp | 421 - modules/ripple_app/ripple_app.h | 25 - modules/ripple_app/ripple_app_pt1.cpp | 8 - modules/ripple_app/ripple_app_pt2.cpp | 8 - modules/ripple_app/ripple_app_pt3.cpp | 8 - modules/ripple_app/ripple_app_pt4.cpp | 8 - .../containers/ripple_KeyCache.h | 202 - .../containers/ripple_RangeSet.cpp | 211 - .../containers/ripple_RangeSet.h | 63 - .../containers/ripple_SecureAllocator.h | 59 - .../containers/ripple_TaggedCache.cpp | 7 - .../containers/ripple_TaggedCache.h | 444 - modules/ripple_basics/ripple_basics.cpp | 80 - modules/ripple_basics/ripple_basics.h | 114 - .../ripple_basics/types/ripple_BasicTypes.h | 16 - modules/ripple_basics/types/ripple_HashMaps.h | 120 - .../ripple_basics/types/ripple_UInt256.cpp | 20 - modules/ripple_basics/types/ripple_UInt256.h | 896 - .../utility/ripple_ByteOrder.cpp | 44 - .../ripple_basics/utility/ripple_ByteOrder.h | 46 - .../utility/ripple_CountedObject.cpp | 78 - .../utility/ripple_CountedObject.h | 150 - .../utility/ripple_DiffieHellmanUtil.cpp | 37 - .../utility/ripple_DiffieHellmanUtil.h | 15 - .../utility/ripple_HashUtilities.h | 95 - .../utility/ripple_IntegerTypes.h | 36 - modules/ripple_basics/utility/ripple_Log.cpp | 316 - modules/ripple_basics/utility/ripple_Log.h | 150 - .../utility/ripple_PlatformMacros.h | 45 - .../utility/ripple_RandomNumbers.cpp | 218 - .../utility/ripple_RandomNumbers.h | 73 - .../ripple_basics/utility/ripple_ScopedLock.h | 84 - .../utility/ripple_StringUtilities.cpp | 311 - .../utility/ripple_StringUtilities.h | 222 - .../ripple_basics/utility/ripple_Sustain.cpp | 94 - .../ripple_basics/utility/ripple_Sustain.h | 20 - .../utility/ripple_ThreadName.cpp | 78 - .../ripple_basics/utility/ripple_ThreadName.h | 12 - modules/ripple_basics/utility/ripple_Time.cpp | 42 - modules/ripple_basics/utility/ripple_Time.h | 15 - .../utility/ripple_UptimeTimer.cpp | 61 - .../utility/ripple_UptimeTimer.h | 43 - modules/ripple_client/ripple_client.cpp | 61 - modules/ripple_client/ripple_client.h | 23 - modules/ripple_data/crypto/ripple_Base58.cpp | 188 - modules/ripple_data/crypto/ripple_Base58.h | 49 - .../ripple_data/crypto/ripple_Base58Data.cpp | 135 - .../ripple_data/crypto/ripple_Base58Data.h | 55 - modules/ripple_data/crypto/ripple_CBigNum.cpp | 643 - modules/ripple_data/crypto/ripple_CBigNum.h | 171 - modules/ripple_data/crypto/ripple_CKey.cpp | 13 - modules/ripple_data/crypto/ripple_CKey.h | 304 - .../crypto/ripple_CKeyDeterministic.cpp | 383 - .../ripple_data/crypto/ripple_CKeyECIES.cpp | 316 - modules/ripple_data/crypto/ripple_RFC1751.cpp | 473 - modules/ripple_data/crypto/ripple_RFC1751.h | 28 - .../protocol/ripple_FieldNames.cpp | 137 - .../ripple_data/protocol/ripple_FieldNames.h | 213 - .../ripple_data/protocol/ripple_HashPrefix.h | 69 - .../protocol/ripple_LedgerFormat.cpp | 150 - .../protocol/ripple_LedgerFormat.h | 129 - .../protocol/ripple_PackedMessage.cpp | 74 - .../protocol/ripple_PackedMessage.h | 60 - .../ripple_data/protocol/ripple_Protocol.h | 72 - .../protocol/ripple_RippleAddress.cpp | 935 - .../protocol/ripple_RippleAddress.h | 208 - .../protocol/ripple_RippleSystem.h | 47 - .../ripple_data/protocol/ripple_STAmount.cpp | 1818 - .../protocol/ripple_STAmountRound.cpp | 351 - .../protocol/ripple_SerializeDeclarations.h | 186 - .../protocol/ripple_SerializedObject.cpp | 1623 - .../protocol/ripple_SerializedObject.h | 497 - .../ripple_SerializedObjectTemplate.cpp | 47 - .../ripple_SerializedObjectTemplate.h | 81 - .../protocol/ripple_SerializedTypes.cpp | 595 - .../protocol/ripple_SerializedTypes.h | 1541 - .../protocol/ripple_Serializer.cpp | 727 - .../ripple_data/protocol/ripple_Serializer.h | 282 - modules/ripple_data/protocol/ripple_TER.cpp | 135 - modules/ripple_data/protocol/ripple_TER.h | 169 - modules/ripple_data/protocol/ripple_TxFlags.h | 63 - .../ripple_data/protocol/ripple_TxFormat.cpp | 93 - .../ripple_data/protocol/ripple_TxFormat.h | 76 - .../ripple_data/protocol/ripple_TxFormats.cpp | 54 - .../ripple_data/protocol/ripple_TxFormats.h | 46 - modules/ripple_data/ripple_data.cpp | 100 - modules/ripple_data/ripple_data.h | 78 - .../ripple_data/utility/ripple_JSONCache.cpp | 186 - .../ripple_data/utility/ripple_JSONCache.h | 98 - .../utility/ripple_UptimeTimerAdapter.h | 20 - modules/ripple_json/json/LICENSE | Bin 69 -> 0 bytes modules/ripple_json/json/json_autolink.h | 28 - .../ripple_json/json/json_batchallocator.h | 132 - modules/ripple_json/json/json_config.h | 49 - modules/ripple_json/json/json_features.h | 47 - modules/ripple_json/json/json_forwards.h | 44 - .../ripple_json/json/json_internalarray.inl | 484 - modules/ripple_json/json/json_internalmap.inl | 658 - modules/ripple_json/json/json_reader.cpp | 1023 - modules/ripple_json/json/json_reader.h | 196 - modules/ripple_json/json/json_value.cpp | 1911 - modules/ripple_json/json/json_value.h | 1064 - .../ripple_json/json/json_valueiterator.inl | 329 - modules/ripple_json/json/json_writer.cpp | 931 - modules/ripple_json/json/json_writer.h | 176 - modules/ripple_json/json/version | 1 - modules/ripple_json/ripple_json.cpp | 49 - modules/ripple_json/ripple_json.h | 50 - modules/ripple_leveldb/ripple_leveldb.cpp | 91 - modules/ripple_leveldb/ripple_leveldb.h | 15 - modules/ripple_sqlite/ripple_sqlite.c | 60 - modules/ripple_sqlite/ripple_sqlite.h | 30 - .../autosocket/ripple_AutoSocket.cpp | 8 - .../autosocket/ripple_AutoSocket.h | 266 - modules/ripple_websocket/ripple_websocket.cpp | 26 - modules/ripple_websocket/ripple_websocket.h | 54 - package.json | 32 - {Subtrees/leveldb/port => port}/README | 0 .../leveldb/port => port}/atomic_pointer.h | 0 {Subtrees/leveldb/port => port}/port.h | 0 .../leveldb/port => port}/port_example.h | 0 {Subtrees/leveldb/port => port}/port_posix.cc | 0 {Subtrees/leveldb/port => port}/port_posix.h | 0 {Subtrees/leveldb/port => port}/port_win.cc | 0 {Subtrees/leveldb/port => port}/port_win.h | 0 .../port => port}/thread_annotations.h | 0 {Subtrees/leveldb/port => port}/win/stdint.h | 0 ripple-example.txt | 116 - rippled-example.cfg | 314 - rippled.1 | Bin 3043 -> 0 bytes rippled.xcodeproj/project.pbxproj | 2757 - .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 68280 -> 0 bytes .../xcdebugger/Breakpoints.xcbkptlist | 5 - .../xcschemes/rippled.xcscheme | 86 - .../xcschemes/xcschememanagement.plist | 22 - site_scons/site_tools/protoc.py | 88 - src/cpp/protobuf/CHANGES.txt | 531 - src/cpp/protobuf/CONTRIBUTORS.txt | 90 - src/cpp/protobuf/COPYING.txt | 33 - src/cpp/protobuf/INSTALL.txt | 237 - src/cpp/protobuf/Makefile.am | 225 - src/cpp/protobuf/README.txt | 152 - src/cpp/protobuf/autogen.sh | 41 - src/cpp/protobuf/benchmarks/ProtoBench.java | 203 - .../protobuf/benchmarks/google_message1.dat | Bin 228 -> 0 bytes .../protobuf/benchmarks/google_message2.dat | Bin 84570 -> 0 bytes src/cpp/protobuf/benchmarks/google_size.proto | 136 - .../protobuf/benchmarks/google_speed.proto | 136 - src/cpp/protobuf/benchmarks/readme.txt | 50 - src/cpp/protobuf/configure.ac | 150 - src/cpp/protobuf/editors/README.txt | 5 - src/cpp/protobuf/editors/proto.vim | 105 - src/cpp/protobuf/editors/protobuf-mode.el | 220 - src/cpp/protobuf/examples/AddPerson.java | 95 - src/cpp/protobuf/examples/ListPeople.java | 50 - src/cpp/protobuf/examples/Makefile | 58 - src/cpp/protobuf/examples/README.txt | 29 - src/cpp/protobuf/examples/add_person.cc | 95 - src/cpp/protobuf/examples/add_person.py | 58 - src/cpp/protobuf/examples/addressbook.proto | 30 - src/cpp/protobuf/examples/list_people.cc | 68 - src/cpp/protobuf/examples/list_people.py | 38 - src/cpp/protobuf/generate_descriptor_proto.sh | 33 - src/cpp/protobuf/java/README.txt | 96 - src/cpp/protobuf/java/pom.xml | 207 - .../com/google/protobuf/AbstractMessage.java | 930 - .../google/protobuf/AbstractMessageLite.java | 343 - .../com/google/protobuf/AbstractParser.java | 261 - .../google/protobuf/BlockingRpcChannel.java | 51 - .../com/google/protobuf/BlockingService.java | 64 - .../google/protobuf/BoundedByteString.java | 163 - .../java/com/google/protobuf/ByteString.java | 970 - .../com/google/protobuf/CodedInputStream.java | 920 - .../google/protobuf/CodedOutputStream.java | 1111 - .../java/com/google/protobuf/Descriptors.java | 1970 - .../com/google/protobuf/DynamicMessage.java | 482 - .../google/protobuf/ExtensionRegistry.java | 266 - .../protobuf/ExtensionRegistryLite.java | 185 - .../java/com/google/protobuf/FieldSet.java | 861 - .../com/google/protobuf/GeneratedMessage.java | 1939 - .../google/protobuf/GeneratedMessageLite.java | 797 - .../java/com/google/protobuf/Internal.java | 153 - .../InvalidProtocolBufferException.java | 114 - .../java/com/google/protobuf/LazyField.java | 210 - .../google/protobuf/LazyStringArrayList.java | 178 - .../com/google/protobuf/LazyStringList.java | 81 - .../google/protobuf/LiteralByteString.java | 349 - .../java/com/google/protobuf/Message.java | 237 - .../java/com/google/protobuf/MessageLite.java | 319 - .../google/protobuf/MessageLiteOrBuilder.java | 60 - .../com/google/protobuf/MessageOrBuilder.java | 129 - .../main/java/com/google/protobuf/Parser.java | 259 - .../google/protobuf/ProtocolMessageEnum.java | 58 - .../google/protobuf/RepeatedFieldBuilder.java | 696 - .../com/google/protobuf/RopeByteString.java | 943 - .../java/com/google/protobuf/RpcCallback.java | 47 - .../java/com/google/protobuf/RpcChannel.java | 71 - .../com/google/protobuf/RpcController.java | 118 - .../java/com/google/protobuf/RpcUtil.java | 135 - .../java/com/google/protobuf/Service.java | 117 - .../com/google/protobuf/ServiceException.java | 52 - .../google/protobuf/SingleFieldBuilder.java | 241 - .../com/google/protobuf/SmallSortedMap.java | 618 - .../java/com/google/protobuf/TextFormat.java | 1559 - .../UninitializedMessageException.java | 99 - .../com/google/protobuf/UnknownFieldSet.java | 978 - .../protobuf/UnmodifiableLazyStringList.java | 152 - .../main/java/com/google/protobuf/Utf8.java | 349 - .../java/com/google/protobuf/WireFormat.java | 163 - .../google/protobuf/AbstractMessageTest.java | 509 - .../protobuf/BoundedByteStringTest.java | 68 - .../com/google/protobuf/ByteStringTest.java | 692 - .../google/protobuf/CodedInputStreamTest.java | 528 - .../protobuf/CodedOutputStreamTest.java | 317 - .../google/protobuf/DeprecatedFieldTest.java | 80 - .../com/google/protobuf/DescriptorsTest.java | 648 - .../google/protobuf/DynamicMessageTest.java | 264 - .../protobuf/ForceFieldBuildersPreRun.java | 48 - .../google/protobuf/GeneratedMessageTest.java | 1146 - .../com/google/protobuf/IsValidUtf8Test.java | 180 - .../google/protobuf/IsValidUtf8TestUtil.java | 421 - .../protobuf/LazyStringArrayListTest.java | 162 - .../protobuf/LazyStringEndToEndTest.java | 143 - .../java/com/google/protobuf/LiteTest.java | 148 - .../protobuf/LiteralByteStringTest.java | 396 - .../java/com/google/protobuf/MessageTest.java | 353 - .../google/protobuf/NestedBuildersTest.java | 185 - .../java/com/google/protobuf/ParserTest.java | 375 - .../protobuf/RepeatedFieldBuilderTest.java | 190 - .../protobuf/RopeByteStringSubstringTest.java | 97 - .../google/protobuf/RopeByteStringTest.java | 115 - .../java/com/google/protobuf/ServiceTest.java | 320 - .../protobuf/SingleFieldBuilderTest.java | 155 - .../google/protobuf/SmallSortedMapTest.java | 420 - .../google/protobuf/TestBadIdentifiers.java | 63 - .../java/com/google/protobuf/TestUtil.java | 3955 - .../com/google/protobuf/TextFormatTest.java | 786 - .../google/protobuf/UnknownFieldSetTest.java | 437 - .../UnmodifiableLazyStringListTest.java | 152 - .../com/google/protobuf/WireFormatTest.java | 580 - .../google/protobuf/multiple_files_test.proto | 71 - .../protobuf/nested_builders_test.proto | 53 - .../google/protobuf/nested_extension.proto | 45 - .../protobuf/nested_extension_lite.proto | 48 - .../protobuf/non_nested_extension.proto | 48 - .../protobuf/non_nested_extension_lite.proto | 50 - .../protobuf/test_bad_identifiers.proto | 108 - src/cpp/protobuf/m4/ac_system_extensions.m4 | 37 - src/cpp/protobuf/m4/acx_check_suncc.m4 | 74 - src/cpp/protobuf/m4/acx_pthread.m4 | 397 - src/cpp/protobuf/m4/stl_hash.m4 | 72 - src/cpp/protobuf/more_tests/Makefile | 41 - src/cpp/protobuf/post_process_dist.sh | 60 - src/cpp/protobuf/protobuf-lite.pc.in | 13 - src/cpp/protobuf/protobuf.pc.in | 14 - src/cpp/protobuf/python/README.txt | 101 - src/cpp/protobuf/python/ez_setup.py | 283 - src/cpp/protobuf/python/google/__init__.py | 1 - .../python/google/protobuf/__init__.py | 0 .../python/google/protobuf/descriptor.py | 713 - .../google/protobuf/descriptor_database.py | 120 - .../python/google/protobuf/descriptor_pool.py | 527 - .../google/protobuf/internal/__init__.py | 0 .../protobuf/internal/api_implementation.py | 87 - .../google/protobuf/internal/containers.py | 269 - .../google/protobuf/internal/cpp_message.py | 663 - .../google/protobuf/internal/decoder.py | 720 - .../internal/descriptor_database_test.py | 63 - .../protobuf/internal/descriptor_pool_test.py | 220 - .../protobuf/internal/descriptor_test.py | 613 - .../google/protobuf/internal/encoder.py | 769 - .../protobuf/internal/enum_type_wrapper.py | 89 - .../protobuf/internal/factory_test1.proto | 55 - .../protobuf/internal/factory_test2.proto | 77 - .../protobuf/internal/generator_test.py | 269 - .../protobuf/internal/message_cpp_test.py | 45 - .../protobuf/internal/message_factory_test.py | 113 - .../protobuf/internal/message_listener.py | 78 - .../google/protobuf/internal/message_test.py | 494 - .../protobuf/internal/more_extensions.proto | 58 - .../internal/more_extensions_dynamic.proto | 49 - .../protobuf/internal/more_messages.proto | 51 - .../protobuf/internal/python_message.py | 1150 - .../internal/reflection_cpp_generated_test.py | 91 - .../protobuf/internal/reflection_test.py | 2671 - .../internal/service_reflection_test.py | 136 - .../internal/test_bad_identifiers.proto | 52 - .../google/protobuf/internal/test_util.py | 651 - .../protobuf/internal/text_format_test.py | 617 - .../google/protobuf/internal/type_checkers.py | 286 - .../protobuf/internal/unknown_fields_test.py | 170 - .../google/protobuf/internal/wire_format.py | 268 - .../protobuf/internal/wire_format_test.py | 253 - .../python/google/protobuf/message.py | 280 - .../python/google/protobuf/message_factory.py | 113 - .../google/protobuf/pyext/python-proto2.cc | 1717 - .../protobuf/pyext/python_descriptor.cc | 337 - .../google/protobuf/pyext/python_descriptor.h | 87 - .../google/protobuf/pyext/python_protobuf.cc | 63 - .../google/protobuf/pyext/python_protobuf.h | 57 - .../python/google/protobuf/reflection.py | 169 - .../python/google/protobuf/service.py | 226 - .../google/protobuf/service_reflection.py | 284 - .../python/google/protobuf/text_format.py | 739 - src/cpp/protobuf/python/mox.py | 1401 - src/cpp/protobuf/python/setup.py | 195 - src/cpp/protobuf/python/stubout.py | 140 - src/cpp/protobuf/src/Makefile.am | 395 - src/cpp/protobuf/src/google/protobuf/SEBS | 240 - .../protobuf/compiler/code_generator.cc | 80 - .../google/protobuf/compiler/code_generator.h | 142 - .../compiler/command_line_interface.cc | 1437 - .../compiler/command_line_interface.h | 353 - .../command_line_interface_unittest.cc | 1560 - .../compiler/cpp/cpp_bootstrap_unittest.cc | 158 - .../google/protobuf/compiler/cpp/cpp_enum.cc | 258 - .../google/protobuf/compiler/cpp/cpp_enum.h | 101 - .../protobuf/compiler/cpp/cpp_enum_field.cc | 366 - .../protobuf/compiler/cpp/cpp_enum_field.h | 105 - .../protobuf/compiler/cpp/cpp_extension.cc | 210 - .../protobuf/compiler/cpp/cpp_extension.h | 86 - .../google/protobuf/compiler/cpp/cpp_field.cc | 142 - .../google/protobuf/compiler/cpp/cpp_field.h | 177 - .../google/protobuf/compiler/cpp/cpp_file.cc | 652 - .../google/protobuf/compiler/cpp/cpp_file.h | 99 - .../protobuf/compiler/cpp/cpp_generator.cc | 124 - .../protobuf/compiler/cpp/cpp_generator.h | 72 - .../protobuf/compiler/cpp/cpp_helpers.cc | 438 - .../protobuf/compiler/cpp/cpp_helpers.h | 186 - .../protobuf/compiler/cpp/cpp_message.cc | 2020 - .../protobuf/compiler/cpp/cpp_message.h | 171 - .../compiler/cpp/cpp_message_field.cc | 298 - .../protobuf/compiler/cpp/cpp_message_field.h | 104 - .../protobuf/compiler/cpp/cpp_options.h | 58 - .../compiler/cpp/cpp_plugin_unittest.cc | 121 - .../compiler/cpp/cpp_primitive_field.cc | 387 - .../compiler/cpp/cpp_primitive_field.h | 105 - .../protobuf/compiler/cpp/cpp_service.cc | 334 - .../protobuf/compiler/cpp/cpp_service.h | 119 - .../protobuf/compiler/cpp/cpp_string_field.cc | 491 - .../protobuf/compiler/cpp/cpp_string_field.h | 108 - .../cpp/cpp_test_bad_identifiers.proto | 123 - .../protobuf/compiler/cpp/cpp_unittest.cc | 1354 - .../protobuf/compiler/cpp/cpp_unittest.h | 51 - .../src/google/protobuf/compiler/importer.cc | 459 - .../src/google/protobuf/compiler/importer.h | 304 - .../protobuf/compiler/importer_unittest.cc | 600 - .../compiler/java/java_doc_comment.cc | 236 - .../protobuf/compiler/java/java_doc_comment.h | 69 - .../java/java_doc_comment_unittest.cc | 66 - .../protobuf/compiler/java/java_enum.cc | 271 - .../google/protobuf/compiler/java/java_enum.h | 86 - .../protobuf/compiler/java/java_enum_field.cc | 603 - .../protobuf/compiler/java/java_enum_field.h | 123 - .../protobuf/compiler/java/java_extension.cc | 218 - .../protobuf/compiler/java/java_extension.h | 77 - .../protobuf/compiler/java/java_field.cc | 137 - .../protobuf/compiler/java/java_field.h | 109 - .../protobuf/compiler/java/java_file.cc | 490 - .../google/protobuf/compiler/java/java_file.h | 101 - .../protobuf/compiler/java/java_generator.cc | 128 - .../protobuf/compiler/java/java_generator.h | 72 - .../protobuf/compiler/java/java_helpers.cc | 500 - .../protobuf/compiler/java/java_helpers.h | 220 - .../protobuf/compiler/java/java_message.cc | 1435 - .../protobuf/compiler/java/java_message.h | 112 - .../compiler/java/java_message_field.cc | 974 - .../compiler/java/java_message_field.h | 136 - .../compiler/java/java_plugin_unittest.cc | 122 - .../compiler/java/java_primitive_field.cc | 787 - .../compiler/java/java_primitive_field.h | 123 - .../protobuf/compiler/java/java_service.cc | 453 - .../protobuf/compiler/java/java_service.h | 113 - .../compiler/java/java_string_field.cc | 726 - .../compiler/java/java_string_field.h | 122 - .../src/google/protobuf/compiler/main.cc | 61 - .../protobuf/compiler/mock_code_generator.cc | 241 - .../protobuf/compiler/mock_code_generator.h | 117 - .../google/protobuf/compiler/package_info.h | 64 - .../src/google/protobuf/compiler/parser.cc | 1611 - .../src/google/protobuf/compiler/parser.h | 477 - .../protobuf/compiler/parser_unittest.cc | 2374 - .../src/google/protobuf/compiler/plugin.cc | 163 - .../src/google/protobuf/compiler/plugin.h | 72 - .../src/google/protobuf/compiler/plugin.pb.cc | 1090 - .../src/google/protobuf/compiler/plugin.pb.h | 856 - .../src/google/protobuf/compiler/plugin.proto | 147 - .../compiler/python/python_generator.cc | 1157 - .../compiler/python/python_generator.h | 161 - .../compiler/python/python_plugin_unittest.cc | 116 - .../google/protobuf/compiler/subprocess.cc | 463 - .../src/google/protobuf/compiler/subprocess.h | 108 - .../google/protobuf/compiler/test_plugin.cc | 51 - .../protobuf/compiler/zip_output_unittest.sh | 91 - .../google/protobuf/compiler/zip_writer.cc | 218 - .../src/google/protobuf/compiler/zip_writer.h | 93 - .../src/google/protobuf/descriptor.cc | 4949 - .../protobuf/src/google/protobuf/descriptor.h | 1521 - .../src/google/protobuf/descriptor.pb.cc | 8146 - .../src/google/protobuf/descriptor.pb.h | 5992 - .../src/google/protobuf/descriptor.proto | 620 - .../google/protobuf/descriptor_database.cc | 541 - .../src/google/protobuf/descriptor_database.h | 367 - .../protobuf/descriptor_database_unittest.cc | 748 - .../google/protobuf/descriptor_unittest.cc | 4656 - .../src/google/protobuf/dynamic_message.cc | 571 - .../src/google/protobuf/dynamic_message.h | 136 - .../protobuf/dynamic_message_unittest.cc | 166 - .../src/google/protobuf/extension_set.cc | 1461 - .../src/google/protobuf/extension_set.h | 1007 - .../google/protobuf/extension_set_heavy.cc | 711 - .../google/protobuf/extension_set_unittest.cc | 726 - .../protobuf/generated_enum_reflection.h | 85 - .../protobuf/generated_message_reflection.cc | 1293 - .../protobuf/generated_message_reflection.h | 419 - .../generated_message_reflection_unittest.cc | 484 - .../google/protobuf/generated_message_util.cc | 54 - .../google/protobuf/generated_message_util.h | 77 - .../src/google/protobuf/io/coded_stream.cc | 857 - .../src/google/protobuf/io/coded_stream.h | 1136 - .../src/google/protobuf/io/coded_stream_inl.h | 68 - .../protobuf/io/coded_stream_unittest.cc | 1191 - .../src/google/protobuf/io/gzip_stream.cc | 326 - .../src/google/protobuf/io/gzip_stream.h | 209 - .../protobuf/io/gzip_stream_unittest.sh | 44 - .../src/google/protobuf/io/package_info.h | 54 - .../src/google/protobuf/io/printer.cc | 198 - .../protobuf/src/google/protobuf/io/printer.h | 136 - .../google/protobuf/io/printer_unittest.cc | 285 - .../src/google/protobuf/io/tokenizer.cc | 1091 - .../src/google/protobuf/io/tokenizer.h | 384 - .../google/protobuf/io/tokenizer_unittest.cc | 1001 - .../google/protobuf/io/zero_copy_stream.cc | 48 - .../src/google/protobuf/io/zero_copy_stream.h | 238 - .../protobuf/io/zero_copy_stream_impl.cc | 471 - .../protobuf/io/zero_copy_stream_impl.h | 357 - .../protobuf/io/zero_copy_stream_impl_lite.cc | 393 - .../protobuf/io/zero_copy_stream_impl_lite.h | 340 - .../protobuf/io/zero_copy_stream_unittest.cc | 944 - .../src/google/protobuf/lite_unittest.cc | 185 - .../protobuf/src/google/protobuf/message.cc | 358 - .../protobuf/src/google/protobuf/message.h | 837 - .../src/google/protobuf/message_lite.cc | 334 - .../src/google/protobuf/message_lite.h | 246 - .../src/google/protobuf/message_unittest.cc | 354 - .../src/google/protobuf/package_info.h | 64 - .../src/google/protobuf/reflection_ops.cc | 267 - .../src/google/protobuf/reflection_ops.h | 81 - .../protobuf/reflection_ops_unittest.cc | 405 - .../src/google/protobuf/repeated_field.cc | 87 - .../src/google/protobuf/repeated_field.h | 1519 - .../repeated_field_reflection_unittest.cc | 195 - .../protobuf/repeated_field_unittest.cc | 1357 - .../protobuf/src/google/protobuf/service.cc | 46 - .../protobuf/src/google/protobuf/service.h | 291 - .../src/google/protobuf/stubs/atomicops.h | 206 - .../stubs/atomicops_internals_arm_gcc.h | 151 - .../stubs/atomicops_internals_arm_qnx.h | 146 - .../atomicops_internals_atomicword_compat.h | 122 - .../stubs/atomicops_internals_macosx.h | 225 - .../stubs/atomicops_internals_mips_gcc.h | 187 - .../stubs/atomicops_internals_pnacl.h | 73 - .../stubs/atomicops_internals_x86_gcc.cc | 137 - .../stubs/atomicops_internals_x86_gcc.h | 293 - .../stubs/atomicops_internals_x86_msvc.cc | 112 - .../stubs/atomicops_internals_x86_msvc.h | 150 - .../src/google/protobuf/stubs/common.cc | 395 - .../src/google/protobuf/stubs/common.h | 1223 - .../google/protobuf/stubs/common_unittest.cc | 357 - .../protobuf/src/google/protobuf/stubs/hash.h | 232 - .../src/google/protobuf/stubs/map-util.h | 143 - .../src/google/protobuf/stubs/once.cc | 99 - .../protobuf/src/google/protobuf/stubs/once.h | 148 - .../google/protobuf/stubs/once_unittest.cc | 253 - .../google/protobuf/stubs/platform_macros.h | 70 - .../src/google/protobuf/stubs/stl_util.h | 121 - .../src/google/protobuf/stubs/stringprintf.cc | 175 - .../src/google/protobuf/stubs/stringprintf.h | 76 - .../protobuf/stubs/stringprintf_unittest.cc | 152 - .../protobuf/stubs/structurally_valid.cc | 536 - .../stubs/structurally_valid_unittest.cc | 40 - .../src/google/protobuf/stubs/strutil.cc | 1211 - .../src/google/protobuf/stubs/strutil.h | 467 - .../google/protobuf/stubs/strutil_unittest.cc | 83 - .../src/google/protobuf/stubs/substitute.cc | 134 - .../src/google/protobuf/stubs/substitute.h | 170 - .../src/google/protobuf/stubs/template_util.h | 138 - .../protobuf/stubs/template_util_unittest.cc | 130 - .../src/google/protobuf/stubs/type_traits.h | 336 - .../protobuf/stubs/type_traits_unittest.cc | 628 - .../protobuf/src/google/protobuf/test_util.cc | 3047 - .../protobuf/src/google/protobuf/test_util.h | 193 - .../src/google/protobuf/test_util_lite.cc | 1548 - .../src/google/protobuf/test_util_lite.h | 101 - .../google/protobuf/testdata/golden_message | Bin 509 -> 0 bytes .../testdata/golden_packed_fields_message | Bin 142 -> 0 bytes .../testdata/text_format_unittest_data.txt | 128 - .../text_format_unittest_extensions_data.txt | 128 - .../src/google/protobuf/testing/file.cc | 176 - .../src/google/protobuf/testing/file.h | 83 - .../src/google/protobuf/testing/googletest.cc | 255 - .../src/google/protobuf/testing/googletest.h | 102 - .../src/google/protobuf/testing/zcgunzip.cc | 73 - .../src/google/protobuf/testing/zcgzip.cc | 79 - .../src/google/protobuf/text_format.cc | 1521 - .../src/google/protobuf/text_format.h | 369 - .../google/protobuf/text_format_unittest.cc | 1248 - .../src/google/protobuf/unittest.proto | 719 - .../protobuf/unittest_custom_options.proto | 387 - .../unittest_embed_optimize_for.proto | 50 - .../src/google/protobuf/unittest_empty.proto | 37 - .../unittest_enormous_descriptor.proto | 1046 - .../src/google/protobuf/unittest_import.proto | 64 - .../protobuf/unittest_import_lite.proto | 51 - .../protobuf/unittest_import_public.proto | 40 - .../unittest_import_public_lite.proto | 42 - .../src/google/protobuf/unittest_lite.proto | 360 - .../unittest_lite_imports_nonlite.proto | 43 - .../src/google/protobuf/unittest_mset.proto | 72 - .../unittest_no_generic_services.proto | 52 - .../protobuf/unittest_optimize_for.proto | 61 - .../src/google/protobuf/unknown_field_set.cc | 266 - .../src/google/protobuf/unknown_field_set.h | 311 - .../protobuf/unknown_field_set_unittest.cc | 594 - .../src/google/protobuf/wire_format.cc | 1063 - .../src/google/protobuf/wire_format.h | 308 - .../src/google/protobuf/wire_format_lite.cc | 361 - .../src/google/protobuf/wire_format_lite.h | 622 - .../google/protobuf/wire_format_lite_inl.h | 776 - .../google/protobuf/wire_format_unittest.cc | 978 - src/cpp/protobuf/src/solaris/libstdc++.la | 51 - src/cpp/protobuf/vsprojects/config.h | 29 - .../protobuf/vsprojects/convert2008to2005.sh | 20 - .../protobuf/vsprojects/extract_includes.bat | 49 - .../vsprojects/libprotobuf-lite.vcproj | 302 - .../protobuf/vsprojects/libprotobuf.vcproj | 462 - src/cpp/protobuf/vsprojects/libprotoc.vcproj | 426 - src/cpp/protobuf/vsprojects/lite-test.vcproj | 305 - src/cpp/protobuf/vsprojects/protobuf.sln | 92 - src/cpp/protobuf/vsprojects/protoc.vcproj | 192 - src/cpp/protobuf/vsprojects/readme.txt | 114 - .../protobuf/vsprojects/test_plugin.vcproj | 209 - src/cpp/protobuf/vsprojects/tests.vcproj | 681 - src/cpp/protobuf_core.cpp | 54 - src/cpp/ripple/AccountSetTransactor.cpp | 276 - src/cpp/ripple/AccountSetTransactor.h | 19 - src/cpp/ripple/CallRPC.cpp | 1050 - src/cpp/ripple/CallRPC.h | 72 - src/cpp/ripple/ChangeTransactor.cpp | 125 - src/cpp/ripple/ChangeTransactor.h | 33 - src/cpp/ripple/Contract.cpp | 33 - src/cpp/ripple/Contract.h | 35 - src/cpp/ripple/HTTPRequest.cpp | 114 - src/cpp/ripple/HTTPRequest.h | 90 - src/cpp/ripple/HttpsClient.cpp | 491 - src/cpp/ripple/HttpsClient.h | 120 - src/cpp/ripple/Interpreter.cpp | 214 - src/cpp/ripple/Interpreter.h | 86 - src/cpp/ripple/Ledger.cpp | 1934 - src/cpp/ripple/Ledger.h | 472 - src/cpp/ripple/LedgerMaster.cpp | 827 - src/cpp/ripple/LedgerMaster.h | 217 - src/cpp/ripple/LedgerProposal.cpp | 103 - src/cpp/ripple/LedgerProposal.h | 123 - src/cpp/ripple/LedgerTiming.cpp | 154 - src/cpp/ripple/LedgerTiming.h | 87 - src/cpp/ripple/NetworkOPs.cpp | 2287 - src/cpp/ripple/NetworkOPs.h | 443 - src/cpp/ripple/OfferCancelTransactor.cpp | 57 - src/cpp/ripple/OfferCancelTransactor.h | 19 - src/cpp/ripple/OfferCreateTransactor.cpp | 720 - src/cpp/ripple/OfferCreateTransactor.h | 48 - src/cpp/ripple/Operation.cpp | 21 - src/cpp/ripple/Operation.h | 367 - src/cpp/ripple/OrderBookDB.cpp | 243 - src/cpp/ripple/OrderBookDB.h | 73 - src/cpp/ripple/ParameterTable.cpp | 178 - src/cpp/ripple/ParameterTable.h | 86 - src/cpp/ripple/ParseSection.cpp | 132 - src/cpp/ripple/ParseSection.h | 19 - src/cpp/ripple/PaymentTransactor.cpp | 246 - src/cpp/ripple/PaymentTransactor.h | 19 - src/cpp/ripple/Peer.h | 84 - src/cpp/ripple/PeerDoor.cpp | 152 - src/cpp/ripple/PeerDoor.h | 35 - src/cpp/ripple/RPC.h | 47 - src/cpp/ripple/RPCDoor.cpp | 94 - src/cpp/ripple/RPCDoor.h | 32 - src/cpp/ripple/RPCErr.cpp | 107 - src/cpp/ripple/RPCErr.h | 97 - src/cpp/ripple/RPCHandler.cpp | 3789 - src/cpp/ripple/RPCHandler.h | 153 - src/cpp/ripple/RPCServer.cpp | 204 - src/cpp/ripple/RPCServer.h | 65 - src/cpp/ripple/RPCSub.cpp | 119 - src/cpp/ripple/RPCSub.h | 63 - src/cpp/ripple/RegularKeySetTransactor.cpp | 58 - src/cpp/ripple/RegularKeySetTransactor.h | 20 - src/cpp/ripple/SNTPClient.cpp | 268 - src/cpp/ripple/SNTPClient.h | 60 - src/cpp/ripple/ScriptData.cpp | 5 - src/cpp/ripple/ScriptData.h | 171 - src/cpp/ripple/SerializedValidation.cpp | 144 - src/cpp/ripple/SerializedValidation.h | 77 - src/cpp/ripple/Transaction.cpp | 403 - src/cpp/ripple/Transaction.h | 173 - src/cpp/ripple/TransactionCheck.cpp | 93 - src/cpp/ripple/TransactionEngine.cpp | 215 - src/cpp/ripple/TransactionEngine.h | 101 - src/cpp/ripple/TransactionMaster.cpp | 98 - src/cpp/ripple/TransactionMaster.h | 34 - src/cpp/ripple/TransactionMeta.cpp | 216 - src/cpp/ripple/TransactionMeta.h | 89 - src/cpp/ripple/TransactionQueue.cpp | 110 - src/cpp/ripple/TransactionQueue.h | 88 - src/cpp/ripple/Transactor.cpp | 254 - src/cpp/ripple/Transactor.h | 55 - src/cpp/ripple/TrustSetTransactor.cpp | 338 - src/cpp/ripple/TrustSetTransactor.h | 19 - src/cpp/ripple/WSConnection.cpp | 8 - src/cpp/ripple/WSConnection.h | 272 - src/cpp/ripple/WSDoor.cpp | 102 - src/cpp/ripple/WSDoor.h | 36 - src/cpp/ripple/WSHandler.cpp | 8 - src/cpp/ripple/WSHandler.h | 332 - src/cpp/ripple/WalletAddTransactor.cpp | 79 - src/cpp/ripple/WalletAddTransactor.h | 19 - src/cpp/ripple/main.cpp | 281 - src/cpp/ripple/ripple.proto | 347 - src/cpp/ripple/ripple_AcceptedLedger.cpp | 46 - src/cpp/ripple/ripple_AcceptedLedger.h | 79 - src/cpp/ripple/ripple_AcceptedLedgerTx.cpp | 61 - src/cpp/ripple/ripple_AcceptedLedgerTx.h | 97 - src/cpp/ripple/ripple_AccountItem.cpp | 11 - src/cpp/ripple/ripple_AccountItem.h | 74 - src/cpp/ripple/ripple_AccountItems.cpp | 68 - src/cpp/ripple/ripple_AccountItems.h | 45 - src/cpp/ripple/ripple_AccountState.cpp | 69 - src/cpp/ripple/ripple_AccountState.h | 77 - src/cpp/ripple/ripple_Application.cpp | 976 - src/cpp/ripple/ripple_CanonicalTXSet.cpp | 78 - src/cpp/ripple/ripple_CanonicalTXSet.h | 109 - src/cpp/ripple/ripple_Config.cpp | 582 - src/cpp/ripple/ripple_Config.h | 204 - src/cpp/ripple/ripple_DBInit.cpp | 356 - src/cpp/ripple/ripple_Database.cpp | 194 - src/cpp/ripple/ripple_Database.h | 116 - src/cpp/ripple/ripple_DatabaseCon.cpp | 32 - src/cpp/ripple/ripple_DatabaseCon.h | 39 - src/cpp/ripple/ripple_DisputedTx.cpp | 137 - src/cpp/ripple/ripple_DisputedTx.h | 75 - src/cpp/ripple/ripple_Features.cpp | 541 - src/cpp/ripple/ripple_FeeVote.cpp | 194 - src/cpp/ripple/ripple_HashRouter.cpp | 224 - src/cpp/ripple/ripple_HashedObject.cpp | 53 - src/cpp/ripple/ripple_HashedObject.h | 86 - src/cpp/ripple/ripple_HashedObjectStore.cpp | 621 - src/cpp/ripple/ripple_HashedObjectStore.h | 88 - src/cpp/ripple/ripple_IApplication.h | 116 - src/cpp/ripple/ripple_IFeatures.h | 130 - src/cpp/ripple/ripple_IFeeVote.h | 44 - src/cpp/ripple/ripple_IHashRouter.h | 68 - src/cpp/ripple/ripple_ILoadFeeTrack.h | 41 - src/cpp/ripple/ripple_IPeers.h | 79 - src/cpp/ripple/ripple_IProofOfWorkFactory.h | 60 - src/cpp/ripple/ripple_IUniqueNodeList.h | 60 - src/cpp/ripple/ripple_IValidations.h | 46 - src/cpp/ripple/ripple_InboundLedger.cpp | 872 - src/cpp/ripple/ripple_InboundLedger.h | 122 - src/cpp/ripple/ripple_InboundLedgers.cpp | 251 - src/cpp/ripple/ripple_InboundLedgers.h | 68 - src/cpp/ripple/ripple_InfoSub.cpp | 73 - src/cpp/ripple/ripple_InfoSub.h | 64 - src/cpp/ripple/ripple_Job.cpp | 185 - src/cpp/ripple/ripple_Job.h | 95 - src/cpp/ripple/ripple_JobQueue.cpp | 296 - src/cpp/ripple/ripple_JobQueue.h | 64 - src/cpp/ripple/ripple_LedgerConsensus.cpp | 1472 - src/cpp/ripple/ripple_LedgerConsensus.h | 156 - src/cpp/ripple/ripple_LedgerEntrySet.cpp | 1646 - src/cpp/ripple/ripple_LedgerEntrySet.h | 279 - src/cpp/ripple/ripple_LedgerHistory.cpp | 141 - src/cpp/ripple/ripple_LedgerHistory.h | 48 - src/cpp/ripple/ripple_LoadEvent.cpp | 42 - src/cpp/ripple/ripple_LoadEvent.h | 52 - src/cpp/ripple/ripple_LoadFeeTrack.cpp | 209 - src/cpp/ripple/ripple_LoadManager.cpp | 284 - src/cpp/ripple/ripple_LoadManager.h | 239 - src/cpp/ripple/ripple_LoadMonitor.cpp | 156 - src/cpp/ripple/ripple_LoadMonitor.h | 47 - src/cpp/ripple/ripple_LocalCredentials.cpp | 170 - src/cpp/ripple/ripple_LocalCredentials.h | 67 - src/cpp/ripple/ripple_LogWebsockets.cpp | 47 - src/cpp/ripple/ripple_NicknameState.cpp | 33 - src/cpp/ripple/ripple_NicknameState.h | 49 - src/cpp/ripple/ripple_Offer.cpp | 33 - src/cpp/ripple/ripple_Offer.h | 55 - src/cpp/ripple/ripple_OrderBook.cpp | 44 - src/cpp/ripple/ripple_OrderBook.h | 57 - src/cpp/ripple/ripple_PathRequest.cpp | 361 - src/cpp/ripple/ripple_PathRequest.h | 74 - src/cpp/ripple/ripple_PathState.cpp | 793 - src/cpp/ripple/ripple_PathState.h | 164 - src/cpp/ripple/ripple_Pathfinder.cpp | 840 - src/cpp/ripple/ripple_Pathfinder.h | 93 - src/cpp/ripple/ripple_Peer.cpp | 2385 - src/cpp/ripple/ripple_Peer.h | 91 - src/cpp/ripple/ripple_PeerSet.cpp | 98 - src/cpp/ripple/ripple_PeerSet.h | 111 - src/cpp/ripple/ripple_Peers.cpp | 881 - src/cpp/ripple/ripple_ProofOfWork.cpp | 179 - src/cpp/ripple/ripple_ProofOfWork.h | 60 - src/cpp/ripple/ripple_ProofOfWorkFactory.cpp | 334 - src/cpp/ripple/ripple_RippleCalc.cpp | 2664 - src/cpp/ripple/ripple_RippleCalc.h | 88 - src/cpp/ripple/ripple_RippleLineCache.cpp | 18 - src/cpp/ripple/ripple_RippleLineCache.h | 37 - src/cpp/ripple/ripple_RippleState.cpp | 60 - src/cpp/ripple/ripple_RippleState.h | 122 - src/cpp/ripple/ripple_SHAMap.cpp | 1131 - src/cpp/ripple/ripple_SHAMap.h | 235 - src/cpp/ripple/ripple_SHAMapAddNode.h | 88 - src/cpp/ripple/ripple_SHAMapDelta.cpp | 257 - src/cpp/ripple/ripple_SHAMapItem.cpp | 19 - src/cpp/ripple/ripple_SHAMapItem.h | 114 - src/cpp/ripple/ripple_SHAMapMissingNode.cpp | 26 - src/cpp/ripple/ripple_SHAMapMissingNode.h | 85 - src/cpp/ripple/ripple_SHAMapNode.cpp | 164 - src/cpp/ripple/ripple_SHAMapNode.h | 117 - src/cpp/ripple/ripple_SHAMapSync.cpp | 790 - src/cpp/ripple/ripple_SHAMapSyncFilter.h | 40 - src/cpp/ripple/ripple_SHAMapSyncFilters.cpp | 111 - src/cpp/ripple/ripple_SHAMapSyncFilters.h | 73 - src/cpp/ripple/ripple_SHAMapTreeNode.cpp | 462 - src/cpp/ripple/ripple_SHAMapTreeNode.h | 175 - src/cpp/ripple/ripple_SerializedLedger.cpp | 194 - src/cpp/ripple/ripple_SerializedLedger.h | 106 - .../ripple/ripple_SerializedTransaction.cpp | 356 - src/cpp/ripple/ripple_SerializedTransaction.h | 141 - src/cpp/ripple/ripple_SqliteDatabase.cpp | 439 - src/cpp/ripple/ripple_SqliteDatabase.h | 128 - src/cpp/ripple/ripple_TransactionAcquire.cpp | 215 - src/cpp/ripple/ripple_TransactionAcquire.h | 50 - src/cpp/ripple/ripple_UniqueNodeList.cpp | 1926 - src/cpp/ripple/ripple_Validations.cpp | 414 - src/cpp/ripple/ripple_Version.h | 36 - src/cpp/ripple/rpc.cpp | 286 - {Subtrees/leveldb/table => table}/block.cc | 0 {Subtrees/leveldb/table => table}/block.h | 0 .../leveldb/table => table}/block_builder.cc | 0 .../leveldb/table => table}/block_builder.h | 0 .../leveldb/table => table}/filter_block.cc | 0 .../leveldb/table => table}/filter_block.h | 0 .../table => table}/filter_block_test.cc | 0 {Subtrees/leveldb/table => table}/format.cc | 0 {Subtrees/leveldb/table => table}/format.h | 0 {Subtrees/leveldb/table => table}/iterator.cc | 0 .../table => table}/iterator_wrapper.h | 0 {Subtrees/leveldb/table => table}/merger.cc | 0 {Subtrees/leveldb/table => table}/merger.h | 0 {Subtrees/leveldb/table => table}/table.cc | 0 .../leveldb/table => table}/table_builder.cc | 0 .../leveldb/table => table}/table_test.cc | 0 .../table => table}/two_level_iterator.cc | 0 .../table => table}/two_level_iterator.h | 0 test/account_set-test.js | 221 - test/account_tx-test.js | 212 - test/buster.js | 11 - test/config-example.js | 46 - test/jsonrpc-test.js | 188 - test/monitor-test.js | 53 - test/nodeutils.js | 91 - test/offer-test.js | 1931 - test/path-test.js | 1405 - test/remote-test.js | 245 - test/send-test.js | 1330 - test/server-test.js | 28 - test/server.js | 211 - test/testconfig.js | 48 - test/testutils.js | 485 - test/websocket-test.js | 38 - {Subtrees/leveldb/util => util}/arena.cc | 0 {Subtrees/leveldb/util => util}/arena.h | 0 {Subtrees/leveldb/util => util}/arena_test.cc | 0 {Subtrees/leveldb/util => util}/bloom.cc | 0 {Subtrees/leveldb/util => util}/bloom_test.cc | 0 {Subtrees/leveldb/util => util}/cache.cc | 0 {Subtrees/leveldb/util => util}/cache_test.cc | 0 {Subtrees/leveldb/util => util}/coding.cc | 0 {Subtrees/leveldb/util => util}/coding.h | 0 .../leveldb/util => util}/coding_test.cc | 0 {Subtrees/leveldb/util => util}/comparator.cc | 0 {Subtrees/leveldb/util => util}/crc32c.cc | 0 {Subtrees/leveldb/util => util}/crc32c.h | 0 .../leveldb/util => util}/crc32c_test.cc | 0 {Subtrees/leveldb/util => util}/env.cc | 0 {Subtrees/leveldb/util => util}/env_posix.cc | 0 {Subtrees/leveldb/util => util}/env_test.cc | 0 {Subtrees/leveldb/util => util}/env_win.cc | 0 .../leveldb/util => util}/filter_policy.cc | 0 {Subtrees/leveldb/util => util}/hash.cc | 0 {Subtrees/leveldb/util => util}/hash.h | 0 {Subtrees/leveldb/util => util}/histogram.cc | 0 {Subtrees/leveldb/util => util}/histogram.h | 0 {Subtrees/leveldb/util => util}/logging.cc | 0 {Subtrees/leveldb/util => util}/logging.h | 0 {Subtrees/leveldb/util => util}/mutexlock.h | 0 {Subtrees/leveldb/util => util}/options.cc | 0 .../leveldb/util => util}/posix_logger.h | 0 {Subtrees/leveldb/util => util}/random.h | 0 {Subtrees/leveldb/util => util}/status.cc | 0 .../leveldb/util => util}/testharness.cc | 0 {Subtrees/leveldb/util => util}/testharness.h | 0 {Subtrees/leveldb/util => util}/testutil.cc | 0 {Subtrees/leveldb/util => util}/testutil.h | 0 validators-example.txt | 25 - web_modules/domain.js | 1 - web_modules/ws.js | 1 - 1490 files changed, 19 insertions(+), 544886 deletions(-) delete mode 100644 .dir-locals.el delete mode 100644 .gitattributes rename Subtrees/leveldb/AUTHORS => AUTHORS (100%) delete mode 100644 BeastConfig.h delete mode 100644 Builds/VisualStudio2010/RippleD.props delete mode 100644 Builds/VisualStudio2010/RippleD.sln delete mode 100644 Builds/VisualStudio2010/RippleD.vcxproj delete mode 100644 Builds/VisualStudio2010/RippleD.vcxproj.filters delete mode 100644 Builds/VisualStudio2012/Ripple.sln delete mode 100644 Builds/VisualStudio2012/RippleD.props delete mode 100644 Builds/VisualStudio2012/RippleD.vcxproj delete mode 100644 Builds/VisualStudio2012/RippleD.vcxproj.filters delete mode 100644 Builds/XCode/README.txt delete mode 100644 CHANGELOG delete mode 100644 CheatSheet.md delete mode 100644 CodingStyle.md delete mode 100644 Doxyfile delete mode 100644 LEVELDB.txt rename Subtrees/leveldb/Makefile => Makefile (100%) rename Subtrees/leveldb/NEWS => NEWS (100%) rename Subtrees/leveldb/README => README (100%) delete mode 100644 README.md delete mode 100644 RippleD.props delete mode 100644 SConstruct delete mode 100644 Subtrees/README.md delete mode 100644 Subtrees/beast/.gitattributes delete mode 100644 Subtrees/beast/.gitignore delete mode 100644 Subtrees/beast/Builds/VisualStudio2012/BeastConfig.h delete mode 100644 Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj delete mode 100644 Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters delete mode 100644 Subtrees/beast/CodingStyle.md delete mode 100644 Subtrees/beast/Doxyfile delete mode 100644 Subtrees/beast/ReadMe.md delete mode 100644 Subtrees/beast/modules/beast_basics/beast_basics.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/beast_basics.h delete mode 100644 Subtrees/beast/modules/beast_basics/containers/beast_List.h delete mode 100644 Subtrees/beast/modules/beast_basics/containers/beast_LockFreeQueue.h delete mode 100644 Subtrees/beast/modules/beast_basics/containers/beast_LockFreeStack.h delete mode 100644 Subtrees/beast/modules/beast_basics/containers/beast_SharedTable.h delete mode 100644 Subtrees/beast/modules/beast_basics/containers/beast_SortedLookupTable.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_SafeBool.h delete mode 100644 Subtrees/beast/modules/beast_basics/diagnostic/beast_Throw.h delete mode 100644 Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.h delete mode 100644 Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.h delete mode 100644 Subtrees/beast/modules/beast_basics/functor/beast_Bind.h delete mode 100644 Subtrees/beast/modules/beast_basics/functor/beast_Function.h delete mode 100644 Subtrees/beast/modules/beast_basics/math/beast_Interval.h delete mode 100644 Subtrees/beast/modules/beast_basics/math/beast_Math.h delete mode 100644 Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_AllocatedBy.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_AtomicCounter.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_AtomicFlag.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_AtomicPointer.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_AtomicState.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_CacheLine.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStore.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_MemoryAlignment.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_RefCountedSingleton.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_StaticObject.h delete mode 100644 Subtrees/beast/modules/beast_basics/memory/beast_Uncopyable.h delete mode 100644 Subtrees/beast/modules/beast_basics/native/beast_posix_FPUFlags.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/native/beast_posix_Threads.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/native/beast_win32_FPUFlags.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/native/beast_win32_Threads.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentState.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_GlobalThreadGroup.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_Listeners.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_Listeners.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_SerialFor.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_SpinDelay.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.h delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.cpp delete mode 100644 Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.h delete mode 100644 Subtrees/beast/modules/beast_core/beast_core.cpp delete mode 100644 Subtrees/beast/modules/beast_core/beast_core.h delete mode 100644 Subtrees/beast/modules/beast_core/beast_core.mm delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.cpp delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_Array.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_ArrayAllocationBase.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.cpp delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_ElementComparator.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_HashMap.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_LinkedListPointer.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.cpp delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_PropertySet.cpp delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_PropertySet.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_ReferenceCountedArray.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_ScopedValueSetter.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_SortedSet.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_SparseSet.h delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_Variant.cpp delete mode 100644 Subtrees/beast/modules/beast_core/containers/beast_Variant.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_File.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_File.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileInputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileInputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_MemoryMappedFile.h delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.cpp delete mode 100644 Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.h delete mode 100644 Subtrees/beast/modules/beast_core/json/beast_JSON.cpp delete mode 100644 Subtrees/beast/modules/beast_core/json/beast_JSON.h delete mode 100644 Subtrees/beast/modules/beast_core/logging/beast_FileLogger.cpp delete mode 100644 Subtrees/beast/modules/beast_core/logging/beast_FileLogger.h delete mode 100644 Subtrees/beast/modules/beast_core/logging/beast_Logger.cpp delete mode 100644 Subtrees/beast/modules/beast_core/logging/beast_Logger.h delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_BigInteger.cpp delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_BigInteger.h delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_Expression.cpp delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_Expression.h delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_MathsFunctions.h delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_Random.cpp delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_Random.h delete mode 100644 Subtrees/beast/modules/beast_core/maths/beast_Range.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_Atomic.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_ByteOrder.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_HeapBlock.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_LeakedObjectDetector.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_Memory.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.cpp delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_OptionalScopedPointer.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_ReferenceCountedObject.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_Singleton.h delete mode 100644 Subtrees/beast/modules/beast_core/memory/beast_WeakReference.h delete mode 100644 Subtrees/beast/modules/beast_core/misc/beast_Result.cpp delete mode 100644 Subtrees/beast/modules/beast_core/misc/beast_Result.h delete mode 100644 Subtrees/beast/modules/beast_core/misc/beast_Uuid.cpp delete mode 100644 Subtrees/beast/modules/beast_core/misc/beast_Uuid.h delete mode 100644 Subtrees/beast/modules/beast_core/misc/beast_WindowsRegistry.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_BasicNativeHeaders.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_Files.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_JNIHelpers.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_Misc.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_Network.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_SystemStats.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_android_Threads.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_linux_Files.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_linux_Network.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_linux_SystemStats.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_linux_Threads.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_mac_Files.mm delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_mac_Network.mm delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_mac_Strings.mm delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_mac_SystemStats.mm delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_mac_Threads.mm delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_osx_ObjCHelpers.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_posix_NamedPipe.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_posix_SharedCode.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_ComSmartPtr.h delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_Files.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_Network.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_Registry.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_SystemStats.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/beast_win32_Threads.cpp delete mode 100644 Subtrees/beast/modules/beast_core/native/java/BeastAppActivity.java delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_IPAddress.cpp delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_IPAddress.h delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_MACAddress.cpp delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_MACAddress.h delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_NamedPipe.cpp delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_NamedPipe.h delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_Socket.cpp delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_Socket.h delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_URL.cpp delete mode 100644 Subtrees/beast/modules/beast_core/network/beast_URL.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_InputSource.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_InputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_InputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_OutputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_OutputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.h delete mode 100644 Subtrees/beast/modules/beast_core/system/beast_PlatformDefs.h delete mode 100644 Subtrees/beast/modules/beast_core/system/beast_StandardHeader.h delete mode 100644 Subtrees/beast/modules/beast_core/system/beast_SystemStats.cpp delete mode 100644 Subtrees/beast/modules/beast_core/system/beast_SystemStats.h delete mode 100644 Subtrees/beast/modules/beast_core/system/beast_TargetPlatform.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharPointer_ASCII.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF16.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF32.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF8.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_Identifier.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_Identifier.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_NewLine.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_String.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_String.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringArray.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringArray.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringPairArray.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringPairArray.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringPool.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_StringPool.h delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_TextDiff.cpp delete mode 100644 Subtrees/beast/modules/beast_core/text/beast_TextDiff.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_CriticalSection.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_DynamicLibrary.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_InterProcessLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_Process.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ScopedLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ScopedReadLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ScopedWriteLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_SpinLock.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_Thread.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_Thread.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ThreadLocalValue.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.cpp delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.h delete mode 100644 Subtrees/beast/modules/beast_core/threads/beast_WaitableEvent.h delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.cpp delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.h delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_RelativeTime.cpp delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_RelativeTime.h delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_Time.cpp delete mode 100644 Subtrees/beast/modules/beast_core/time/beast_Time.h delete mode 100644 Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.cpp delete mode 100644 Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.h delete mode 100644 Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.cpp delete mode 100644 Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.h delete mode 100644 Subtrees/beast/modules/beast_core/xml/beast_XmlElement.cpp delete mode 100644 Subtrees/beast/modules/beast_core/xml/beast_XmlElement.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.cpp delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_ZipFile.cpp delete mode 100644 Subtrees/beast/modules/beast_core/zip/beast_ZipFile.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/README delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/adler32.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/compress.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/crc32.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/crc32.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/deflate.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/deflate.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/infback.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inffast.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inffast.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inffixed.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inflate.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inflate.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inftrees.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/inftrees.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/trees.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/trees.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/uncompr.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/zconf.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/zconf.in.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/zlib.h delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/zutil.c delete mode 100644 Subtrees/beast/modules/beast_core/zip/zlib/zutil.h delete mode 100644 Subtrees/leveldb/.gitignore delete mode 100644 Subtrees/leveldb/LICENSE delete mode 100644 Subtrees/sqlite/sqlite3.c delete mode 100644 Subtrees/sqlite/sqlite3.h delete mode 100644 Subtrees/sqlite/sqlite3ext.h delete mode 100644 Subtrees/websocket/.gitattributes delete mode 100644 Subtrees/websocket/.gitignore delete mode 100644 Subtrees/websocket/Makefile delete mode 100644 Subtrees/websocket/SConstruct delete mode 100644 Subtrees/websocket/dependencies.txt delete mode 100644 Subtrees/websocket/doc/uri.txt delete mode 100644 Subtrees/websocket/examples/Makefile delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/Makefile delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/broadcast_admin.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/broadcast_admin_handler.hpp delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/broadcast_handler.hpp delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_handler.hpp delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_tls.cpp delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/API.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/FAQ.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/LICENSE.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/Makefile delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/NEWS.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/PLUGINS.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/README.txt delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/ajax.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/annotating.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-down.gif delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-left.gif delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-right.gif delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-up.gif delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/basic.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-1.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-2.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-3.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-4.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-5.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-japan-gdp-growth.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-usa-gdp-growth.json delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/graph-types.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/hs-2004-27-a-large_web.jpg delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/image.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/index.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting-axes.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/layout.css delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/multiple-axes.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/navigate.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/percentiles.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/pie.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/realtime.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/resize.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/selection.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/setting-options.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/stacking.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/symbols.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/thresholding.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/time.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/tracking.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/turning-series.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/visitors.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/zooming.html delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.image.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.image.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.navigate.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.navigate.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.pie.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.pie.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.symbol.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.symbol.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.min.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/vendor/md5.js delete mode 100644 Subtrees/websocket/examples/broadcast_server_tls/wscmd.hpp delete mode 100644 Subtrees/websocket/examples/chat_client/Makefile delete mode 100644 Subtrees/websocket/examples/chat_client/SConscript delete mode 100644 Subtrees/websocket/examples/chat_client/chat_client.cpp delete mode 100644 Subtrees/websocket/examples/chat_client/chat_client.html delete mode 100644 Subtrees/websocket/examples/chat_client/chat_client_handler.cpp delete mode 100644 Subtrees/websocket/examples/chat_client/chat_client_handler.hpp delete mode 100644 Subtrees/websocket/examples/chat_client/vendor/jquery-1.6.3.min.js delete mode 100644 Subtrees/websocket/examples/chat_server/Makefile delete mode 100644 Subtrees/websocket/examples/chat_server/SConscript delete mode 100644 Subtrees/websocket/examples/chat_server/chat.cpp delete mode 100644 Subtrees/websocket/examples/chat_server/chat.hpp delete mode 100644 Subtrees/websocket/examples/chat_server/chat_server.cpp delete mode 100644 Subtrees/websocket/examples/common.mk delete mode 100644 Subtrees/websocket/examples/concurrent_server/Makefile delete mode 100644 Subtrees/websocket/examples/concurrent_server/SConscript delete mode 100644 Subtrees/websocket/examples/concurrent_server/concurrent_client.html delete mode 100644 Subtrees/websocket/examples/concurrent_server/concurrent_server.cpp delete mode 100644 Subtrees/websocket/examples/echo_client/Makefile delete mode 100644 Subtrees/websocket/examples/echo_client/SConscript delete mode 100644 Subtrees/websocket/examples/echo_client/echo_client.cpp delete mode 100644 Subtrees/websocket/examples/echo_server/Makefile delete mode 100644 Subtrees/websocket/examples/echo_server/SConscript delete mode 100644 Subtrees/websocket/examples/echo_server/echo_client.html delete mode 100644 Subtrees/websocket/examples/echo_server/echo_server.cpp delete mode 100644 Subtrees/websocket/examples/echo_server_tls/Makefile delete mode 100644 Subtrees/websocket/examples/echo_server_tls/SConscript delete mode 100644 Subtrees/websocket/examples/echo_server_tls/echo.cpp delete mode 100644 Subtrees/websocket/examples/echo_server_tls/echo.hpp delete mode 100644 Subtrees/websocket/examples/echo_server_tls/echo_client.html delete mode 100644 Subtrees/websocket/examples/echo_server_tls/echo_server_tls.cpp delete mode 100644 Subtrees/websocket/examples/fuzzing_client/Makefile delete mode 100644 Subtrees/websocket/examples/fuzzing_client/fuzzing_client.cpp delete mode 100644 Subtrees/websocket/examples/fuzzing_server_tls/Makefile delete mode 100644 Subtrees/websocket/examples/fuzzing_server_tls/echo_client.html delete mode 100644 Subtrees/websocket/examples/fuzzing_server_tls/fuzzing_server_tls.cpp delete mode 100644 Subtrees/websocket/examples/stress_client/Makefile delete mode 100644 Subtrees/websocket/examples/stress_client/stress_client.cpp delete mode 100644 Subtrees/websocket/examples/telemetry_server/Makefile delete mode 100644 Subtrees/websocket/examples/telemetry_server/SConscript delete mode 100644 Subtrees/websocket/examples/telemetry_server/telemetry_server.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/Makefile delete mode 100644 Subtrees/websocket/examples/wsperf/SConscript delete mode 100644 Subtrees/websocket/examples/wsperf/case.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/case.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/generic.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/generic.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/message_test.html delete mode 100644 Subtrees/websocket/examples/wsperf/request.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/request.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/stress_aggregate.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/stress_aggregate.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/stress_handler.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/stress_handler.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/stress_test.html delete mode 100644 Subtrees/websocket/examples/wsperf/vendor/backbone-localstorage.js delete mode 100644 Subtrees/websocket/examples/wsperf/vendor/backbone.js delete mode 100644 Subtrees/websocket/examples/wsperf/vendor/jquery.min.js delete mode 100644 Subtrees/websocket/examples/wsperf/vendor/underscore.js delete mode 100644 Subtrees/websocket/examples/wsperf/wscmd.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/wscmd.hpp delete mode 100644 Subtrees/websocket/examples/wsperf/wsperf.cfg delete mode 100644 Subtrees/websocket/examples/wsperf/wsperf.cpp delete mode 100644 Subtrees/websocket/examples/wsperf/wsperf_commander.html delete mode 100644 Subtrees/websocket/license.txt delete mode 100644 Subtrees/websocket/readme.txt delete mode 100644 Subtrees/websocket/src/SConscript delete mode 100644 Subtrees/websocket/src/base64/base64.cpp delete mode 100644 Subtrees/websocket/src/base64/base64.h delete mode 100644 Subtrees/websocket/src/common.hpp delete mode 100644 Subtrees/websocket/src/connection.hpp delete mode 100644 Subtrees/websocket/src/endpoint.hpp delete mode 100644 Subtrees/websocket/src/http/constants.hpp delete mode 100644 Subtrees/websocket/src/http/parser.hpp delete mode 100644 Subtrees/websocket/src/logger/logger.hpp delete mode 100644 Subtrees/websocket/src/md5/md5.c delete mode 100644 Subtrees/websocket/src/md5/md5.h delete mode 100644 Subtrees/websocket/src/md5/md5.hpp delete mode 100644 Subtrees/websocket/src/messages/control.hpp delete mode 100644 Subtrees/websocket/src/messages/data.cpp delete mode 100644 Subtrees/websocket/src/messages/data.hpp delete mode 100644 Subtrees/websocket/src/network_utilities.cpp delete mode 100644 Subtrees/websocket/src/network_utilities.hpp delete mode 100644 Subtrees/websocket/src/processors/hybi.hpp delete mode 100644 Subtrees/websocket/src/processors/hybi_header.cpp delete mode 100644 Subtrees/websocket/src/processors/hybi_header.hpp delete mode 100644 Subtrees/websocket/src/processors/hybi_legacy.hpp delete mode 100644 Subtrees/websocket/src/processors/hybi_util.cpp delete mode 100644 Subtrees/websocket/src/processors/hybi_util.hpp delete mode 100644 Subtrees/websocket/src/processors/processor.hpp delete mode 100644 Subtrees/websocket/src/rng/blank_rng.cpp delete mode 100644 Subtrees/websocket/src/rng/blank_rng.hpp delete mode 100644 Subtrees/websocket/src/rng/boost_rng.cpp delete mode 100644 Subtrees/websocket/src/rng/boost_rng.hpp delete mode 100644 Subtrees/websocket/src/roles/client.hpp delete mode 100644 Subtrees/websocket/src/roles/server.hpp delete mode 100755 Subtrees/websocket/src/sha1/Makefile delete mode 100755 Subtrees/websocket/src/sha1/Makefile.nt delete mode 100755 Subtrees/websocket/src/sha1/license.txt delete mode 100755 Subtrees/websocket/src/sha1/sha.cpp delete mode 100755 Subtrees/websocket/src/sha1/sha1.cpp delete mode 100755 Subtrees/websocket/src/sha1/sha1.h delete mode 100755 Subtrees/websocket/src/sha1/shacmp.cpp delete mode 100755 Subtrees/websocket/src/sha1/shatest.cpp delete mode 100644 Subtrees/websocket/src/shared_const_buffer.hpp delete mode 100644 Subtrees/websocket/src/sockets/autotls.hpp delete mode 100644 Subtrees/websocket/src/sockets/plain.hpp delete mode 100644 Subtrees/websocket/src/sockets/socket_base.hpp delete mode 100644 Subtrees/websocket/src/sockets/tls.hpp delete mode 100644 Subtrees/websocket/src/ssl/client.pem delete mode 100644 Subtrees/websocket/src/ssl/dh512.pem delete mode 100644 Subtrees/websocket/src/ssl/server.cer delete mode 100644 Subtrees/websocket/src/ssl/server.pem delete mode 100644 Subtrees/websocket/src/uri.cpp delete mode 100644 Subtrees/websocket/src/uri.hpp delete mode 100644 Subtrees/websocket/src/utf8_validator/utf8_validator.hpp delete mode 100644 Subtrees/websocket/src/websocket_frame.hpp delete mode 100644 Subtrees/websocket/src/websocketpp.hpp delete mode 100644 Subtrees/websocket/test/basic/Makefile delete mode 100644 Subtrees/websocket/test/basic/hybi_util.cpp delete mode 100644 Subtrees/websocket/test/basic/logging.cpp delete mode 100644 Subtrees/websocket/test/basic/parsing.cpp delete mode 100644 Subtrees/websocket/test/basic/uri_perf.cpp delete mode 100644 Subtrees/websocket/todo.txt delete mode 100644 Subtrees/websocket/websocketpp.bbprojectd/Scratchpad.txt delete mode 100644 Subtrees/websocket/websocketpp.bbprojectd/Unix Worksheet.worksheet delete mode 100644 Subtrees/websocket/websocketpp.bbprojectd/project.bbprojectdata delete mode 100644 Subtrees/websocket/websocketpp.bbprojectd/zaphoyd.bbprojectsettings delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/project.pbxproj delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/WebSocket++ Dynamic Library.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/WebSocket++ Static Library.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/broadcast_server.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/chat_client.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/concurrent_server.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/echo_client.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/echo_server.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/echo_server_tls.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/fuzzing_client.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/fuzzing_server.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/policy_test.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/stress_client.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/wsperf.xcscheme delete mode 100644 Subtrees/websocket/websocketpp.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Subtrees/websocket/windows/vcpp2008/.gitignore delete mode 100644 Subtrees/websocket/windows/vcpp2008/common.vsprops delete mode 100644 Subtrees/websocket/windows/vcpp2008/examples/chatclient.vcproj delete mode 100644 Subtrees/websocket/windows/vcpp2008/examples/chatserver.vcproj delete mode 100644 Subtrees/websocket/windows/vcpp2008/examples/concurrent_server.vcproj delete mode 100644 Subtrees/websocket/windows/vcpp2008/examples/echoserver.vcproj delete mode 100644 Subtrees/websocket/windows/vcpp2008/stdint.h delete mode 100644 Subtrees/websocket/windows/vcpp2008/websocketpp.sln delete mode 100644 Subtrees/websocket/windows/vcpp2008/websocketpp.vcproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/.gitignore delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/chatclient.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/chatclient.vcxproj.filters delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/chatserver.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/chatserver.vcxproj.filters delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/echoclient.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/echoclient.vcxproj.filters delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/echoserver.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/echoserver.vcxproj.filters delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/wsperf/wsperf.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/examples/wsperf/wsperf.vcxproj.filters delete mode 100644 Subtrees/websocket/windows/vcpp2010/readme.txt delete mode 100644 Subtrees/websocket/windows/vcpp2010/websocketpp.sln delete mode 100644 Subtrees/websocket/windows/vcpp2010/websocketpp.vcxproj delete mode 100644 Subtrees/websocket/windows/vcpp2010/websocketpp.vcxproj.filters rename Subtrees/leveldb/TODO => TODO (100%) delete mode 100644 TODO.txt rename Subtrees/leveldb/WINDOWS.md => WINDOWS.md (100%) delete mode 100644 artwork/LogoForDocumentation.png delete mode 100755 bin/browser.js delete mode 100644 bin/debug_local_sign.js delete mode 100755 bin/email_hash.js delete mode 100755 bin/flash_policy.js delete mode 100755 bin/hexify.js delete mode 100755 bin/jsonrpc_request.js delete mode 100755 bin/jsonrpc_server.js delete mode 100755 bin/network-build delete mode 100755 bin/network-init delete mode 100755 bin/network-restart delete mode 100755 bin/network-start delete mode 100755 bin/network-stop delete mode 100755 bin/network-update delete mode 100755 bin/nx delete mode 100755 bin/rlint.js delete mode 100644 bin/update_binformat.js rename Subtrees/leveldb/build_detect_platform => build_detect_platform (97%) rename {Subtrees/leveldb/db => db}/builder.cc (100%) rename {Subtrees/leveldb/db => db}/builder.h (100%) rename {Subtrees/leveldb/db => db}/c.cc (100%) rename {Subtrees/leveldb/db => db}/c_test.c (100%) rename {Subtrees/leveldb/db => db}/corruption_test.cc (100%) rename {Subtrees/leveldb/db => db}/db_bench.cc (100%) rename {Subtrees/leveldb/db => db}/db_impl.cc (99%) rename {Subtrees/leveldb/db => db}/db_impl.h (100%) rename {Subtrees/leveldb/db => db}/db_iter.cc (100%) rename {Subtrees/leveldb/db => db}/db_iter.h (100%) rename {Subtrees/leveldb/db => db}/db_test.cc (100%) rename {Subtrees/leveldb/db => db}/dbformat.cc (100%) rename {Subtrees/leveldb/db => db}/dbformat.h (100%) rename {Subtrees/leveldb/db => db}/dbformat_test.cc (100%) rename {Subtrees/leveldb/db => db}/filename.cc (100%) rename {Subtrees/leveldb/db => db}/filename.h (100%) rename {Subtrees/leveldb/db => db}/filename_test.cc (100%) rename {Subtrees/leveldb/db => db}/leveldb_main.cc (100%) rename {Subtrees/leveldb/db => db}/log_format.h (100%) rename {Subtrees/leveldb/db => db}/log_reader.cc (100%) rename {Subtrees/leveldb/db => db}/log_reader.h (100%) rename {Subtrees/leveldb/db => db}/log_test.cc (100%) rename {Subtrees/leveldb/db => db}/log_writer.cc (100%) rename {Subtrees/leveldb/db => db}/log_writer.h (100%) rename {Subtrees/leveldb/db => db}/memtable.cc (100%) rename {Subtrees/leveldb/db => db}/memtable.h (100%) rename {Subtrees/leveldb/db => db}/repair.cc (100%) rename {Subtrees/leveldb/db => db}/skiplist.h (100%) rename {Subtrees/leveldb/db => db}/skiplist_test.cc (100%) rename {Subtrees/leveldb/db => db}/snapshot.h (100%) rename {Subtrees/leveldb/db => db}/table_cache.cc (100%) rename {Subtrees/leveldb/db => db}/table_cache.h (100%) rename {Subtrees/leveldb/db => db}/version_edit.cc (100%) rename {Subtrees/leveldb/db => db}/version_edit.h (100%) rename {Subtrees/leveldb/db => db}/version_edit_test.cc (100%) rename {Subtrees/leveldb/db => db}/version_set.cc (100%) rename {Subtrees/leveldb/db => db}/version_set.h (100%) rename {Subtrees/leveldb/db => db}/version_set_test.cc (100%) rename {Subtrees/leveldb/db => db}/write_batch.cc (100%) rename {Subtrees/leveldb/db => db}/write_batch_internal.h (100%) rename {Subtrees/leveldb/db => db}/write_batch_test.cc (100%) delete mode 100644 deploy/rippled.nsi delete mode 100644 deploy/start rippled.bat delete mode 100644 deploy/validators.txt rename {Subtrees/leveldb/doc => doc}/bench/db_bench_sqlite3.cc (100%) rename {Subtrees/leveldb/doc => doc}/bench/db_bench_tree_db.cc (100%) rename {Subtrees/leveldb/doc => doc}/benchmark.html (100%) rename {Subtrees/leveldb/doc => doc}/doc.css (100%) rename {Subtrees/leveldb/doc => doc}/impl.html (100%) rename {Subtrees/leveldb/doc => doc}/index.html (100%) rename {Subtrees/leveldb/doc => doc}/log_format.txt (100%) rename {Subtrees/leveldb/doc => doc}/table_format.txt (100%) rename {Subtrees/leveldb/helpers => helpers}/memenv/memenv.cc (100%) rename {Subtrees/leveldb/helpers => helpers}/memenv/memenv.h (100%) rename {Subtrees/leveldb/helpers => helpers}/memenv/memenv_test.cc (100%) rename {Subtrees/leveldb/include => include}/leveldb/c.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/cache.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/comparator.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/db.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/env.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/filter_policy.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/iterator.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/options.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/slice.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/status.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/table.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/table_builder.h (100%) rename {Subtrees/leveldb/include => include}/leveldb/write_batch.h (100%) delete mode 100644 issues/issue178_test.cc delete mode 100644 modules/ripple_app/ripple_app.cpp delete mode 100644 modules/ripple_app/ripple_app.h delete mode 100644 modules/ripple_app/ripple_app_pt1.cpp delete mode 100644 modules/ripple_app/ripple_app_pt2.cpp delete mode 100644 modules/ripple_app/ripple_app_pt3.cpp delete mode 100644 modules/ripple_app/ripple_app_pt4.cpp delete mode 100644 modules/ripple_basics/containers/ripple_KeyCache.h delete mode 100644 modules/ripple_basics/containers/ripple_RangeSet.cpp delete mode 100644 modules/ripple_basics/containers/ripple_RangeSet.h delete mode 100644 modules/ripple_basics/containers/ripple_SecureAllocator.h delete mode 100644 modules/ripple_basics/containers/ripple_TaggedCache.cpp delete mode 100644 modules/ripple_basics/containers/ripple_TaggedCache.h delete mode 100644 modules/ripple_basics/ripple_basics.cpp delete mode 100644 modules/ripple_basics/ripple_basics.h delete mode 100644 modules/ripple_basics/types/ripple_BasicTypes.h delete mode 100644 modules/ripple_basics/types/ripple_HashMaps.h delete mode 100644 modules/ripple_basics/types/ripple_UInt256.cpp delete mode 100644 modules/ripple_basics/types/ripple_UInt256.h delete mode 100644 modules/ripple_basics/utility/ripple_ByteOrder.cpp delete mode 100644 modules/ripple_basics/utility/ripple_ByteOrder.h delete mode 100644 modules/ripple_basics/utility/ripple_CountedObject.cpp delete mode 100644 modules/ripple_basics/utility/ripple_CountedObject.h delete mode 100644 modules/ripple_basics/utility/ripple_DiffieHellmanUtil.cpp delete mode 100644 modules/ripple_basics/utility/ripple_DiffieHellmanUtil.h delete mode 100644 modules/ripple_basics/utility/ripple_HashUtilities.h delete mode 100644 modules/ripple_basics/utility/ripple_IntegerTypes.h delete mode 100644 modules/ripple_basics/utility/ripple_Log.cpp delete mode 100644 modules/ripple_basics/utility/ripple_Log.h delete mode 100644 modules/ripple_basics/utility/ripple_PlatformMacros.h delete mode 100644 modules/ripple_basics/utility/ripple_RandomNumbers.cpp delete mode 100644 modules/ripple_basics/utility/ripple_RandomNumbers.h delete mode 100644 modules/ripple_basics/utility/ripple_ScopedLock.h delete mode 100644 modules/ripple_basics/utility/ripple_StringUtilities.cpp delete mode 100644 modules/ripple_basics/utility/ripple_StringUtilities.h delete mode 100644 modules/ripple_basics/utility/ripple_Sustain.cpp delete mode 100644 modules/ripple_basics/utility/ripple_Sustain.h delete mode 100644 modules/ripple_basics/utility/ripple_ThreadName.cpp delete mode 100644 modules/ripple_basics/utility/ripple_ThreadName.h delete mode 100644 modules/ripple_basics/utility/ripple_Time.cpp delete mode 100644 modules/ripple_basics/utility/ripple_Time.h delete mode 100644 modules/ripple_basics/utility/ripple_UptimeTimer.cpp delete mode 100644 modules/ripple_basics/utility/ripple_UptimeTimer.h delete mode 100644 modules/ripple_client/ripple_client.cpp delete mode 100644 modules/ripple_client/ripple_client.h delete mode 100644 modules/ripple_data/crypto/ripple_Base58.cpp delete mode 100644 modules/ripple_data/crypto/ripple_Base58.h delete mode 100644 modules/ripple_data/crypto/ripple_Base58Data.cpp delete mode 100644 modules/ripple_data/crypto/ripple_Base58Data.h delete mode 100644 modules/ripple_data/crypto/ripple_CBigNum.cpp delete mode 100644 modules/ripple_data/crypto/ripple_CBigNum.h delete mode 100644 modules/ripple_data/crypto/ripple_CKey.cpp delete mode 100644 modules/ripple_data/crypto/ripple_CKey.h delete mode 100644 modules/ripple_data/crypto/ripple_CKeyDeterministic.cpp delete mode 100644 modules/ripple_data/crypto/ripple_CKeyECIES.cpp delete mode 100644 modules/ripple_data/crypto/ripple_RFC1751.cpp delete mode 100644 modules/ripple_data/crypto/ripple_RFC1751.h delete mode 100644 modules/ripple_data/protocol/ripple_FieldNames.cpp delete mode 100644 modules/ripple_data/protocol/ripple_FieldNames.h delete mode 100644 modules/ripple_data/protocol/ripple_HashPrefix.h delete mode 100644 modules/ripple_data/protocol/ripple_LedgerFormat.cpp delete mode 100644 modules/ripple_data/protocol/ripple_LedgerFormat.h delete mode 100644 modules/ripple_data/protocol/ripple_PackedMessage.cpp delete mode 100644 modules/ripple_data/protocol/ripple_PackedMessage.h delete mode 100644 modules/ripple_data/protocol/ripple_Protocol.h delete mode 100644 modules/ripple_data/protocol/ripple_RippleAddress.cpp delete mode 100644 modules/ripple_data/protocol/ripple_RippleAddress.h delete mode 100644 modules/ripple_data/protocol/ripple_RippleSystem.h delete mode 100644 modules/ripple_data/protocol/ripple_STAmount.cpp delete mode 100644 modules/ripple_data/protocol/ripple_STAmountRound.cpp delete mode 100644 modules/ripple_data/protocol/ripple_SerializeDeclarations.h delete mode 100644 modules/ripple_data/protocol/ripple_SerializedObject.cpp delete mode 100644 modules/ripple_data/protocol/ripple_SerializedObject.h delete mode 100644 modules/ripple_data/protocol/ripple_SerializedObjectTemplate.cpp delete mode 100644 modules/ripple_data/protocol/ripple_SerializedObjectTemplate.h delete mode 100644 modules/ripple_data/protocol/ripple_SerializedTypes.cpp delete mode 100644 modules/ripple_data/protocol/ripple_SerializedTypes.h delete mode 100644 modules/ripple_data/protocol/ripple_Serializer.cpp delete mode 100644 modules/ripple_data/protocol/ripple_Serializer.h delete mode 100644 modules/ripple_data/protocol/ripple_TER.cpp delete mode 100644 modules/ripple_data/protocol/ripple_TER.h delete mode 100644 modules/ripple_data/protocol/ripple_TxFlags.h delete mode 100644 modules/ripple_data/protocol/ripple_TxFormat.cpp delete mode 100644 modules/ripple_data/protocol/ripple_TxFormat.h delete mode 100644 modules/ripple_data/protocol/ripple_TxFormats.cpp delete mode 100644 modules/ripple_data/protocol/ripple_TxFormats.h delete mode 100644 modules/ripple_data/ripple_data.cpp delete mode 100644 modules/ripple_data/ripple_data.h delete mode 100644 modules/ripple_data/utility/ripple_JSONCache.cpp delete mode 100644 modules/ripple_data/utility/ripple_JSONCache.h delete mode 100644 modules/ripple_data/utility/ripple_UptimeTimerAdapter.h delete mode 100644 modules/ripple_json/json/LICENSE delete mode 100644 modules/ripple_json/json/json_autolink.h delete mode 100644 modules/ripple_json/json/json_batchallocator.h delete mode 100644 modules/ripple_json/json/json_config.h delete mode 100644 modules/ripple_json/json/json_features.h delete mode 100644 modules/ripple_json/json/json_forwards.h delete mode 100644 modules/ripple_json/json/json_internalarray.inl delete mode 100644 modules/ripple_json/json/json_internalmap.inl delete mode 100644 modules/ripple_json/json/json_reader.cpp delete mode 100644 modules/ripple_json/json/json_reader.h delete mode 100644 modules/ripple_json/json/json_value.cpp delete mode 100644 modules/ripple_json/json/json_value.h delete mode 100644 modules/ripple_json/json/json_valueiterator.inl delete mode 100644 modules/ripple_json/json/json_writer.cpp delete mode 100644 modules/ripple_json/json/json_writer.h delete mode 100644 modules/ripple_json/json/version delete mode 100644 modules/ripple_json/ripple_json.cpp delete mode 100644 modules/ripple_json/ripple_json.h delete mode 100644 modules/ripple_leveldb/ripple_leveldb.cpp delete mode 100644 modules/ripple_leveldb/ripple_leveldb.h delete mode 100644 modules/ripple_sqlite/ripple_sqlite.c delete mode 100644 modules/ripple_sqlite/ripple_sqlite.h delete mode 100644 modules/ripple_websocket/autosocket/ripple_AutoSocket.cpp delete mode 100644 modules/ripple_websocket/autosocket/ripple_AutoSocket.h delete mode 100644 modules/ripple_websocket/ripple_websocket.cpp delete mode 100644 modules/ripple_websocket/ripple_websocket.h delete mode 100644 package.json rename {Subtrees/leveldb/port => port}/README (100%) rename {Subtrees/leveldb/port => port}/atomic_pointer.h (100%) rename {Subtrees/leveldb/port => port}/port.h (100%) rename {Subtrees/leveldb/port => port}/port_example.h (100%) rename {Subtrees/leveldb/port => port}/port_posix.cc (100%) rename {Subtrees/leveldb/port => port}/port_posix.h (100%) rename {Subtrees/leveldb/port => port}/port_win.cc (100%) rename {Subtrees/leveldb/port => port}/port_win.h (100%) rename {Subtrees/leveldb/port => port}/thread_annotations.h (100%) rename {Subtrees/leveldb/port => port}/win/stdint.h (100%) delete mode 100644 ripple-example.txt delete mode 100644 rippled-example.cfg delete mode 100644 rippled.1 delete mode 100644 rippled.xcodeproj/project.pbxproj delete mode 100644 rippled.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 rippled.xcodeproj/project.xcworkspace/xcuserdata/jcar.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 rippled.xcodeproj/xcuserdata/jcar.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist delete mode 100644 rippled.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/rippled.xcscheme delete mode 100644 rippled.xcodeproj/xcuserdata/jcar.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 site_scons/site_tools/protoc.py delete mode 100644 src/cpp/protobuf/CHANGES.txt delete mode 100644 src/cpp/protobuf/CONTRIBUTORS.txt delete mode 100644 src/cpp/protobuf/COPYING.txt delete mode 100644 src/cpp/protobuf/INSTALL.txt delete mode 100644 src/cpp/protobuf/Makefile.am delete mode 100644 src/cpp/protobuf/README.txt delete mode 100755 src/cpp/protobuf/autogen.sh delete mode 100644 src/cpp/protobuf/benchmarks/ProtoBench.java delete mode 100644 src/cpp/protobuf/benchmarks/google_message1.dat delete mode 100644 src/cpp/protobuf/benchmarks/google_message2.dat delete mode 100644 src/cpp/protobuf/benchmarks/google_size.proto delete mode 100644 src/cpp/protobuf/benchmarks/google_speed.proto delete mode 100644 src/cpp/protobuf/benchmarks/readme.txt delete mode 100644 src/cpp/protobuf/configure.ac delete mode 100644 src/cpp/protobuf/editors/README.txt delete mode 100644 src/cpp/protobuf/editors/proto.vim delete mode 100644 src/cpp/protobuf/editors/protobuf-mode.el delete mode 100644 src/cpp/protobuf/examples/AddPerson.java delete mode 100644 src/cpp/protobuf/examples/ListPeople.java delete mode 100644 src/cpp/protobuf/examples/Makefile delete mode 100644 src/cpp/protobuf/examples/README.txt delete mode 100644 src/cpp/protobuf/examples/add_person.cc delete mode 100755 src/cpp/protobuf/examples/add_person.py delete mode 100644 src/cpp/protobuf/examples/addressbook.proto delete mode 100644 src/cpp/protobuf/examples/list_people.cc delete mode 100755 src/cpp/protobuf/examples/list_people.py delete mode 100755 src/cpp/protobuf/generate_descriptor_proto.sh delete mode 100644 src/cpp/protobuf/java/README.txt delete mode 100644 src/cpp/protobuf/java/pom.xml delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/ByteString.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Internal.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/LazyField.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Message.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Parser.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RpcController.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Service.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/Utf8.java delete mode 100644 src/cpp/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto delete mode 100644 src/cpp/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto delete mode 100644 src/cpp/protobuf/m4/ac_system_extensions.m4 delete mode 100644 src/cpp/protobuf/m4/acx_check_suncc.m4 delete mode 100644 src/cpp/protobuf/m4/acx_pthread.m4 delete mode 100644 src/cpp/protobuf/m4/stl_hash.m4 delete mode 100755 src/cpp/protobuf/more_tests/Makefile delete mode 100755 src/cpp/protobuf/post_process_dist.sh delete mode 100644 src/cpp/protobuf/protobuf-lite.pc.in delete mode 100644 src/cpp/protobuf/protobuf.pc.in delete mode 100644 src/cpp/protobuf/python/README.txt delete mode 100755 src/cpp/protobuf/python/ez_setup.py delete mode 100755 src/cpp/protobuf/python/google/__init__.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/__init__.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/descriptor.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/descriptor_database.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/descriptor_pool.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/__init__.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/api_implementation.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/containers.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/cpp_message.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/decoder.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/descriptor_database_test.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/descriptor_pool_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/descriptor_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/encoder.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/enum_type_wrapper.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/factory_test1.proto delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/factory_test2.proto delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/generator_test.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/message_cpp_test.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/message_factory_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/message_listener.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/message_test.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/more_extensions.proto delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/more_messages.proto delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/python_message.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/reflection_cpp_generated_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/reflection_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/service_reflection_test.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/test_util.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/text_format_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/type_checkers.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/unknown_fields_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/wire_format.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/internal/wire_format_test.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/message.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/message_factory.py delete mode 100644 src/cpp/protobuf/python/google/protobuf/pyext/python-proto2.cc delete mode 100644 src/cpp/protobuf/python/google/protobuf/pyext/python_descriptor.cc delete mode 100644 src/cpp/protobuf/python/google/protobuf/pyext/python_descriptor.h delete mode 100644 src/cpp/protobuf/python/google/protobuf/pyext/python_protobuf.cc delete mode 100644 src/cpp/protobuf/python/google/protobuf/pyext/python_protobuf.h delete mode 100755 src/cpp/protobuf/python/google/protobuf/reflection.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/service.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/service_reflection.py delete mode 100755 src/cpp/protobuf/python/google/protobuf/text_format.py delete mode 100755 src/cpp/protobuf/python/mox.py delete mode 100755 src/cpp/protobuf/python/setup.py delete mode 100755 src/cpp/protobuf/python/stubout.py delete mode 100644 src/cpp/protobuf/src/Makefile.am delete mode 100644 src/cpp/protobuf/src/google/protobuf/SEBS delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/code_generator.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/code_generator.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/command_line_interface.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/command_line_interface.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/importer.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/importer.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/importer_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_enum.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_enum.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_enum_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_extension.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_extension.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_file.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_file.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_generator.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_generator.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_helpers.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_helpers.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_message.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_message.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_message_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_message_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_service.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_service.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_string_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/java/java_string_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/main.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/mock_code_generator.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/mock_code_generator.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/package_info.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/parser.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/parser.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/parser_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/plugin.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/plugin.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/plugin.pb.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/plugin.pb.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/plugin.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/python/python_generator.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/python/python_generator.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/subprocess.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/subprocess.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/test_plugin.cc delete mode 100755 src/cpp/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/zip_writer.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/compiler/zip_writer.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor.pb.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor.pb.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor_database.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor_database.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor_database_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/descriptor_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/dynamic_message.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/dynamic_message.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/dynamic_message_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/extension_set.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/extension_set.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/extension_set_heavy.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/extension_set_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_enum_reflection.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_message_reflection.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_message_reflection.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_message_util.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/generated_message_util.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/coded_stream.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/coded_stream.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/coded_stream_inl.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/coded_stream_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/gzip_stream.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/gzip_stream.h delete mode 100755 src/cpp/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/package_info.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/printer.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/printer.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/printer_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/tokenizer.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/tokenizer.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/tokenizer_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/lite_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/message.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/message.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/message_lite.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/message_lite.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/message_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/package_info.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/reflection_ops.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/reflection_ops.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/reflection_ops_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/repeated_field.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/repeated_field.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/repeated_field_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/service.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/service.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/common.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/common.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/common_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/hash.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/map-util.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/once.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/once.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/once_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/platform_macros.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/stl_util.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/stringprintf.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/stringprintf.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/structurally_valid.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/strutil.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/strutil.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/strutil_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/substitute.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/substitute.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/template_util.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/template_util_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/type_traits.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/test_util.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/test_util.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/test_util_lite.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/test_util_lite.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/testdata/golden_message delete mode 100644 src/cpp/protobuf/src/google/protobuf/testdata/golden_packed_fields_message delete mode 100644 src/cpp/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt delete mode 100644 src/cpp/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/file.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/file.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/googletest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/googletest.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/zcgunzip.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/testing/zcgzip.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/text_format.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/text_format.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/text_format_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_custom_options.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_empty.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_import.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_import_lite.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_import_public.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_import_public_lite.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_lite.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_mset.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_no_generic_services.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unittest_optimize_for.proto delete mode 100644 src/cpp/protobuf/src/google/protobuf/unknown_field_set.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/unknown_field_set.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/unknown_field_set_unittest.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format_lite.cc delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format_lite.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format_lite_inl.h delete mode 100644 src/cpp/protobuf/src/google/protobuf/wire_format_unittest.cc delete mode 100644 src/cpp/protobuf/src/solaris/libstdc++.la delete mode 100644 src/cpp/protobuf/vsprojects/config.h delete mode 100755 src/cpp/protobuf/vsprojects/convert2008to2005.sh delete mode 100755 src/cpp/protobuf/vsprojects/extract_includes.bat delete mode 100644 src/cpp/protobuf/vsprojects/libprotobuf-lite.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/libprotobuf.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/libprotoc.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/lite-test.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/protobuf.sln delete mode 100644 src/cpp/protobuf/vsprojects/protoc.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/readme.txt delete mode 100755 src/cpp/protobuf/vsprojects/test_plugin.vcproj delete mode 100644 src/cpp/protobuf/vsprojects/tests.vcproj delete mode 100644 src/cpp/protobuf_core.cpp delete mode 100644 src/cpp/ripple/AccountSetTransactor.cpp delete mode 100644 src/cpp/ripple/AccountSetTransactor.h delete mode 100644 src/cpp/ripple/CallRPC.cpp delete mode 100644 src/cpp/ripple/CallRPC.h delete mode 100644 src/cpp/ripple/ChangeTransactor.cpp delete mode 100644 src/cpp/ripple/ChangeTransactor.h delete mode 100644 src/cpp/ripple/Contract.cpp delete mode 100644 src/cpp/ripple/Contract.h delete mode 100644 src/cpp/ripple/HTTPRequest.cpp delete mode 100644 src/cpp/ripple/HTTPRequest.h delete mode 100644 src/cpp/ripple/HttpsClient.cpp delete mode 100644 src/cpp/ripple/HttpsClient.h delete mode 100644 src/cpp/ripple/Interpreter.cpp delete mode 100644 src/cpp/ripple/Interpreter.h delete mode 100644 src/cpp/ripple/Ledger.cpp delete mode 100644 src/cpp/ripple/Ledger.h delete mode 100644 src/cpp/ripple/LedgerMaster.cpp delete mode 100644 src/cpp/ripple/LedgerMaster.h delete mode 100644 src/cpp/ripple/LedgerProposal.cpp delete mode 100644 src/cpp/ripple/LedgerProposal.h delete mode 100644 src/cpp/ripple/LedgerTiming.cpp delete mode 100644 src/cpp/ripple/LedgerTiming.h delete mode 100644 src/cpp/ripple/NetworkOPs.cpp delete mode 100644 src/cpp/ripple/NetworkOPs.h delete mode 100644 src/cpp/ripple/OfferCancelTransactor.cpp delete mode 100644 src/cpp/ripple/OfferCancelTransactor.h delete mode 100644 src/cpp/ripple/OfferCreateTransactor.cpp delete mode 100644 src/cpp/ripple/OfferCreateTransactor.h delete mode 100644 src/cpp/ripple/Operation.cpp delete mode 100644 src/cpp/ripple/Operation.h delete mode 100644 src/cpp/ripple/OrderBookDB.cpp delete mode 100644 src/cpp/ripple/OrderBookDB.h delete mode 100644 src/cpp/ripple/ParameterTable.cpp delete mode 100644 src/cpp/ripple/ParameterTable.h delete mode 100644 src/cpp/ripple/ParseSection.cpp delete mode 100644 src/cpp/ripple/ParseSection.h delete mode 100644 src/cpp/ripple/PaymentTransactor.cpp delete mode 100644 src/cpp/ripple/PaymentTransactor.h delete mode 100644 src/cpp/ripple/Peer.h delete mode 100644 src/cpp/ripple/PeerDoor.cpp delete mode 100644 src/cpp/ripple/PeerDoor.h delete mode 100644 src/cpp/ripple/RPC.h delete mode 100644 src/cpp/ripple/RPCDoor.cpp delete mode 100644 src/cpp/ripple/RPCDoor.h delete mode 100644 src/cpp/ripple/RPCErr.cpp delete mode 100644 src/cpp/ripple/RPCErr.h delete mode 100644 src/cpp/ripple/RPCHandler.cpp delete mode 100644 src/cpp/ripple/RPCHandler.h delete mode 100644 src/cpp/ripple/RPCServer.cpp delete mode 100644 src/cpp/ripple/RPCServer.h delete mode 100644 src/cpp/ripple/RPCSub.cpp delete mode 100644 src/cpp/ripple/RPCSub.h delete mode 100644 src/cpp/ripple/RegularKeySetTransactor.cpp delete mode 100644 src/cpp/ripple/RegularKeySetTransactor.h delete mode 100644 src/cpp/ripple/SNTPClient.cpp delete mode 100644 src/cpp/ripple/SNTPClient.h delete mode 100644 src/cpp/ripple/ScriptData.cpp delete mode 100644 src/cpp/ripple/ScriptData.h delete mode 100644 src/cpp/ripple/SerializedValidation.cpp delete mode 100644 src/cpp/ripple/SerializedValidation.h delete mode 100644 src/cpp/ripple/Transaction.cpp delete mode 100644 src/cpp/ripple/Transaction.h delete mode 100644 src/cpp/ripple/TransactionCheck.cpp delete mode 100644 src/cpp/ripple/TransactionEngine.cpp delete mode 100644 src/cpp/ripple/TransactionEngine.h delete mode 100644 src/cpp/ripple/TransactionMaster.cpp delete mode 100644 src/cpp/ripple/TransactionMaster.h delete mode 100644 src/cpp/ripple/TransactionMeta.cpp delete mode 100644 src/cpp/ripple/TransactionMeta.h delete mode 100644 src/cpp/ripple/TransactionQueue.cpp delete mode 100644 src/cpp/ripple/TransactionQueue.h delete mode 100644 src/cpp/ripple/Transactor.cpp delete mode 100644 src/cpp/ripple/Transactor.h delete mode 100644 src/cpp/ripple/TrustSetTransactor.cpp delete mode 100644 src/cpp/ripple/TrustSetTransactor.h delete mode 100644 src/cpp/ripple/WSConnection.cpp delete mode 100644 src/cpp/ripple/WSConnection.h delete mode 100644 src/cpp/ripple/WSDoor.cpp delete mode 100644 src/cpp/ripple/WSDoor.h delete mode 100644 src/cpp/ripple/WSHandler.cpp delete mode 100644 src/cpp/ripple/WSHandler.h delete mode 100644 src/cpp/ripple/WalletAddTransactor.cpp delete mode 100644 src/cpp/ripple/WalletAddTransactor.h delete mode 100644 src/cpp/ripple/main.cpp delete mode 100644 src/cpp/ripple/ripple.proto delete mode 100644 src/cpp/ripple/ripple_AcceptedLedger.cpp delete mode 100644 src/cpp/ripple/ripple_AcceptedLedger.h delete mode 100644 src/cpp/ripple/ripple_AcceptedLedgerTx.cpp delete mode 100644 src/cpp/ripple/ripple_AcceptedLedgerTx.h delete mode 100644 src/cpp/ripple/ripple_AccountItem.cpp delete mode 100644 src/cpp/ripple/ripple_AccountItem.h delete mode 100644 src/cpp/ripple/ripple_AccountItems.cpp delete mode 100644 src/cpp/ripple/ripple_AccountItems.h delete mode 100644 src/cpp/ripple/ripple_AccountState.cpp delete mode 100644 src/cpp/ripple/ripple_AccountState.h delete mode 100644 src/cpp/ripple/ripple_Application.cpp delete mode 100644 src/cpp/ripple/ripple_CanonicalTXSet.cpp delete mode 100644 src/cpp/ripple/ripple_CanonicalTXSet.h delete mode 100644 src/cpp/ripple/ripple_Config.cpp delete mode 100644 src/cpp/ripple/ripple_Config.h delete mode 100644 src/cpp/ripple/ripple_DBInit.cpp delete mode 100644 src/cpp/ripple/ripple_Database.cpp delete mode 100644 src/cpp/ripple/ripple_Database.h delete mode 100644 src/cpp/ripple/ripple_DatabaseCon.cpp delete mode 100644 src/cpp/ripple/ripple_DatabaseCon.h delete mode 100644 src/cpp/ripple/ripple_DisputedTx.cpp delete mode 100644 src/cpp/ripple/ripple_DisputedTx.h delete mode 100644 src/cpp/ripple/ripple_Features.cpp delete mode 100644 src/cpp/ripple/ripple_FeeVote.cpp delete mode 100644 src/cpp/ripple/ripple_HashRouter.cpp delete mode 100644 src/cpp/ripple/ripple_HashedObject.cpp delete mode 100644 src/cpp/ripple/ripple_HashedObject.h delete mode 100644 src/cpp/ripple/ripple_HashedObjectStore.cpp delete mode 100644 src/cpp/ripple/ripple_HashedObjectStore.h delete mode 100644 src/cpp/ripple/ripple_IApplication.h delete mode 100644 src/cpp/ripple/ripple_IFeatures.h delete mode 100644 src/cpp/ripple/ripple_IFeeVote.h delete mode 100644 src/cpp/ripple/ripple_IHashRouter.h delete mode 100644 src/cpp/ripple/ripple_ILoadFeeTrack.h delete mode 100644 src/cpp/ripple/ripple_IPeers.h delete mode 100644 src/cpp/ripple/ripple_IProofOfWorkFactory.h delete mode 100644 src/cpp/ripple/ripple_IUniqueNodeList.h delete mode 100644 src/cpp/ripple/ripple_IValidations.h delete mode 100644 src/cpp/ripple/ripple_InboundLedger.cpp delete mode 100644 src/cpp/ripple/ripple_InboundLedger.h delete mode 100644 src/cpp/ripple/ripple_InboundLedgers.cpp delete mode 100644 src/cpp/ripple/ripple_InboundLedgers.h delete mode 100644 src/cpp/ripple/ripple_InfoSub.cpp delete mode 100644 src/cpp/ripple/ripple_InfoSub.h delete mode 100644 src/cpp/ripple/ripple_Job.cpp delete mode 100644 src/cpp/ripple/ripple_Job.h delete mode 100644 src/cpp/ripple/ripple_JobQueue.cpp delete mode 100644 src/cpp/ripple/ripple_JobQueue.h delete mode 100644 src/cpp/ripple/ripple_LedgerConsensus.cpp delete mode 100644 src/cpp/ripple/ripple_LedgerConsensus.h delete mode 100644 src/cpp/ripple/ripple_LedgerEntrySet.cpp delete mode 100644 src/cpp/ripple/ripple_LedgerEntrySet.h delete mode 100644 src/cpp/ripple/ripple_LedgerHistory.cpp delete mode 100644 src/cpp/ripple/ripple_LedgerHistory.h delete mode 100644 src/cpp/ripple/ripple_LoadEvent.cpp delete mode 100644 src/cpp/ripple/ripple_LoadEvent.h delete mode 100644 src/cpp/ripple/ripple_LoadFeeTrack.cpp delete mode 100644 src/cpp/ripple/ripple_LoadManager.cpp delete mode 100644 src/cpp/ripple/ripple_LoadManager.h delete mode 100644 src/cpp/ripple/ripple_LoadMonitor.cpp delete mode 100644 src/cpp/ripple/ripple_LoadMonitor.h delete mode 100644 src/cpp/ripple/ripple_LocalCredentials.cpp delete mode 100644 src/cpp/ripple/ripple_LocalCredentials.h delete mode 100644 src/cpp/ripple/ripple_LogWebsockets.cpp delete mode 100644 src/cpp/ripple/ripple_NicknameState.cpp delete mode 100644 src/cpp/ripple/ripple_NicknameState.h delete mode 100644 src/cpp/ripple/ripple_Offer.cpp delete mode 100644 src/cpp/ripple/ripple_Offer.h delete mode 100644 src/cpp/ripple/ripple_OrderBook.cpp delete mode 100644 src/cpp/ripple/ripple_OrderBook.h delete mode 100644 src/cpp/ripple/ripple_PathRequest.cpp delete mode 100644 src/cpp/ripple/ripple_PathRequest.h delete mode 100644 src/cpp/ripple/ripple_PathState.cpp delete mode 100644 src/cpp/ripple/ripple_PathState.h delete mode 100644 src/cpp/ripple/ripple_Pathfinder.cpp delete mode 100644 src/cpp/ripple/ripple_Pathfinder.h delete mode 100644 src/cpp/ripple/ripple_Peer.cpp delete mode 100644 src/cpp/ripple/ripple_Peer.h delete mode 100644 src/cpp/ripple/ripple_PeerSet.cpp delete mode 100644 src/cpp/ripple/ripple_PeerSet.h delete mode 100644 src/cpp/ripple/ripple_Peers.cpp delete mode 100644 src/cpp/ripple/ripple_ProofOfWork.cpp delete mode 100644 src/cpp/ripple/ripple_ProofOfWork.h delete mode 100644 src/cpp/ripple/ripple_ProofOfWorkFactory.cpp delete mode 100644 src/cpp/ripple/ripple_RippleCalc.cpp delete mode 100644 src/cpp/ripple/ripple_RippleCalc.h delete mode 100644 src/cpp/ripple/ripple_RippleLineCache.cpp delete mode 100644 src/cpp/ripple/ripple_RippleLineCache.h delete mode 100644 src/cpp/ripple/ripple_RippleState.cpp delete mode 100644 src/cpp/ripple/ripple_RippleState.h delete mode 100644 src/cpp/ripple/ripple_SHAMap.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMap.h delete mode 100644 src/cpp/ripple/ripple_SHAMapAddNode.h delete mode 100644 src/cpp/ripple/ripple_SHAMapDelta.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapItem.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapItem.h delete mode 100644 src/cpp/ripple/ripple_SHAMapMissingNode.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapMissingNode.h delete mode 100644 src/cpp/ripple/ripple_SHAMapNode.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapNode.h delete mode 100644 src/cpp/ripple/ripple_SHAMapSync.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapSyncFilter.h delete mode 100644 src/cpp/ripple/ripple_SHAMapSyncFilters.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapSyncFilters.h delete mode 100644 src/cpp/ripple/ripple_SHAMapTreeNode.cpp delete mode 100644 src/cpp/ripple/ripple_SHAMapTreeNode.h delete mode 100644 src/cpp/ripple/ripple_SerializedLedger.cpp delete mode 100644 src/cpp/ripple/ripple_SerializedLedger.h delete mode 100644 src/cpp/ripple/ripple_SerializedTransaction.cpp delete mode 100644 src/cpp/ripple/ripple_SerializedTransaction.h delete mode 100644 src/cpp/ripple/ripple_SqliteDatabase.cpp delete mode 100644 src/cpp/ripple/ripple_SqliteDatabase.h delete mode 100644 src/cpp/ripple/ripple_TransactionAcquire.cpp delete mode 100644 src/cpp/ripple/ripple_TransactionAcquire.h delete mode 100644 src/cpp/ripple/ripple_UniqueNodeList.cpp delete mode 100644 src/cpp/ripple/ripple_Validations.cpp delete mode 100644 src/cpp/ripple/ripple_Version.h delete mode 100644 src/cpp/ripple/rpc.cpp rename {Subtrees/leveldb/table => table}/block.cc (100%) rename {Subtrees/leveldb/table => table}/block.h (100%) rename {Subtrees/leveldb/table => table}/block_builder.cc (100%) rename {Subtrees/leveldb/table => table}/block_builder.h (100%) rename {Subtrees/leveldb/table => table}/filter_block.cc (100%) rename {Subtrees/leveldb/table => table}/filter_block.h (100%) rename {Subtrees/leveldb/table => table}/filter_block_test.cc (100%) rename {Subtrees/leveldb/table => table}/format.cc (100%) rename {Subtrees/leveldb/table => table}/format.h (100%) rename {Subtrees/leveldb/table => table}/iterator.cc (100%) rename {Subtrees/leveldb/table => table}/iterator_wrapper.h (100%) rename {Subtrees/leveldb/table => table}/merger.cc (100%) rename {Subtrees/leveldb/table => table}/merger.h (100%) rename {Subtrees/leveldb/table => table}/table.cc (100%) rename {Subtrees/leveldb/table => table}/table_builder.cc (100%) rename {Subtrees/leveldb/table => table}/table_test.cc (100%) rename {Subtrees/leveldb/table => table}/two_level_iterator.cc (100%) rename {Subtrees/leveldb/table => table}/two_level_iterator.h (100%) delete mode 100644 test/account_set-test.js delete mode 100644 test/account_tx-test.js delete mode 100644 test/buster.js delete mode 100644 test/config-example.js delete mode 100644 test/jsonrpc-test.js delete mode 100644 test/monitor-test.js delete mode 100644 test/nodeutils.js delete mode 100644 test/offer-test.js delete mode 100644 test/path-test.js delete mode 100644 test/remote-test.js delete mode 100644 test/send-test.js delete mode 100644 test/server-test.js delete mode 100644 test/server.js delete mode 100644 test/testconfig.js delete mode 100644 test/testutils.js delete mode 100644 test/websocket-test.js rename {Subtrees/leveldb/util => util}/arena.cc (100%) rename {Subtrees/leveldb/util => util}/arena.h (100%) rename {Subtrees/leveldb/util => util}/arena_test.cc (100%) rename {Subtrees/leveldb/util => util}/bloom.cc (100%) rename {Subtrees/leveldb/util => util}/bloom_test.cc (100%) rename {Subtrees/leveldb/util => util}/cache.cc (100%) rename {Subtrees/leveldb/util => util}/cache_test.cc (100%) rename {Subtrees/leveldb/util => util}/coding.cc (100%) rename {Subtrees/leveldb/util => util}/coding.h (100%) rename {Subtrees/leveldb/util => util}/coding_test.cc (100%) rename {Subtrees/leveldb/util => util}/comparator.cc (100%) rename {Subtrees/leveldb/util => util}/crc32c.cc (100%) rename {Subtrees/leveldb/util => util}/crc32c.h (100%) rename {Subtrees/leveldb/util => util}/crc32c_test.cc (100%) rename {Subtrees/leveldb/util => util}/env.cc (100%) rename {Subtrees/leveldb/util => util}/env_posix.cc (100%) rename {Subtrees/leveldb/util => util}/env_test.cc (100%) rename {Subtrees/leveldb/util => util}/env_win.cc (100%) rename {Subtrees/leveldb/util => util}/filter_policy.cc (100%) rename {Subtrees/leveldb/util => util}/hash.cc (100%) rename {Subtrees/leveldb/util => util}/hash.h (100%) rename {Subtrees/leveldb/util => util}/histogram.cc (100%) rename {Subtrees/leveldb/util => util}/histogram.h (100%) rename {Subtrees/leveldb/util => util}/logging.cc (100%) rename {Subtrees/leveldb/util => util}/logging.h (100%) rename {Subtrees/leveldb/util => util}/mutexlock.h (100%) rename {Subtrees/leveldb/util => util}/options.cc (100%) rename {Subtrees/leveldb/util => util}/posix_logger.h (100%) rename {Subtrees/leveldb/util => util}/random.h (100%) rename {Subtrees/leveldb/util => util}/status.cc (100%) rename {Subtrees/leveldb/util => util}/testharness.cc (100%) rename {Subtrees/leveldb/util => util}/testharness.h (100%) rename {Subtrees/leveldb/util => util}/testutil.cc (100%) rename {Subtrees/leveldb/util => util}/testutil.h (100%) delete mode 100644 validators-example.txt delete mode 100644 web_modules/domain.js delete mode 100644 web_modules/ws.js diff --git a/.dir-locals.el b/.dir-locals.el deleted file mode 100644 index 4c10e984fa..0000000000 --- a/.dir-locals.el +++ /dev/null @@ -1,10 +0,0 @@ -;; Emacs - Code style and formatting settings - -;; C++ -((c++-mode - (indent-tabs-mode . t) - (tab-width . 4) - (c-basic-offset . 4))) - -;; Headers should open in C++ mode -((c-mode . ((mode . c++)))) diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index e60f766261..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,13 +0,0 @@ -# Set default behaviour, in case users don't have core.autocrlf set. -* text=auto - -# These annoying files -rippled.1 binary -LICENSE binary - -# Visual Studio -*.sln text eol=crlf -*.vcproj text eol=crlf -*.vcxproj text eol=crlf -*.props text eol=crlf -*.filters text eol=crlf diff --git a/.gitignore b/.gitignore index 3341cf2853..55ba072e0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,43 +1,12 @@ -# .gitignore - -# Ignore vim swap files. -*.swp - -# Ignore SCons support files. -.sconsign.dblite - -# Ignore python compiled files. -*.pyc - -# Ignore Macintosh Desktop Services Store files. -.DS_Store - -# Ignore backup/temps -*~ - -# Ignore object files. +build_config.mk +*.a *.o -build -tags -bin/rippled -Debug/*.* -Release/*.* - -# Ignore locally installed node_modules -node_modules - -# Ignore tmp directory. -tmp - -# Ignore database directory. -db -db/*.db -db/*.db-* - -# Ignore customized configs -rippled.cfg -validators.txt -test/config.js - -# Doxygen generated documentation output -HtmlDocumentation +*.dylib* +*.so +*.so.* +*_test +db_bench +Release +Debug +Benchmark +vs2010.* diff --git a/Subtrees/leveldb/AUTHORS b/AUTHORS similarity index 100% rename from Subtrees/leveldb/AUTHORS rename to AUTHORS diff --git a/BeastConfig.h b/BeastConfig.h deleted file mode 100644 index 29fd836456..0000000000 --- a/BeastConfig.h +++ /dev/null @@ -1,23 +0,0 @@ - -#ifndef BEAST_BEASTCONFIG_HEADER -#define BEAST_BEASTCONFIG_HEADER - -// beast_core flags: - -#ifndef BEAST_FORCE_DEBUG - //#define BEAST_FORCE_DEBUG -#endif - -#ifndef BEAST_LOG_ASSERTIONS - //#define BEAST_LOG_ASSERTIONS 1 -#endif - -#ifndef BEAST_CHECK_MEMORY_LEAKS - //#define BEAST_CHECK_MEMORY_LEAKS -#endif - -#ifndef BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - //#define BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES -#endif - -#endif diff --git a/Builds/VisualStudio2010/RippleD.props b/Builds/VisualStudio2010/RippleD.props deleted file mode 100644 index 8938f2a334..0000000000 --- a/Builds/VisualStudio2010/RippleD.props +++ /dev/null @@ -1,30 +0,0 @@ - - - - - ..\.. - $(RepoDir)\src\cpp\ripple - - - $(RepoDir)\build\VisualStudio2010\$(Configuration).$(Platform)\ - - - $(RepoDir)\build\obj\VisualStudio2010\$(Configuration).$(Platform)\ - - - - $(RepoDir);$(RepoDir)\src\cpp\leveldb;$(RepoDir)\src\cpp\leveldb\include;$(RepoDir)\src\cpp\protobuf\src;$(RepoDir)\src\cpp\protobuf\vsprojects;$(RepoDir)\build\proto;$(RepoDir)\Subtrees\beast;%(AdditionalIncludeDirectories) - USE_LEVELDB;BOOST_TEST_ALTERNATIVE_INIT_API;BOOST_TEST_NO_MAIN;_WIN32_WINNT=0x0600;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions) - Level3 - true - - - - - $(RepoDir) - - - $(SrcDir) - - - \ No newline at end of file diff --git a/Builds/VisualStudio2010/RippleD.sln b/Builds/VisualStudio2010/RippleD.sln deleted file mode 100644 index 057db6130b..0000000000 --- a/Builds/VisualStudio2010/RippleD.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RippleD", "RippleD.vcxproj", "{EE95954F-3D34-4FB1-ADBD-FE8395233026}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EE95954F-3D34-4FB1-ADBD-FE8395233026}.Debug|Win32.ActiveCfg = Debug|Win32 - {EE95954F-3D34-4FB1-ADBD-FE8395233026}.Debug|Win32.Build.0 = Debug|Win32 - {EE95954F-3D34-4FB1-ADBD-FE8395233026}.Release|Win32.ActiveCfg = Release|Win32 - {EE95954F-3D34-4FB1-ADBD-FE8395233026}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Builds/VisualStudio2010/RippleD.vcxproj b/Builds/VisualStudio2010/RippleD.vcxproj deleted file mode 100644 index c2e54f9319..0000000000 --- a/Builds/VisualStudio2010/RippleD.vcxproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {EE95954F-3D34-4FB1-ADBD-FE8395233026} - Win32Proj - RippleD - - - - Application - true - NotSet - - - Application - false - true - NotSet - - - - - - - - - - - - - - true - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreadedDebug - false - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Builds/VisualStudio2010/RippleD.vcxproj.filters b/Builds/VisualStudio2010/RippleD.vcxproj.filters deleted file mode 100644 index 327a864b22..0000000000 --- a/Builds/VisualStudio2010/RippleD.vcxproj.filters +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - Subtrees - - - Subtrees - - - Subtrees - - - Subtrees - - - Subtrees - - - Subtrees - - - - - {63db902e-0e7a-42d1-b5f5-663e4b48786c} - - - {469e8a0a-64bf-4fa1-8b6f-81207db68577} - - - \ No newline at end of file diff --git a/Builds/VisualStudio2012/Ripple.sln b/Builds/VisualStudio2012/Ripple.sln deleted file mode 100644 index 5995866ca7..0000000000 --- a/Builds/VisualStudio2012/Ripple.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RippleD", "RippleD.vcxproj", "{19465545-42EE-42FA-9CC8-F8975F8F1CC7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "beast", "..\..\Subtrees\beast\Builds\VisualStudio2012\beast.vcxproj", "{73C5A0F0-7629-4DE7-9194-BE7AC6C19535}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Debug|Win32.ActiveCfg = Debug|Win32 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Debug|Win32.Build.0 = Debug|Win32 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Debug|x64.ActiveCfg = Debug|x64 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Debug|x64.Build.0 = Debug|x64 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Release|Win32.ActiveCfg = Release|Win32 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Release|Win32.Build.0 = Release|Win32 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Release|x64.ActiveCfg = Release|x64 - {19465545-42EE-42FA-9CC8-F8975F8F1CC7}.Release|x64.Build.0 = Release|x64 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Debug|Win32.ActiveCfg = Debug|Win32 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Debug|Win32.Build.0 = Debug|Win32 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Debug|x64.ActiveCfg = Debug|Win32 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Release|Win32.ActiveCfg = Release|Win32 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Release|Win32.Build.0 = Release|Win32 - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535}.Release|x64.ActiveCfg = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Builds/VisualStudio2012/RippleD.props b/Builds/VisualStudio2012/RippleD.props deleted file mode 100644 index 04758bdfe3..0000000000 --- a/Builds/VisualStudio2012/RippleD.props +++ /dev/null @@ -1,34 +0,0 @@ - - - - - ..\.. - $(RepoDir)\src\cpp\ripple - - - $(RepoDir)\build\VisualStudio2012\$(Configuration).$(Platform)\ - $(RepoDir)\build\obj\VisualStudio2012\$(Configuration).$(Platform)\ - rippled - - - - BOOST_TEST_ALTERNATIVE_INIT_API;BOOST_TEST_NO_MAIN;_WIN32_WINNT=0x0600;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions) - true - Level3 - $(RepoDir);$(RepoDir)\src\cpp\protobuf\src;$(RepoDir)\src\cpp\protobuf\vsprojects;$(RepoDir)\build\proto;$(RepoDir)\Subtrees;$(RepoDir)\Subtrees\leveldb;$(RepoDir)\Subtrees\leveldb\include;$(RepoDir)\Subtrees\beast;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - Async - - - Shlwapi.lib;%(AdditionalDependencies) - - - - - $(RepoDir) - - - $(SrcDir) - - - \ No newline at end of file diff --git a/Builds/VisualStudio2012/RippleD.vcxproj b/Builds/VisualStudio2012/RippleD.vcxproj deleted file mode 100644 index 8bd7bbbe78..0000000000 --- a/Builds/VisualStudio2012/RippleD.vcxproj +++ /dev/null @@ -1,1927 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {19465545-42EE-42FA-9CC8-F8975F8F1CC7} - Win32Proj - newcoin - - - - Application - true - MultiByte - v110 - - - Application - true - MultiByte - v110 - - - Application - false - true - MultiByte - v110 - - - Application - false - true - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - NotUsing - Disabled - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ProgramDatabase - false - MultiThreadedDebug - - - Console - true - %(AdditionalLibraryDirectories) - ssleay32MTd.lib;libeay32MTd.lib;%(AdditionalDependencies) - - - - - - - - - - - - - NotUsing - Disabled - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ProgramDatabase - false - MultiThreadedDebug - - - Console - true - %(AdditionalLibraryDirectories) - ssleay32MTd.lib;libeay32MTd.lib;%(AdditionalDependencies) - - - - - - - - - - - - - NotUsing - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - %(AdditionalLibraryDirectories) - ssleay32MT.lib;libeay32MT.lib;%(AdditionalDependencies) - - - - - NotUsing - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - %(AdditionalLibraryDirectories) - ssleay32MT.lib;libeay32MT.lib;%(AdditionalDependencies) - - - - - - Level4 - Level4 - Level4 - Level4 - - - true - true - true - true - - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - - - - - true - true - true - true - - - true - true - true - true - - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - true - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Document - protoc --cpp_out=$(RepoDir)\build\proto -I=$(SrcDir) "$(SrcDir)\%(Filename)%(Extension)" - protoc --cpp_out=$(SrcDir) -I=$(SrcDir) "$(SrcDir)\%(Filename)%(Extension)" - $(RepoDir)\build\proto\%(Filename).pb.h;$(RepoDir)\build\proto\%(Filename).pb.cc - $(SrcDir)\%(Filename).pb.h;$(SrcDir)\%(Filename).pb.cc - protoc --cpp_out=$(RepoDir)\build\proto -I=$(SrcDir) "$(SrcDir)\%(Filename)%(Extension)" - protoc --cpp_out=$(SrcDir) -I=$(SrcDir) "$(SrcDir)\%(Filename)%(Extension)" - $(RepoDir)\build\proto\%(Filename).pb.h;$(RepoDir)\build\proto\%(Filename).pb.cc - $(SrcDir)\%(Filename).pb.h;$(SrcDir)\%(Filename).pb.cc - - - - - true - true - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Builds/VisualStudio2012/RippleD.vcxproj.filters b/Builds/VisualStudio2012/RippleD.vcxproj.filters deleted file mode 100644 index 132e986242..0000000000 --- a/Builds/VisualStudio2012/RippleD.vcxproj.filters +++ /dev/null @@ -1,1733 +0,0 @@ - - - - - {475c5b33-c9b5-415f-89df-fb9961f3b57c} - - - {290b7b39-a4e6-4b8b-b464-d1e458562fdd} - - - {83e0c1a9-5ac4-4c68-ba62-45e24bf60c85} - - - {1e155698-fbdf-4b1a-861f-396ca1690486} - - - {90f03f10-67b3-405b-9395-ca514b3d2554} - - - {08051cd0-8c55-4aea-a839-fab10847ae8e} - - - {2c99e10c-fd93-4859-ad41-b4878eb7e149} - - - {5aa322df-2bf4-4409-a39a-cb0069eb5e87} - - - {5249322a-6711-40e8-b1fb-12873aa39495} - - - {50c3843c-4a67-4cc2-a1d9-c45692849b48} - - - {f57e4d02-7a69-4861-9f4b-160f13695e54} - - - {27858e65-9580-4a67-b0c5-054e970516af} - - - {a152ed99-bd05-4c37-8ae7-82888b1bb469} - - - {84e43f43-816e-4ccd-80c2-38b322904894} - - - {96cbc9ff-0118-4844-bb4c-05aef58a60b5} - - - {9f33883e-d53d-469f-ab51-653ac3e8780b} - - - {670d727d-6c99-4893-b0bb-e620975e8b8d} - - - {e398b116-a7fa-4850-8b8e-6de95efdea4e} - - - {c30623e7-e0ab-4a8e-a213-aeaceb4327e2} - - - {0d38ac4f-f094-4b17-9f4c-ac4011ea3bca} - - - {8d0241d2-071c-4d6c-a15e-980cc51b26ce} - - - {095d33d8-dbf7-44d0-a675-6722b02bb3be} - - - {2f3572a9-2882-4656-ab93-82b7761c9e3d} - - - {ba524810-8446-4c50-ad59-d284747ba220} - - - {82b7f371-8bc6-474b-b10c-18c004467b46} - - - {786657f9-b1b3-483c-a8e6-863cc2e02eb8} - - - {97c96b68-70fd-4679-89fc-c1c8c87c265e} - - - {1a379c07-ccf1-4636-8018-2cfc0685edf0} - - - {86d0831e-74e5-443b-b5f9-d6b39d5b4c97} - - - {c7f863ce-204b-4a15-b236-24fe1e3430e5} - - - {3f351c55-360d-40bc-a136-4944ce572efd} - - - {1d36a65a-de7c-41f9-85dd-93b29d67606e} - - - {c441b367-d096-401f-a3f0-5ac24290d7b7} - - - {78b0aa30-f238-4e41-821f-ce84dde82ceb} - - - {6097a179-ddad-4c69-9a34-2e3fc2c9fa1d} - - - {bfd76b72-9979-469b-8fd1-834e0622728a} - - - {5b22fcf9-c9f0-4260-9a17-7b448e30bb57} - - - {babbb25a-e143-4140-bc6f-16b659d8098b} - - - {8b88138b-e5bd-492b-bd34-012b9f43e544} - - - {90a5527e-0de0-4d5f-a731-b6b196a013b5} - - - {857187f0-ff25-4ebe-af30-544b7b7f503a} - - - {90f3b8c4-01a1-41f1-969b-39ec650c00cd} - - - {9d37d3a1-e8ac-49c5-845b-702a191f28e0} - - - {9cd9dfb0-daa3-474e-b1c7-b048f5b85e71} - - - {6bbe236f-79ff-4e30-928c-bf5f302b3a21} - - - {82d79c26-4932-4a48-b134-09969f45d75a} - - - - - 0. Third Party Code\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_basics - - - 2. %28Unused%29\ripple_client - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_data - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_basics\types - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\utility - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored\transactions - - - 1. Modules\ripple_app\refactored\consensus - - - 1. Modules\ripple_app\refactored\consensus - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app\_unfactored - - - 1. Modules\ripple_app\_unfactored - - - 1. Modules\ripple_app\_unfactored - - - 1. Modules\ripple_basics\utility - - - 0. Third Party Code\beast - - - 0. Third Party Code\beast - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 1. Modules\ripple_websocket - - - 1. Modules\ripple_websocket\autosocket - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_app\_unfactored\db - - - 1. Modules\ripple_app\_unfactored\db - - - 1. Modules\ripple_app\_unfactored\db - - - 1. Modules\ripple_sqlite - - - 1. Modules\ripple_leveldb - - - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\protobuf - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\io - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 0. Third Party Code\protobuf\stubs - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_basics - - - 2. %28Unused%29\ripple_client - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\contracts - - - 1. Modules\ripple_app\_unfactored\transactions - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json\DEPRECATED - - - 1. Modules\ripple_json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_basics\containers - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_basics\types - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_data - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_data\crypto - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\_unfactored\ledger - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\network - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_app\_unfactored\rpc - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_basics\types - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_basics\types - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\utility - - - 1. Modules\ripple_data\utility - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored\shamap - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_data\utility - - - 1. Modules\ripple_app\refactored\transactions - - - 1. Modules\ripple_app\refactored\consensus - - - 1. Modules\ripple_app\refactored\consensus - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_app\refactored\pathing - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_data\protocol - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - 1. Modules\ripple_app\refactored\ledger - - - - 1. Modules\ripple_app - - - 1. Modules\ripple_app\_unfactored - - - 1. Modules\ripple_app\_unfactored - - - 1. Modules\ripple_basics\utility - - - 1. Modules\ripple_data\protocol - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\db - - - 0. Third Party Code\LevelDB\port\win - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\port - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\table - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 0. Third Party Code\LevelDB\util - - - 1. Modules\ripple_websocket - - - 1. Modules\ripple_websocket\autosocket - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_websocket\subtree - - - 1. Modules\ripple_app\_unfactored\db - - - 1. Modules\ripple_app\_unfactored\db - - - 1. Modules\ripple_sqlite - - - 1. Modules\ripple_leveldb - - - - - 0. Third Party Code\protobuf\protobuf - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - 1. Modules\ripple_json\json - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Builds/XCode/README.txt b/Builds/XCode/README.txt deleted file mode 100644 index 359c5c676a..0000000000 --- a/Builds/XCode/README.txt +++ /dev/null @@ -1 +0,0 @@ -Place XCode project file here! diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index a163ecedae..0000000000 --- a/CHANGELOG +++ /dev/null @@ -1,17 +0,0 @@ -Critical protocol changes -------------------------- - -Mon Apr 8 16:13:12 PDT 2013 -* The JSON field "inLedger" changing to "ledger_index" - -Previous -* The JSON field "metaData" changing to "meta". -* RPC ledger will no longer take "ledger", use "ledger_hash" or "ledger_index". -* "ledgerClose" events: -** "hash" DEPRECATED: use "ledger_hash" -** "seqNum" DEPRECATED: use "ledger_index" -** "closeTime" DEPRECATED: use "close" or "close_human" -* stream "rt_accounts" --> "accounts_proposed" -* stream "rt_transactions" --> "transactions_proposed" -* subscribe "username" --> "url_username" -* subscribe "password" --> "url_password" diff --git a/CheatSheet.md b/CheatSheet.md deleted file mode 100644 index 7ce9cc2d81..0000000000 --- a/CheatSheet.md +++ /dev/null @@ -1,18 +0,0 @@ -# Form - -- One class per header file. -- Place each data member on its own line. -- Place each ctor-initializer on its own line. -- Create typedefs for primitive types to describe them. -- Return descriptive local variables instead of constants. -- Use long descriptive names instead of abbreviations. -- Use "explicit" for single-argument ctors -- Avoid globals especially objects with static storage duration -- Order class declarations as types, public, protected, private, then data. -- Prefer 'private' over 'protected' - -# Function - -- Minimize external dependencies - * Pass options in the ctor instead of using theConfig - * Use as few other classes as possible diff --git a/CodingStyle.md b/CodingStyle.md deleted file mode 100644 index a060e14af3..0000000000 --- a/CodingStyle.md +++ /dev/null @@ -1,217 +0,0 @@ --------------------------------------------------------------------------------- - -# Coding Standards - -Coding standards used here are extreme strict and consistent. The style -evolved gradually over the years, incorporating generally acknowledged -best-practice C++ advice, experience, and personal preference. - -## Don't Repeat Yourself! - -The [Don't Repeat Yourself][1] principle summarises the essence of what it -means to write good code, in all languages, at all levels. - -## Formatting - -The goal of source code formatting should always be to make things as easy to -read as possible. White space is used to guide the eye so that details are not -overlooked. Blank lines are used to separate code into "paragraphs." - -* No tab characters please. -* Tab stops are set to 4 spaces. -* Braces are indented in the [Allman style][2]. -* Always place a space before and after all binary operators, - especially assignments (`operator=`). -* The `!` operator should always be followed by a space. -* The `~` operator should be preceded by a space, but not followed by one. -* The `++` and `--` operators should have no spaces between the operator and - the operand. -* A space never appears before a comma, and always appears after a comma. -* Always place a space before an opening parenthesis. One exception is if - the parentheses are empty. -* Don't put spaces after a parenthesis. A typical member function call might - look like this: `foobar (1, 2, 3);` -* In general, leave a blank line before an `if` statement. -* In general, leave a blank line after a closing brace `}`. -* Do not place code or comments on the same line as any opening or - closing brace. -* Do not write `if` statements all-on-one-line. The exception to this is when - you've got a sequence of similar `if` statements, and are aligning them all - vertically to highlight their similarities. -* In an `if-else` statement, if you surround one half of the statement with - braces, you also need to put braces around the other half, to match. -* When writing a pointer type, use this spacing: `SomeObject* myObject`. - Technically, a more correct spacing would be `SomeObject *myObject`, but - it makes more sense for the asterisk to be grouped with the type name, - since being a pointer is part of the type, not the variable name. The only - time that this can lead to any problems is when you're declaring multiple - pointers of the same type in the same statement - which leads on to the next - rule: -* When declaring multiple pointers, never do so in a single statement, e.g. - `SomeObject* p1, *p2;` - instead, always split them out onto separate lines - and write the type name again, to make it quite clear what's going on, and - avoid the danger of missing out any vital asterisks. -* The previous point also applies to references, so always put the `&` next to - the type rather than the variable, e.g. `void foo (Thing const& thing)`. And - don't put a space on both sides of the `*` or `&` - always put a space after - it, but never before it. -* The word `const` should be placed to the right of the thing that it modifies, - for consistency. For example `int const` refers to an int which is const. - `int const*` is a pointer to an int which is const. `int *const` is a const - pointer to an int. -* Always place a space in between the template angle brackets and the type - name. Template code is already hard enough to read! - -## Naming conventions - -* Member variables and method names are written with camel-case, and never - begin with a capital letter. -* Class names are also written in camel-case, but always begin with a capital - letter. -* For global variables... well, you shouldn't have any, so it doesn't matter. -* Class data members begin with `m_`, static data members begin with `s_`. - Global variables begin with `g_`. This is so the scope of the corresponding - declaration can be easily determined. -* Avoid underscores in your names, especially leading or trailing underscores. - In particular, leading underscores should be avoided, as these are often used - in standard library code, so to use them in your own code looks quite jarring. -* If you really have to write a macro for some reason, then make it all caps, - with underscores to separate the words. And obviously make sure that its name - is unlikely to clash with symbols used in other libraries or 3rd party code. - -## Types, const-correctness - -* If a method can (and should!) be const, make it const! -* If a method definitely doesn't throw an exception (be careful!), mark it as - `noexcept` -* When returning a temporary object, e.g. a String, the returned object should - be non-const, so that if the class has a C++11 move operator, it can be used. -* If a local variable can be const, then make it const! -* Remember that pointers can be const as well as primitives; For example, if - you have a `char*` whose contents are going to be altered, you may still be - able to make the pointer itself const, e.g. `char* const foobar = getFoobar();`. -* Do not declare all your local variables at the top of a function or method - (i.e. in the old-fashioned C-style). Declare them at the last possible moment, - and give them as small a scope as possible. -* Object parameters should be passed as `const&` wherever possible. Only - pass a parameter as a copy-by-value object if you really need to mutate - a local copy inside the method, and if making a local copy inside the method - would be difficult. -* Use portable `for()` loop variable scoping (i.e. do not have multiple for - loops in the same scope that each re-declare the same variable name, as - this fails on older compilers) -* When you're testing a pointer to see if it's null, never write - `if (myPointer)`. Always avoid that implicit cast-to-bool by writing it more - fully: `if (myPointer != nullptr)`. And likewise, never ever write - `if (! myPointer)`, instead always write `if (myPointer == nullptr)`. - It is more readable that way. -* Avoid C-style casts except when converting between primitive numeric types. - Some people would say "avoid C-style casts altogether", but `static_cast` is - a bit unreadable when you just want to cast an `int` to a `float`. But - whenever a pointer is involved, or a non-primitive object, always use - `static_cast`. And when you're reinterpreting data, always use - `reinterpret_cast`. -* Until C++ gets a universal 64-bit primitive type (part of the C++11 - standard), it's best to stick to the `int64` and `uint64` typedefs. - -## Object lifetime and ownership - -* Absolutely do NOT use `delete`, `deleteAndZero`, etc. There are very very few - situations where you can't use a `ScopedPointer` or some other automatic - lifetime management class. -* Do not use `new` unless there's no alternative. Whenever you type `new`, always - treat it as a failure to find a better solution. If a local variable can be - allocated on the stack rather than the heap, then always do so. -* Do not ever use `new` or `malloc` to allocate a C++ array. Always use a - `HeapBlock` instead. -* And just to make it doubly clear: Never use `malloc` or `calloc`. -* If a parent object needs to create and own some kind of child object, always - use composition as your first choice. If that's not possible (e.g. if the - child needs a pointer to the parent for its constructor), then use a - `ScopedPointer`. -* If possible, pass an object as a reference rather than a pointer. If possible, - make it a `const` reference. -* Obviously avoid static and global values. Sometimes there's no alternative, - but if there is an alternative, then use it, no matter how much effort it - involves. -* If allocating a local POD structure (e.g. an operating-system structure in - native code), and you need to initialise it with zeros, use the `= { 0 };` - syntax as your first choice for doing this. If for some reason that's not - appropriate, use the `zerostruct()` function, or in case that isn't suitable, - use `zeromem()`. Don't use `memset()`. - -## Classes - -* Declare a class's public section first, and put its constructors and - destructor first. Any protected items come next, and then private ones. -* Use the most restrictive access-specifier possible for each member. Prefer - `private` over `protected`, and `protected` over `public`. Don't expose - things unnecessarily. -* Preferred positioning for any inherited classes is to put them to the right - of the class name, vertically aligned, e.g.: - class Thing : public Foo, - private Bar - { - } -* Put a class's member variables (which should almost always be private, of course), - after all the public and protected method declarations. -* Any private methods can go towards the end of the class, after the member - variables. -* If your class does not have copy-by-value semantics, derive the class from - `Uncopyable`. -* If your class is likely to be leaked, then derive your class from - `LeakChecked<>`. -* Constructors that take a single parameter should be default be marked - `explicit`. Obviously there are cases where you do want implicit conversion, - but always think about it carefully before writing a non-explicit constructor. -* Do not use `NULL`, `null`, or 0 for a null-pointer. And especially never use - '0L', which is particulary burdensome. Use `nullptr` instead - this is the - C++2011 standard, so get used to it. There's a fallback definition for `nullptr` - in Beast, so it's always possible to use it even if your compiler isn't yet - C++2011 compliant. -* All the C++ 'guru' books and articles are full of excellent and detailed advice - on when it's best to use inheritance vs composition. If you're not already - familiar with the received wisdom in these matters, then do some reading! - -## Miscellaneous - -* `goto` statements should not be used at all, even if the alternative is - more verbose code. The only exception is when implementing an algorithm in - a function as a state machine. -* Don't use macros! OK, obviously there are many situations where they're the - right tool for the job, but treat them as a last resort. Certainly don't ever - use a macro just to hold a constant value or to perform any kind of function - that could have been done as a real inline function. And it goes without saying - that you should give them names which aren't going to clash with other code. - And `#undef` them after you've used them, if possible. -* When using the `++` or `--` operators, never use post-increment if - pre-increment could be used instead. Although it doesn't matter for - primitive types, it's good practice to pre-increment since this can be - much more efficient for more complex objects. In particular, if you're - writing a for loop, always use pre-increment, - e.g. `for (int = 0; i < 10; ++i)` -* Never put an "else" statement after a "return"! This is well-explained in the - LLVM coding standards...and a couple of other very good pieces of advice from - the LLVM standards are in there as well. -* When getting a possibly-null pointer and using it only if it's non-null, limit - the scope of the pointer as much as possible - e.g. Do NOT do this: - - Foo* f = getFoo (); - if (f != nullptr) - f->doSomething (); - // other code - f->doSomething (); // oops! f may be null! - - ..instead, prefer to write it like this, which reduces the scope of the - pointer, making it impossible to write code that accidentally uses a null - pointer: - - if (Foo* f = getFoo ()) - f->doSomethingElse (); - - // f is out-of-scope here, so impossible to use it if it's null - - (This also results in smaller, cleaner code) - -[1]: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself -[2]: http://en.wikipedia.org/wiki/Indent_style#Allman_style diff --git a/Doxyfile b/Doxyfile deleted file mode 100644 index a17311d83a..0000000000 --- a/Doxyfile +++ /dev/null @@ -1,1890 +0,0 @@ -# Doxyfile 1.8.3.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = \ - modules \ - src/cpp/ripple - - #modules/ripple_basics/containers/ripple_KeyCache.h - - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = src \ - src/cpp \ - src/cpp/ripple \ - modules - - - -#--------------------------------------------------------------------------- - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -SYMBOL_CACHE_SIZE = 2 - -# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be -# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given -# their name and scope. Since this can be an expensive process and often the -# same symbol appear multiple times in the code, doxygen keeps a cache of -# pre-resolved symbols. If the cache is too small doxygen will become slower. -# If the cache is too large, memory is wasted. The cache size is given by this -# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -LOOKUP_CACHE_SIZE = 2 - -#--------------------------------------------------------------------------- - -# VF: These options control the formatting of C++ doc comments - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all -# comments according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you -# can mix doxygen, HTML, and XML commands with Markdown formatting. -# Disable only in case of backward compatibilities issues. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented classes, -# or namespaces to their corresponding documentation. Such a link can be -# prevented in individual cases by by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if section-label ... \endif -# and \cond section-label ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = NO - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. Do not use -# file names with spaces, bibtex cannot handle them. - -CITE_BIB_FILES = - - - - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. - -PROJECT_NAME = "RippleD" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "OpenCoin Ripple Server Software" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = artwork/LogoForDocumentation.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. Note that you specify absolute paths here, but also -# relative paths, which will be relative from the directory where doxygen is -# started. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding -# "class=itcl::class" will allow you to use the command class in the -# itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, -# and language is one of the parsers supported by doxygen: IDL, Java, -# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, -# C++. For instance to make doxygen treat .inc files as Fortran files (default -# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note -# that for custom extensions you also need to set FILE_PATTERNS otherwise the -# files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES (the -# default) will make doxygen replace the get and set methods by a property in -# the documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields will be shown inline in the documentation -# of the scope in which they are defined (i.e. file, namespace, or group -# documentation), provided this scope is documented. If set to NO (the default), -# structs, classes, and unions are shown on a separate page (for HTML and Man -# pages) or section (for LaTeX and RTF). - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page (index.html). -# This can be useful if you have a project on for instance GitHub and want reuse -# the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C, C++ and Fortran comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = HtmlDocumentation - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If left blank doxygen will -# generate a default style sheet. Note that it is recommended to use -# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this -# tag will in the future become obsolete. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional -# user-defined cascading style sheet that is included after the standard -# style sheets created by doxygen. Using this option one can overrule -# certain style aspects. This is preferred over using HTML_STYLESHEET -# since it does not replace the standard style sheet and is therefor more -# robust against future updates. Doxygen will copy the style sheet file to -# the output directory. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. - -HTML_DYNAMIC_SECTIONS = YES - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of -# entries shown in the various tree structured indices initially; the user -# can expand and collapse entries dynamically later on. Doxygen will expand -# the tree to such a level that at most the specified number of entries are -# visible (unless a fully collapsed tree already exceeds this amount). -# So setting the number of entries 1 will produce a full collapsed tree by -# default. 0 is a special value representing an infinite number of entries -# and will result in a full expanded tree by default. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely -# identify the documentation publisher. This should be a reverse domain-name -# style string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you may also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and -# SVG. The default value is HTML-CSS, which is slower, but has the best -# compatibility. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to -# the MathJax Content Delivery Network so you can quickly see the result without -# installing MathJax. -# However, it is strongly recommended to install a local -# copy of MathJax from http://www.mathjax.org before deployment. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. - -MATHJAX_EXTENSIONS = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. -# There are two flavours of web server based search depending on the -# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for -# searching and an index file used by the script. When EXTERNAL_SEARCH is -# enabled the indexing and searching needs to be provided by external tools. -# See the manual for details. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain -# the search results. Doxygen ships with an example indexer (doxyindexer) and -# search engine (doxysearch.cgi) which are based on the open source search engine -# library Xapian. See the manual for configuration details. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will returned the search results when EXTERNAL_SEARCH is enabled. -# Doxygen ships with an example search engine (doxysearch) which is based on -# the open source search engine library Xapian. See the manual for configuration -# details. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id -# of to a relative location where the documentation can be found. -# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. - -LATEX_BIB_STYLE = plain - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. For each -# tag file the location of the external documentation should be added. The -# format of a tag file without this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths -# or URLs. Note that each tag file must have a unique name (where the name does -# NOT include the path). If a tag file is not located in the directory in which -# doxygen is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside -# the class node. If there are many fields or methods and many nodes the -# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS -# threshold limits the number of items for each type to make the size more -# managable. Set this to 0 for no limit. Note that the threshold may be -# exceeded by 50% before the limit is enforced. - -UML_LIMIT_NUM_FIELDS = 10 - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. - -INTERACTIVE_SVG = NO - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/LEVELDB.txt b/LEVELDB.txt deleted file mode 100644 index 9685fd2082..0000000000 --- a/LEVELDB.txt +++ /dev/null @@ -1,14 +0,0 @@ - -To use LevelDB, follow these steps: - -1) Add the following to your rippled.cfg file: -[node_db] -LevelDB - -2) If you have no databases, you can just start rippled. If you have -databases you don't care about, just remove them. Otherwise, start rippled -with '--import' to import your existing hashnode database into LevelDB. -After you import the hashnode database, either delete (or move) the -'hashnode.db', 'hashnode.db-shm' and 'hashnode.db-wal' files from your -database directory. Do not touch the LevelDB files in the 'hashnode' -directory. diff --git a/LICENSE b/LICENSE index 44b4f56b05a68cf7b5d41d5e7dc4118c72b9a111..8e80208cd72b3225c87d9111c4d7cab13af1c2ac 100644 GIT binary patch literal 1484 zcmbtS%WmT~6y5VHE@m|;1h>;=yP_r9CLoJ0NyX!(BGEAcOAI7BLH@pniZgLA1-h7x zO^Cebbx$6iUPu3UiuAR;qd))n_KobxQR$xDxmXgv#8Vij1@ZHl=64f~ZgS(Z>lTb@ z*ZC=q{^1gR7^oRKx=fDzKvTGkt((6*_@NnJ=@`a-%IL+%6NPd950}XL(D|cpn*@+i zGdg;5WA9^h9X*ZV*>^a^Qxoyy0CGNu7e72w8-~uOp(zcq-o?KdBck8vv#5!}@m)YM0B-<+q9i08fFlHG3f>Zfv8 z8pe{+q3K;pWF5le*^wOD1=N1r&3XGc!OZa14D<(tuk_$jIS^hTH+1+4oG}ULL&VnS zG~z@Zl%ZX8#08s|Fok1$NzF(a(HWYaT$@URA)l%=rn(Go#hE5_0@bt|X~?LR-E%Dn z=bcvfvJeF=4`erja7j7{5Wxn9mfyDQn7RHd$ zB)7X#0u1PyS5^v>k*xBvE@ZXN2mn+m%SySG7SF88X40R>NUdlqbiM%!U&>P2!_2pm zwn|(pr5UFk*H-3r$u;e2y;DX|vQd<5N!*LdlG*UG{OppceI;~~eru7I zf=bDkrAR~|J^)jT+$J|4ryRjSUYRko6S>3zSqMbH^&z`r8u3q!N4TVdZ~0mn`uabK zU?q92#WqPs45nThD{XBBt(7X~oQ=@;G8g7=Dpg8;MYRzbE4bw|F(8l>uAzQe8#!kt zD=W0FcUG$E4(r_`75L^DE#`1lm8_y8Lg_;SO&QGDXSCl4e8+~Xx1@Lq!=Mzoy?q8g zbi}d`k5q|uDc7RPMN*>@%3d0AhgC@^TPMhr@ScMc1p#j=B2=;YcvD#9i$#)L5ijn6 VQM^CK>W#eC1Vg6IH`llq>|YKv(3SuI literal 3417 zcma)9O>>(_5WVYHbomsgWXVoy59`|63YM_VE&?qeJ3gf_jLam6A;VzB`|J1h0J0n_ z*;Kj826|q9O!s^3q!5&5ncCE8^(3nYTFX*2)KC53Eg ztMnJVu1qSchH9;9Erm(-6JF+GGFl3~kxe62MX=W5Yb&+LX{|KnvN2lTw+0^p7psl1 zht5Z{!4191j_KX$**kKyDOybzS{kEX8=Re3t9kk;bBeQKn`-m#56%8U1dD8zmg4^B ze&5rLtSTw!GA%Pje>~c!$(o-&JZw@~PEfHwM?^D}U`VE+wN{&#M^PDs2EScF4XSNW znugSx_`!>3dH7V@e%wNsD;L4u!7E9lQlfCod zB`w@&b`3b^!t=f44ruKB(n|t2jwj>=6olm7xIsekHM{5F`?xM#@;&Fmcj*#QI>8;q zOLyiu{um)g?kpJt&I|g#2{yAZh~0lyK!X*{orQCSH2TBCMR*ZM?cisYcwxZSaGOMU98=(4`QDWq%v^xs zXlU(|FoNj{^|eRFip%^{P(~~K!MN_LPXXa{DtI?hvficr; z6ec1EEy)sH$iv#x*uXFE>4Xl(Wy9hWOOaxR9%Um96~@%()9H4*oqTRH!4$AZBVCqG z?1d!0rJEWodOn&?UpYN}&zyBevqFOiRgFQU#f1J=MOmoz8lmwA!VrELUggRl)y*;B z7;!!j=nGo8P^vMz!VaV|rW>Ix4WCU;C-jCZw@>$s#|1-I&s;R>r?XF|6Z6e5WANZ} z9D8}+vy+L^57Y1Lk6%^dLYhp;>TnHy=Ng<+oEp^>l7jS0x=|qb1NB0w5?pl;hwFS4 zr2_LbKQ6_>OQs)jZpVsc$FO5+`o=j}g5GLKe=lwLtGe#8x%Y<6bR*5laH=lq*G->5 z4{qD@PBVAm;CeG~D+}UtzpqtUsx9~Nj&RRMqv_iby*=DRr@w(#Ek2t#;M>SbG)1Bj z`cdR)d3$(xy?F z#C+$JtE}A!tOl&`{W!kCxH81iF!@Kv)>SUR29OJ$=Hb&$sxaFS*NkDtFv`l7=bT{% zF)Jmmp!35B-HyU39FWe9u=&;PeJPs)JpJ~06+zw&zqdlXQ`tuBL~PLOAx3KhM~q@+ z(DW5+*!#A?y}U>X`2Mrr!dJv~ukEPDrN%;Wfdzfs8)d+G0CZ`*0meRli<+25}LtT>C;I{=6Cat-*! zB>;#)n2~-Hp3=H5u{{pG&-@0$9HfuOf;KG_PqV%Q5dUa^axhC)wg!&cacMs& zoCebsfU+``-~?{!>1gESIp_wu3qN055Rdhs#Y3v?a$(o(o**!;pyp@xCG&avA!{Zv N1_*mcK5^%((SM%RHzxo9 diff --git a/Subtrees/leveldb/Makefile b/Makefile similarity index 100% rename from Subtrees/leveldb/Makefile rename to Makefile diff --git a/Subtrees/leveldb/NEWS b/NEWS similarity index 100% rename from Subtrees/leveldb/NEWS rename to NEWS diff --git a/Subtrees/leveldb/README b/README similarity index 100% rename from Subtrees/leveldb/README rename to README diff --git a/README.md b/README.md deleted file mode 100644 index 96981679c5..0000000000 --- a/README.md +++ /dev/null @@ -1,16 +0,0 @@ -Ripple - P2P Payment Network -============================ - -Some portions of this source code are currently closed source. - -This is the repository for Ripple's `rippled`, reference P2P network server. - -Build instructions: -* https://ripple.com/wiki/Rippled_build_instructions - -Setup instructions: -* https://ripple.com/wiki/Rippled_setup_instructions - -For more information: -* https://ripple.com -* https://ripple.com/wiki diff --git a/RippleD.props b/RippleD.props deleted file mode 100644 index 7466630c5c..0000000000 --- a/RippleD.props +++ /dev/null @@ -1,34 +0,0 @@ - - - - - . - $(RepoDir)\src\cpp\ripple - - - $(SolutionDir)build\VisualStudio2012\$(Configuration).$(Platform)\ - $(SolutionDir)build\obj\VisualStudio2012\$(Configuration).$(Platform)\ - rippled - - - - USE_LEVELDB;BOOST_TEST_ALTERNATIVE_INIT_API;BOOST_TEST_NO_MAIN;_WIN32_WINNT=0x0600;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions) - true - Level3 - $(RepoDir);$(RepoDir)\src\cpp\leveldb;$(RepoDir)\src\cpp\leveldb\include;$(RepoDir)\src\cpp\protobuf\src;$(RepoDir)\src\cpp\protobuf\vsprojects;$(RepoDir)\build\proto;$(RepoDir)\Subtrees\beast;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - Async - - - Shlwapi.lib;%(AdditionalDependencies) - - - - - $(RepoDir) - - - $(SrcDir) - - - \ No newline at end of file diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 389813e57b..0000000000 --- a/SConstruct +++ /dev/null @@ -1,197 +0,0 @@ -# -# Ripple - SConstruct -# - -import commands -import copy -import glob -import os -import platform -import re - -LevelDB = bool(1) - -OSX = bool(platform.mac_ver()[0]) -FreeBSD = bool('FreeBSD' == platform.system()) -Linux = bool('Linux' == platform.system()) -Ubuntu = bool(Linux and 'Ubuntu' == platform.linux_distribution()[0]) - -if OSX or Ubuntu: - CTAGS = '/usr/bin/ctags' -else: - CTAGS = '/usr/bin/exuberant-ctags' - -# -# scons tools -# - -env = Environment( - tools = ['default', 'protoc'] -) - -GCC_VERSION = re.split('\.', commands.getoutput(env['CXX'] + ' -dumpversion')) - -# Use clang -#env.Replace(CC = 'clang') -#env.Replace(CXX = 'clang++') - -# -# Builder for CTags -# -ctags = Builder(action = '$CTAGS $CTAGSOPTIONS -f $TARGET $SOURCES') -env.Append(BUILDERS = { 'CTags' : ctags }) -if OSX: - env.Replace(CTAGS = CTAGS) -else: - env.Replace(CTAGS = CTAGS, CTAGSOPTIONS = '--tag-relative') - -# Use openssl -env.ParseConfig('pkg-config --cflags --libs openssl') - -# The required version of boost is documented in the README file. -# -# We whitelist platforms where the non -mt version is linked with pthreads. -# This can be verified with: ldd libboost_filesystem.* -# If a threading library is included the platform can be whitelisted. -# -# FreeBSD and Ubuntu non-mt libs do link with pthreads. -if FreeBSD or Ubuntu: - env.Append( - LIBS = [ - 'boost_date_time', - 'boost_filesystem', - 'boost_program_options', - 'boost_regex', - 'boost_system', - 'boost_thread', - 'boost_random', - ] - ) -else: - env.Append( - LIBS = [ - 'boost_date_time-mt', - 'boost_filesystem-mt', - 'boost_program_options-mt', - 'boost_regex-mt', - 'boost_system-mt', - 'boost_thread-mt', - 'boost_random-mt', - ] - ) - -#------------------------------------------------------------------------------- -# -# VFALCO This is my oasis of sanity. Nothing having to do with directories, -# source files, or include paths should reside outside the boundaries. -# - -# List of includes passed to the C++ compiler. -# These are all relative to the repo dir. -# -INCLUDE_PATHS = [ - '.', - 'build/proto', - 'Subtrees', - 'Subtrees/leveldb', - 'Subtrees/leveldb/port', - 'Subtrees/leveldb/include', - 'Subtrees/beast', - 'src/cpp/ripple' - ] - -COMPILED_FILES = [ - 'Subtrees/beast/modules/beast_core/beast_core.cpp', - 'Subtrees/beast/modules/beast_basics/beast_basics.cpp', - 'modules/ripple_basics/ripple_basics.cpp', - 'modules/ripple_data/ripple_data.cpp', - 'modules/ripple_json/ripple_json.cpp', - 'modules/ripple_leveldb/ripple_leveldb.cpp', - 'modules/ripple_websocket/ripple_websocket.cpp', - 'modules/ripple_sqlite/ripple_sqlite.c', - 'modules/ripple_app/ripple_app_pt1.cpp', - 'modules/ripple_app/ripple_app_pt2.cpp', - 'modules/ripple_app/ripple_app_pt3.cpp', - 'modules/ripple_app/ripple_app_pt4.cpp' - ] - -#------------------------------------------------------------------------------- - -# Map top level source directories to their location in the outputs -# - -VariantDir('build/obj/src', 'src', duplicate=0) -VariantDir('build/obj/modules', 'modules', duplicate=0) -VariantDir('build/obj/Subtrees', 'Subtrees', duplicate=0) - -#------------------------------------------------------------------------------- - -# Add the list of includes to compiler include paths. -# -for path in INCLUDE_PATHS: - env.Append (CPPPATH = [ path ]) - -#------------------------------------------------------------------------------- - -# Apparently, only linux uses -ldl -if not FreeBSD: - env.Append( - LIBS = [ - 'dl', # dynamic linking for linux - ] - ) - -# Apparently, pkg-config --libs protobuf on bsd fails to provide this necessary include dir. -if FreeBSD: - env.Append(LINKFLAGS = ['-I/usr/local/include']) - env.Append(CXXFLAGS = ['-DOS_FREEBSD']) - -env.Append( - LIBS = [ - 'rt', # for clock_nanosleep in beast - 'protobuf', - 'z' - ] -) - -DEBUGFLAGS = ['-g', '-DDEBUG'] -BOOSTFLAGS = ['-DBOOST_TEST_DYN_LINK', '-DBOOST_FILESYSTEM_NO_DEPRECATED'] - -env.Append(LINKFLAGS = ['-rdynamic', '-pthread']) -env.Append(CCFLAGS = ['-pthread', '-Wall', '-Wno-sign-compare', '-Wno-char-subscripts']) -env.Append(CXXFLAGS = ['-O0', '-pthread', '-Wno-invalid-offsetof', '-Wformat']+BOOSTFLAGS+DEBUGFLAGS) - -# RTTI is required for Beast and CountedObject. -# -env.Append(CXXFLAGS = ['-frtti']) - -if (int(GCC_VERSION[0]) > 4 or (int(GCC_VERSION[0]) == 4 and int(GCC_VERSION[1]) >= 7)): - env.Append(CXXFLAGS = ['-std=c++11']) - -if OSX: - env.Append(LINKFLAGS = ['-L/usr/local/opt/openssl/lib']) - env.Append(CXXFLAGS = ['-I/usr/local/opt/openssl/include']) - -PROTO_SRCS = env.Protoc([], 'src/cpp/ripple/ripple.proto', PROTOCOUTDIR='build/proto', PROTOCPYTHONOUTDIR=None) -env.Clean(PROTO_SRCS, 'site_scons/site_tools/protoc.pyc') - -# Only tag actual Ripple files. -TAG_SRCS = copy.copy(COMPILED_FILES) - -# Derive the object files from the source files. -OBJECT_FILES = [] - -OBJECT_FILES += PROTO_SRCS - -for file in COMPILED_FILES: - OBJECT_FILES.append('build/obj/' + file) - -# -# Targets -# - -rippled = env.Program('build/rippled', OBJECT_FILES) - -tags = env.CTags('tags', TAG_SRCS) - -Default(rippled, tags) diff --git a/Subtrees/README.md b/Subtrees/README.md deleted file mode 100644 index 75c170dc28..0000000000 --- a/Subtrees/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Subtrees - -These directories come from entire outside repositories -brought in using git-subtree. - -About git-subtree: - -https://github.com/apenwarr/git-subtree
-http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/
- -## LevelDB - -Repository
-``` -git@github.com:vinniefalco/LevelDB.git -``` -Branch -``` -ripple-fork -``` - -## websocket - -Repository -``` -git@github.com:vinniefalco/websocketpp.git -``` -Branch -``` -ripple-fork -``` - -## protobuf - -Repository -``` -git@github.com:vinniefalco/protobuf.git -``` -Branch -``` -master -``` - -**NOTE** Linux builds use the protobuf installed in /usr/lib. This will be -fixed in a future revision. - -## SQLite - -Not technically a subtree but included here because it is a direct -copy of the official SQLite distributions available here: - -http://sqlite.org/download.html diff --git a/Subtrees/beast/.gitattributes b/Subtrees/beast/.gitattributes deleted file mode 100644 index 8d9c7343dc..0000000000 --- a/Subtrees/beast/.gitattributes +++ /dev/null @@ -1,12 +0,0 @@ -# Set default behaviour, in case users don't have core.autocrlf set. -* text=auto - -# Github -.md text eol=lf - -# Visual Studio -*.sln text eol=crlf -*.vcproj text eol=crlf -*.vcxproj text eol=crlf -*.props text eol=crlf -*.filters text eol=crlf diff --git a/Subtrees/beast/.gitignore b/Subtrees/beast/.gitignore deleted file mode 100644 index d5acdb6154..0000000000 --- a/Subtrees/beast/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -Docs -._* -*.mode1v3 -*.pbxuser -*.perspectivev3 -*.user -*.ncb -*.suo -*.obj -*.ilk -*.pch -*.pdb -*.dep -*.idb -*.manifest -*.manifest.res -*.o -*.d -*.sdf -xcuserdata -contents.xcworkspacedata -.DS_Store -.svn -profile -Builds/VisualStudio2012/Debug -Builds/VisualStudio2012/Release diff --git a/Subtrees/beast/Builds/VisualStudio2012/BeastConfig.h b/Subtrees/beast/Builds/VisualStudio2012/BeastConfig.h deleted file mode 100644 index 447c226faf..0000000000 --- a/Subtrees/beast/Builds/VisualStudio2012/BeastConfig.h +++ /dev/null @@ -1,59 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BEASTCONFIG_HEADER -#define BEAST_BEASTCONFIG_HEADER - -// beast_core flags: - -#ifndef BEAST_FORCE_DEBUG - //#define BEAST_FORCE_DEBUG -#endif - -#ifndef BEAST_LOG_ASSERTIONS - //#define BEAST_LOG_ASSERTIONS 1 -#endif - -#ifndef BEAST_CHECK_MEMORY_LEAKS - //#define BEAST_CHECK_MEMORY_LEAKS -#endif - -#ifndef BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - //#define BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES -#endif - -// beast_basics flags - -#ifndef BEAST_USE_BOOST -#define BEAST_USE_BOOST 0 -#endif - -#ifndef BEAST_USE_BZIP2 -#define BEAST_USE_BZIP2 0 -#endif - -#ifndef BEAST_USE_NATIVE_SQLITE -#define BEAST_USE_NATIVE_SQLITE 1 -#endif - -#ifndef BEAST_USE_LEAKCHECKED -#define BEAST_USE_LEAKCHECKED BEAST_CHECK_MEMORY_LEAKS -#endif - -#endif diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj deleted file mode 100644 index 04af470a2b..0000000000 --- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj +++ /dev/null @@ -1,716 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - {73C5A0F0-7629-4DE7-9194-BE7AC6C19535} - Win32Proj - beast - - - - StaticLibrary - true - v110 - Unicode - - - StaticLibrary - false - v110 - true - Unicode - - - - - - - - - - - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - $(ProjectDir) - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - $(ProjectDir) - - - Windows - true - true - true - - - - - - \ No newline at end of file diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters deleted file mode 100644 index f2f88ba0bc..0000000000 --- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters +++ /dev/null @@ -1,956 +0,0 @@ - - - - - - - beast_core - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\zip\zlib - - - beast_core\native\java - - - - - - - - {6dafd8d5-2901-4b41-85b7-52f6e86baacc} - - - {7cc041c8-fdf4-4e98-a56a-df516c2a9aa2} - - - {3b7d8d7e-eabc-423c-a631-2ff37bf9b9eb} - - - {abe24d69-c1d1-49e2-98a1-1e7bf760b97a} - - - {0fa6b76b-305f-473c-9b94-c1028a3af3fc} - - - {e2339099-bb8e-4437-ae8b-d4f64ef1e3f3} - - - {a89aa17e-4e01-4c2d-ba7e-196e9e0b67bb} - - - {64a314e1-0361-428a-a294-0615d8140f58} - - - {1d018a70-71b3-4d70-9280-02efd4f348de} - - - {ad675f57-9303-4712-9ff2-c7f59f959e7b} - - - {016d839c-4860-4bc3-8f6c-e965f50c2bfa} - - - {7fb77af6-ce16-4f53-823e-906963b42985} - - - {4603580c-5668-4e70-bed8-77f00f03f0ff} - - - {3409dc7a-92b5-43aa-b678-fde9f82ced55} - - - {d3ea4af5-ae48-4144-a2ef-a212342d72ee} - - - {0a8a6870-87a4-4f19-bbd3-b277f94bb83e} - - - {a1a38659-7779-41d6-8a3c-068433c4deaf} - - - {df5f5a69-5919-4a24-bbce-b3f87e4903cf} - - - {b0d206d9-c002-4be1-b503-4ad16aca838a} - - - {31038502-9139-4c19-bd67-8f90f08a70ca} - - - {e3a8f3eb-7f0f-4b81-b978-0dd0823f583b} - - - {3e9389c0-c8f0-4657-ab11-cbbea889d3be} - - - {ba11b980-76dd-49a4-b2c7-878e9f08f8ce} - - - {b8caa85d-f224-4e3a-966f-a19b65023869} - - - {bb0bef46-51a6-4c26-8354-4df753c3bace} - - - {1d53386e-0732-4213-b45d-026ff3d14042} - - - {9e850052-6ab7-4a65-911d-adfde81ceb5f} - - - {811c5374-8959-4df9-aba9-a7e27b85046e} - - - {f58dddf7-fe43-49a2-8e57-91feba586119} - - - - - beast_core - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\json - - - beast_core\logging - - - beast_core\logging - - - beast_core\maths - - - beast_core\maths - - - beast_core\maths - - - beast_core\maths - - - beast_core\maths - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\memory - - - beast_core\misc - - - beast_core\misc - - - beast_core\misc - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\system - - - beast_core\system - - - beast_core\system - - - beast_core\system - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\time - - - beast_core\time - - - beast_core\time - - - beast_core\unit_tests - - - beast_core\xml - - - beast_core\xml - - - beast_core\zip - - - beast_core\zip - - - beast_core\zip - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - - beast_basics - - - beast_basics\containers - - - beast_basics\containers - - - beast_basics\containers - - - beast_basics\containers - - - beast_basics\containers - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\events - - - beast_basics\events - - - beast_basics\functor - - - beast_basics\functor - - - beast_basics\math - - - beast_basics\math - - - beast_basics\math - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - - - beast_core - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\containers - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\files - - - beast_core\json - - - beast_core\logging - - - beast_core\logging - - - beast_core\maths - - - beast_core\maths - - - beast_core\maths - - - beast_core\memory - - - beast_core\misc - - - beast_core\misc - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\native - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\network - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\streams - - - beast_core\system - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\text - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\threads - - - beast_core\time - - - beast_core\time - - - beast_core\time - - - beast_core\unit_tests - - - beast_core\xml - - - beast_core\xml - - - beast_core\zip - - - beast_core\zip - - - beast_core\zip - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_core\zip\zlib - - - beast_basics - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\diagnostic - - - beast_basics\events - - - beast_basics\events - - - beast_basics\math - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\memory - - - beast_basics\native - - - beast_basics\native - - - beast_basics\native - - - beast_basics\native - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - beast_basics\threads - - - \ No newline at end of file diff --git a/Subtrees/beast/CodingStyle.md b/Subtrees/beast/CodingStyle.md deleted file mode 100644 index a060e14af3..0000000000 --- a/Subtrees/beast/CodingStyle.md +++ /dev/null @@ -1,217 +0,0 @@ --------------------------------------------------------------------------------- - -# Coding Standards - -Coding standards used here are extreme strict and consistent. The style -evolved gradually over the years, incorporating generally acknowledged -best-practice C++ advice, experience, and personal preference. - -## Don't Repeat Yourself! - -The [Don't Repeat Yourself][1] principle summarises the essence of what it -means to write good code, in all languages, at all levels. - -## Formatting - -The goal of source code formatting should always be to make things as easy to -read as possible. White space is used to guide the eye so that details are not -overlooked. Blank lines are used to separate code into "paragraphs." - -* No tab characters please. -* Tab stops are set to 4 spaces. -* Braces are indented in the [Allman style][2]. -* Always place a space before and after all binary operators, - especially assignments (`operator=`). -* The `!` operator should always be followed by a space. -* The `~` operator should be preceded by a space, but not followed by one. -* The `++` and `--` operators should have no spaces between the operator and - the operand. -* A space never appears before a comma, and always appears after a comma. -* Always place a space before an opening parenthesis. One exception is if - the parentheses are empty. -* Don't put spaces after a parenthesis. A typical member function call might - look like this: `foobar (1, 2, 3);` -* In general, leave a blank line before an `if` statement. -* In general, leave a blank line after a closing brace `}`. -* Do not place code or comments on the same line as any opening or - closing brace. -* Do not write `if` statements all-on-one-line. The exception to this is when - you've got a sequence of similar `if` statements, and are aligning them all - vertically to highlight their similarities. -* In an `if-else` statement, if you surround one half of the statement with - braces, you also need to put braces around the other half, to match. -* When writing a pointer type, use this spacing: `SomeObject* myObject`. - Technically, a more correct spacing would be `SomeObject *myObject`, but - it makes more sense for the asterisk to be grouped with the type name, - since being a pointer is part of the type, not the variable name. The only - time that this can lead to any problems is when you're declaring multiple - pointers of the same type in the same statement - which leads on to the next - rule: -* When declaring multiple pointers, never do so in a single statement, e.g. - `SomeObject* p1, *p2;` - instead, always split them out onto separate lines - and write the type name again, to make it quite clear what's going on, and - avoid the danger of missing out any vital asterisks. -* The previous point also applies to references, so always put the `&` next to - the type rather than the variable, e.g. `void foo (Thing const& thing)`. And - don't put a space on both sides of the `*` or `&` - always put a space after - it, but never before it. -* The word `const` should be placed to the right of the thing that it modifies, - for consistency. For example `int const` refers to an int which is const. - `int const*` is a pointer to an int which is const. `int *const` is a const - pointer to an int. -* Always place a space in between the template angle brackets and the type - name. Template code is already hard enough to read! - -## Naming conventions - -* Member variables and method names are written with camel-case, and never - begin with a capital letter. -* Class names are also written in camel-case, but always begin with a capital - letter. -* For global variables... well, you shouldn't have any, so it doesn't matter. -* Class data members begin with `m_`, static data members begin with `s_`. - Global variables begin with `g_`. This is so the scope of the corresponding - declaration can be easily determined. -* Avoid underscores in your names, especially leading or trailing underscores. - In particular, leading underscores should be avoided, as these are often used - in standard library code, so to use them in your own code looks quite jarring. -* If you really have to write a macro for some reason, then make it all caps, - with underscores to separate the words. And obviously make sure that its name - is unlikely to clash with symbols used in other libraries or 3rd party code. - -## Types, const-correctness - -* If a method can (and should!) be const, make it const! -* If a method definitely doesn't throw an exception (be careful!), mark it as - `noexcept` -* When returning a temporary object, e.g. a String, the returned object should - be non-const, so that if the class has a C++11 move operator, it can be used. -* If a local variable can be const, then make it const! -* Remember that pointers can be const as well as primitives; For example, if - you have a `char*` whose contents are going to be altered, you may still be - able to make the pointer itself const, e.g. `char* const foobar = getFoobar();`. -* Do not declare all your local variables at the top of a function or method - (i.e. in the old-fashioned C-style). Declare them at the last possible moment, - and give them as small a scope as possible. -* Object parameters should be passed as `const&` wherever possible. Only - pass a parameter as a copy-by-value object if you really need to mutate - a local copy inside the method, and if making a local copy inside the method - would be difficult. -* Use portable `for()` loop variable scoping (i.e. do not have multiple for - loops in the same scope that each re-declare the same variable name, as - this fails on older compilers) -* When you're testing a pointer to see if it's null, never write - `if (myPointer)`. Always avoid that implicit cast-to-bool by writing it more - fully: `if (myPointer != nullptr)`. And likewise, never ever write - `if (! myPointer)`, instead always write `if (myPointer == nullptr)`. - It is more readable that way. -* Avoid C-style casts except when converting between primitive numeric types. - Some people would say "avoid C-style casts altogether", but `static_cast` is - a bit unreadable when you just want to cast an `int` to a `float`. But - whenever a pointer is involved, or a non-primitive object, always use - `static_cast`. And when you're reinterpreting data, always use - `reinterpret_cast`. -* Until C++ gets a universal 64-bit primitive type (part of the C++11 - standard), it's best to stick to the `int64` and `uint64` typedefs. - -## Object lifetime and ownership - -* Absolutely do NOT use `delete`, `deleteAndZero`, etc. There are very very few - situations where you can't use a `ScopedPointer` or some other automatic - lifetime management class. -* Do not use `new` unless there's no alternative. Whenever you type `new`, always - treat it as a failure to find a better solution. If a local variable can be - allocated on the stack rather than the heap, then always do so. -* Do not ever use `new` or `malloc` to allocate a C++ array. Always use a - `HeapBlock` instead. -* And just to make it doubly clear: Never use `malloc` or `calloc`. -* If a parent object needs to create and own some kind of child object, always - use composition as your first choice. If that's not possible (e.g. if the - child needs a pointer to the parent for its constructor), then use a - `ScopedPointer`. -* If possible, pass an object as a reference rather than a pointer. If possible, - make it a `const` reference. -* Obviously avoid static and global values. Sometimes there's no alternative, - but if there is an alternative, then use it, no matter how much effort it - involves. -* If allocating a local POD structure (e.g. an operating-system structure in - native code), and you need to initialise it with zeros, use the `= { 0 };` - syntax as your first choice for doing this. If for some reason that's not - appropriate, use the `zerostruct()` function, or in case that isn't suitable, - use `zeromem()`. Don't use `memset()`. - -## Classes - -* Declare a class's public section first, and put its constructors and - destructor first. Any protected items come next, and then private ones. -* Use the most restrictive access-specifier possible for each member. Prefer - `private` over `protected`, and `protected` over `public`. Don't expose - things unnecessarily. -* Preferred positioning for any inherited classes is to put them to the right - of the class name, vertically aligned, e.g.: - class Thing : public Foo, - private Bar - { - } -* Put a class's member variables (which should almost always be private, of course), - after all the public and protected method declarations. -* Any private methods can go towards the end of the class, after the member - variables. -* If your class does not have copy-by-value semantics, derive the class from - `Uncopyable`. -* If your class is likely to be leaked, then derive your class from - `LeakChecked<>`. -* Constructors that take a single parameter should be default be marked - `explicit`. Obviously there are cases where you do want implicit conversion, - but always think about it carefully before writing a non-explicit constructor. -* Do not use `NULL`, `null`, or 0 for a null-pointer. And especially never use - '0L', which is particulary burdensome. Use `nullptr` instead - this is the - C++2011 standard, so get used to it. There's a fallback definition for `nullptr` - in Beast, so it's always possible to use it even if your compiler isn't yet - C++2011 compliant. -* All the C++ 'guru' books and articles are full of excellent and detailed advice - on when it's best to use inheritance vs composition. If you're not already - familiar with the received wisdom in these matters, then do some reading! - -## Miscellaneous - -* `goto` statements should not be used at all, even if the alternative is - more verbose code. The only exception is when implementing an algorithm in - a function as a state machine. -* Don't use macros! OK, obviously there are many situations where they're the - right tool for the job, but treat them as a last resort. Certainly don't ever - use a macro just to hold a constant value or to perform any kind of function - that could have been done as a real inline function. And it goes without saying - that you should give them names which aren't going to clash with other code. - And `#undef` them after you've used them, if possible. -* When using the `++` or `--` operators, never use post-increment if - pre-increment could be used instead. Although it doesn't matter for - primitive types, it's good practice to pre-increment since this can be - much more efficient for more complex objects. In particular, if you're - writing a for loop, always use pre-increment, - e.g. `for (int = 0; i < 10; ++i)` -* Never put an "else" statement after a "return"! This is well-explained in the - LLVM coding standards...and a couple of other very good pieces of advice from - the LLVM standards are in there as well. -* When getting a possibly-null pointer and using it only if it's non-null, limit - the scope of the pointer as much as possible - e.g. Do NOT do this: - - Foo* f = getFoo (); - if (f != nullptr) - f->doSomething (); - // other code - f->doSomething (); // oops! f may be null! - - ..instead, prefer to write it like this, which reduces the scope of the - pointer, making it impossible to write code that accidentally uses a null - pointer: - - if (Foo* f = getFoo ()) - f->doSomethingElse (); - - // f is out-of-scope here, so impossible to use it if it's null - - (This also results in smaller, cleaner code) - -[1]: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself -[2]: http://en.wikipedia.org/wiki/Indent_style#Allman_style diff --git a/Subtrees/beast/Doxyfile b/Subtrees/beast/Doxyfile deleted file mode 100644 index 65efc1edf6..0000000000 --- a/Subtrees/beast/Doxyfile +++ /dev/null @@ -1,303 +0,0 @@ -# Doxyfile 1.8.3.1 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "Beast" -PROJECT_NUMBER = -PROJECT_BRIEF = -PROJECT_LOGO = -OUTPUT_DIRECTORY = Docs -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 4 -ALIASES = -TCL_SUBST = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -EXTENSION_MAPPING = -MARKDOWN_SUPPORT = YES -AUTOLINK_SUPPORT = YES -BUILTIN_STL_SUPPORT = NO -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -INLINE_GROUPED_CLASSES = NO -INLINE_SIMPLE_STRUCTS = NO -TYPEDEF_HIDES_STRUCT = NO -SYMBOL_CACHE_SIZE = 0 -LOOKUP_CACHE_SIZE = 0 -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_PACKAGE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_MEMBERS_CTORS_1ST = NO -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -STRICT_PROTO_MATCHING = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_FILES = YES -SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = -LAYOUT_FILE = -CITE_BIB_FILES = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = modules -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = -RECURSIVE = YES -EXCLUDE = modules/beast_core/beast_core.h \ - modules/beast_core/beast_core.cpp \ - modules/beast_basics/beast_basics.h \ - modules/beast_basics/beast_basics.cpp \ - modules/beast_basics/native \ - modules/beast_basics/zip/zlib -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = . -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = -HTML_EXTRA_FILES = -HTML_COLORSTYLE_HUE = 220 -HTML_COLORSTYLE_SAT = 100 -HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = YES -HTML_DYNAMIC_SECTIONS = NO -HTML_INDEX_NUM_ENTRIES = 100 -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -DOCSET_PUBLISHER_ID = org.doxygen.Publisher -DOCSET_PUBLISHER_NAME = Publisher -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO -GENERATE_QHP = NO -QCH_FILE = -QHP_NAMESPACE = org.doxygen.Project -QHP_VIRTUAL_FOLDER = doc -QHP_CUST_FILTER_NAME = -QHP_CUST_FILTER_ATTRS = -QHP_SECT_FILTER_ATTRS = -QHG_LOCATION = -GENERATE_ECLIPSEHELP = NO -ECLIPSE_DOC_ID = org.doxygen.Project -DISABLE_INDEX = NO -GENERATE_TREEVIEW = NO -ENUM_VALUES_PER_LINE = 4 -TREEVIEW_WIDTH = 250 -EXT_LINKS_IN_WINDOW = NO -FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES -USE_MATHJAX = NO -MATHJAX_FORMAT = HTML-CSS -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -MATHJAX_EXTENSIONS = -SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = -SEARCHDATA_FILE = searchdata.xml -EXTERNAL_SEARCH_ID = -EXTRA_SEARCH_MAPPINGS = -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4 -EXTRA_PACKAGES = -LATEX_HEADER = -LATEX_FOOTER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -LATEX_SOURCE_CODE = NO -LATEX_BIB_STYLE = plain -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -MSCGEN_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -DOT_NUM_THREADS = 0 -DOT_FONTNAME = Helvetica -DOT_FONTSIZE = 10 -DOT_FONTPATH = -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -UML_LIMIT_NUM_FIELDS = 10 -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -INTERACTIVE_SVG = NO -DOT_PATH = -DOTFILE_DIRS = -MSCFILE_DIRS = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES - diff --git a/Subtrees/beast/ReadMe.md b/Subtrees/beast/ReadMe.md deleted file mode 100644 index 57c2293e6b..0000000000 --- a/Subtrees/beast/ReadMe.md +++ /dev/null @@ -1,14 +0,0 @@ -# Beast: An amazing cross platform library - -Contains cross platform objects to do a variety of useful things. -No external dependencies, no complicated build steps. - -Things people need for building peer to peer, concurrent, cryptographic systems. - -The hope is that this will replace the use of boost and other cumbersome jalopies. - -## JUCE - -Beast is based on the beast_core module which is provided under the ISC -license. More information about JUCE is available at -http://www.juce.com diff --git a/Subtrees/beast/modules/beast_basics/beast_basics.cpp b/Subtrees/beast/modules/beast_basics/beast_basics.cpp deleted file mode 100644 index 4a62756512..0000000000 --- a/Subtrees/beast/modules/beast_basics/beast_basics.cpp +++ /dev/null @@ -1,89 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/** Add this to get the @ref beast_basics module. - - @file beast_basics.cpp - @ingroup beast_basics -*/ - -#include "BeastConfig.h" - -#include "beast_basics.h" - -#if BEAST_MSVC && _DEBUG -#include -#endif - -#if BEAST_MSVC -#pragma warning (push) -#pragma warning (disable: 4100) // unreferenced formal parmaeter -#pragma warning (disable: 4355) // 'this' used in base member -#endif - -namespace beast -{ - -#include "diagnostic/beast_CatchAny.cpp" -#include "diagnostic/beast_Debug.cpp" -#include "diagnostic/beast_Error.cpp" -#include "diagnostic/beast_FPUFlags.cpp" -#include "diagnostic/beast_LeakChecked.cpp" - -#include "events/beast_OncePerSecond.cpp" -#include "events/beast_PerformedAtExit.cpp" - -#include "math/beast_MurmurHash.cpp" - -#include "threads/beast_InterruptibleThread.cpp" -#include "threads/beast_Semaphore.cpp" - -#if BEAST_WINDOWS -#include "native/beast_win32_FPUFlags.cpp" -#include "native/beast_win32_Threads.cpp" - -#else -#include "native/beast_posix_FPUFlags.cpp" -#include "native/beast_posix_Threads.cpp" - -#endif - -#if BEAST_USE_BOOST -#include "memory/beast_FifoFreeStoreWithTLS.cpp" -#else -#include "memory/beast_FifoFreeStoreWithoutTLS.cpp" -#endif -#include "memory/beast_GlobalPagedFreeStore.cpp" -#include "memory/beast_PagedFreeStore.cpp" - -#include "threads/beast_CallQueue.cpp" -#include "threads/beast_ConcurrentObject.cpp" -#include "threads/beast_Listeners.cpp" -#include "threads/beast_ManualCallQueue.cpp" -#include "threads/beast_ParallelFor.cpp" -#include "threads/beast_ReadWriteMutex.cpp" -#include "threads/beast_SharedObject.cpp" -#include "threads/beast_ThreadGroup.cpp" -#include "threads/beast_ThreadWithCallQueue.cpp" - -} - -#if BEAST_MSVC -#pragma warning (pop) -#endif diff --git a/Subtrees/beast/modules/beast_basics/beast_basics.h b/Subtrees/beast/modules/beast_basics/beast_basics.h deleted file mode 100644 index c692151e82..0000000000 --- a/Subtrees/beast/modules/beast_basics/beast_basics.h +++ /dev/null @@ -1,470 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/** Include this to get the @ref beast_basics module. - - @file beast_basics.h - @ingroup beast_basics -*/ - -#ifndef BEAST_BASICS_BEASTHEADER -#define BEAST_BASICS_BEASTHEADER - -//============================================================================== -/** - @mainpage Beast: A multipurpose library using parts of JUCE. - - ### Version 1.1 - - Copyright (C) 2008 by Vinnie Falco \ ([e-mail][0]) - - Beast is a source code collection of individual modules containing - functionality for a variety of applications, with an emphasis on building - concurrent systems. Beast requires [JUCE][3] (Jules' Utility Class - Extensions), available from [Raw Material Software][4]. JUCE is available - under both the [GNU General Public License][5] and a [commercial license][6]. - Other than JUCE, Beast has no external dependencies. - - Beast is hosted on Github at [https://github.com/vinniefalco/Beast][1] - - The online documentation is at [http://vinniefalco.github.com/Beast][2] - - ## Platforms - - All platforms supported by JUCE are also supported by Beast. Currently these - platforms include: - - - **Windows**: Applications and VST/RTAS/NPAPI/ActiveX plugins can be built - using MS Visual Studio. The results are all fully compatible with Windows - XP, Vista or Windows 7. - - - **Mac OS X**: Applications and VST/AudioUnit/RTAS/NPAPI plugins with Xcode. - - - **GNU/Linux**: Applications and plugins can be built for any kernel 2.6 or - later. - - - **iOS**: Native iPhone and iPad apps. - - - **Android**: Supported. - - ## Prerequisites - - This documentation assumes that the reader has a working knowledge of JUCE. - Some modules built on external libraries assume that the reader understands - the operation of those external libraries. Certain modules assume that the - reader understands additional domain-specific information. Modules with - additional prerequisites are marked in the documentation. - - ## External Modules - - Some modules bring in functionality provided by external libraries. For - example, the @ref beast_bzip2 module provides the compression and decompression - algorithms in [bZip2][7]. Usage of these external library modules is optional. - They come with complete source code, as well as options for using either - system or user provided variants of the external libraries: it is not - necessary to download additional source code packages to use these modules. - - External code incorporated into Beast is covered by separate licenses. See - the licensing information and notes in the corresponding source files for - copyright information and terms of use. - - ## Integration - - Beast requires recent versions of JUCE. It won't work with versions 1.53 or - earlier. To use the library it is necessary to first download JUCE to a - location where your development environment can find it. Or, you can use your - existing installation of JUCE. - - This library uses the same modularized organizational structure as JUCE. To - use a module, first add a path to the list of includes searched by your - development environment or project, which points to the Beast directory. Then, - add the single corresponding .c or .cpp file to your existing project which - already uses JUCE. For example, to use the @ref beast_core module, add the file - beast_core.cpp to your project. Some modules depend on other modules. - - To use a module, include the appropriate header from within your source code. - For example, to access classes in the @ref beast_concurrent module, use this: - - @code - - #include "modules/beast_concurrent/beast_concurrent.h" - - @endcode - - Then add the corresponding file beast_concurrent.cpp to your build. - - ## AppConfig - - Some Beast features can be controlled at compilation time through - preprocessor directives. The available choices of compilation options are - described in AppConfig.h, located in the AppConfigTemplate directory. Copy - the provided settings into your existing AppConfig.h (a file used by JUCE - convention). - - ## License - - This library contains portions of other open source products covered by - separate licenses. Please see the corresponding source files for specific - terms. - - Beast is provided under the terms of The MIT License (MIT): - - 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, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - 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. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - - Some files contain portions of these external projects, licensed separately: - - - [bZip2][7] is Copyright (C) 1996-2010 Julian R Seward. All rights - reserved. See the corresponding file LICENSE for licensing terms. - - - Portions of the software are Copyright (C) 1996-2001, 2006 by [The FreeType - Project][8]. All rights reserved. [FreeType][8] is distributed - under both the [GNU General Public License][5], or the - [FreeType License][9]. - - - Portions of this software are Copyright (C) 1994-2012 [Lua.org][10], PUC-Rio. - Lua is distributed under the terms of the [MIT License][11]. - - - [Luabridge][12] is Copyright (C) 2012 by Vinnie Falco and Copyrighted (C) - 2007 by Nathan Reed. [Luabridge][12] is distributed under the terms of the - [MIT License][11]. - - - [Soci][13] is Copyright (C) 2004-2008 Maciej Sobczak, Stephen Hutton, and - various others noted in the corresponding source files. Soci is distributed - under the [Boost Software License, Version 1.0][14]. - - - [SQLite][15], placed in the public domain. - - - [TagLib][16] is distributed under both the [GNU Lesser General Public License, - Version 2.1][17] and the [Mozilla Public License][18]. - - [0]: mailto:vinnie.falco@gmail.com "Vinnie Falco (Email)" - [1]: https://github.com/vinniefalco/Beast "Beast Project" - [2]: http://vinniefalco.github.com/Beast/ "Beast Documentation" - [3]: http://rawmaterialsoftware.com/juce.php "JUCE" - [4]: http://rawmaterialsoftware.com/ "Raw Material Software" - [5]: http://www.gnu.org/licenses/gpl-2.0.html "GNU General Public License, version 2" - [6]: http://rawmaterialsoftware.com/jucelicense.php "JUCE Licenses" - [7]: http://www.bzip.org/ "bZip2: Home" - [8]: http://freetype.org/ "The FreeType Project" - [9]: http://www.freetype.org/FTL.TXT "The FreeType Project License" - [10]: http://www.lua.org/ "The Programming Language Lua" - [11]: http://www.opensource.org/licenses/mit-license.html "The MIT License" - [12]: https://github.com/vinniefalco/LuaBridge - [13]: http://soci.sourceforge.net/ "SOCI" - [14]: http://www.boost.org/LICENSE_1_0.txt "Boost Software License, Version 1.0" - [15]: http://sqlite.org/ "SQLite Home Page" - [16]: http://developer.kde.org/~wheeler/taglib.html "TagLib" - [17]: http://www.gnu.org/licenses/lgpl-2.1.html "Gnu Lesser General Public License, version 2.1" - [18]: http://www.mozilla.org/MPL/1.1/ "Mozilla Public License" - - @copyright Copyright (C) 2008 by Vinnie Falco \ ([e-mail][0]) - @copyright Provided under the [MIT License][11] -*/ - -/*============================================================================*/ -/** - @internal - - Implementation classes. - - Thase classes are used internally. - - @defgroup internal internal -*/ - -/*============================================================================*/ -/** - External modules. - - These modules bring in functionality from third party or system libraries. - - @defgroup external external -*/ - -/*============================================================================*/ -/** - Core classes. - - This module provides core required functionality, and classes useful for - general development. All other modules require this module. - - @todo Discuss the treatment of exceptions versus Error objects in the library. - - @todo Discuss the additions to AppConfig.h - - @defgroup beast_core beast_core -*/ - -/* See the Juce notes regarding AppConfig.h - - This file must always be included before any Juce headers. - - There are some Beast specific build options that may be placed - into this file. See the AppConfig.h provided with Beast. -*/ - -/* BeastConfig.h must be included before this file */ - -/* Use sensible default configurations if they forgot - to append the necessary macros into their AppConfig.h. -*/ -#ifndef BEAST_USE_BOOST -#define BEAST_USE_BOOST 0 -#endif - -#ifndef BEAST_USE_BZIP2 -#define BEAST_USE_BZIP2 0 -#endif - -#ifndef BEAST_USE_NATIVE_SQLITE -#define BEAST_USE_NATIVE_SQLITE 1 -#endif - -#ifndef BEAST_USE_LEAKCHECKED -#define BEAST_USE_LEAKCHECKED BEAST_CHECK_MEMORY_LEAKS -#endif - -/* Get this early so we can use it. */ -#include "../beast_core/system/beast_TargetPlatform.h" - -#if BEAST_USE_BOOST -#include -#endif - -#if BEAST_MSVC -# include -# include - -#elif BEAST_IOS -# if BEAST_USE_BOOST -# include -# include -# else -# include // detect std::lib -# if _LIBCPP_VERSION // libc++ -# include -# else // libstdc++ (GNU) -# include -# endif -# endif - -#elif BEAST_MAC -# include // detect std::lib -# if _LIBCPP_VERSION // libc++ -# include -# else // libstdc++ (GNU) -# include -# endif - -#elif BEAST_LINUX -# include - -#else -# error Unnkown platform! - -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _CRTDBG_MAP_ALLOC -#error "MSVC C Runtime Debug Macros not supported" -#endif - -// If the MSVC debug heap headers were included, disable -// the macros during the juce include since they conflict. -#ifdef _CRTDBG_MAP_ALLOC -#include -#include -#include - -#pragma push_macro("calloc") -#pragma push_macro("free") -#pragma push_macro("malloc") -#pragma push_macro("realloc") -#pragma push_macro("_recalloc") -#pragma push_macro("_aligned_free") -#pragma push_macro("_aligned_malloc") -#pragma push_macro("_aligned_offset_malloc") -#pragma push_macro("_aligned_realloc") -#pragma push_macro("_aligned_recalloc") -#pragma push_macro("_aligned_offset_realloc") -#pragma push_macro("_aligned_offset_recalloc") -#pragma push_macro("_aligned_msize") - -#undef calloc -#undef free -#undef malloc -#undef realloc -#undef _recalloc -#undef _aligned_free -#undef _aligned_malloc -#undef _aligned_offset_malloc -#undef _aligned_realloc -#undef _aligned_recalloc -#undef _aligned_offset_realloc -#undef _aligned_offset_recalloc -#undef _aligned_msize -#endif - -#include "../beast_core/beast_core.h" - -#ifdef _CRTDBG_MAP_ALLOC -#pragma pop_macro("_aligned_msize") -#pragma pop_macro("_aligned_offset_recalloc") -#pragma pop_macro("_aligned_offset_realloc") -#pragma pop_macro("_aligned_recalloc") -#pragma pop_macro("_aligned_realloc") -#pragma pop_macro("_aligned_offset_malloc") -#pragma pop_macro("_aligned_malloc") -#pragma pop_macro("_aligned_free") -#pragma pop_macro("_recalloc") -#pragma pop_macro("realloc") -#pragma pop_macro("malloc") -#pragma pop_macro("free") -#pragma pop_macro("calloc") -#endif - -/** The Beast namespace. - - This namespace contains all Beast symbols. -*/ -namespace beast -{ - -// This group must come first since other files need it -#include "memory/beast_Uncopyable.h" -#include "diagnostic/beast_CatchAny.h" -#include "diagnostic/beast_Debug.h" -#include "diagnostic/beast_Error.h" -#include "diagnostic/beast_FPUFlags.h" -#include "diagnostic/beast_LeakChecked.h" -#include "diagnostic/beast_SafeBool.h" -#include "diagnostic/beast_Throw.h" - -#include "containers/beast_List.h" -#include "containers/beast_LockFreeStack.h" -#include "containers/beast_LockFreeQueue.h" -#include "containers/beast_SharedTable.h" -#include "containers/beast_SortedLookupTable.h" - -#include "events/beast_OncePerSecond.h" -#include "events/beast_PerformedAtExit.h" - -#include "functor/beast_Bind.h" -#include "functor/beast_Function.h" - -#include "math/beast_Interval.h" -#include "math/beast_Math.h" -#include "math/beast_MurmurHash.h" - -#include "memory/beast_MemoryAlignment.h" -#include "memory/beast_StaticObject.h" -#include "memory/beast_AtomicCounter.h" -#include "memory/beast_AtomicFlag.h" -#include "memory/beast_AtomicPointer.h" -#include "memory/beast_AtomicState.h" -#include "memory/beast_AllocatedBy.h" -#include "memory/beast_RefCountedSingleton.h" -#include "memory/beast_FifoFreeStore.h" -#if BEAST_USE_BOOST -#include "memory/beast_FifoFreeStoreWithTLS.h" -#else -#include "memory/beast_FifoFreeStoreWithoutTLS.h" -#endif -#include "memory/beast_GlobalFifoFreeStore.h" -#include "memory/beast_GlobalPagedFreeStore.h" -#include "memory/beast_PagedFreeStore.h" - -#if BEAST_MSVC -#pragma warning (push) -#pragma warning (disable: 4100) // unreferenced formal parmaeter -#pragma warning (disable: 4355) // 'this' used in base member -#endif -#include "memory/beast_CacheLine.h" -#if BEAST_MSVC -#pragma warning (pop) -#endif - -#include "threads/beast_Semaphore.h" -#include "threads/beast_SerialFor.h" -#include "threads/beast_SpinDelay.h" -#include "threads/beast_InterruptibleThread.h" -#include "threads/beast_ReadWriteMutex.h" -#include "threads/beast_ThreadGroup.h" -#include "threads/beast_CallQueue.h" -#include "threads/beast_ConcurrentObject.h" -#include "threads/beast_ConcurrentState.h" -#include "threads/beast_GlobalThreadGroup.h" -#include "threads/beast_Listeners.h" -#include "threads/beast_ManualCallQueue.h" -#include "threads/beast_ParallelFor.h" -#include "threads/beast_ThreadWithCallQueue.h" -#include "threads/beast_SharedObject.h" - -} - -#endif - diff --git a/Subtrees/beast/modules/beast_basics/containers/beast_List.h b/Subtrees/beast/modules/beast_basics/containers/beast_List.h deleted file mode 100644 index 00e90912f4..0000000000 --- a/Subtrees/beast/modules/beast_basics/containers/beast_List.h +++ /dev/null @@ -1,796 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LIST_BEASTHEADER -#define BEAST_LIST_BEASTHEADER - -struct ListDefaultTag; - -/*============================================================================*/ -/** - Intrusive Containers - - # Introduction - - Intrusive containers are special containers that offer better performance - and exception safety guarantees than non-intrusive containers (like the - STL containers). They are useful building blocks for high performance - concurrent systems or other purposes where allocations are restricted - (such as the AudioIODeviceCallback object), because intrusive list - operations do not allocate or free memory. - - While intrusive containers were and are widely used in C, they became more - and more forgotten in C++ due to the presence of the standard containers - which don't support intrusive techniques. VFLib not only reintroduces this - technique to C++ for lists, it also encapsulates the implementation in a - mostly compliant STL interface. Hence anyone familiar with standard - containers can easily use them. - - # Interface - - The interface for intrusive elements in this library is unified for all - containers. Unlike STL containers, objects placed into intrusive containers - are not copied. Instead, a pointer to the object is stored. All - responsibility for object lifetime is the responsibility of the caller; - the intrusive container just keeps track of what is in it. - - Summary of intrusive container differences: - - - Holds pointers to existing objects instead of copies. - - - Does not allocate or free any objects. - - - Requires a element's class declaration to be modified. - - - Methods never throw exceptions when called with valid arguments. - - # Usage - - Like STL containers, intrusive containers are all template based, where the - template argument specifies the type of object that the container will hold. - These declarations specify a doubly linked list where each element points - to a user defined class: - - @code - - class Object; // Forward declaration - - List list; // Doubly-linked list of Object - - @endcode - - Because intrusive containers allocate no memory, allowing objects to be - placed inside requires a modification to their class declaration. Each - intrusive container declares a nested class `Node` which elements must be - derived from, using the Curiously Recurring Template Pattern (CRTP). We - will continue to fully declare the Object type from the previous example - to support emplacement into an intrusive container: - - @code - - class Object : public List ::Node // Required for List - { - public: - void performAction (); - }; - - @endcode - - Usage of a typedef eliminates redundant specification of the template - arguments but requires a forward declaration. The following code is - equivalent. - - @code - - class Object; // Forward declaration - - // Specify template parameters just once - typedef List ListType; - - class Object : public ListType::Node - { - void performAction (); - }; - - ListType::Node list; - - @endcode - - With these declarations we may proceed to create our objects, add them to - the list, and perform operations: - - @code - - // Create a few objects and put them in the list - for (i = 0; i < 5; ++i) - list.push_back (*new Object); - - // Call a method on each list - for (ListType::iterator iter = list.begin(); iter != list.end (); ++iter) - iter->performAction (); - - @endcode - - Unlike regular STL containers, an object derived from an intrusive container - node cannot exist in more than one instance of that list at a time. This is - because the bookkeeping information for maintaining the list is kept in - the object rather than the list. - - To support objects existing in multiple containers, templates variations - are instantiated by distinguishing them with an empty structure, called a - tag. The object is derived from multiple instances of Node, where each - instance specifies a unique tag. The tag is passed as the second template - argument. When the second argument is unspecified, the default tag is used. - - This declaration example shows the usage of tags to allow an object to exist - simultaneously in two separate lists: - - @code - - struct GlobalListTag { }; // list of all objects - struct ActiveListTag { }; // subset of all objects that are active - - class Object : public List - , public List - { - public: - Object () : m_isActive (false) - { - // Add ourselves to the global list - s_globalList.push_front (*this); - } - - ~Object () - { - deactivate (); - } - - void becomeActive () - { - // Add ourselves to the active list - if (!m_isActive) - { - s_activeList.push_front (*this); - m_isActive = true; - } - } - - void deactivate () - { - if (m_isActive) - { - // Doesn't delete the object - s_activeList.erase (s_activeList.iterator_to (this)); - - m_isActive = false; - } - } - - private: - bool m_isActive; - - static List s_globalList; - static List s_activeList; - } - - @endcode - - @defgroup intrusive intrusive - @ingroup beast_core -*/ - -/*============================================================================*/ -/** - Intrusive doubly linked list. - - This intrusive List is a container similar in operation to std::list in the - Standard Template Library (STL). Like all @ref intrusive containers, List - requires you to first derive your class from List<>::Node: - - @code - - struct Object : List ::Node - { - Object (int value) : m_value (value) - { - } - - int m_value; - }; - - @endcode - - Now we define the list, and add a couple of items. - - @code - - List list; - - list.push_back (* (new Object (1))); - list.push_back (* (new Object (2))); - - @endcode - - For compatibility with the standard containers, push_back() expects a - reference to the object. Unlike the standard container, however, push_back() - places the actual object in the list and not a copy-constructed duplicate. - - Iterating over the list follows the same idiom as the STL: - - @code - - for (List ::iterator iter = list.begin(); iter != list.end; ++iter) - std::cout << iter->m_value; - - @endcode - - You can even use BOOST_FOREACH, or range based for loops: - - @code - - BOOST_FOREACH (Object& object, list) // boost only - std::cout << object.m_value; - - for (Object& object : list) // C++11 only - std::cout << object.m_value; - - @endcode - - Because List is mostly STL compliant, it can be passed into STL algorithms: - e.g. `std::for_each()` or `std::find_first_of()`. - - In general, objects placed into a List should be dynamically allocated - although this cannot be enforced at compile time. Since the caller provides - the storage for the object, the caller is also responsible for deleting the - object. An object still exists after being removed from a List, until the - caller deletes it. This means an element can be moved from one List to - another with practically no overhead. - - Unlike the standard containers, an object may only exist in one list at a - time, unless special preparations are made. The Tag template parameter is - used to distinguish between different list types for the same object, - allowing the object to exist in more than one list simultaneously. - - For example, consider an actor system where a global list of actors is - maintained, so that they can each be periodically receive processing - time. We wish to also maintain a list of the subset of actors that require - a domain-dependent update. To achieve this, we declare two tags, the - associated list types, and the list element thusly: - - @code - - struct Actor; // Forward declaration required - - struct ProcessTag { }; - struct UpdateTag { }; - - typedef List ProcessList; - typedef List UpdateList; - - // Derive from both node types so we can be in each list at once. - // - struct Actor : ProcessList::Node, UpdateList::Node - { - bool process (); // returns true if we need an update - void update (); - }; - - @endcode - - @tparam Element The base type of element which the list will store - pointers to. - - @tparam Tag An optional unique type name used to distinguish lists and nodes, - when the object can exist in multiple lists simultaneously. - - @ingroup beast_core intrusive -*/ -template -class List : Uncopyable -{ -public: - typedef int size_type; - - typedef Element value_type; - typedef Element& reference; - typedef Element const& const_reference; - typedef Element* pointer; - typedef Element const* const_pointer; - - class Node : Uncopyable - { - public: - Node () { } - - private: - friend class List; - Node* m_next; - Node* m_prev; - }; - -private: - template - class iterator_base : public std::iterator < - std::bidirectional_iterator_tag, int > - { - public: - typedef ElemType value_type; - typedef ElemType* pointer; - typedef ElemType& reference; - - iterator_base (NodeType* node = nullptr) : m_node (node) - { - } - - template - iterator_base (iterator_base const& other) - : m_node (other.m_node) - { - } - - template - iterator_base& operator= (iterator_base const& other) - { - m_node = other.m_node; - return *this; - } - - template - bool operator == (iterator_base const& other) const - { - return m_node == other.m_node; - } - - template - bool operator != (iterator_base const& other) const - { - return ! this->operator== (other); - } - - reference operator* () const - { - return dereference (); - } - - pointer operator-> () const - { - return &dereference (); - } - - iterator_base& operator++ () - { - increment (); - return *this; - } - - iterator_base operator++ (int) - { - iterator_base result (*this); - increment (); - return result; - } - - iterator_base& operator-- () - { - decrement (); - return *this; - } - - iterator_base operator-- (int) - { - iterator_base result (*this); - decrement (); - return result; - } - - private: - friend class List; - - NodeType* get_node () - { - return m_node; - } - - NodeType const* get_node () const - { - return m_node; - } - - reference dereference () const - { - return *static_cast (m_node); - } - - bool equal (NodeType* const* node) const - { - return m_node == node; - } - - void increment () - { - bassert (m_node->m_next); - m_node = m_node->m_next; - } - - void decrement () - { - bassert (m_node->m_prev && m_node->m_prev->m_prev != 0); - m_node = m_node->m_prev; - } - - private: - NodeType* m_node; - }; - -public: - /** A read/write List iterator. */ - typedef iterator_base iterator; - - /** A read-only List iterator. */ - typedef iterator_base const_iterator; - -public: - /** Create an empty list. */ - List () : m_size (0) - { - m_head.m_prev = nullptr; // identifies the head - m_tail.m_next = nullptr; // identifies the tail - clear (); - } - - /** Returns the number of elements in the list - - @return The number of elements in the list. - */ - size_type size () const - { - return m_size; - } - - /** Obtain a reference to the first element. - - @invariant The list may not be empty. - - @return A reference to the first element. - */ - reference front () - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - return element_from (m_head.m_next); - } - - /** Obtain a const reference to the first element. - - @invariant The list may not be empty. - - @return A const reference to the first element. - */ - const_reference front () const - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - return element_from (m_head.m_next); - } - - /** Obtain a reference to the last element. - - @invariant The list may not be empty. - - @return A reference to the last element. - */ - reference back () - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - return element_from (m_tail.m_prev); - } - - /** Obtain a const reference to the last element. - - @invariant The list may not be empty. - - @return A const reference to the last element. - */ - const_reference back () const - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - return element_from (m_tail.m_prev); - } - - /** Obtain an iterator to the beginning of the list. - - @return An iterator pointing to the beginning of the list. - */ - iterator begin () - { - return iterator (m_head.m_next); - } - - /** Obtain a const iterator to the beginning of the list. - - @return A const iterator pointing to the beginning of the list. - */ - const_iterator begin () const - { - return const_iterator (m_head.m_next); - } - - /** Obtain a const iterator to the beginning of the list. - - @return A const iterator pointing to the beginning of the list. - */ - const_iterator cbegin () const - { - return const_iterator (m_head.m_next); - } - - /** Obtain a iterator to the end of the list. - - @return An iterator pointing to the end of the list. - */ - iterator end () - { - return iterator (&m_tail); - } - - /** Obtain a const iterator to the end of the list. - - @return A constiterator pointing to the end of the list. - */ - const_iterator end () const - { - return const_iterator (&m_tail); - } - - /** Obtain a const iterator to the end of the list. - - @return A constiterator pointing to the end of the list. - */ - const_iterator cend () const - { - return const_iterator (&m_tail); - } - - /** Determine if the list is empty. - - @return `true` if the list is empty. - */ - bool empty () const - { - return m_head.m_next == &m_tail; - } - - /** Clear the list. - - @note This does not free the elements. - */ - void clear () - { - m_head.m_next = &m_tail; - m_tail.m_prev = &m_head; - m_size = 0; - } - - /** Insert an element. - - @invariant The element must not already be in the list. - - @param pos The location to insert after. - - @param elem The element to insert. - - @return An iterator pointing to the newly inserted element. - */ - iterator insert (iterator pos, Element& elem) - { - Node* node = node_from (elem); - node->m_next = pos.get_node (); - node->m_prev = node->m_next->m_prev; - node->m_next->m_prev = node; - node->m_prev->m_next = node; - ++m_size; - return iterator (node); - } - - /** Insert another list into this one. - - The other list is cleared. - - @param pos The location to insert after. - - @param other The list to insert. - */ - - void insert (iterator pos, List& other) - { - if (!other.empty ()) - { - Node* before = pos.get_node (); - other.m_head.m_next->m_prev = before->m_prev; - before->m_prev->m_next = other.m_head.m_next; - other.m_tail.m_prev->m_next = before; - before->m_prev = other.m_tail.m_prev; - m_size += other.m_size; - other.clear (); - } - } - - /** Remove an element. - - @invariant The element must exist in the list. - - @param pos An iterator pointing to the element to remove. - - @return An iterator pointing to the next element after the one removed. - */ - iterator erase (iterator pos) - { - Node* node = pos.get_node (); - ++pos; - node->m_next->m_prev = node->m_prev; - node->m_prev->m_next = node->m_next; - --m_size; - return pos; - } - - /** Insert an element at the beginning of the list. - - @invariant The element must not exist in the list. - - @param elem The element to insert. - */ - void push_front (Element& elem) - { - insert (begin (), elem); - } - - /** Remove the element at the beginning of the list. - - @invariant The list must not be empty. - */ - void pop_front () - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - erase (begin ()); - } - - /** Append an element at the end of the list. - - @invariant The element must not exist in the list. - - @param elem The element to append. - */ - void push_back (Element& elem) - { - insert (end (), elem); - } - - /** Remove the element at the end of the list. - - @invariant The list must not be empty. - */ - void pop_back () - { - if (empty ()) - Throw (Error ().fail (__FILE__, __LINE__, Error::noMoreData)); - - erase (--end ()); - } - - /** Swap contents with another list. - */ - void swap (List& other) - { - List temp; - temp.append (other); - other.append (*this); - append (temp); - } - - /** Insert another list at the beginning of this list. - - The other list is cleared. - - @param list The other list to insert. - */ - void prepend (List& list) - { - insert (begin (), list); - } - - /** Append another list at the end of this list. - - The other list is cleared. - - @param list the other list to append. - */ - void append (List& list) - { - insert (end (), list); - } - - /** Obtain an iterator from an element. - - @invariant The element must exist in the list. - - @param elem The element to obtain an iterator for. - - @return An iterator to the element. - */ - iterator iterator_to (Element& elem) const - { - return iterator (static_cast (&elem)); - } - - /** Obtain a const iterator from an element. - - @invariant The element must exist in the list. - - @param elem The element to obtain an iterator for. - - @return A const iterator to the element. - */ - const_iterator const_iterator_to (Element const& elem) const - { - return const_iterator (static_cast (&elem)); - } - -private: - inline reference element_from (Node* node) - { - return * (static_cast (node)); - } - - inline const_reference element_from (Node const* node) const - { - return * (static_cast (node)); - } - - inline Node* node_from (Element& elem) - { - return static_cast (&elem); - } - - inline Node const* node_from (Element const& elem) const - { - return static_cast (&elem); - } - -private: - size_type m_size; - Node m_head; - Node m_tail; -}; - -/** - Default tag for List. - - @ingroup beast_core intrusive -*/ -struct ListDefaultTag { }; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeQueue.h b/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeQueue.h deleted file mode 100644 index 28d51c6c7d..0000000000 --- a/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeQueue.h +++ /dev/null @@ -1,226 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LOCKFREEQUEUE_BEASTHEADER -#define BEAST_LOCKFREEQUEUE_BEASTHEADER - -#include "../memory/beast_CacheLine.h" -#include "../memory/beast_AtomicPointer.h" -#include "../threads/beast_SpinDelay.h" - -struct LockFreeQueueDefaultTag; - -/*============================================================================*/ -/** - Multiple Producer, Single Consumer (MPSC) intrusive FIFO. - - This container uses the same intrusive interface as List. It is wait-free - for producers and lock-free for consumers. The caller is responsible for - preventing the ABA problem (http://en.wikipedia.org/wiki/ABA_problem) - - Invariants: - - - Any thread may call push_back() at any time (Multiple Producer). - - - Only one thread may call try_pop_front() at a time (Single Consumer) - - - The queue is signaled if there are one or more elements. - - @param Tag A type name used to distinguish lists and nodes, for - putting objects in multiple lists. If this parameter is - omitted, the default tag is used. - - @ingroup beast_core intrusive -*/ -template -class LockFreeQueue -{ -public: - class Node : Uncopyable - { - public: - Node () { } - explicit Node (Node* next) : m_next (next) { } - - AtomicPointer m_next; - }; - -public: - /** Create an empty list. - */ - LockFreeQueue () - : m_head (&m_null) - , m_tail (&m_null) - , m_null (nullptr) - { - } - - /** Determine if the list is empty. - - This is not thread safe, the caller must synchronize. - - @return true if the list is empty. - */ - bool empty () const - { - return (m_head.get () == m_tail); - } - - /** Put an element into the list. - - This operation is wait-free. - - @param node The element to enqueue. - - @return true if the list was previously empty. - */ - bool push_back (Node* node) - { - node->m_next.set (0); - - Node* prev = m_head.exchange (node); - - // (*) If a try_pop_front() happens at this point, it might not see the - // element we are pushing. This only happens when the list is empty, - // and furthermore it is detectable. - - prev->m_next.set (node); - - return prev == &m_null; - } - - /** Retrieve an element from the list. - - This operation is lock-free. - - @return The element, or nullptr if the list was empty. - */ - Element* pop_front () - { - Element* elem; - - // Avoid the SpinDelay ctor if possible - if (!try_pop_front (&elem)) - { - SpinDelay delay; - - do - { - delay.pause (); - } - while (!try_pop_front (&elem)); - } - - return elem; - } - - /** Attempt to retrieve an element. - - This attempts to pop an element from the front of the list. The return - value indicates if the operation was successful. An operation is - successful if there is no contention for the list. On a successful - operation, an element is returned if the list was non empty, else nullptr - is returned. On failure, the returned element is undefined. - - This operation is wait-free. - - @param[out] pElem The element that was retrieved, or nullptr if the - list was empty. - - @return true if the list was uncontended. - */ - bool try_pop_front (Element** pElem) - { - Node* tail = m_tail; - Node* next = tail->m_next.get (); - - if (tail == &m_null) - { - if (next == 0) - { - // (*) If a push_back() happens at this point, - // we might not see the element. - - if (m_head.get () == tail) - { - *pElem = nullptr; - return true; // success, but queue empty - } - else - { - return false; // failure: a push_back() caused contention - } - } - - m_tail = next; - tail = next; - next = next->m_next.get (); - } - - if (next) - { - m_tail = next; - *pElem = static_cast (tail); - return true; - } - - Node* head = m_head.get (); - - if (tail == head) - { - push_back (&m_null); - next = tail->m_next.get (); - - if (next) - { - m_tail = next; - *pElem = static_cast (tail); - return true; - } - } - - // (*) If a push_back() happens at this point, - // we might not see the element. - - if (head == m_tail) - { - *pElem = nullptr; - return true; // success, but queue empty - } - else - { - return false; // failure: a push_back() caused contention - } - } - -private: - // Elements are pushed on to the head and popped from the tail. - AtomicPointer m_head; - Node* m_tail; - Node m_null; -}; - -/*============================================================================*/ -/** Default tag for LockFreeQueue - - @ingroup beast_core intrusive -*/ -struct LockFreeQueueDefaultTag { }; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeStack.h b/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeStack.h deleted file mode 100644 index 606163a29e..0000000000 --- a/Subtrees/beast/modules/beast_basics/containers/beast_LockFreeStack.h +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LOCKFREESTACK_BEASTHEADER -#define BEAST_LOCKFREESTACK_BEASTHEADER - -#include "../memory/beast_AtomicPointer.h" - -struct LockFreeStackDefaultTag; - -/*============================================================================*/ -/** - Multiple Producer, Multiple Consumer (MPMC) intrusive stack. - - This stack is implemented using the same intrusive interface as List. All - operations are lock-free. - - The caller is responsible for preventing the "ABA" problem - (http://en.wikipedia.org/wiki/ABA_problem) - - @param Tag A type name used to distinguish lists and nodes, for - putting objects in multiple lists. If this parameter is - omitted, the default tag is used. - - @ingroup beast_core intrusive -*/ -template -class LockFreeStack : Uncopyable -{ -public: - class Node : Uncopyable - { - public: - Node () - { - } - - explicit Node (Node* next) : m_next (next) - { - } - - private: - friend class LockFreeStack; - - AtomicPointer m_next; - }; - -public: - LockFreeStack () : m_head (0) - { - } - - /** Create a LockFreeStack from another stack. - - The contents of the other stack are atomically acquired. - The other stack is cleared. - - @param other The other stack to acquire. - */ - explicit LockFreeStack (LockFreeStack& other) - { - Node* head; - - do - { - head = other.m_head.get (); - } - while (!other.m_head.compareAndSet (0, head)); - - m_head = head; - } - - /** Push a node onto the stack. - - The caller is responsible for preventing the ABA problem. This operation - is lock-free. - - @param node The node to push. - - @return True if the stack was previously empty. If multiple threads - are attempting to push, only one will receive true. - */ - bool push_front (Node* node) - { - bool first; - Node* head; - - do - { - head = m_head.get (); - first = head == 0; - node->m_next = head; - } - while (!m_head.compareAndSet (node, head)); - - return first; - } - - /** Pop an element off the stack. - - The caller is responsible for preventing the ABA problem. This operation - is lock-free. - - @return The element that was popped, or nullptr if the stack was empty. - */ - Element* pop_front () - { - Node* node; - Node* head; - - do - { - node = m_head.get (); - - if (node == 0) - break; - - head = node->m_next.get (); - } - while (!m_head.compareAndSet (head, node)); - - return node ? static_cast (node) : nullptr; - } - - /** Swap the contents of this stack with another stack. - - This call is not thread safe or atomic. The caller is responsible for - synchronizing access. - - @param other The other stack to swap contents with. - */ - void swap (LockFreeStack& other) - { - Node* temp = other.m_head.get (); - other.m_head.set (m_head.get ()); - m_head.set (temp); - } - -private: - AtomicPointer m_head; -}; - -/*============================================================================*/ -/** Default tag for LockFreeStack - - @ingroup beast_core intrusive -*/ -struct LockFreeStackDefaultTag { }; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/containers/beast_SharedTable.h b/Subtrees/beast/modules/beast_basics/containers/beast_SharedTable.h deleted file mode 100644 index 9e76c155fc..0000000000 --- a/Subtrees/beast/modules/beast_basics/containers/beast_SharedTable.h +++ /dev/null @@ -1,213 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SHAREDTABLE_BEASTHEADER -#define BEAST_SHAREDTABLE_BEASTHEADER - -/** Handle to a reference counted fixed size table. - - @note Currently, ElementType must be an aggregate of POD. - - @tparam ElementType The type of element. - - @ingroup beast_gui -*/ -template -class SharedTable -{ -public: - typedef ElementType Entry; - - static SharedTable const null; - - /** Creates a null table. - */ - SharedTable () - { - } - - /** Creates a table with the specified number of entries. - - The entries are uninitialized. - - @param numEntries The number of entries in the table. - - @todo Initialize the data if ElementType is not POD. - */ - explicit SharedTable (int numEntries) - : m_data (new Data (numEntries)) - { - } - - /** Creates a shared reference to another table. - */ - SharedTable (SharedTable const& other) - : m_data (other.m_data) - { - } - - /** Makes this table refer to another table. - */ - SharedTable& operator= (SharedTable const& other) - { - m_data = other.m_data; - return *this; - } - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - SharedTable (SharedTable&& other) noexcept -: - m_data (static_cast < typename Data::Ptr&& > (other.m_data)) - { - } - - SharedTable& operator= (SharedTable && other) noexcept - { - m_data = static_cast < typename Data::Ptr && > (other.m_data); - return *this; - } -#endif - - /** Destructor. - */ - ~SharedTable () - { - } - - /** Returns true if the two tables share the same set of entries. - */ - bool operator== (SharedTable const& other) const noexcept - { - return m_data == other.m_data; - } - - /** Returns true if the two tables do not share the same set of entries. - */ - bool operator!= (SharedTable const& other) const noexcept - { - return m_data != other.m_data; - } - - /** Returns true if the table is not null. - */ - inline bool isValid () const noexcept - { - return m_data != nullptr; - } - - /** Returns true if the table is null. - */ - inline bool isNull () const noexcept - { - return m_data == nullptr; - } - - /** Returns the number of tables referring to the same shared entries. - */ - int getReferenceCount () const noexcept - { - return m_data == nullptr ? 0 : m_data->getReferenceCount (); - } - - /** Create a physical duplicate of the table. - */ - SharedTable createCopy () const - { - return SharedTable (m_data != nullptr ? m_data->clone () : nullptr); - } - - /** Makes sure no other tables share the same entries as this table. - */ - void duplicateIfShared () - { - if (m_data != nullptr && m_data->getReferenceCount () > 1) - m_data = m_data->clone (); - } - - /** Return the number of entries in this table. - */ - inline int getNumEntries () const noexcept - { - return m_data->getNumEntries (); - } - - /** Retrieve a table entry. - - @param index The index of the entry, from 0 to getNumEntries (). - */ - inline ElementType& operator [] (int index) const noexcept - { - return m_data->getReference (index); - } - -private: - class Data : public ReferenceCountedObject - { - public: - typedef ReferenceCountedObjectPtr Ptr; - - explicit Data (int numEntries) - : m_numEntries (numEntries) - , m_table (numEntries) - { - } - - inline Data* clone () const - { - Data* data = new Data (m_numEntries); - - memcpy ( - data->m_table.getData (), - m_table.getData (), - m_numEntries * sizeof (ElementType)); - - return data; - } - - inline int getNumEntries () const - { - return m_numEntries; - } - - inline ElementType& getReference (int index) const - { - bassert (index >= 0 && index < m_numEntries); - return m_table [index]; - } - - private: - int const m_numEntries; - HeapBlock const m_table; - }; - - explicit SharedTable (Data* data) - : m_data (data) - { - } - - ReferenceCountedObjectPtr m_data; -}; - -template -SharedTable const SharedTable ::null; - -#endif - -//------------------------------------------------------------------------------ - diff --git a/Subtrees/beast/modules/beast_basics/containers/beast_SortedLookupTable.h b/Subtrees/beast/modules/beast_basics/containers/beast_SortedLookupTable.h deleted file mode 100644 index cdfd3e4539..0000000000 --- a/Subtrees/beast/modules/beast_basics/containers/beast_SortedLookupTable.h +++ /dev/null @@ -1,156 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SORTEDLOOKUPTABLE_BEASTHEADER -#define BEAST_SORTEDLOOKUPTABLE_BEASTHEADER - -//============================================================================== -/** - Sorted map for fast lookups. - - This container is optimized for a data set with fixed elements. - - SchemaType obeys this concept: - - @code - - struct SchemaType - { - typename KeyType; - typename ValueType; - - // Retrieve the key for a specified value. - KeyType getKey (Value const& value); - }; - - @endcode - - To use the table, reserve space with reserveSpaceForValues() if the number - of elements is known ahead of time. Then, call insert() for all the your - elements. Call prepareForLookups() once then call lookupValueByKey () -*/ -template -class SortedLookupTable -{ -private: - typedef typename SchemaType::KeyType KeyType; - typedef typename SchemaType::ValueType ValueType; - - typedef std::vector values_t; - - values_t m_values; - -private: - struct SortCompare - { - bool operator () (ValueType const& lhs, ValueType const& rhs) const - { - return SchemaType ().getKey (lhs) < SchemaType ().getKey (rhs); - } - }; - - struct FindCompare - { - bool operator () (ValueType const& lhs, ValueType const& rhs) - { - return SchemaType ().getKey (lhs) < SchemaType ().getKey (rhs); - } - - bool operator () (KeyType const& key, ValueType const& rhs) - { - return key < SchemaType ().getKey (rhs); - } - - bool operator () (ValueType const& lhs, KeyType const& key) - { - return SchemaType ().getKey (lhs) < key; - } - }; - -public: - typedef typename values_t::size_type size_type; - - /** Reserve space for values. - - Although not necessary, this can help with memory usage if the - number of values is known ahead of time. - - @param numberOfValues The amount of space to reserve. - */ - void reserveSpaceForValues (size_type numberOfValues) - { - m_values.reserve (numberOfValues); - } - - /** Insert a value into the index. - - @invariant The value must not already exist in the index. - - @param valueToInsert The value to insert. - */ - void insert (ValueType const& valueToInsert) - { - m_values.push_back (valueToInsert); - } - - /** Prepare the index for lookups. - - This must be called at least once after calling insert() - and before calling find(). - */ - void prepareForLookups () - { - std::sort (m_values.begin (), m_values.end (), SortCompare ()); - } - - /** Find the value for a key. - - Quickly locates a value matching the key, or returns false - indicating no value was found. - - @invariant You must call prepareForLookups() once, after all - insertions, before calling this function. - - @param key The key to locate. - @param pFoundValue Pointer to store the value if a matching - key was found. - @return `true` if the value was found. - */ - bool lookupValueByKey (KeyType const& key, ValueType* pFoundValue) - { - bool found; - - std::pair result = - std::equal_range (m_values.begin (), m_values.end (), key, FindCompare ()); - - if (result.first != result.second) - { - *pFoundValue = *result.first; - found = true; - } - else - { - found = false; - } - - return found; - } -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.cpp b/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.cpp deleted file mode 100644 index 3577550406..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.cpp +++ /dev/null @@ -1,276 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if 0 -#include - -//------------------------------------------------------------------------------ -// -// Windows structured exception handling -// -#if BEAST_MSVC - -#include - -namespace vf -{ - -namespace -{ - -// -// While this object is in scope, any Windows SEH -// exceptions will be caught and re-thrown as an Error object. -// -class ScopedPlatformExceptionCatcher : Uncopyable -{ -public: - ScopedPlatformExceptionCatcher () - { - //s_mutex.enter (); - - if (++s_count == 1) - s_sehPrev = ::SetUnhandledExceptionFilter (sehFilter); - - //s_mutex.exit (); - } - - ~ScopedPlatformExceptionCatcher () - { - //s_mutex.enter (); - - if (--s_count == 0) - SetUnhandledExceptionFilter (s_sehPrev); - - //s_mutex.exit (); - } - - static LONG WINAPI sehFilter (_EXCEPTION_POINTERS* ei) - { - EXCEPTION_RECORD* er = ei->ExceptionRecord; - - if (er->ExceptionCode == EXCEPTION_BREAKPOINT || - er->ExceptionCode == EXCEPTION_SINGLE_STEP) - { - // pass through - } - else - { - String s; - - switch (er->ExceptionCode) - { - case EXCEPTION_ACCESS_VIOLATION: - s = TRANS ("an access violation occurred"); - break; - - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - s = TRANS ("array bounds were exceeded"); - break; - - case EXCEPTION_DATATYPE_MISALIGNMENT: - s = TRANS ("memory access was unaligned"); - break; - - case EXCEPTION_FLT_DENORMAL_OPERAND: - s = TRANS ("a floating point operation produced a denormal"); - break; - - case EXCEPTION_FLT_DIVIDE_BY_ZERO: - s = TRANS ("a floating point divide by zero was attempted"); - break; - - case EXCEPTION_FLT_INEXACT_RESULT: - s = TRANS ("the floating point operation was unrepresentable"); - break; - - case EXCEPTION_FLT_INVALID_OPERATION: - s = TRANS ("the floating point operation was invalid"); - break; - - case EXCEPTION_FLT_OVERFLOW: - s = TRANS ("the floating point operation overflowed"); - break; - - case EXCEPTION_FLT_STACK_CHECK: - s = TRANS ("a stack check resulted from a floating point operation"); - break; - - case EXCEPTION_FLT_UNDERFLOW: - s = TRANS ("the floating point operation underflowed"); - break; - - case EXCEPTION_ILLEGAL_INSTRUCTION: - s = TRANS ("an invalid instruction was received"); - break; - - case EXCEPTION_IN_PAGE_ERROR: - s = TRANS ("a virtual paging error occurred"); - break; - - case EXCEPTION_INT_DIVIDE_BY_ZERO: - s = TRANS ("an integer divide by zero was attempted"); - break; - - case EXCEPTION_INT_OVERFLOW: - s = TRANS ("an integer operation overflowed"); - break; - - case EXCEPTION_INVALID_DISPOSITION: - s = TRANS ("the exception handler returned an invalid disposition"); - break; - - case EXCEPTION_NONCONTINUABLE_EXCEPTION: - s = TRANS ("a non-continuable exception occurred"); - break; - - case EXCEPTION_PRIV_INSTRUCTION: - s = TRANS ("a privileged instruction was attempted"); - break; - - case EXCEPTION_STACK_OVERFLOW: - s = TRANS ("the stack overflowed"); - break; - - default: - s = TRANS ("an unknown system exception of code "); - s << String ((unsigned int)er->ExceptionCode); - s << " " << TRANS ("occurred"); - break; - } - - Throw (Error ().fail (__FILE__, __LINE__, s, Error::platform)); - } - - return s_sehPrev (ei); - } - -private: - static int s_count; - static CriticalSection s_mutex; - static LPTOP_LEVEL_EXCEPTION_FILTER s_sehPrev; -}; - -CriticalSection ScopedPlatformExceptionCatcher::s_mutex; -int ScopedPlatformExceptionCatcher::s_count = 0; -LPTOP_LEVEL_EXCEPTION_FILTER ScopedPlatformExceptionCatcher::s_sehPrev = 0; - -} - -} - -//------------------------------------------------------------------------------ - -#else - -// TODO: POSIX SIGNAL HANDLER - -#pragma message(BEAST_FILEANDLINE_ "Missing class ScopedPlatformExceptionCatcher") - -namespace vf -{ - -namespace -{ - -class ScopedPlatformExceptionCatcher -{ -public: - // Missing -}; - -} - -END_BEAST_NAMESPACE - -#endif - -#endif - -//------------------------------------------------------------------------------ - -bool CatchAny (Function f, bool returnFromException) -{ - bool caughtException = true; // assume the worst - -#if 0 - try - { - //ScopedPlatformExceptionCatcher platformExceptionCatcher; - - f (); - - caughtException = false; - } - catch (Error& e) - { - if (!returnFromException) - { - JUCEApplication* app = JUCEApplication::getInstance (); - - if (app) - { - app->unhandledException ( - &e, - e.getSourceFilename (), - e.getLineNumber ()); - } - else - { - std::cout << e.what (); - std::unexpected (); - } - } - } - catch (std::exception& e) - { - if (!returnFromException) - { - JUCEApplication* app = JUCEApplication::getInstance (); - - if (app) - { - app->unhandledException (&e, __FILE__, __LINE__); - } - else - { - std::cout << e.what (); - std::unexpected (); - } - } - } - catch (...) - { - if (!returnFromException) - { - JUCEApplication* app = JUCEApplication::getInstance (); - - if (app) - { - app->unhandledException (0, __FILE__, __LINE__); - } - else - { - std::unexpected (); - } - } - } -#endif - return caughtException; -} diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.h deleted file mode 100644 index 0d8e3ebecc..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_CatchAny.h +++ /dev/null @@ -1,56 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CATCHANY_BEASTHEADER -#define BEAST_CATCHANY_BEASTHEADER - -#include "../functor/beast_Function.h" - -/** - Exception catcher. - - Executes the function and catches any exception. - In addition to C++ exceptions, this will also catch - any platform-specific exceptions. For example, SEH - (Structured Exception Handling) on Windows, or POSIX - signals if they are available. - - If returnFromException is false then a framework - specific unhandled exception handler will be called. - Otherwise, this function will return true if it - catches something or else false. - - The return value approach is useful for detecting - when outside code fails (for example, a VST plugin), - and disabling its future use for example. - - @todo Remove dependence on the JUCEApplication object and remove beast_gui_basics.h from beast_core.cpp - - @param f The function to call. - - @param returnFromException `false` if exceptions should terminate the app. - - @return `true` if an exception was caught. - - @ingroup beast_core -*/ -extern bool CatchAny (Function f, - bool returnFromException = false); - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.cpp b/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.cpp deleted file mode 100644 index 9cf37f37b1..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.cpp +++ /dev/null @@ -1,255 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace Debug -{ - -//------------------------------------------------------------------------------ - -bool isDebuggerAttached () -{ - return beast_isRunningUnderDebugger (); -} - -//------------------------------------------------------------------------------ - -#if BEAST_DEBUG && defined (beast_breakDebugger) -void breakPoint () -{ - if (isDebuggerAttached ()) - beast_breakDebugger; -} - -#else -void breakPoint () -{ - bassertfalse -} - -#endif - -//---------------------------------------------------------------------------- - -#if BEAST_MSVC && defined (_DEBUG) - -void setHeapAlwaysCheck (bool bAlwaysCheck) -{ - int flags = _CrtSetDbgFlag (_CRTDBG_REPORT_FLAG); - - if (bAlwaysCheck) flags |= _CRTDBG_CHECK_ALWAYS_DF; // on - else flags &= ~_CRTDBG_CHECK_ALWAYS_DF; // off - - _CrtSetDbgFlag (flags); -} - -void setHeapDelayedFree (bool bDelayedFree) -{ - int flags = _CrtSetDbgFlag (_CRTDBG_REPORT_FLAG); - - if (bDelayedFree) flags |= _CRTDBG_DELAY_FREE_MEM_DF; // on - else flags &= ~_CRTDBG_DELAY_FREE_MEM_DF; // off - - _CrtSetDbgFlag (flags); -} - -void setHeapReportLeaks (bool bReportLeaks) -{ - int flags = _CrtSetDbgFlag (_CRTDBG_REPORT_FLAG); - - if (bReportLeaks) flags |= _CRTDBG_LEAK_CHECK_DF; // on - else flags &= ~_CRTDBG_LEAK_CHECK_DF; // off - - _CrtSetDbgFlag (flags); -} - -void checkHeap () -{ - _CrtCheckMemory (); -} - -#else - -void setHeapAlwaysCheck (bool) -{ -} - -void setHeapDelayedFree (bool) -{ -} - -void setHeapReportLeaks (bool) -{ -} - -void checkHeap () -{ -} - -#endif - -//------------------------------------------------------------------------------ - -const String getFileNameFromPath (const char* sourceFileName) -{ - return File::createFileWithoutCheckingPath (sourceFileName).getFileName (); -} - -// Returns a String with double quotes escaped -static const String withEscapedQuotes (String const& string) -{ - String escaped; - - int i0 = 0; - int i; - - do - { - i = string.indexOfChar (i0, '"'); - - if (i == -1) - { - escaped << string.substring (i0, string.length ()); - } - else - { - escaped << string.substring (i0, i) << "\\\""; - i0 = i + 1; - } - } - while (i != -1); - - return escaped; -} - -// Converts escaped quotes back into regular quotes -static const String withUnescapedQuotes (String const& string) -{ - String unescaped; - - int i0 = 0; - int i; - - do - { - i = string.indexOfChar (i0, '\\'); - - if (i == -1) - { - unescaped << string.substring (i0, string.length ()); - } - else - { - // peek - if (string.length () > i && string[i + 1] == '\"') - { - unescaped << string.substring (i0, i) << '"'; - i0 = i + 2; - } - else - { - unescaped << string.substring (i0, i + 1); - i0 = i + 1; - } - } - } - while (i != -1); - - return unescaped; -} - -// Converts a String that may contain newlines, into a -// command line where each line is delimited with quotes. -// Any quotes in the actual string will be escaped via \". -String stringToCommandLine (String const& string) -{ - String commandLine; - - int i0 = 0; - int i; - - for (i = 0; i < string.length (); i++) - { - beast_wchar c = string[i]; - - if (c == '\n') - { - if (i0 != 0) - commandLine << ' '; - - commandLine << '"' << withEscapedQuotes (string.substring (i0, i)) << '"'; - i0 = i + 1; - } - } - - if (i0 < i) - { - if (i0 != 0) - commandLine << ' '; - - commandLine << '"' << withEscapedQuotes (string.substring (i0, i)) << '"'; - } - - return commandLine; -} - -// Converts a command line consisting of multiple quoted strings -// back into a single string with newlines delimiting each quoted -// string. Escaped quotes \" are turned into real quotes. -String commandLineToString (const String& commandLine) -{ - String string; - - bool quoting = false; - int i0 = 0; - int i; - - for (i = 0; i < commandLine.length (); i++) - { - beast_wchar c = commandLine[i]; - - if (c == '\\') - { - // peek - if (commandLine.length () > i && commandLine[i + 1] == '\"') - { - i++; - } - } - else if (c == '"') - { - if (!quoting) - { - i0 = i + 1; - quoting = true; - } - else - { - if (!string.isEmpty ()) - string << '\n'; - - string << withUnescapedQuotes (commandLine.substring (i0, i)); - quoting = false; - } - } - } - - return string; -} - -} diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.h deleted file mode 100644 index 205bcb0bab..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Debug.h +++ /dev/null @@ -1,56 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_DEBUG_BEASTHEADER -#define BEAST_DEBUG_BEASTHEADER - -// Auxiliary outines for debugging - -namespace Debug -{ - -// Returns true if a debugger is attached, for any build. -extern bool isDebuggerAttached (); - -// Breaks to the debugger if a debugger is attached. -extern void breakPoint (); - -// VF: IS THIS REALLY THE RIGHT PLACE FOR THESE?? - -// Return only the filename portion of sourceFileName -// This hides the programmer's directory structure from end-users. -const String getFileNameFromPath (const char* sourceFileName); - -// Convert a String that may contain double quotes and newlines -// into a String with double quotes escaped as \" and each -// line as a separate quoted command line argument. -String stringToCommandLine (const String& s); - -// Convert a quoted and escaped command line back into a String -// that can contain newlines and double quotes. -String commandLineToString (const String& commandLine); - -extern void setHeapAlwaysCheck (bool bAlwaysCheck); -extern void setHeapDelayedFree (bool bDelayedFree); -extern void setHeapReportLeaks (bool bReportLeaks); -extern void checkHeap (); - -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.cpp b/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.cpp deleted file mode 100644 index 1b6952cccc..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.cpp +++ /dev/null @@ -1,243 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Error::Error () - : m_code (success) - , m_lineNumber (0) - , m_needsToBeChecked (true) - , m_szWhat (0) -{ -} - -Error::Error (const Error& other) - : m_code (other.m_code) - , m_reasonText (other.m_reasonText) - , m_sourceFileName (other.m_sourceFileName) - , m_lineNumber (other.m_lineNumber) - , m_needsToBeChecked (true) - , m_szWhat (0) -{ - other.m_needsToBeChecked = false; -} - -Error::~Error () noexcept -{ - /* If this goes off it means an error object was created but never tested */ - bassert (!m_needsToBeChecked); -} - -Error& Error::operator= (const Error& other) -{ - m_code = other.m_code; - m_reasonText = other.m_reasonText; - m_sourceFileName = other.m_sourceFileName; - m_lineNumber = other.m_lineNumber; - m_needsToBeChecked = true; - m_what = String::empty; - m_szWhat = 0; - - other.m_needsToBeChecked = false; - - return *this; -} - -Error::Code Error::code () const -{ - m_needsToBeChecked = false; - return m_code; -} - -bool Error::failed () const -{ - return code () != success; -} - -bool Error::asBoolean () const -{ - return code () != success; -} - -const String Error::getReasonText () const -{ - return m_reasonText; -} - -const String Error::getSourceFilename () const -{ - return m_sourceFileName; -} - -int Error::getLineNumber () const -{ - return m_lineNumber; -} - -Error& Error::fail (const char* sourceFileName, - int lineNumber, - const String reasonText, - Code errorCode) -{ - bassert (m_code == success); - bassert (errorCode != success); - - m_code = errorCode; - m_reasonText = reasonText; - m_sourceFileName = Debug::getFileNameFromPath (sourceFileName); - m_lineNumber = lineNumber; - m_needsToBeChecked = true; - - return *this; -} - -Error& Error::fail (const char* sourceFileName, - int lineNumber, - Code errorCode) -{ - return fail (sourceFileName, - lineNumber, - getReasonTextForCode (errorCode), - errorCode); -} - -void Error::reset () -{ - m_code = success; - m_reasonText = String::empty; - m_sourceFileName = String::empty; - m_lineNumber = 0; - m_needsToBeChecked = true; - m_what = String::empty; - m_szWhat = 0; -} - -void Error::willBeReported () const -{ - m_needsToBeChecked = false; -} - -const char* Error::what () const noexcept -{ - if (!m_szWhat) - { - // The application could not be initialized because sqlite was denied access permission - // The application unexpectedly quit because the exception 'sqlite was denied access permission at file ' was thrown - m_what << - m_reasonText << " " << - TRANS ("at file") << " '" << - m_sourceFileName << "' " << - TRANS ("line") << " " << - String (m_lineNumber) << " " << - TRANS ("with code") << " = " << - String (m_code); - - m_szWhat = (const char*)m_what.toUTF8 (); - } - - return m_szWhat; -} - -const String Error::getReasonTextForCode (Code code) -{ - String s; - - switch (code) - { - case success: - s = TRANS ("the operation was successful"); - break; - - case general: - s = TRANS ("a general error occurred"); - break; - - case canceled: - s = TRANS ("the operation was canceled"); - break; - - case exception: - s = TRANS ("an exception was thrown"); - break; - - case unexpected: - s = TRANS ("an unexpected result was encountered"); - break; - - case platform: - s = TRANS ("a system exception was signaled"); - break; - - case noMemory: - s = TRANS ("there was not enough memory"); - break; - - case noMoreData: - s = TRANS ("the end of data was reached"); - break; - - case invalidData: - s = TRANS ("the data is corrupt or invalid"); - break; - - case bufferSpace: - s = TRANS ("the buffer is too small"); - break; - - case badParameter: - s = TRANS ("one or more parameters were invalid"); - break; - - case assertFailed: - s = TRANS ("an assertion failed"); - break; - - case fileInUse: - s = TRANS ("the file is in use"); - break; - - case fileExists: - s = TRANS ("the file exists"); - break; - - case fileNoPerm: - s = TRANS ("permission was denied"); - break; - - case fileIOError: - s = TRANS ("an I/O or device error occurred"); - break; - - case fileNoSpace: - s = TRANS ("there is no space left on the device"); - break; - - case fileNotFound: - s = TRANS ("the file was not found"); - break; - - case fileNameInvalid: - s = TRANS ("the file name was illegal or malformed"); - break; - - default: - s = TRANS ("an unknown error code was received"); - break; - } - - return s; -} diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.h deleted file mode 100644 index 1d67ffa314..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Error.h +++ /dev/null @@ -1,126 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ERROR_BEASTHEADER -#define BEAST_ERROR_BEASTHEADER - -#include "beast_SafeBool.h" - -/** - A concise error report. - - This lightweight but flexible class records lets you record the file and - line where a recoverable error occurred, along with some optional human - readable text. - - A recoverable error can be passed along and turned into a non recoverable - error by throwing the object: it's derivation from std::exception is - fully compliant with the C++ exception interface. - - @ingroup beast_core -*/ -class Error - : public std::exception - , public SafeBool -{ -public: - /** Numeric code. - - This enumeration is useful when the caller needs to take different - actions depending on the failure. For example, trying again later if - a file is locked. - */ - enum Code - { - success, //!< "the operation was successful" - - general, //!< "a general error occurred" - - canceled, //!< "the operation was canceled" - exception, //!< "an exception was thrown" - unexpected, //!< "an unexpected result was encountered" - platform, //!< "a system exception was signaled" - - noMemory, //!< "there was not enough memory" - noMoreData, //!< "the end of data was reached" - invalidData, //!< "the data is corrupt or invalid" - bufferSpace, //!< "the buffer is too small" - badParameter, //!< "one or more parameters were invalid" - assertFailed, //!< "an assertion failed" - - fileInUse, //!< "the file is in use" - fileExists, //!< "the file exists" - fileNoPerm, //!< "permission was denied" (file attributes conflict) - fileIOError, //!< "an I/O or device error occurred" - fileNoSpace, //!< "there is no space left on the device" - fileNotFound, //!< "the file was not found" - fileNameInvalid //!< "the file name was illegal or malformed" - }; - - Error (); - Error (const Error& other); - Error& operator= (const Error& other); - - virtual ~Error () noexcept; - - Code code () const; - bool failed () const; - - bool asBoolean () const; - - const String getReasonText () const; - const String getSourceFilename () const; - int getLineNumber () const; - - Error& fail (const char* sourceFileName, - int lineNumber, - const String reasonText, - Code errorCode = general); - - Error& fail (const char* sourceFileName, - int lineNumber, - Code errorCode = general); - - // A function that is capable of recovering from an error (for - // example, by performing a different action) can reset the - // object so it can be passed up. - void reset (); - - // Call this when reporting the error to clear the "checked" flag - void willBeReported () const; - - // for std::exception. This lets you throw an Error that should - // terminate the application. The what() message will be less - // descriptive so ideally you should catch the Error object instead. - const char* what () const noexcept; - - static const String getReasonTextForCode (Code code); - -private: - Code m_code; - String m_reasonText; - String m_sourceFileName; - int m_lineNumber; - mutable bool m_needsToBeChecked; - - mutable String m_what; // created on demand - mutable const char* m_szWhat; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.cpp b/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.cpp deleted file mode 100644 index 8e83e14864..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void FPUFlags::clearUnsetFlagsFrom (const FPUFlags& flags) -{ - if (!flags.getMaskNaNs ().is_set ()) m_maskNaNs.clear (); - - if (!flags.getMaskDenormals ().is_set ()) m_maskDenormals.clear (); - - if (!flags.getMaskZeroDivides ().is_set ()) m_maskZeroDivides.clear (); - - if (!flags.getMaskOverflows ().is_set ()) m_maskOverflows.clear (); - - if (!flags.getMaskUnderflows ().is_set ()) m_maskUnderflows.clear (); - - //if (!flags.getMaskInexacts().is_set ()) m_maskInexacts.clear (); - if (!flags.getFlushDenormals ().is_set ()) m_flushDenormals.clear (); - - if (!flags.getInfinitySigned ().is_set ()) m_infinitySigned.clear (); - - if (!flags.getRounding ().is_set ()) m_rounding.clear (); - - if (!flags.getPrecision ().is_set ()) m_precision.clear (); -} diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.h deleted file mode 100644 index 71b9abde8a..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_FPUFlags.h +++ /dev/null @@ -1,335 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FPUFLAGS_BEASTHEADER -#define BEAST_FPUFLAGS_BEASTHEADER - -/*============================================================================*/ -/** - A set of IEEE FPU flags. - - Description. - - @ingroup beast_core -*/ -class FPUFlags -{ -public: - /** An individual FPU flag */ - struct Flag - { - Flag () : m_set (false) { } - Flag (Flag const& flag) : m_set (flag.m_set), m_value (flag.m_value) { } - Flag& operator= (Flag const& flag) - { - m_set = flag.m_set; - m_value = flag.m_value; - return *this; - } - bool is_set () const - { - return m_set; - } - bool value () const - { - assert (m_set); - return m_value; - } - void set_value (bool value) - { - m_set = true; - m_value = value; - } - void clear () - { - m_set = false; - } - - private: - bool m_set : 1; - bool m_value : 1; - }; - - /** A multi-valued FPU setting */ - template - struct Enum - { - Enum () : m_set (false) { } - Enum (Enum const& value) : m_set (value.m_set), m_value (value.m_value) { } - Enum& operator= (Enum const& value) - { - m_set = value.m_set; - m_value = value.m_value; - return *this; - } - bool is_set () const - { - return m_set; - } - Constants value () const - { - return m_value; - } - void set_value (Constants value) - { - m_set = true; - m_value = value; - } - void clear () - { - m_set = false; - } - - private: - bool m_set : 1; - Constants m_value; - }; - -public: - // - // Exception masks - // - - void setMaskNaNs (bool mask = true) - { - m_maskNaNs.set_value (mask); - } - void setMaskDenormals (bool mask = true) - { - m_maskDenormals.set_value (mask); - } - void setMaskZeroDivides (bool mask = true) - { - m_maskZeroDivides.set_value (mask); - } - void setMaskOverflows (bool mask = true) - { - m_maskOverflows.set_value (mask); - } - void setMaskUnderflows (bool mask = true) - { - m_maskUnderflows.set_value (mask); - } - //void setMaskInexacts (bool mask = true) { m_maskInexacts.set_value (mask); } - - void setUnmaskAllExceptions (bool unmask = true) - { - setMaskNaNs (!unmask); - setMaskDenormals (!unmask); - setMaskZeroDivides (!unmask); - setMaskOverflows (!unmask); - setMaskUnderflows (!unmask); - //setMaskInexacts (!unmask); - } - - // - // Denormal control - // - - void setFlushDenormals (bool flush = true) - { - m_flushDenormals.set_value (flush); - } - - // - // Infinity control - // - - void setInfinitySigned (bool is_signed = true) - { - m_infinitySigned.set_value (is_signed); - } - - // - // Rounding control - // - - enum Rounding - { - roundChop, - roundUp, - roundDown, - roundNear - }; - - void setRounding (Rounding rounding) - { - m_rounding.set_value (rounding); - } - - // - // Precision control - // - - enum Precision - { - bits24, - bits53, - bits64 - }; - - void setPrecision (Precision precision) - { - m_precision.set_value (precision); - } - - // - // Retrieval - // - - const Flag getMaskNaNs () const - { - return m_maskNaNs; - } - const Flag getMaskDenormals () const - { - return m_maskDenormals; - } - const Flag getMaskZeroDivides () const - { - return m_maskZeroDivides; - } - const Flag getMaskOverflows () const - { - return m_maskOverflows; - } - const Flag getMaskUnderflows () const - { - return m_maskUnderflows; - } - //const Flag getMaskInexacts () const { return m_maskInexacts; } - const Flag getFlushDenormals () const - { - return m_flushDenormals; - } - const Flag getInfinitySigned () const - { - return m_infinitySigned; - } - const Enum getRounding () const - { - return m_rounding; - } - const Enum getPrecision () const - { - return m_precision; - } - - Flag& getMaskNaNs () - { - return m_maskNaNs; - } - Flag& getMaskDenormals () - { - return m_maskDenormals; - } - Flag& getMaskZeroDivides () - { - return m_maskZeroDivides; - } - Flag& getMaskOverflows () - { - return m_maskOverflows; - } - Flag& getMaskUnderflows () - { - return m_maskUnderflows; - } - //Flag& getMaskInexacts () { return m_maskInexacts; } - Flag& getFlushDenormals () - { - return m_flushDenormals; - } - Flag& getInfinitySigned () - { - return m_infinitySigned; - } - Enum & getRounding () - { - return m_rounding; - } - Enum & getPrecision () - { - return m_precision; - } - - // Clears our flags if they are not set in another object - void clearUnsetFlagsFrom (FPUFlags const& flags); - - // Retrieve the current flags fron the FPU - static FPUFlags getCurrent (); - - // Change the current FPU flags based on what is set in flags - static void setCurrent (FPUFlags const& flags); - -private: - Flag m_maskNaNs; - Flag m_maskDenormals; - Flag m_maskZeroDivides; - Flag m_maskOverflows; - Flag m_maskUnderflows; - //Flag m_maskInexacts; - Flag m_flushDenormals; - Flag m_infinitySigned; - Enum m_rounding; - Enum m_precision; -}; - -//------------------------------------------------------------------------------ - -/*============================================================================*/ -/** - IEEE FPU flag modifications with scoped lifetime. - - An instance of the class saves the FPU flags and updates - - FPUFlags flags; - flags.setUnmaskAllExceptions (); - - { - ScopedFPUFlags fpu (flags); - - // Perform floating point calculations - } - - // FPU flags are back to what they were now - - @ingroup beast_core -*/ -class ScopedFPUFlags -{ -public: - ScopedFPUFlags (FPUFlags const& flagsToSet) - { - m_savedFlags = FPUFlags::getCurrent (); - m_savedFlags.clearUnsetFlagsFrom (flagsToSet); - FPUFlags::setCurrent (flagsToSet); - } - - ~ScopedFPUFlags () - { - FPUFlags::setCurrent (m_savedFlags); - } - -private: - FPUFlags m_savedFlags; -}; - -#endif - diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.cpp b/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.cpp deleted file mode 100644 index 0cf686ec78..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.cpp +++ /dev/null @@ -1,91 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if BEAST_USE_LEAKCHECKED - -/*============================================================================*/ -// Type-independent portion of Counter -class LeakCheckedBase::CounterBase::Singleton -{ -public: - void push_back (CounterBase* counter) - { - m_list.push_front (counter); - } - - void detectAllLeaks () - { - for (;;) - { - CounterBase* counter = m_list.pop_front (); - - if (!counter) - break; - - counter->detectLeaks (); - } - } - - static Singleton& getInstance () - { - static Singleton instance; - - return instance; - } - -private: - LockFreeStack m_list; -}; - -//------------------------------------------------------------------------------ - -LeakCheckedBase::CounterBase::CounterBase () -{ - Singleton::getInstance ().push_back (this); -} - -void LeakCheckedBase::CounterBase::detectAllLeaks () -{ - Singleton::getInstance ().detectAllLeaks (); -} - -void LeakCheckedBase::CounterBase::detectLeaks () -{ - // If there's a runtime error from this line, it means there's - // an order of destruction problem between different translation units! - // - this->checkPureVirtual (); - - int const count = m_count.get (); - - if (count > 0) - { - bassertfalse; - DBG ("[LEAK] " << count << " of " << getClassName ()); - } -} - -//------------------------------------------------------------------------------ - -void LeakCheckedBase::detectAllLeaks () -{ - CounterBase::detectAllLeaks (); -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.h deleted file mode 100644 index 256812d9e6..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_LeakChecked.h +++ /dev/null @@ -1,171 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LEAKCHECKED_BEASTHEADER -#define BEAST_LEAKCHECKED_BEASTHEADER - -#include "beast_Error.h" -#include "beast_Throw.h" -#include "../memory/beast_StaticObject.h" -#include "../containers/beast_LockFreeStack.h" - -// -// Derived classes are automatically leak-checked on exit -// - -#if BEAST_USE_LEAKCHECKED - -class LeakCheckedBase -{ -public: - static void detectAllLeaks (); - -protected: - class CounterBase : public LockFreeStack ::Node - { - public: - CounterBase (); - - virtual ~CounterBase () { } - - inline int increment () - { - return ++m_count; - } - - inline int decrement () - { - return --m_count; - } - - virtual char const* getClassName () const = 0; - - static void detectAllLeaks (); - - private: - void detectLeaks (); - - virtual void checkPureVirtual () const = 0; - - protected: - class Singleton; - - Atomic m_count; - }; -}; - -//------------------------------------------------------------------------------ - -/** Detects leaks at program exit. - - To use this, derive your class from this template using CRTP (curiously - recurring template pattern). -*/ -template -class LeakChecked : private LeakCheckedBase -{ -protected: - LeakChecked () noexcept - { - if (getLeakCheckedCounter ().increment () == 0) - { - DBG ("[LOGIC] " << getLeakCheckedName ()); - Throw (Error ().fail (__FILE__, __LINE__)); - } - } - - LeakChecked (const LeakChecked&) noexcept - { - if (getLeakCheckedCounter ().increment () == 0) - { - DBG ("[LOGIC] " << getLeakCheckedName ()); - Throw (Error ().fail (__FILE__, __LINE__)); - } - } - - ~LeakChecked () - { - if (getLeakCheckedCounter ().decrement () < 0) - { - DBG ("[LOGIC] " << getLeakCheckedName ()); - Throw (Error ().fail (__FILE__, __LINE__)); - } - } - -private: - class Counter : public CounterBase - { - public: - Counter () noexcept - { - } - - char const* getClassName () const - { - return getLeakCheckedName (); - } - - void checkPureVirtual () const { } - }; - -private: - /* Due to a bug in Visual Studio 10 and earlier, the string returned by - typeid().name() will appear to leak on exit. Therefore, we should - only call this function when there's an actual leak, or else there - will be spurious leak notices at exit. - */ - static const char* getLeakCheckedName () - { - return typeid (Object).name (); - } - - static Counter& getLeakCheckedCounter () noexcept - { - static Counter* volatile s_instance; - static Static::Initializer s_initializer; - - if (s_initializer.begin ()) - { - static char s_storage [sizeof (Counter)]; - s_instance = new (s_storage) Counter; - s_initializer.end (); - } - - return *s_instance; - } -}; - -#else - -class LeakCheckedBase -{ -private: - friend class PerformedAtExit; - - static void detectAllLeaks () { } -}; - -template -struct LeakChecked : LeakCheckedBase -{ -}; - -#endif - -#endif diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_SafeBool.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_SafeBool.h deleted file mode 100644 index f7fb22b6e7..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_SafeBool.h +++ /dev/null @@ -1,91 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SAFEBOOL_BEASTHEADER -#define BEAST_SAFEBOOL_BEASTHEADER - -/** - Safe evaluation of class as `bool`. - - This allows a class to be safely evaluated as a bool without the usual harmful - side effects of the straightforward operator conversion approach. To use it, - derive your class from SafeBool and implement `asBoolean()` as: - - @code - - bool asBoolean () const; - - @endcode - - Ideas from http://www.artima.com/cppsource/safebool.html - - @class SafeBool - - @ingroup beast_core -*/ - -class SafeBoolBase -{ -private: - void disallowed () const { } - -public: - void allowed () const { } - -protected: - typedef void (SafeBoolBase::*boolean_t) () const; - - SafeBoolBase () { } - SafeBoolBase (SafeBoolBase const&) { } - SafeBoolBase& operator= (SafeBoolBase const&) - { - return *this; - } - ~SafeBoolBase () { } -}; - -template -class SafeBool : public SafeBoolBase -{ -public: - operator boolean_t () const - { - return (static_cast (this))->asBoolean () - ? &SafeBoolBase::allowed : 0; - } - -protected: - ~SafeBool () { } -}; - -template -void operator== (SafeBool const& lhs, SafeBool const& rhs) -{ - lhs.disallowed (); -} - -template -void operator!= (SafeBool const& lhs, SafeBool const& rhs) -{ - lhs.disallowed (); -} - -#endif - - diff --git a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Throw.h b/Subtrees/beast/modules/beast_basics/diagnostic/beast_Throw.h deleted file mode 100644 index d1116df77f..0000000000 --- a/Subtrees/beast/modules/beast_basics/diagnostic/beast_Throw.h +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THROW_BEASTHEADER -#define BEAST_THROW_BEASTHEADER - -#include "beast_Debug.h" - -// -// Throw an exception, with the opportunity to get a -// breakpoint with the call stack before the throw. -// - -template -inline void Throw (Exception const& e) -{ - Debug::breakPoint (); - - throw e; -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp b/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp deleted file mode 100644 index 8311b397fb..0000000000 --- a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.cpp +++ /dev/null @@ -1,111 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class OncePerSecond::TimerSingleton - : public RefCountedSingleton - , private InterruptibleThread::EntryPoint -{ -private: - TimerSingleton () - : RefCountedSingleton ( - SingletonLifetime::persistAfterCreation) - , m_thread ("Once Per Second") - { - m_thread.start (this); - } - - ~TimerSingleton () - { - m_thread.join (); - - bassert (m_list.empty ()); - } - - void threadRun () - { - for (;;) - { - const bool interrupted = m_thread.wait (1000); - - if (interrupted) - break; - - notify (); - } - } - - void notify () - { - CriticalSection::ScopedLockType lock (m_mutex); - - for (List ::iterator iter = m_list.begin (); iter != m_list.end ();) - { - OncePerSecond* object = iter->object; - ++iter; - object->doOncePerSecond (); - } - } - -public: - void insert (Elem* elem) - { - CriticalSection::ScopedLockType lock (m_mutex); - - m_list.push_back (*elem); - } - - void remove (Elem* elem) - { - CriticalSection::ScopedLockType lock (m_mutex); - - m_list.erase (m_list.iterator_to (*elem)); - } - - static TimerSingleton* createInstance () - { - return new TimerSingleton; - } - -private: - InterruptibleThread m_thread; - CriticalSection m_mutex; - List m_list; -}; - -//------------------------------------------------------------------------------ - -OncePerSecond::OncePerSecond () -{ - m_elem.instance = TimerSingleton::getInstance (); - m_elem.object = this; -} - -OncePerSecond::~OncePerSecond () -{ -} - -void OncePerSecond::startOncePerSecond () -{ - m_elem.instance->insert (&m_elem); -} - -void OncePerSecond::endOncePerSecond () -{ - m_elem.instance->remove (&m_elem); -} diff --git a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.h b/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.h deleted file mode 100644 index 2c5075aa2e..0000000000 --- a/Subtrees/beast/modules/beast_basics/events/beast_OncePerSecond.h +++ /dev/null @@ -1,64 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ONCEPERSECOND_BEASTHEADER -#define BEAST_ONCEPERSECOND_BEASTHEADER - -#include "../containers/beast_List.h" - -/*============================================================================*/ -/** - Provides a once per second notification. - - Derive your class from OncePerSecond and override doOncePerSecond(). Then, - call startOncePerSecond() to begin receiving the notifications. No clean-up - or other actions are required. - - @ingroup beast_core -*/ -class OncePerSecond : Uncopyable -{ -public: - OncePerSecond (); - virtual ~OncePerSecond (); - - /** Begin receiving notifications. */ - void startOncePerSecond (); - - /** Stop receiving notifications. */ - void endOncePerSecond (); - -protected: - /** Called once per second. */ - virtual void doOncePerSecond () = 0; - -private: - class TimerSingleton; - typedef ReferenceCountedObjectPtr TimerPtr; - - struct Elem : List ::Node - { - TimerPtr instance; - OncePerSecond* object; - }; - - Elem m_elem; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.cpp b/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.cpp deleted file mode 100644 index 896dc98c00..0000000000 --- a/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.cpp +++ /dev/null @@ -1,66 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class PerformedAtExit::Performer -{ -public: - typedef Static::Storage , PerformedAtExit> StackType; - -private: - ~Performer () - { - PerformedAtExit* object = s_list->pop_front (); - - while (object != nullptr) - { - object->performAtExit (); - - object = s_list->pop_front (); - } - - LeakCheckedBase::detectAllLeaks (); - } - -public: - static void push_front (PerformedAtExit* object) - { - s_list->push_front (object); - } - -private: - friend class PerformedAtExit; - - static StackType s_list; - - static Performer s_performer; -}; - -PerformedAtExit::Performer PerformedAtExit::Performer::s_performer; -PerformedAtExit::Performer::StackType PerformedAtExit::Performer::s_list; - -PerformedAtExit::PerformedAtExit () -{ -#if BEAST_IOS - // TODO: PerformedAtExit::Performer::push_front crashes on iOS if s_storage is not accessed before used - char* hack = PerformedAtExit::Performer::s_list.s_storage; -#endif - - Performer::push_front (this); -} - diff --git a/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.h b/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.h deleted file mode 100644 index 7bd0abbd41..0000000000 --- a/Subtrees/beast/modules/beast_basics/events/beast_PerformedAtExit.h +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PERFORMEDATEXIT_BEASTHEADER -#define BEAST_PERFORMEDATEXIT_BEASTHEADER - -#include "../containers/beast_LockFreeStack.h" - -/*============================================================================*/ -/** - Perform an action at program exit - - To use, derive your class from PerformedAtExit, and override `performAtExit()`. - The call will be made during the destruction of objects with static storage - duration, before LeakChecked performs its diagnostics. - - @ingroup beast_core -*/ -class PerformedAtExit : public LockFreeStack ::Node -{ -protected: - PerformedAtExit (); - virtual ~PerformedAtExit () { } - -protected: - /** Called at program exit. - */ - virtual void performAtExit () = 0; - -private: - class Performer; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/functor/beast_Bind.h b/Subtrees/beast/modules/beast_basics/functor/beast_Bind.h deleted file mode 100644 index ed29b3d47c..0000000000 --- a/Subtrees/beast/modules/beast_basics/functor/beast_Bind.h +++ /dev/null @@ -1,96 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BIND_BEASTHEADER -#define BEAST_BIND_BEASTHEADER - -/* Brings functional support into our namespace, based on environment. -*/ -#if BEAST_MSVC -// Visual Studio has these in std. -using std::ref; -using std::bind; -using std::function; -using std::placeholders::_1; -using std::placeholders::_2; - -#elif BEAST_IOS -#if BEAST_USE_BOOST -/* If boost is activated, use it. This works - around a bug with the iOS implementation of bind. -*/ -using boost::ref -using boost::bind; -using boost::function; -using ::_1; -using ::_2; -#else -#if _LIBCPP_VERSION // libc++ -using std::ref; -using std::bind; -using std::function; -using std::placeholders::_1; -using std::placeholders::_2; -#else // libstdc++ (GNU) -using std::tr1::ref; -using std::tr1::bind; -using std::tr1::function; -using std::tr1::placeholders::_1; -using std::tr1::placeholders::_2; -#endif -#endif - -#elif BEAST_MAC -#if _LIBCPP_VERSION // libc++ -using std::ref; -using std::bind; -using std::function; -using std::placeholders::_1; -using std::placeholders::_2; -#else // libstdc++ (GNU) -using std::tr1::ref; -using std::tr1::bind; -using std::tr1::function; -using std::tr1::placeholders::_1; -using std::tr1::placeholders::_2; -#endif - -#elif BEAST_LINUX -using std::tr1::bind; -using std::tr1::placeholders::_1; -using std::tr1::placeholders::_2; - -#else -#error Unknown platform in beast_Bind.h - -#endif - -/** Max number of arguments to bind, total. -*/ -#if BEAST_MSVC -# ifdef _VARIADIC_MAX -# define BEAST_VARIADIC_MAX _VARIADIC_MAX -# else -# define BEAST_VARIADIC_MAX 9 -# endif -#else -# define BEAST_VARIADIC_MAX 9 -#endif - -#endif diff --git a/Subtrees/beast/modules/beast_basics/functor/beast_Function.h b/Subtrees/beast/modules/beast_basics/functor/beast_Function.h deleted file mode 100644 index 20c72df5c4..0000000000 --- a/Subtrees/beast/modules/beast_basics/functor/beast_Function.h +++ /dev/null @@ -1,266 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FUNCTION_BEASTHEADER -#define BEAST_FUNCTION_BEASTHEADER - -// -// Strong replacement for boost::function: -// -// #1 Bounded memory requirement, avoids the free store. -// -// #2 Always refers to a functor (i.e. is never invalid) -// -// #3 Default value (None) is a function that -// returns a default object (the result type -// constructed with a default constructor). -// - -template -class Function; - -// -// nullary function -// - -template -class Function -{ -public: - typedef R result_type; - typedef Function self_type; - - struct None - { - typedef R result_type; - result_type operator () () const - { - return result_type (); - } - }; - - Function () - { - constructCopyOf (None ()); - } - - Function (Function const& f) - { - f.getCall ().constructCopyInto (m_storage); - } - - template - Function (Functor const& f) - { - constructCopyOf (f); - } - - ~Function () - { - getCall ().~Call (); - } - - Function& operator= (Function const& f) - { - getCall ().~Call (); - f.getCall ().constructCopyInto (m_storage); - return *this; - } - - template - Function& operator= (Functor const& f) - { - getCall ().~Call (); - constructCopyOf (f); - return *this; - } - - result_type operator () () - { - return getCall ().operator () (); - } - -private: - template - void constructCopyOf (Functor const& f) - { - // If this generates a compile error it means that - // the functor is too large for the static buffer. - // Increase the storage template parameter until - // the error message goes away. This might cause - // changes throughout the application with other - // template classes that depend on the size. - static_bassert (sizeof (StoredCall ) <= Bytes); - new (m_storage) StoredCall (f); - } - -private: - struct Call - { - virtual ~Call () {} - virtual void constructCopyInto (void* p) const = 0; - virtual result_type operator () () = 0; - }; - - template - struct StoredCall : Call - { - explicit StoredCall (Functor const& f) : m_f (f) { } - StoredCall (const StoredCall& c) : m_f (c.m_f) { } - void constructCopyInto (void* p) const - { - new (p) StoredCall (m_f); - } - result_type operator () () - { - return m_f (); - } - private: - Functor m_f; - }; - - Call& getCall () - { - return *reinterpret_cast (&m_storage[0]); - } - - Call const& getCall () const - { - return *reinterpret_cast (&m_storage[0]); - } - - char m_storage [Bytes]; // should be enough -}; - -//------------------------------------------------------------------------------ - -// -// unary function -// - -template -class Function -{ -public: - typedef R result_type; - typedef Function self_type; - - struct None - { - typedef R result_type; - result_type operator () (T1) const - { - return result_type (); - } - }; - - Function () - { - constructCopyOf (None ()); - } - - Function (const Function& f) - { - f.getCall ().constructCopyInto (m_storage); - } - - template - Function (Functor const& f) - { - constructCopyOf (f); - } - - ~Function () - { - getCall ().~Call (); - } - - Function& operator= (const Function& f) - { - getCall ().~Call (); - f.getCall ().constructCopyInto (m_storage); - return *this; - } - - template - Function& operator= (Functor const& f) - { - getCall ().~Call (); - constructCopyOf (f); - return *this; - } - - result_type operator () (T1 t1) - { - return getCall ().operator () (t1); - } - -private: - template - void constructCopyOf (Functor const& f) - { - // If this generates a compile error it means that - // the functor is too large for the static buffer. - // Increase the storage template parameter until - // the error message goes away. This might cause - // changes throughout the application with other - // template classes that depend on the size. - static_bassert (sizeof (StoredCall ) <= Bytes); - new (m_storage) StoredCall (f); - } - -private: - struct Call - { - virtual ~Call () {} - virtual void constructCopyInto (void* p) const = 0; - virtual result_type operator () (T1 t1) = 0; - }; - - template - struct StoredCall : Call - { - explicit StoredCall (Functor const& f) : m_f (f) { } - StoredCall (const StoredCall& c) : m_f (c.m_f) { } - void constructCopyInto (void* p) const - { - new (p) StoredCall (m_f); - } - result_type operator () (T1 t1) - { - return m_f (t1); - } - private: - Functor m_f; - }; - - Call& getCall () - { - return *reinterpret_cast (&m_storage[0]); - } - - Call const& getCall () const - { - return *reinterpret_cast (&m_storage[0]); - } - - char m_storage [Bytes]; // should be enough -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/math/beast_Interval.h b/Subtrees/beast/modules/beast_basics/math/beast_Interval.h deleted file mode 100644 index 411496d5d8..0000000000 --- a/Subtrees/beast/modules/beast_basics/math/beast_Interval.h +++ /dev/null @@ -1,387 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_INTERVAL_BEASTHEADER -#define BEAST_INTERVAL_BEASTHEADER - -/** A half-open interval. - - This represents the half-open interval [begin, end) over the scalar - type of template parameter `Ty`. It may also be considered as the - specification of a subset of a 1-dimensional Euclidean space. - - @tparam Ty A scalar numerical type. -*/ -template -class Interval -{ -public: - typedef Ty value_type; - - /** The empty interval. - */ - static const Interval none; - - /** Create an uninitialized interval. - */ - Interval () - { - } - - /** Create an interval with the specified values. - */ - Interval (Ty begin, Ty end) - : m_begin (begin) - , m_end (end) - { - } - - /** Create an interval from another interval. - */ - Interval (Interval const& other) - : m_begin (other.m_begin) - , m_end (other.m_end) - { - } - - /** Assign from another interval. - - @param other The interval to assign from. - - @return A reference to this interval. - */ - Interval& operator= (const Interval& other) - { - m_begin = other.m_begin; - m_end = other.m_end; - return *this; - } - - /** Compare an interval for equality. - - Empty intervals are always equal to other empty intervals. - - @param rhs The other interval to compare. - - @return `true` if this interval is equal to the specified interval. - */ - bool operator== (Interval const& rhs) const - { - return (empty () && rhs.empty ()) || - (m_begin == rhs.m_begin && m_end == rhs.m_end); - } - - /** Compare an interval for inequality. - - @param rhs The other interval to compare. - - @return `true` if this interval is not equal to the specified interval. - */ - bool operator!= (Interval const& rhs) const - { - return !this->operator== (rhs); - } - - /** Get the starting value of the interval. - - @return The starting point of the interval. - */ - Ty begin () const - { - return m_begin; - } - - /** Get the ending value of the interval. - - @return The ending point of the interval. - */ - Ty end () const - { - return m_end; - } - - /** Get the Lebesque measure. - - @return The Lebesque measure. - */ - Ty length () const - { - return empty () ? Ty () : (end () - begin ()); - } - - //Ty count () const { return length (); } // sugar - //Ty distance () const { return length (); } // sugar - - /** Determine if the interval is empty. - - @return `true` if the interval is empty. - */ - bool empty () const - { - return m_begin >= m_end; - } - - /** Determine if the interval is non-empty. - - @return `true` if the interval is not empty. - */ - bool notEmpty () const - { - return m_begin < m_end; - } - - /** Set the starting point of the interval. - - @param v The starting point. - */ - void setBegin (Ty v) - { - m_begin = v; - } - - /** Set the ending point of the interval. - - @param v The ending point. - */ - void setEnd (Ty v) - { - m_end = v; - } - - /** Set the ending point relative to the starting point. - - @param v The length of the resulting interval. - */ - void setLength (Ty v) - { - m_end = m_begin + v; - } - - /** Determine if a value is contained in the interval. - - @param v The value to check. - - @return `true` if this interval contains `v`. - */ - bool contains (Ty v) const - { - return notEmpty () && v >= m_begin && v < m_end; - } - - /** Determine if this interval intersects another interval. - - @param other The other interval. - - @return `true` if the intervals intersect. - */ - template - bool intersects (Interval const& other) const - { - return notEmpty () && other.notEmpty () && - end () > other.begin () && begin () < other.end (); - } - - /** Determine if this interval adjoins another interval. - - An interval is adjoint to another interval if and only if the union of the - intervals is a single non-empty half-open subset. - - @param other The other interval. - - @return `true` if the intervals are adjoint. - */ - template - bool adjoins (Interval const& other) const - { - return (empty () != other.empty ()) || - (notEmpty () && end () >= other.begin () - && begin () <= other.end ()); - } - - /** Determine if this interval is disjoint from another interval. - - @param other The other interval. - - @return `true` if the intervals are disjoint. - */ - bool disjoint (Interval const& other) const - { - return !intersects (other); - } - - /** Determine if this interval is a superset of another interval. - - An interval A is a superset of interval B if B is empty or if A fully - contains B. - - @param other The other interval. - - @return `true` if this is a superset of `other`. - */ - template - bool superset_of (Interval const& other) const - { - return other.empty () || - (notEmpty () && begin () <= other.begin () - && end () >= other.end ()); - } - - /** Determine if this interval is a proper superset of another interval. - - An interval A is a proper superset of interval B if A is a superset of - B and A is not equal to B. - - @param other The other interval. - - @return `true` if this interval is a proper superset of `other`. - */ - template - bool proper_superset_of (Interval const& other) const - { - return this->superset_of (other) && this->operator != (other); - } - - /** Determine if this interval is a subset of another interval. - - @param other The other interval. - - @return `true` if this interval is a subset of `other`. - */ - template - bool subset_of (Interval const& other) const - { - return other.superset_of (*this); - } - - /** Determine if this interval is a proper subset of another interval. - - @param other The other interval. - - @return `true` if this interval is a proper subset of `other`. - */ - template - bool proper_subset_of (Interval const& other) const - { - return other.proper_superset_of (*this); - } - - /** Return the intersection of this interval with another interval. - - @param other The other interval. - - @return The intersection of the intervals. - */ - template - Interval intersection (Interval const& other) const - { - return Interval (std::max (begin (), other.begin ()), - std::min (end (), other.end ())); - } - - /** Determine the smallest interval that contains both intervals. - - @param other The other interval. - - @return The simple union of the intervals. - */ - template - Interval simple_union (Interval const& other) const - { - return Interval ( - std::min (other.normalized ().begin (), normalized ().begin ()), - std::max (other.normalized ().end (), normalized ().end ())); - } - - /** Calculate the single-interval union. - - The result is empty if the union cannot be represented as a - single half-open interval. - - @param other The other interval. - - @return The simple union of the intervals. - */ - template - Interval single_union (Interval const& other) const - { - if (empty ()) - return other; - - else if (other.empty ()) - return *this; - - else if (end () < other.begin () || begin () > other.end ()) - return none; - - else - return Interval (std::min (begin (), other.begin ()), - std::max (end (), other.end ())); - } - - /** Determine if the interval is correctly ordered. - - @return `true` if the interval is correctly ordered. - */ - bool normal () const - { - return end () >= begin (); - } - - /** Return a normalized interval. - - @return The normalized interval. - */ - Interval normalized () const - { - if (normal ()) - return *this; - else - return Interval (end (), begin ()); - } - - /** Clamp a value to the interval. - - @param v The value to clamp. - - @return The clamped result. - */ - template - Ty clamp (Tv v) const - { - // These conditionals are carefully ordered so - // that if m_begin == m_end, value is assigned m_begin. - if (v > end ()) - v = end () - (std::numeric_limits ::is_integer ? 1 : - std::numeric_limits ::epsilon ()); - - if (v < begin ()) - v = begin (); - - return v; - } - -private: - Ty m_begin; - Ty m_end; -}; - -template -const Interval Interval::none = Interval (Ty (), Ty ()); - -#endif diff --git a/Subtrees/beast/modules/beast_basics/math/beast_Math.h b/Subtrees/beast/modules/beast_basics/math/beast_Math.h deleted file mode 100644 index e042af7a88..0000000000 --- a/Subtrees/beast/modules/beast_basics/math/beast_Math.h +++ /dev/null @@ -1,84 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MATH_BEASTHEADER -#define BEAST_MATH_BEASTHEADER - -// -// Miscellaneous mathematical calculations -// - -// Calculate the bin for a value given the bin size. -// This correctly handles negative numbers. For example -// if value == -1 then calc_bin returns -1. -template -inline Ty calc_bin (Ty value, int size) -{ - if (value >= 0) - return value / size; - else - return (value - size + 1) / size; -} - -// Given a number and a bin size, this returns the first -// corresponding value of the bin associated with the given number. -// It correctly handles negative numbers. For example, -// if value == -1 then calc_bin always returns -size -template -inline Ty calc_bin_start (Ty value, int size) -{ - return calc_bin (value, size) * size; -} - -template -inline T pi () noexcept -{ - return 3.14159265358979; -} - -template -inline T twoPi () noexcept -{ - return 6.28318530717958; -} - -template -inline T oneOverTwoPi () noexcept -{ - return 0.1591549430918955; -} - -template -inline T degreesToRadians (U degrees) -{ - return T (degrees * 0.0174532925199433); -} - -template -inline T radiansToDegrees (U radians) -{ - T deg = T (radians * U (57.29577951308238)); - - if (deg < 0) - deg += 360; - - return deg; -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.cpp b/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.cpp deleted file mode 100644 index 8f7d7be2d1..0000000000 --- a/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.cpp +++ /dev/null @@ -1,487 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -// http://code.google.com/p/smhasher/ - -namespace Murmur -{ - -//----------------------------------------------------------------------------- -// Platform-specific functions and macros - -// Microsoft Visual Studio - -#if BEAST_MSVC - -#define ROTL32(x,y) _rotl(x,y) -#define ROTL64(x,y) _rotl64(x,y) - -#define BIG_CONSTANT(x) (x) - -// Other compilers - -#else - -static inline uint32_t rotl32 ( uint32_t x, int8_t r ) -{ - return (x << r) | (x >> (32 - r)); -} - -static inline uint64_t rotl64 ( uint64_t x, int8_t r ) -{ - return (x << r) | (x >> (64 - r)); -} - -#define ROTL32(x,y) rotl32(x,y) -#define ROTL64(x,y) rotl64(x,y) - -#define BIG_CONSTANT(x) (x##LLU) - -#endif - -//----------------------------------------------------------------------------- -// Block read - if your platform needs to do endian-swapping or can only -// handle aligned reads, do the conversion here - -static forcedinline uint32_t getblock ( const uint32_t* p, int i ) -{ - return p[i]; -} - -static forcedinline uint64_t getblock ( const uint64_t* p, int i ) -{ - return p[i]; -} - -//----------------------------------------------------------------------------- -// Finalization mix - force all bits of a hash block to avalanche - -static forcedinline uint32_t fmix ( uint32_t h ) -{ - h ^= h >> 16; - h *= 0x85ebca6b; - h ^= h >> 13; - h *= 0xc2b2ae35; - h ^= h >> 16; - - return h; -} - -//---------- - -static forcedinline uint64_t fmix ( uint64_t k ) -{ - k ^= k >> 33; - k *= BIG_CONSTANT (0xff51afd7ed558ccd); - k ^= k >> 33; - k *= BIG_CONSTANT (0xc4ceb9fe1a85ec53); - k ^= k >> 33; - - return k; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x86_32 ( const void* key, int len, - uint32_t seed, void* out ) -{ - const uint8_t* data = (const uint8_t*)key; - const int nblocks = len / 4; - - uint32_t h1 = seed; - - uint32_t c1 = 0xcc9e2d51; - uint32_t c2 = 0x1b873593; - - //---------- - // body - - const uint32_t* blocks = (const uint32_t*) (data + nblocks * 4); - - for (int i = -nblocks; i; i++) - { - uint32_t k1 = getblock (blocks, i); - - k1 *= c1; - k1 = ROTL32 (k1, 15); - k1 *= c2; - - h1 ^= k1; - h1 = ROTL32 (h1, 13); - h1 = h1 * 5 + 0xe6546b64; - } - - //---------- - // tail - - const uint8_t* tail = (const uint8_t*) (data + nblocks * 4); - - uint32_t k1 = 0; - - switch (len & 3) - { - case 3: - k1 ^= tail[2] << 16; - - case 2: - k1 ^= tail[1] << 8; - - case 1: - k1 ^= tail[0]; - k1 *= c1; - k1 = ROTL32 (k1, 15); - k1 *= c2; - h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; - - h1 = fmix (h1); - - * (uint32_t*)out = h1; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x86_128 ( const void* key, const int len, - uint32_t seed, void* out ) -{ - const uint8_t* data = (const uint8_t*)key; - const int nblocks = len / 16; - - uint32_t h1 = seed; - uint32_t h2 = seed; - uint32_t h3 = seed; - uint32_t h4 = seed; - - uint32_t c1 = 0x239b961b; - uint32_t c2 = 0xab0e9789; - uint32_t c3 = 0x38b34ae5; - uint32_t c4 = 0xa1e38b93; - - //---------- - // body - - const uint32_t* blocks = (const uint32_t*) (data + nblocks * 16); - - for (int i = -nblocks; i; i++) - { - uint32_t k1 = getblock (blocks, i * 4 + 0); - uint32_t k2 = getblock (blocks, i * 4 + 1); - uint32_t k3 = getblock (blocks, i * 4 + 2); - uint32_t k4 = getblock (blocks, i * 4 + 3); - - k1 *= c1; - k1 = ROTL32 (k1, 15); - k1 *= c2; - h1 ^= k1; - - h1 = ROTL32 (h1, 19); - h1 += h2; - h1 = h1 * 5 + 0x561ccd1b; - - k2 *= c2; - k2 = ROTL32 (k2, 16); - k2 *= c3; - h2 ^= k2; - - h2 = ROTL32 (h2, 17); - h2 += h3; - h2 = h2 * 5 + 0x0bcaa747; - - k3 *= c3; - k3 = ROTL32 (k3, 17); - k3 *= c4; - h3 ^= k3; - - h3 = ROTL32 (h3, 15); - h3 += h4; - h3 = h3 * 5 + 0x96cd1c35; - - k4 *= c4; - k4 = ROTL32 (k4, 18); - k4 *= c1; - h4 ^= k4; - - h4 = ROTL32 (h4, 13); - h4 += h1; - h4 = h4 * 5 + 0x32ac3b17; - } - - //---------- - // tail - - const uint8_t* tail = (const uint8_t*) (data + nblocks * 16); - - uint32_t k1 = 0; - uint32_t k2 = 0; - uint32_t k3 = 0; - uint32_t k4 = 0; - - switch (len & 15) - { - case 15: - k4 ^= tail[14] << 16; - - case 14: - k4 ^= tail[13] << 8; - - case 13: - k4 ^= tail[12] << 0; - k4 *= c4; - k4 = ROTL32 (k4, 18); - k4 *= c1; - h4 ^= k4; - - case 12: - k3 ^= tail[11] << 24; - - case 11: - k3 ^= tail[10] << 16; - - case 10: - k3 ^= tail[ 9] << 8; - - case 9: - k3 ^= tail[ 8] << 0; - k3 *= c3; - k3 = ROTL32 (k3, 17); - k3 *= c4; - h3 ^= k3; - - case 8: - k2 ^= tail[ 7] << 24; - - case 7: - k2 ^= tail[ 6] << 16; - - case 6: - k2 ^= tail[ 5] << 8; - - case 5: - k2 ^= tail[ 4] << 0; - k2 *= c2; - k2 = ROTL32 (k2, 16); - k2 *= c3; - h2 ^= k2; - - case 4: - k1 ^= tail[ 3] << 24; - - case 3: - k1 ^= tail[ 2] << 16; - - case 2: - k1 ^= tail[ 1] << 8; - - case 1: - k1 ^= tail[ 0] << 0; - k1 *= c1; - k1 = ROTL32 (k1, 15); - k1 *= c2; - h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; - - h2 ^= len; - - h3 ^= len; - - h4 ^= len; - - h1 += h2; - - h1 += h3; - - h1 += h4; - - h2 += h1; - - h3 += h1; - - h4 += h1; - - h1 = fmix (h1); - - h2 = fmix (h2); - - h3 = fmix (h3); - - h4 = fmix (h4); - - h1 += h2; - - h1 += h3; - - h1 += h4; - - h2 += h1; - - h3 += h1; - - h4 += h1; - - ((uint32_t*)out)[0] = h1; - - ((uint32_t*)out)[1] = h2; - - ((uint32_t*)out)[2] = h3; - - ((uint32_t*)out)[3] = h4; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x64_128 ( const void* key, const int len, - const uint32_t seed, void* out ) -{ - const uint8_t* data = (const uint8_t*)key; - const int nblocks = len / 16; - - uint64_t h1 = seed; - uint64_t h2 = seed; - - uint64_t c1 = BIG_CONSTANT (0x87c37b91114253d5); - uint64_t c2 = BIG_CONSTANT (0x4cf5ad432745937f); - - //---------- - // body - - const uint64_t* blocks = (const uint64_t*) (data); - - for (int i = 0; i < nblocks; i++) - { - uint64_t k1 = getblock (blocks, i * 2 + 0); - uint64_t k2 = getblock (blocks, i * 2 + 1); - - k1 *= c1; - k1 = ROTL64 (k1, 31); - k1 *= c2; - h1 ^= k1; - - h1 = ROTL64 (h1, 27); - h1 += h2; - h1 = h1 * 5 + 0x52dce729; - - k2 *= c2; - k2 = ROTL64 (k2, 33); - k2 *= c1; - h2 ^= k2; - - h2 = ROTL64 (h2, 31); - h2 += h1; - h2 = h2 * 5 + 0x38495ab5; - } - - //---------- - // tail - - const uint8_t* tail = (const uint8_t*) (data + nblocks * 16); - - uint64_t k1 = 0; - uint64_t k2 = 0; - - switch (len & 15) - { - case 15: - k2 ^= uint64_t (tail[14]) << 48; - - case 14: - k2 ^= uint64_t (tail[13]) << 40; - - case 13: - k2 ^= uint64_t (tail[12]) << 32; - - case 12: - k2 ^= uint64_t (tail[11]) << 24; - - case 11: - k2 ^= uint64_t (tail[10]) << 16; - - case 10: - k2 ^= uint64_t (tail[ 9]) << 8; - - case 9: - k2 ^= uint64_t (tail[ 8]) << 0; - k2 *= c2; - k2 = ROTL64 (k2, 33); - k2 *= c1; - h2 ^= k2; - - case 8: - k1 ^= uint64_t (tail[ 7]) << 56; - - case 7: - k1 ^= uint64_t (tail[ 6]) << 48; - - case 6: - k1 ^= uint64_t (tail[ 5]) << 40; - - case 5: - k1 ^= uint64_t (tail[ 4]) << 32; - - case 4: - k1 ^= uint64_t (tail[ 3]) << 24; - - case 3: - k1 ^= uint64_t (tail[ 2]) << 16; - - case 2: - k1 ^= uint64_t (tail[ 1]) << 8; - - case 1: - k1 ^= uint64_t (tail[ 0]) << 0; - k1 *= c1; - k1 = ROTL64 (k1, 31); - k1 *= c2; - h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; - - h2 ^= len; - - h1 += h2; - - h2 += h1; - - h1 = fmix (h1); - - h2 = fmix (h2); - - h1 += h2; - - h2 += h1; - - ((uint64_t*)out)[0] = h1; - - ((uint64_t*)out)[1] = h2; -} - -} diff --git a/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.h b/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.h deleted file mode 100644 index a406615b13..0000000000 --- a/Subtrees/beast/modules/beast_basics/math/beast_MurmurHash.h +++ /dev/null @@ -1,66 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MURMURHASH_BEASTHEADER -#define BEAST_MURMURHASH_BEASTHEADER - -// Original source code links in .cpp file - -// This file depends on some Juce declarations and defines - -namespace Murmur -{ - -extern void MurmurHash3_x86_32 (const void* key, int len, uint32 seed, void* out); -extern void MurmurHash3_x86_128 (const void* key, int len, uint32 seed, void* out); -extern void MurmurHash3_x64_128 (const void* key, int len, uint32 seed, void* out); - -// Uses Juce to choose an appropriate routine - -// This handy template deduces which size hash is desired -template -inline void Hash (const void* key, int len, uint32 seed, HashType* out) -{ - switch (8 * sizeof (HashType)) - { - case 32: - MurmurHash3_x86_32 (key, len, seed, out); - break; - -#if BEAST_64BIT - - case 128: - MurmurHash3_x64_128 (key, len, seed, out); - break; -#else - - case 128: - MurmurHash3_x86_128 (key, len, seed, out); - break; -#endif - - default: - Throw (std::runtime_error ("invalid key size in MurmurHash")); - break; - }; -} - -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_AllocatedBy.h b/Subtrees/beast/modules/beast_basics/memory/beast_AllocatedBy.h deleted file mode 100644 index 502914c76a..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_AllocatedBy.h +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ALLOCATEDBY_BEASTHEADER -#define BEAST_ALLOCATEDBY_BEASTHEADER - -/*============================================================================*/ -/** - Customized allocation for heap objects. - - Derived classes will use the specified allocator for new and delete. - - @param AllocatorType The type of allocator to use. - - @ingroup beast_concurrent -*/ -template -class AllocatedBy -{ -public: - static inline void* operator new (size_t bytes, AllocatorType& allocator) noexcept - { - return allocator.allocate (bytes); - } - - static inline void* operator new (size_t bytes, AllocatorType* allocator) noexcept - { - return allocator->allocate (bytes); - } - - static inline void operator delete (void* p, AllocatorType&) noexcept - { - AllocatorType::deallocate (p); - } - - static inline void operator delete (void* p, AllocatorType*) noexcept - { - AllocatorType::deallocate (p); - } - - static inline void operator delete (void* p) noexcept - { - AllocatorType::deallocate (p); - } -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicCounter.h b/Subtrees/beast/modules/beast_basics/memory/beast_AtomicCounter.h deleted file mode 100644 index 5d8a5f7301..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicCounter.h +++ /dev/null @@ -1,83 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ATOMICCOUNTER_BEASTHEADER -#define BEAST_ATOMICCOUNTER_BEASTHEADER - -/*============================================================================*/ -/** - A thread safe usage counter. - - This provides a simplified interface to an atomic integer suitable for - measuring reference or usage counts. The counter is signaled when the - count is non zero. - - @ingroup beast_core -*/ -class AtomicCounter -{ -public: - /** Create a new counter. - - @param initialValue An optional starting usage count (default is 0). - */ - AtomicCounter (int initialValue = 0) noexcept -: - m_value (initialValue) - { - } - - /** Increment the usage count. - - @return `true` if the counter became signaled. - */ - inline bool addref () noexcept - { - return (++m_value) == 1; - } - - /** Decrements the usage count. - - @return `true` if the counter became non-signaled. - */ - inline bool release () noexcept - { - // Unfortunately, AllocatorWithoutTLS breaks this assert - //bassert (isSignaled ()); - - return (--m_value) == 0; - } - - /** Determine if the counter is signaled. - - Note that another thread can cause the counter to become reset after - this function returns true. - - @return `true` if the counter was signaled. - */ - inline bool isSignaled () const noexcept - { - return m_value.get () > 0; - } - -private: - Atomic m_value; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicFlag.h b/Subtrees/beast/modules/beast_basics/memory/beast_AtomicFlag.h deleted file mode 100644 index cb1ba7ea3f..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicFlag.h +++ /dev/null @@ -1,102 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ATOMICFLAG_BEASTHEADER -#define BEAST_ATOMICFLAG_BEASTHEADER - -/*============================================================================*/ -/** - A thread safe flag. - - This provides a simplified interface to an atomic integer suitable for - representing a flag. The flag is signaled when on, else it is considered - reset. - - @ingroup beast_core -*/ -class AtomicFlag -{ -public: - /** Create an AtomicFlag in the reset state. */ - AtomicFlag () noexcept -: - m_value (0) - { - } - - /** Signal the flag. - - If two or more threads simultaneously attempt to signal the flag, - only one will receive a true return value. - - @return true if the flag was previously reset. - */ - inline bool trySignal () noexcept - { - return m_value.compareAndSetBool (1, 0); - } - - /** Signal the flag. - - The flag must be in the reset state. Only one thread may - call this at a time. - */ - inline void signal () noexcept - { -#if BEAST_DEBUG - const bool success = m_value.compareAndSetBool (1, 0); - bassert (success); -#else - m_value.set (1); -#endif - } - - /** Reset the flag. - - The flag must be in the signaled state. Only one thread may - call this at a time. Usually it is the thread that was successful - in a previous call to trySignal(). - */ - inline void reset () noexcept - { -#if BEAST_DEBUG - const bool success = m_value.compareAndSetBool (0, 1); - bassert (success); -#else - m_value.set (0); -#endif - } - - /** Check if the AtomicFlag is signaled - - The signaled status may change immediately after this call - returns. The caller must synchronize. - - @return true if the flag was signaled. - */ - inline bool isSignaled () const noexcept - { - return m_value.get () == 1; - } - -private: - Atomic m_value; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicPointer.h b/Subtrees/beast/modules/beast_basics/memory/beast_AtomicPointer.h deleted file mode 100644 index df144d866c..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicPointer.h +++ /dev/null @@ -1,133 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ATOMICPOINTER_BEASTHEADER -#define BEAST_ATOMICPOINTER_BEASTHEADER - -/*============================================================================*/ -/** - A thread safe pointer. - - This provides a simplified interface to an atomic pointer suitable - for building containers or composite classes. Operator overloads - allow access to the underlying pointer using natural C++ syntax. - - @ingroup beast_core -*/ -template -class AtomicPointer -{ -public: - /** Create a pointer. - - @param initialValue An optional starting value (default is null). - */ - explicit AtomicPointer (P* const initialValue = nullptr) noexcept -: - m_value (initialValue) - { - } - - /** Retrieve the pointer value */ - inline P* get () const noexcept - { - return m_value.get (); - } - - /** Obtain a pointer to P through type conversion. - - The caller must synchronize access to P. - - @return A pointer to P. - */ - inline operator P* () const noexcept - { - return get (); - } - - /** Dereference operator - - The caller must synchronize access to P. - - @return A reference to P. - */ - inline P& operator* () const noexcept - { - return &get (); - } - - /** Member selection - - The caller must synchronize access to P. - - @return A pointer to P. - */ - inline P* operator-> () const noexcept - { - return get (); - } - - inline void set (P* p) - { - m_value.set (p); - } - - /** Atomically assign a new pointer - - @param newValue The new value to assign. - */ - inline void operator= (P* newValue) noexcept - { - set (newValue); - } - - /** Atomically assign a new pointer and return the old value. - - @param newValue The new value to assign. - - @return The previous value. - */ - inline P* exchange (P* newValue) - { - return m_value.exchange (newValue); - } - - /** Conditionally perform an atomic assignment. - - The current value is compared with oldValue and atomically - set to newValue if the comparison is equal. - - The caller is responsible for handling the ABA problem. - - @param newValue The new value to assign. - - @param oldValue The matching old value. - - @return true if the assignment was performed. - */ - inline bool compareAndSet (P* newValue, P* oldValue) - { - return m_value.compareAndSetBool (newValue, oldValue); - } - -private: - Atomic m_value; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicState.h b/Subtrees/beast/modules/beast_basics/memory/beast_AtomicState.h deleted file mode 100644 index 7c2cb85bb1..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_AtomicState.h +++ /dev/null @@ -1,101 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ATOMICSTATE_BEASTHEADER -#define BEAST_ATOMICSTATE_BEASTHEADER - -/*============================================================================*/ -/** - A thread safe state variable. - - This provides a simplified interface to an integer used to control atomic - state transitions. A state is distinguished by a single integer value. - - @ingroup beast_core -*/ -class AtomicState -{ -public: - /** Create a new state with an optional starting value. - - @param initialState The initial state. - */ - - - explicit AtomicState (const int initialState = 0) noexcept -: - m_value (initialState) - { - } - - /** Retrieve the current state. - - This converts the object to an integer reflecting the current state. - - Note that other threads may change the value immediately after this - function returns. The caller is responsible for synchronizing. - - @return The state at the time of the call. - */ - inline operator int () const - { - return m_value.get (); - } - - /** Attempt a state transition. - - The current state is compared to `from`, and if the comparison is - successful the state becomes `to`. The entire operation is atomic. - - @param from The current state, for comparison. - - @param to The desired new state. - - @return true if the state transition succeeded. - */ - inline bool tryChangeState (const int from, const int to) noexcept - { - return m_value.compareAndSetBool (to, from); - } - - /** Perform a state transition. - - This attempts to change the state and generates a diagnostic on - failure. This routine can be used instead of tryChangeState() - when program logic requires that the state change must succeed. - - @param from The required current state. - - @param to The new state. - */ - inline void changeState (const int from, const int to) noexcept - { -#if BEAST_DEBUG - const bool success = tryChangeState (from, to); - bassert (success); -#else - tryChangeState (from, to); -#endif - } - -private: - Atomic m_value; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_CacheLine.h b/Subtrees/beast/modules/beast_basics/memory/beast_CacheLine.h deleted file mode 100644 index 3cdd28997a..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_CacheLine.h +++ /dev/null @@ -1,478 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CACHELINE_BEASTHEADER -#define BEAST_CACHELINE_BEASTHEADER - -#include "beast_MemoryAlignment.h" - -// Allows turning off of all padding, -// e.g. for memory-constrained systems or testing. -// -#define GLOBAL_PADDING_ENABLED 0 - -namespace CacheLine -{ - -#if GLOBAL_PADDING_ENABLED - -// Pads an object so that it starts on a cache line boundary. -// -template -class Aligned -{ -public: - ~Aligned () - { - ptr ()->~T (); - } - - Aligned () - { - new (ptr ()) T; - } - - template - explicit Aligned (const T1& t1) - { - new (ptr ()) T (t1); - } - - template - Aligned (const T1& t1, const T2& t2) - { - new (ptr ()) T (t1, t2); - } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3) - { - new (ptr ()) T (t1, t2, t3); - } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4) - { - new (ptr ()) T (t1, t2, t3, t4); - } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) - { - new (ptr ()) T (t1, t2, t3, t4, t5); - } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) - { - new (ptr ()) T (t1, t2, t3, t4, t5, t6); - } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7 > - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7) - { - new (ptr ()) T (t1, t2, t3, t4, t5, t6, t7); - } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7, class T8 > - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7, const T8& t8) - { - new (ptr ()) T (t1, t2, t3, t4, t5, t6, t7, t8); - } - - void operator= (T const& other) - { - *ptr () = other; - } - - inline T& operator* () noexcept { return *ptr (); } - inline T* operator-> () noexcept { return ptr (); } - inline operator T& () noexcept { return *ptr (); } - inline operator T* () noexcept { return ptr (); } - - inline const T& operator* () const noexcept - { - return *ptr (); - } - inline const T* operator-> () const noexcept - { - return ptr (); - } - inline operator const T& () const noexcept - { - return *ptr (); - } - inline operator const T* () const noexcept - { - return ptr (); - } - -private: - inline T* ptr () noexcept - { - return (T*) ((uintptr_t (m_storage) + Memory::cacheLineAlignMask) - & ~Memory::cacheLineAlignMask); - /* - return reinterpret_cast (Memory::pointerAdjustedForAlignment ( - m_storage, Memory::cacheLineBytes)); - */ - } - - char m_storage [ (sizeof (T) + Memory::cacheLineAlignMask) - & ~Memory::cacheLineAlignMask]; -}; - -// Holds an object padded it to completely fill a CPU cache line. -// The caller must ensure that this object starts at the beginning -// of a cache line. -// -template -class Padded -{ -public: - Padded () - { } - - template - explicit Padded (const T1& t1) - : m_t (t1) { } - - template - Padded (const T1& t1, const T2& t2) - : m_t (t1, t2) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3) - : m_t (t1, t2, t3) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4) - : m_t (t1, t2, t3, t4) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) - : m_t (t1, t2, t3, t4, t5) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) - : m_t (t1, t2, t3, t4, t5, t6) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7 > - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7) - : m_t (t1, t2, t3, t4, t5, t6, t7) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7, class T8 > - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7, const T8& t8) - : m_t (t1, t2, t3, t4, t5, t6, t7, t8) { } - - void operator= (const T& other) - { - m_t = other; - } - - T& operator* () noexcept { return m_t; } - T* operator-> () noexcept { return &m_t; } - operator T& () noexcept { return m_t; } - operator T* () noexcept { return &m_t; } - - const T& operator* () const noexcept - { - return m_t; - } - const T* operator-> () const noexcept - { - return &m_t; - } - operator const T& () const noexcept - { - return m_t; - } - operator const T* () const noexcept - { - return &m_t; - } - -private: - T m_t; - char pad [Memory::cacheLineAlignBytes - sizeof (T)]; -}; - -#else - -template -class Aligned -{ -public: - Aligned () - { } - - template - explicit Aligned (const T1& t1) - : m_t (t1) { } - - template - Aligned (const T1& t1, const T2& t2) - : m_t (t1, t2) { } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3) - : m_t (t1, t2, t3) { } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4) - : m_t (t1, t2, t3, t4) { } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) - : m_t (t1, t2, t3, t4, t5) { } - - template - Aligned (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) - : m_t (t1, t2, t3, t4, t5, t6) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7 > - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7) - : m_t (t1, t2, t3, t4, t5, t6, t7) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7, class T8 > - Aligned (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7, const T8& t8) - : m_t (t1, t2, t3, t4, t5, t6, t7, t8) { } - - void operator= (const T& other) - { - m_t = other; - } - - T& operator* () noexcept { return m_t; } - T* operator-> () noexcept { return &m_t; } - operator T& () noexcept { return m_t; } - operator T* () noexcept { return &m_t; } - - const T& operator* () const noexcept - { - return m_t; - } - const T* operator-> () const noexcept - { - return &m_t; - } - operator const T& () const noexcept - { - return m_t; - } - operator const T* () const noexcept - { - return &m_t; - } - -private: - T m_t; -}; - -template -class Padded -{ -public: - Padded () - { } - - template - explicit Padded (const T1& t1) - : m_t (t1) { } - - template - Padded (const T1& t1, const T2& t2) - : m_t (t1, t2) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3) - : m_t (t1, t2, t3) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4) - : m_t (t1, t2, t3, t4) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) - : m_t (t1, t2, t3, t4, t5) { } - - template - Padded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) - : m_t (t1, t2, t3, t4, t5, t6) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7 > - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7) - : m_t (t1, t2, t3, t4, t5, t6, t7) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7, class T8 > - Padded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7, const T8& t8) - : m_t (t1, t2, t3, t4, t5, t6, t7, t8) { } - - void operator= (const T& other) - { - m_t = other; - } - - T& operator* () noexcept { return m_t; } - T* operator-> () noexcept { return &m_t; } - operator T& () noexcept { return m_t; } - operator T* () noexcept { return &m_t; } - - const T& operator* () const noexcept - { - return m_t; - } - const T* operator-> () const noexcept - { - return &m_t; - } - operator const T& () const noexcept - { - return m_t; - } - operator const T* () const noexcept - { - return &m_t; - } - -private: - T m_t; -}; - -#endif - -// -// Used to remove padding without changing code -// - -template -class Unpadded -{ -public: - Unpadded () - { } - - template - explicit Unpadded (const T1& t1) - : m_t (t1) { } - - template - Unpadded (const T1& t1, const T2& t2) - : m_t (t1, t2) { } - - template - Unpadded (const T1& t1, const T2& t2, const T3& t3) - : m_t (t1, t2, t3) { } - - template - Unpadded (const T1& t1, const T2& t2, const T3& t3, const T4& t4) - : m_t (t1, t2, t3, t4) { } - - template - Unpadded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5) - : m_t (t1, t2, t3, t4, t5) { } - - template - Unpadded (const T1& t1, const T2& t2, const T3& t3, - const T4& t4, const T5& t5, const T6& t6) - : m_t (t1, t2, t3, t4, t5, t6) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7 > - Unpadded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7) - : m_t (t1, t2, t3, t4, t5, t6, t7) { } - - template < class T1, class T2, class T3, class T4, - class T5, class T6, class T7, class T8 > - Unpadded (const T1& t1, const T2& t2, const T3& t3, const T4& t4, - const T5& t5, const T6& t6, const T7& t7, const T8& t8) - : m_t (t1, t2, t3, t4, t5, t6, t7, t8) { } - - void operator= (const T& other) - { - m_t = other; - } - - T& operator* () - { - return m_t; - } - T* operator-> () - { - return &m_t; - } - operator T& () - { - return m_t; - } - operator T* () - { - return &m_t; - } - - const T& operator* () const - { - return m_t; - } - const T* operator-> () const - { - return &m_t; - } - operator const T& () const - { - return m_t; - } - operator const T* () const - { - return &m_t; - } - -private: - T m_t; -}; - -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStore.h deleted file mode 100644 index 452053bfd8..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStore.h +++ /dev/null @@ -1,41 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FIFOFREESTORE_BEASTHEADER -#define BEAST_FIFOFREESTORE_BEASTHEADER - -#if BEAST_USE_BOOST -#include "beast_FifoFreeStoreWithTLS.h" - -#else -#include "beast_FifoFreeStoreWithoutTLS.h" - -#endif - -/** Selected free store based on compilation settings. - - @ingroup beast_concurrent -*/ -#if BEAST_USE_BOOST -typedef FifoFreeStoreWithTLS FifoFreeStoreType; -#else -typedef FifoFreeStoreWithoutTLS FifoFreeStoreType; -#endif - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.cpp b/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.cpp deleted file mode 100644 index 51c93ae8f1..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -// Implementation notes -// -// - A Page is a large allocation from a global PageAllocator. -// -// - Each thread maintains an 'active' page from which it makes allocations. -// -// - When the active page is full, a new one takes it's place. -// -// - Page memory is deallocated when it is not active and no longer referenced. -// -// - Each instance of FifoFreeStoreWithTLS maintains its own set of per-thread active pages, -// but uses a global PageAllocator. This reduces memory consumption without -// affecting performance. -// - -// This precedes every allocation -// -struct FifoFreeStoreWithTLS::Header -{ - FifoFreeStoreWithTLS::Page* page; -}; - -//------------------------------------------------------------------------------ - -class FifoFreeStoreWithTLS::Page : LeakChecked , Uncopyable -{ -public: - explicit Page (const size_t bytes) : m_refs (1) - { - m_end = reinterpret_cast (this) + bytes; - m_free = reinterpret_cast ( - Memory::pointerAdjustedForAlignment (this + 1)); - } - - ~Page () - { - bassert (! m_refs.isSignaled ()); - } - - inline bool release () - { - bassert (! m_refs.isSignaled ()); - - return m_refs.release (); - } - - void* allocate (size_t bytes) - { - bassert (bytes > 0); - - char* p = Memory::pointerAdjustedForAlignment (m_free); - char* free = p + bytes; - - if (free <= m_end) - { - m_free = free; - - m_refs.addref (); - } - else - { - p = 0; - } - - return p; - } - -private: - AtomicCounter m_refs; // reference count - char* m_free; // next free byte - char* m_end; // last free byte + 1 -}; - -//------------------------------------------------------------------------------ - -class FifoFreeStoreWithTLS::PerThreadData : LeakChecked , Uncopyable -{ -public: - explicit PerThreadData (FifoFreeStoreWithTLS* allocator) - : m_allocator (*allocator) - , m_active (m_allocator.newPage ()) - { - } - - ~PerThreadData () - { - if (m_active->release ()) - m_allocator.deletePage (m_active); - } - - inline void* allocate (const size_t bytes) - { - const size_t headerBytes = Memory::sizeAdjustedForAlignment (sizeof (Header)); - const size_t bytesNeeded = headerBytes + bytes; - - if (bytesNeeded > m_allocator.m_pages->getPageBytes ()) - Throw (Error ().fail (__FILE__, __LINE__, TRANS ("the memory request was too large"))); - - Header* header; - - header = reinterpret_cast (m_active->allocate (bytesNeeded)); - - if (!header) - { - if (m_active->release ()) - deletePage (m_active); - - m_active = m_allocator.newPage (); - - header = reinterpret_cast (m_active->allocate (bytesNeeded)); - } - - header->page = m_active; - - return reinterpret_cast (header) + headerBytes; - } - -private: - FifoFreeStoreWithTLS& m_allocator; - Page* m_active; -}; - -//------------------------------------------------------------------------------ - -inline FifoFreeStoreWithTLS::Page* FifoFreeStoreWithTLS::newPage () -{ - return new (m_pages->allocate ()) Page (m_pages->getPageBytes ()); -} - -inline void FifoFreeStoreWithTLS::deletePage (Page* page) -{ - // Safe, because each thread maintains its own active page. - page->~Page (); - PagedFreeStoreType::deallocate (page); -} - -FifoFreeStoreWithTLS::FifoFreeStoreWithTLS () - : m_pages (PagedFreeStoreType::getInstance ()) -{ - //bassert (m_pages->getPageBytes () >= sizeof (Page) + Memory::allocAlignBytes); -} - -FifoFreeStoreWithTLS::~FifoFreeStoreWithTLS () -{ - // Clean up this thread's data before we release - // the reference to the global page allocator. - m_tsp.reset (0); -} - -//------------------------------------------------------------------------------ - -void* FifoFreeStoreWithTLS::allocate (const size_t bytes) -{ - PerThreadData* data = m_tsp.get (); - - if (!data) - { - data = new PerThreadData (this); - m_tsp.reset (data); - } - - return data->allocate (bytes); -} - -//------------------------------------------------------------------------------ - -void FifoFreeStoreWithTLS::deallocate (void* p) -{ - const size_t headerBytes = Memory::sizeAdjustedForAlignment (sizeof (Header)); - Header* const header = reinterpret_cast (reinterpret_cast (p) - headerBytes); - Page* const page = header->page; - - if (page->release ()) - deletePage (page); -} diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.h b/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.h deleted file mode 100644 index 5382c3737f..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithTLS.h +++ /dev/null @@ -1,67 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FIFOFREESTOREWITHTLS_BEASTHEADER -#define BEAST_FIFOFREESTOREWITHTLS_BEASTHEADER - -#include "beast_GlobalPagedFreeStore.h" - -/*============================================================================*/ -/** - Lock-free and mostly wait-free FIFO memory allocator. - - This allocator is suitable for use with CallQueue and Listeners. It is - expected that over time, deallocations will occur in roughly the same order - as allocations. - - @note This implementation uses Thread Local Storage to further improve - performance. However, it requires boost style thread_specific_ptr. - - @invariant allocate() and deallocate() are fully concurrent. - - @invariant The ABA problem is handled automatically. - - @ingroup beast_concurrent -*/ -class FifoFreeStoreWithTLS -{ -public: - FifoFreeStoreWithTLS (); - ~FifoFreeStoreWithTLS (); - - void* allocate (const size_t bytes); - static void deallocate (void* const p); - -private: - typedef GlobalPagedFreeStore PagedFreeStoreType; - struct Header; - - class Page; - - inline Page* newPage (); - static inline void deletePage (Page* page); - -private: - class PerThreadData; - boost::thread_specific_ptr m_tsp; - - PagedFreeStoreType::Ptr m_pages; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.cpp b/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.cpp deleted file mode 100644 index bc8d9b96d9..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.cpp +++ /dev/null @@ -1,241 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -// This precedes every allocation -struct FifoFreeStoreWithoutTLS::Header -{ - union - { - FifoFreeStoreWithoutTLS::Block* block; // backpointer to the page - - char pad [Memory::allocAlignBytes]; - }; -}; - -//------------------------------------------------------------------------------ - -class FifoFreeStoreWithoutTLS::Block : Uncopyable -{ -public: - explicit Block (const size_t bytes) : m_refs (1) - { - m_end = reinterpret_cast (this) + bytes; - m_free = reinterpret_cast ( - Memory::pointerAdjustedForAlignment (this + 1)); - } - - ~Block () - { - bassert (!m_refs.isSignaled ()); - } - - inline void addref () - { - m_refs.addref (); - } - - inline bool release () - { - return m_refs.release (); - } - - enum Result - { - success, // successful allocation - ignore, // disregard the block - consumed // block is consumed (1 thread sees this) - }; - - Result allocate (size_t bytes, void* pBlock) - { - bassert (bytes > 0); - - Result result; - - for (;;) - { - char* base = m_free.get (); - - if (base) - { - char* p = Memory::pointerAdjustedForAlignment (base); - char* free = p + bytes; - - if (free <= m_end) - { - // Try to commit the allocation - if (m_free.compareAndSet (free, base)) - { - * (reinterpret_cast (pBlock)) = p; - result = success; - break; - } - else - { - // Someone changed m_free, retry. - } - } - else - { - // Mark the block consumed. - if (m_free.compareAndSet (0, base)) - { - // Only one caller sees this, the rest get 'ignore' - result = consumed; - break; - } - else - { - // Happens with another concurrent allocate(), retry. - } - } - } - else - { - // Block is consumed, ignore it. - result = ignore; - break; - } - } - - return result; - } - -private: - AtomicCounter m_refs; // reference count - AtomicPointer m_free; // next free byte or 0 if inactive. - char* m_end; // last free byte + 1 -}; - -//------------------------------------------------------------------------------ - -inline FifoFreeStoreWithoutTLS::Block* FifoFreeStoreWithoutTLS::newBlock () -{ - return new (m_pages->allocate ()) Block (m_pages->getPageBytes ()); -} - -inline void FifoFreeStoreWithoutTLS::deleteBlock (Block* b) -{ - // It is critical that we do not call the destructor, - // because due to the lock-free implementation, a Block - // can be accessed for a short time after it is deleted. - /* b->~Block (); */ // DO NOT CALL!!! - - PagedFreeStoreType::deallocate (b); -} - -FifoFreeStoreWithoutTLS::FifoFreeStoreWithoutTLS () - : m_pages (GlobalPagedFreeStore::getInstance ()) -{ - if (m_pages->getPageBytes () < sizeof (Block) + 256) - Throw (Error ().fail (__FILE__, __LINE__, TRANS ("the block size is too small"))); - - m_active = newBlock (); -} - -FifoFreeStoreWithoutTLS::~FifoFreeStoreWithoutTLS () -{ - deleteBlock (m_active); -} - -//------------------------------------------------------------------------------ - -void* FifoFreeStoreWithoutTLS::allocate (const size_t bytes) -{ - const size_t actual = sizeof (Header) + bytes; - - if (actual > m_pages->getPageBytes ()) - Throw (Error ().fail (__FILE__, __LINE__, TRANS ("the memory request was too large"))); - - Header* h; - - for (;;) - { - // Get an active block. - Block* b = m_active; - - while (!b) - { - Thread::yield (); - b = m_active; - } - - // (*) It is possible for the block to get a final release here - // In this case it will have been put in the garbage, and - // m_active will not match. - - // Acquire a reference. - b->addref (); - - // Is it still active? - if (m_active == b) - { - // Yes so try to allocate from it. - const Block::Result result = b->allocate (actual, &h); - - if (result == Block::success) - { - // Keep the reference and return the allocation. - h->block = b; - break; - } - else if (result == Block::consumed) - { - // Remove block from active. - m_active = 0; - - // Take away the reference we added - b->release (); - - // Take away the original active reference. - if (b->release ()) - deleteBlock (b); - - // Install a fresh empty active block. - m_active = newBlock (); - } - else - { - if (b->release ()) - deleteBlock (b); - } - - // Try again. - } - else - { - // Block became inactive, so release our reference. - b->release (); - - // (*) It is possible for this to be a duplicate final release. - } - } - - return h + 1; -} - -//------------------------------------------------------------------------------ - -void FifoFreeStoreWithoutTLS::deallocate (void* p) -{ - Block* const b = (reinterpret_cast (p) - 1)->block; - - if (b->release ()) - deleteBlock (b); -} diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.h b/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.h deleted file mode 100644 index acfe2043f3..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_FifoFreeStoreWithoutTLS.h +++ /dev/null @@ -1,67 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FIFOFREESTOREWITHOUTTLS_BEASTHEADER -#define BEAST_FIFOFREESTOREWITHOUTTLS_BEASTHEADER - -#include "beast_GlobalPagedFreeStore.h" - -/*============================================================================*/ -/** - Lock-free FIFO memory allocator. - - This allocator is suitable for use with CallQueue and Listeners. It is - expected that over time, deallocations will occur in roughly the same order - as allocations. - - @note This version of the fifo free store uses less memory and doesn't require - thread specific storage. However, it runs slower. The performance - differences are negligible for desktop class applications. - - @invariant allocate() and deallocate() are fully concurrent. - - @invariant The ABA problem is handled automatically. - - @ingroup beast_concurrent -*/ -class FifoFreeStoreWithoutTLS -{ -public: - explicit FifoFreeStoreWithoutTLS (); - ~FifoFreeStoreWithoutTLS (); - - void* allocate (const size_t bytes); - static void deallocate (void* const p); - -private: - typedef GlobalPagedFreeStore PagedFreeStoreType; - - struct Header; - - class Block; - - inline Block* newBlock (); - static inline void deleteBlock (Block* b); - -private: - Block* volatile m_active; - PagedFreeStoreType::Ptr m_pages; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h deleted file mode 100644 index 96b9184fe6..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalFifoFreeStore.h +++ /dev/null @@ -1,65 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_GLOBALFIFOFREESTORE_BEASTHEADER -#define BEAST_GLOBALFIFOFREESTORE_BEASTHEADER - -#include "beast_FifoFreeStore.h" - -/*============================================================================*/ -/** - A @ref FifoFreeStoreType singleton. - - @ingroup beast_concurrent -*/ -template -class GlobalFifoFreeStore : public RefCountedSingleton > -{ -public: - inline void* allocate (size_t bytes) - { - return m_allocator.allocate (bytes); - } - - static inline void deallocate (void* const p) - { - FifoFreeStoreType::deallocate (p); - } - - static GlobalFifoFreeStore* createInstance () - { - return new GlobalFifoFreeStore; - } - -private: - GlobalFifoFreeStore () - : RefCountedSingleton > - (SingletonLifetime::persistAfterCreation) - { - } - - ~GlobalFifoFreeStore () - { - } - -private: - FifoFreeStoreType m_allocator; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.cpp b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.cpp deleted file mode 100644 index 1b3cd6d504..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.cpp +++ /dev/null @@ -1,42 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace -{ - -// Size of a page -// -static const size_t globalPageBytes = 8 * 1024; - -} - -GlobalPagedFreeStore::GlobalPagedFreeStore () - : RefCountedSingleton (SingletonLifetime::persistAfterCreation) - , m_allocator (globalPageBytes) -{ -} - -GlobalPagedFreeStore::~GlobalPagedFreeStore () -{ -} - -GlobalPagedFreeStore* GlobalPagedFreeStore::createInstance () -{ - return new GlobalPagedFreeStore; -} diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h deleted file mode 100644 index ff17214868..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_GlobalPagedFreeStore.h +++ /dev/null @@ -1,61 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_GLOBALPAGEDFREESTORE_BEASTHEADER -#define BEAST_GLOBALPAGEDFREESTORE_BEASTHEADER - -#include "beast_PagedFreeStore.h" - -/*============================================================================*/ -/** - A PagedFreeStore singleton. - - @ingroup beast_concurrent -*/ -class GlobalPagedFreeStore - : public RefCountedSingleton - , LeakChecked -{ -private: - GlobalPagedFreeStore (); - ~GlobalPagedFreeStore (); - -public: - inline size_t getPageBytes () - { - return m_allocator.getPageBytes (); - } - - inline void* allocate () - { - return m_allocator.allocate (); - } - - static inline void deallocate (void* const p) - { - PagedFreeStore::deallocate (p); - } - - static GlobalPagedFreeStore* createInstance (); - -private: - PagedFreeStore m_allocator; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_MemoryAlignment.h b/Subtrees/beast/modules/beast_basics/memory/beast_MemoryAlignment.h deleted file mode 100644 index f11f57b769..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_MemoryAlignment.h +++ /dev/null @@ -1,60 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORYALIGNMENT_BEASTHEADER -#define BEAST_MEMORYALIGNMENT_BEASTHEADER - -namespace Memory -{ - -// Constants - -const int cacheLineAlignBits = 6; // 64 bytes -const int cacheLineAlignBytes = 1 << cacheLineAlignBits; -const int cacheLineAlignMask = cacheLineAlignBytes - 1; - -const int allocAlignBits = 3; // 8 bytes -const int allocAlignBytes = 1 << allocAlignBits; -const int allocAlignMask = allocAlignBytes - 1; - -// Returns the number of bytes needed to advance p to the correct alignment -template -inline size_t bytesNeededForAlignment (P const* const p) -{ - return (allocAlignBytes - (uintptr_t (p) & allocAlignMask)) - & allocAlignMask; -} - -// Returns the number of bytes to make "bytes" an aligned size -inline size_t sizeAdjustedForAlignment (const size_t bytes) -{ - return (bytes + allocAlignMask) & ~allocAlignMask; -} - -// Returns a pointer with alignment added. -template -inline P* pointerAdjustedForAlignment (P* const p) -{ - return reinterpret_cast (reinterpret_cast (p) + - bytesNeededForAlignment (p)); -} - -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.cpp b/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.cpp deleted file mode 100644 index cbdec29b74..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.cpp +++ /dev/null @@ -1,226 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#define LOG_GC 0 - -namespace -{ - -// This is the upper limit on the amount of physical memory an instance of the -// allocator will allow. Going over this limit means that consumers cannot keep -// up with producers, and application logic should be re-examined. -// -// TODO: ENFORCE THIS GLOBALLY? MEASURE IN KILOBYTES AND FORCE KILOBYTE PAGE SIZES -#define HARD_LIMIT 1 -const size_t hardLimitMegaBytes = 256; - -} - -/* - -Implementation notes - -- There are two pools, the 'hot' pool and the 'cold' pool. - -- When a new page is needed we pop from the 'fresh' stack of the hot pool. - -- When a page is deallocated it is pushed to the 'garbage' stack of the hot pool. - -- Every so often, a garbage collection is performed on a separate thread. - During collection, fresh and garbage are swapped in the cold pool. - Then, the hot and cold pools are atomically swapped. - -*/ -//------------------------------------------------------------------------------ - -struct PagedFreeStore::Page : Pages::Node, LeakChecked -{ - explicit Page (PagedFreeStore* const allocator) - : m_allocator (*allocator) - { - } - - PagedFreeStore& getAllocator () const - { - return m_allocator; - } - -private: - PagedFreeStore& m_allocator; -}; - -inline void* PagedFreeStore::fromPage (Page* const p) -{ - return reinterpret_cast (p) + - Memory::sizeAdjustedForAlignment (sizeof (Page)); -} - -inline PagedFreeStore::Page* PagedFreeStore::toPage (void* const p) -{ - return reinterpret_cast ( - (reinterpret_cast (p) - - Memory::sizeAdjustedForAlignment (sizeof (Page)))); -} - -//------------------------------------------------------------------------------ - -PagedFreeStore::PagedFreeStore (const size_t pageBytes) - : m_pageBytes (pageBytes) - , m_pageBytesAvailable (pageBytes - Memory::sizeAdjustedForAlignment (sizeof (Page))) - , m_newPagesLeft (int ((hardLimitMegaBytes * 1024 * 1024) / m_pageBytes)) -#if LOG_GC - , m_swaps (0) -#endif -{ - m_hot = m_pool1; - m_cold = m_pool2; - - startOncePerSecond (); -} - -PagedFreeStore::~PagedFreeStore () -{ - endOncePerSecond (); - -#if LOG_GC - bassert (!m_used.isSignaled ()); -#endif - - dispose (m_pool1); - dispose (m_pool2); - -#if LOG_GC - bassert (!m_total.isSignaled ()); -#endif -} - -//------------------------------------------------------------------------------ - -void* PagedFreeStore::allocate () -{ - Page* page = m_hot->fresh->pop_front (); - - if (!page) - { -#if HARD_LIMIT - const bool exhausted = m_newPagesLeft.release (); - - if (exhausted) - Throw (Error ().fail (__FILE__, __LINE__, - TRANS ("the limit of memory allocations was reached"))); - -#endif - - void* storage = ::malloc (m_pageBytes); - - if (!storage) - Throw (Error ().fail (__FILE__, __LINE__, - TRANS ("a memory allocation failed"))); - - page = new (storage) Page (this); - -#if LOG_GC - m_total.addref (); -#endif - } - -#if LOG_GC - m_used.addref (); -#endif - - return fromPage (page); -} - -void PagedFreeStore::deallocate (void* const p) -{ - Page* const page = toPage (p); - PagedFreeStore& allocator = page->getAllocator (); - - allocator.m_hot->garbage->push_front (page); - -#if LOG_GC - allocator.m_used.release (); -#endif -} - -// -// Perform garbage collection. -// -void PagedFreeStore::doOncePerSecond () -{ - // Physically free one page. - // This will reduce the working set over time after a spike. - { - Page* page = m_cold->garbage->pop_front (); - - if (page) - { - page->~Page (); - ::free (page); - m_newPagesLeft.addref (); -#ifdef LOG_GC - m_total.release (); -#endif - } - } - - m_cold->fresh->swap (m_cold->garbage); - - // Swap atomically with respect to m_hot - Pool* temp = m_hot; - m_hot = m_cold; // atomic - m_cold = temp; - -#if LOG_GC - String s; - s << "swap " << String (++m_swaps); - s << " (" << String (m_used.get ()) << "/" - << String (m_total.get ()) << " of " - << String (m_newPagesLeft.get ()) << ")"; - Logger::outputDebugString (s); -#endif -} - -void PagedFreeStore::dispose (Pages& pages) -{ - for (;;) - { - Page* const page = pages.pop_front (); - - if (page) - { - page->~Page (); - ::free (page); - -#if LOG_GC - m_total.release (); -#endif - } - else - { - break; - } - } -} - -void PagedFreeStore::dispose (Pool& pool) -{ - dispose (pool.fresh); - dispose (pool.garbage); -} diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.h b/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.h deleted file mode 100644 index 078a383fd3..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_PagedFreeStore.h +++ /dev/null @@ -1,93 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PAGEDFREESTORE_BEASTHEADER -#define BEAST_PAGEDFREESTORE_BEASTHEADER - -/*============================================================================*/ -/** - Lock-free memory allocator for fixed size pages. - - The ABA problem (http://en.wikipedia.org/wiki/ABA_problem) is avoided by - treating freed pages as garbage, and performing a collection every second. - - @ingroup beast_concurrent -*/ -class PagedFreeStore : private OncePerSecond -{ -public: - explicit PagedFreeStore (const size_t pageBytes); - ~PagedFreeStore (); - - // The available bytes per page is a little bit less - // than requested in the constructor, due to overhead. - // - inline size_t getPageBytes () const - { - return m_pageBytesAvailable; - } - - inline void* allocate (const size_t bytes) - { - if (bytes > m_pageBytes) - Throw (Error ().fail (__FILE__, __LINE__, "the size is too large")); - - return allocate (); - } - - void* allocate (); - static void deallocate (void* const p); - -private: - void* newPage (); - void doOncePerSecond (); - -private: - struct Page; - typedef LockFreeStack Pages; - - struct Pool - { - CacheLine::Padded fresh; - CacheLine::Padded garbage; - }; - - static inline void* fromPage (Page* const p); - static inline Page* toPage (void* const p); - - void dispose (Pages& pages); - void dispose (Pool& pool); - -private: - const size_t m_pageBytes; - const size_t m_pageBytesAvailable; - CacheLine::Aligned m_pool1; // pair of pools - CacheLine::Aligned m_pool2; - Pool* volatile m_cold; // pool which is cooling down - Pool* volatile m_hot; // pool we are currently using - AtomicCounter m_newPagesLeft; // limit of system allocations - -#if 1 - int m_swaps; - AtomicCounter m_total; - AtomicCounter m_used; -#endif -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_RefCountedSingleton.h b/Subtrees/beast/modules/beast_basics/memory/beast_RefCountedSingleton.h deleted file mode 100644 index 54ce76dcbb..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_RefCountedSingleton.h +++ /dev/null @@ -1,199 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_REFERENCECOUNTEDSINGLETON_BEASTHEADER -#define BEAST_REFERENCECOUNTEDSINGLETON_BEASTHEADER - -#include "../events/beast_PerformedAtExit.h" -#include "../memory/beast_StaticObject.h" - -/** - Thread-safe singleton which comes into existence on first use. Use this - instead of creating objects with static storage duration. These singletons - are automatically reference counted, so if you hold a pointer to it in every - object that depends on it, the order of destruction of objects is assured - to be correct. - - class Object must provide the function `Object* Object::createInstance()` - - @class RefCountedSingleton - @ingroup beast_core -*/ -/** @{ */ -class SingletonLifetime -{ - // "base classes dependent on a template parameter - // aren't part of lookup." - ville -public: - /** - Construction options for RefCountedSingleton - - @ingroup beast_core - */ - enum Lifetime - { - /** Singleton is created on first use and destroyed when - the last reference is removed. - */ - createOnDemand, - - /** Like createOnDemand, but after the Singleton is destroyed an - exception will be thrown if an attempt is made to create it again. - */ - createOnDemandOnce, - - /** The singleton is created on first use and persists until program exit. - */ - persistAfterCreation - }; -}; - -template -class RefCountedSingleton - : public SingletonLifetime - , private PerformedAtExit -{ -protected: - typedef SpinLock LockType; - - /** Create the singleton. - - @param lifetime The lifetime management option. - */ - explicit RefCountedSingleton (Lifetime const lifetime) - : m_lifetime (lifetime) - { - bassert (s_instance == nullptr); - - if (m_lifetime == persistAfterCreation) - { - incReferenceCount (); - } - else if (m_lifetime == createOnDemandOnce && *s_created) - { - Throw (Error ().fail (__FILE__, __LINE__)); - } - - *s_created = true; - } - - virtual ~RefCountedSingleton () - { - bassert (s_instance == nullptr); - } - -public: - typedef ReferenceCountedObjectPtr Ptr; - - /** Retrieve a reference to the singleton. - */ - static Ptr getInstance () - { - Ptr instance; - - instance = s_instance; - - if (instance == nullptr) - { - LockType::ScopedLockType lock (*s_mutex); - - instance = s_instance; - - if (instance == nullptr) - { - s_instance = Object::createInstance (); - - instance = s_instance; - } - } - - return instance; - } - - inline void incReferenceCount () noexcept - { - m_refs.addref (); - } - - inline void decReferenceCount () noexcept - { - if (m_refs.release ()) - destroySingleton (); - } - - // Caller must synchronize. - inline bool isBeingReferenced () const - { - return m_refs.isSignaled (); - } - -private: - void performAtExit () - { - if (m_lifetime == SingletonLifetime::persistAfterCreation) - decReferenceCount (); - } - - void destroySingleton () - { - bool destroy; - - { - LockType::ScopedLockType lock (*s_mutex); - - if (isBeingReferenced ()) - { - destroy = false; - } - else - { - destroy = true; - s_instance = 0; - } - } - - if (destroy) - { - delete this; - } - } - -private: - Lifetime const m_lifetime; - AtomicCounter m_refs; - -private: - static Object* s_instance; - static Static::Storage > s_mutex; - static Static::Storage > s_created; -}; -/** @{ */ - -template -Object* RefCountedSingleton ::s_instance; - -template -Static::Storage ::LockType, RefCountedSingleton > -RefCountedSingleton ::s_mutex; - -template -Static::Storage > -RefCountedSingleton ::s_created; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_StaticObject.h b/Subtrees/beast/modules/beast_basics/memory/beast_StaticObject.h deleted file mode 100644 index 663e42b650..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_StaticObject.h +++ /dev/null @@ -1,187 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STATICOBJECT_BEASTHEADER -#define BEAST_STATICOBJECT_BEASTHEADER - -#include "../threads/beast_SpinDelay.h" - -// -// A full suite of thread-safe objects designed for static storage duration. -// -// Wraps an object with a thread-safe initialization preamble so that it can -// properly exist with static storage duration. -// -// Implementation notes: -// -// This is accomplished by omitting the constructor and relying on the C++ -// specification that plain data types with static storage duration are filled -// with zeroes before any other initialization code executes. -// -// Spec: N2914=09-0104 -// -// [3.6.2] Initialization of non-local objects -// -// Objects with static storage duration (3.7.1) or thread storage -// duration (3.7.2) shall be zero-initialized (8.5) before any -// other initialization takes place. -// -// Requirements: -// -// Object must be constructible without parameters. -// The StaticObject must be declared with static storage duration or -// the behavior is undefined. -// -// Usage example: -// -// Object* getInstance () -// { -// static StaticObject instance; -// return instance->getObject (); -// } -// - -namespace Static -{ - -//------------------------------------------------------------------------------ - -// Holds an object with static storage duration. -// The owner determines if and when the object is constructed and destroyed. -// Caller is responsible for synchronization. -// -template -class Storage -{ -public: - static inline void construct () - { - new (getObjectPtr ()) ObjectType; - } - - static inline void destroy () - { - getObjectPtr ()->~ObjectType (); - } - - static inline ObjectType* getObjectPtr () - { - return reinterpret_cast (s_storage); - } - - static inline ObjectType& getObject () - { - return *getObjectPtr (); - } - - inline ObjectType* operator-> () const - { - return getObjectPtr (); - } - - inline ObjectType& operator* () const - { - return getObject (); - } - - inline operator ObjectType* () const - { - return getObjectPtr (); - } - - // TODO: Crashes on iOS if not accessed before usage - static char s_storage [sizeof (ObjectType)]; - -private: -}; - -template -char Storage ::s_storage [sizeof (ObjectType)]; - -//------------------------------------------------------------------------------ - -// Provides a thread safe flag for indicating if and when -// initialization is required for an object with static storage duration. -// -class Initializer -{ -public: - /* - bool inited () const - { - return m_state.get () == stateInitialized; - } - */ - - // If the condition is not initialized, the first caller will - // receive true, while concurrent callers get blocked until - // initialization completes. - // - bool begin () - { - bool shouldInitialize; - - if (m_state.get () == stateUninitialized) - { - if (m_state.compareAndSetBool (stateInitializing, stateUninitialized)) - { - shouldInitialize = true; - } - else - { - SpinDelay delay; - - do - { - delay.pause (); - } - while (m_state.get () != stateInitialized); - - shouldInitialize = false; - } - } - else - { - shouldInitialize = false; - } - - return shouldInitialize; - } - - // Called to signal that the initialization is complete - // - void end () - { - m_state.set (stateInitialized); - } - -private: - enum - { - stateUninitialized = 0, // must be zero - stateInitializing, - stateInitialized - }; - - Atomic m_state; -}; - -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/memory/beast_Uncopyable.h b/Subtrees/beast/modules/beast_basics/memory/beast_Uncopyable.h deleted file mode 100644 index 0ce3c4fa2b..0000000000 --- a/Subtrees/beast/modules/beast_basics/memory/beast_Uncopyable.h +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_UNCOPYABLE_BEASTHEADER -#define BEAST_UNCOPYABLE_BEASTHEADER - -// Prevents warnings about missing copy -// constructors and assignment operators. - -// Ideas based on boost -class Uncopyable -{ -protected: - inline Uncopyable () { } - inline ~Uncopyable () { } - -private: - Uncopyable (Uncopyable const&); - Uncopyable const& operator= (Uncopyable const&); -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/native/beast_posix_FPUFlags.cpp b/Subtrees/beast/modules/beast_basics/native/beast_posix_FPUFlags.cpp deleted file mode 100644 index 0b0d476c12..0000000000 --- a/Subtrees/beast/modules/beast_basics/native/beast_posix_FPUFlags.cpp +++ /dev/null @@ -1,29 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -//#pragma message(BEAST_FILEANDLINE_ "Missing platform-specific implementation") - -FPUFlags FPUFlags::getCurrent () -{ - return FPUFlags (); -} - -void FPUFlags::setCurrent (const FPUFlags& flags) -{ -} diff --git a/Subtrees/beast/modules/beast_basics/native/beast_posix_Threads.cpp b/Subtrees/beast/modules/beast_basics/native/beast_posix_Threads.cpp deleted file mode 100644 index b6865169f0..0000000000 --- a/Subtrees/beast/modules/beast_basics/native/beast_posix_Threads.cpp +++ /dev/null @@ -1,18 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== diff --git a/Subtrees/beast/modules/beast_basics/native/beast_win32_FPUFlags.cpp b/Subtrees/beast/modules/beast_basics/native/beast_win32_FPUFlags.cpp deleted file mode 100644 index a21354d448..0000000000 --- a/Subtrees/beast/modules/beast_basics/native/beast_win32_FPUFlags.cpp +++ /dev/null @@ -1,176 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -FPUFlags FPUFlags::getCurrent () -{ - unsigned int currentControl; - const unsigned int newControl = 0; - const unsigned int mask = 0; - - errno_t result = _controlfp_s (¤tControl, newControl, mask); - - if (result != 0) - Throw (std::runtime_error ("error in _controlfp_s")); - - FPUFlags flags; - - flags.setMaskNaNs ((currentControl & _EM_INVALID) == _EM_INVALID); - flags.setMaskDenormals ((currentControl & _EM_DENORMAL) == _EM_DENORMAL); - flags.setMaskZeroDivides ((currentControl & _EM_ZERODIVIDE) == _EM_ZERODIVIDE); - flags.setMaskOverflows ((currentControl & _EM_OVERFLOW) == _EM_OVERFLOW); - flags.setMaskUnderflows ((currentControl & _EM_UNDERFLOW) == _EM_UNDERFLOW); - //flags.setMaskInexacts ((currentControl & _EM_INEXACT) == _EM_INEXACT); - flags.setFlushDenormals ((currentControl & _DN_FLUSH) == _DN_FLUSH); - flags.setInfinitySigned ((currentControl & _IC_AFFINE) == _IC_AFFINE); - - Rounding rounding = roundDown; - - switch (currentControl & _MCW_RC) - { - case _RC_CHOP: - rounding = roundChop; - break; - - case _RC_UP: - rounding = roundUp; - break; - - case _RC_DOWN: - rounding = roundDown; - break; - - case _RC_NEAR: - rounding = roundNear; - break; - - default: - Throw (std::runtime_error ("unknown rounding in _controlfp_s")); - }; - - flags.setRounding (rounding); - - Precision precision = bits64; - - switch (currentControl & _MCW_PC ) - { - case _PC_64: - precision = bits64; - break; - - case _PC_53: - precision = bits53; - break; - - case _PC_24: - precision = bits24; - break; - - default: - Throw (std::runtime_error ("unknown precision in _controlfp_s")); - }; - - flags.setPrecision (precision); - - return flags; -} - -static void setControl (const FPUFlags::Flag& flag, - unsigned int& newControl, - unsigned int& mask, - unsigned int constant) -{ - if (flag.is_set ()) - { - mask |= constant; - - if (flag.value ()) - newControl |= constant; - } -} - -void FPUFlags::setCurrent (const FPUFlags& flags) -{ - unsigned int newControl = 0; - unsigned int mask = 0; - - setControl (flags.getMaskNaNs (), newControl, mask, _EM_INVALID); - setControl (flags.getMaskDenormals (), newControl, mask, _EM_DENORMAL); - setControl (flags.getMaskZeroDivides (), newControl, mask, _EM_ZERODIVIDE); - setControl (flags.getMaskOverflows (), newControl, mask, _EM_OVERFLOW); - setControl (flags.getMaskUnderflows (), newControl, mask, _EM_UNDERFLOW); - //setControl (flags.getMaskInexacts(), newControl, mask, _EM_INEXACT); - setControl (flags.getFlushDenormals (), newControl, mask, _DN_FLUSH); - setControl (flags.getInfinitySigned (), newControl, mask, _IC_AFFINE); - - if (flags.getRounding ().is_set ()) - { - Rounding rounding = flags.getRounding ().value (); - - switch (rounding) - { - case roundChop: - mask |= _MCW_RC; - newControl |= _RC_CHOP; - break; - - case roundUp: - mask |= _MCW_RC; - newControl |= _RC_UP; - break; - - case roundDown: - mask |= _MCW_RC; - newControl |= _RC_DOWN; - break; - - case roundNear: - mask |= _MCW_RC; - newControl |= _RC_NEAR; - break; - } - } - - if (flags.getPrecision ().is_set ()) - { - switch (flags.getPrecision ().value ()) - { - case bits64: - mask |= _MCW_PC; - newControl |= _PC_64; - break; - - case bits53: - mask |= _MCW_PC; - newControl |= _PC_53; - break; - - case bits24: - mask |= _MCW_PC; - newControl |= _PC_24; - break; - } - } - - unsigned int currentControl; - - errno_t result = _controlfp_s (¤tControl, newControl, mask); - - if (result != 0) - Throw (std::runtime_error ("error in _controlfp_s")); -} diff --git a/Subtrees/beast/modules/beast_basics/native/beast_win32_Threads.cpp b/Subtrees/beast/modules/beast_basics/native/beast_win32_Threads.cpp deleted file mode 100644 index b6865169f0..0000000000 --- a/Subtrees/beast/modules/beast_basics/native/beast_win32_Threads.cpp +++ /dev/null @@ -1,18 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.cpp deleted file mode 100644 index 438c6beec3..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.cpp +++ /dev/null @@ -1,153 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -CallQueue::CallQueue (String name) - : m_name (name) -{ -} - -CallQueue::~CallQueue () -{ - // Someone forget to close the queue. - bassert (m_closed.isSignaled ()); - - // Can't destroy queue with unprocessed calls. - bassert (m_queue.empty ()); -} - -bool CallQueue::isAssociatedWithCurrentThread () const -{ - return Thread::getCurrentThreadId () == m_id; -} - -// Adds a call to the queue of execution. -void CallQueue::queuep (Work* c) -{ - // If this goes off it means calls are being made after the - // queue is closed, and probably there is no one around to - // process it. - bassert (!m_closed.isSignaled ()); - - if (m_queue.push_back (c)) - signal (); -} - -// Append the Work to the queue. If this call is made from the same -// thread as the last thread that called synchronize(), then the call -// will execute synchronously. -// -void CallQueue::callp (Work* c) -{ - queuep (c); - - // If we are called on the process thread and we are not - // recursed into doSynchronize, then process the queue. This - // makes calls from the process thread synchronous. - // - // NOTE: The value of isBeingSynchronized is invalid/volatile unless - // this thread is the last process thread. - // - // NOTE: There is a small window of opportunity where we - // might get an undesired synchronization if new thread - // calls synchronize() concurrently. - // - if (isAssociatedWithCurrentThread () && - m_isBeingSynchronized.trySignal ()) - { - doSynchronize (); - - m_isBeingSynchronized.reset (); - } -} - -bool CallQueue::synchronize () -{ - bool did_something; - - // Detect recursion into doSynchronize(), and - // break ties for concurrent calls atomically. - // - if (m_isBeingSynchronized.trySignal ()) - { - // Remember this thread. - m_id = Thread::getCurrentThreadId (); - - did_something = doSynchronize (); - - m_isBeingSynchronized.reset (); - } - else - { - did_something = false; - } - - return did_something; -} - -// Can still have pending calls, just can't put new ones in. -void CallQueue::close () -{ - m_closed.signal (); - - synchronize (); -} - -// Process everything in the queue. The list of pending calls is -// acquired atomically. New calls may enter the queue while we are -// processing. -// -// Returns true if any functors were called. -// -bool CallQueue::doSynchronize () -{ - bool did_something; - - // Reset since we are emptying the queue. Since we loop - // until the queue is empty, it is possible for us to exit - // this function with an empty queue and signaled state. - // - reset (); - - Work* call = m_queue.pop_front (); - - if (call) - { - did_something = true; - - // This method of processing one at a time has the desired - // side effect of synchronizing nested calls to us from a functor. - // - for (;;) - { - call->operator () (); - delete call; - - call = m_queue.pop_front (); - - if (call == 0) - break; - } - } - else - { - did_something = false; - } - - return did_something; -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.h b/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.h deleted file mode 100644 index 4a59e121c7..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_CallQueue.h +++ /dev/null @@ -1,542 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CALLQUEUE_BEASTHEADER -#define BEAST_CALLQUEUE_BEASTHEADER - -/*============================================================================*/ -/** - A FIFO for calling functors asynchronously. - - This object is an alternative to traditional locking techniques used to - implement concurrent systems. Instead of acquiring a mutex to change shared - data, a functor is queued for later execution (usually on another thread). The - execution of the functor applies the transformation to the shared state that - was formerly performed within a lock (i.e. CriticalSection). - - For read operations on shared data, instead of acquiring a mutex and - accessing the data directly, copies are made (one for each thread), and the - thread accesses its copy without acquiring a lock. One thread owns the master - copy of the shared state. Requests for changing shared state are made by other - threads by posting functors to the master thread's CallQueue. The master - thread notifies other threads of changes by posting functors to their - respective associated CallQueue, using the Listeners interface. - - The purpose of the functor is to encapsulate one mutation of shared state to - guarantee progress towards a consensus of the concurrent data among - participating threads. Functors should execute quickly, ideally in constant - time. Dynamically allocated objects of class type passed as functor parameters - should, in general, be reference counted. The ConcurrentObject class is ideal - for meeting this requirement, and has the additional benefit that the workload - of deletion is performed on a separate, provided thread. This queue is not a - replacement for a thread pool or job queue type system. - - A CallQueue is considered signaled when one or more functors are present. - Functors are executed during a call to synchronize(). The operation of - executing functors via the call to synchronize() is called synchronizing - the queue. It can more generally be thought of as synchronizing multiple - copies of shared data between threads. - - Although there is some extra work required to set up and maintain this - system, the benefits are significant. Since shared data is only synchronized - at well defined times, the programmer can reason and make strong statements - about the correctness of the concurrent system. For example, if an - AudioIODeviceCallback synchronizes the CallQueue only at the beginning of its - execution, it is guaranteed that shared data will remain the same throughout - the remainder of the function. - - Because shared data is accessed for reading without a lock, upper bounds - on the run time performance can easily be calculated and assured. Compare - this with the use of a mutex - the run time performance experiences a - combinatorial explosion of possibilities depending on the complex interaction - of multiple threads. - - Since a CallQueue is almost always used to invoke parameterized member - functions of objects, the call() function comes in a variety of convenient - forms to make usage easy: - - @code - - void func1 (int); - - struct Object - { - void func2 (void); - void func3 (String name); - - static void func4 (); - }; - - CallQueue fifo ("Example"); - - void example () - { - fifo.call (func1, 42); // same as: func1 (42) - - Object* object = new Object; - - fifo.call (&Object::func2, object); // same as: object->func2 () - - fifo.call (&Object::func3, // same as: object->funcf ("Label") - object, - "Label"); - - fifo.call (&Object::func4); // even static members can be called. - - fifo.callf (bind (&Object::func2, // same as: object->func2 () - object)); - } - - @endcode - - @invariant Functors can be added from any thread at any time, to any queue - which is not closed. - - @invariant When synchronize() is called, functors are called and deleted. - - @invariant The thread from which synchronize() is called is considered the - thread associated with the CallQueue. - - @invariant Functors queued by the same thread always execute in the same - order they were queued. - - @invariant Functors are guaranteed to execute. It is an error if the - CallQueue is deleted while there are functors in it. - - Normally, you will not use CallQueue directly, but one of its subclasses - instead. The CallQueue is one of a handful of objects that work together to - implement this system of concurrent data access. - - For performance considerations, this implementation is wait-free for - producers and mostly wait-free for consumers. It also uses a lock-free - and wait-free (in the fast path) custom memory allocator. - - @see GuiCallQueue, ManualCallQueue, MessageThread, ThreadWithCallQueue - - @ingroup beast_concurrent -*/ -class CallQueue -{ -public: - //============================================================================ - - /** Type of allocator to use. - - @internal - */ - typedef FifoFreeStoreType AllocatorType; - - /** Abstract nullary functor in a @ref CallQueue. - - Custom implementations may derive from this object for efficiency instead - of using the automatic binding functions. - */ - class Work : public LockFreeQueue ::Node, - public AllocatedBy - { - public: - virtual ~Work () { } - - /** Calls the functor. - - This executes during the queue's call to synchronize(). - */ - virtual void operator () () = 0; - }; - - //============================================================================ - - /** Create the CallQueue. - - The queue starts out open and empty. - - @param name A string to identify the queue during debugging. - */ - explicit CallQueue (String name); - - /** Destroy the CallQueue. - - @invariant Destroying a queue that contains functors results in undefined - behavior. - - @note It is customary to call close() on the CallQueue early in the - shutdown process to catch functors going into the queue late. - */ - virtual ~CallQueue (); - - //============================================================================ - - /** Add a functor and possibly synchronize. - - Use this when you want to perform the bind yourself. - - @param f The functor to add, typically the return value of a call - to bind(). - - @see call - */ - template - void callf (Functor f) - { - callp (new (m_allocator) CallType (f)); - } - - /** Add a function call and possibly synchronize. - - Parameters are evaluated immediately and added to the queue as a packaged - functor. If the current thread of execution is the same as the thread - associated with the CallQueue, synchronize() is called automatically. This - behavior can be avoided by using queue() instead. - - @param f The function to call followed by up to eight parameters, - evaluated immediately. The parameter list must match the function - signature. For class member functions, the first argument must be a - pointer to the class object. - - @see queue - - @todo Provide an example of when synchronize() is needed in call(). - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - void call (Fn f) - { - callf (bind (f)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void call (Fn f, T1 t1) - { - callf (bind (f, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void call (Fn f, T1 t1, T2 t2) - { - callf (bind (f, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void call (Fn f, T1 t1, T2 t2, T3 t3) - { - callf (bind (f, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void call (Fn f, T1 t1, T2 t2, T3 t3, T4 t4) - { - callf (bind (f, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void call (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - callf (bind (f, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void call (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - callf (bind (f, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void call (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - callf (bind (f, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void call (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - callf (bind (f, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - - /** Add a functor without synchronizing. - - Use this when you want to perform the bind yourself. - - @param f The functor to add, typically the return value of a call - to bind(). - - @see queue - */ - template - void queuef (Functor f) - { - queuep (new (m_allocator) CallType (f)); - } - - /** Add a function call without synchronizing. - - Parameters are evaluated immediately, then the resulting functor is added - to the queue. This is used to postpone the call to synchronize() when - there would be adverse side effects to executing the function immediately. - In this example, we use queue() instead of call() to avoid a deadlock: - - @code - - struct SharedState; // contains data shared between threads - - ConcurrentState sharedState; - - void stateChanged () - { - ConcurrentState ::ReadAccess state (sharedState); - - // (read state) - } - - CallQueue fifo; - - void changeState () - { - ConcurrentState ::WriteAccess state (sharedState); - - // (read and write state) - - fifo.call (&stateChanged); // BUG: DEADLOCK because of the implicit synchronize(). - - fifo.queue (&stateChanged); // Okay, synchronize() will be called later, - // after the write lock is released. - } - - @endcode - - @param f The function to call followed by up to eight parameters, - evaluated immediately. The parameter list must match the - function signature. For non-static class member functions, - the first argument must be a pointer an instance of the class. - - @see call - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - void queue (Fn f) - { - queuef (bind (f)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void queue (Fn f, T1 t1) - { - queuef (bind (f, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void queue (Fn f, T1 t1, T2 t2) - { - queuef (bind (f, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3) - { - queuef (bind (f, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3, T4 t4) - { - queuef (bind (f, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - queuef (bind (f, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - queuef (bind (f, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - queuef (bind (f, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void queue (Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - queuef (bind (f, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - -protected: - //============================================================================ - /** Synchronize the queue. - - A synchronize operation calls all functors in the queue. If a functor - causes additional functors to be added, they are eventually executed - before synchronize() returns. Derived class call this when the queue is - signaled, and optionally at any other time. Calling this function from - more than one thread simultaneously is undefined. - - @return true if any functors were executed. - */ - bool synchronize (); - - /** Close the queue. - - Functors may not be added after this routine is called. This is used for - diagnostics, to track down spurious calls during application shutdown - or exit. Derived classes may call this if the appropriate time is known. - - The queue is synchronized after it is closed. - */ - void close (); - - /** Called when the queue becomes signaled. - - A queue is signaled on the transition from empty to non-empty. Derived - classes implement this function to perform a notification so that - synchronize() will be called. For example, by triggering a WaitableEvent. - - @note Due to the implementation the queue can remain signaled for one - extra cycle. This does not happen under load and is not an issue - in practice. - */ - virtual void signal () = 0; - - /** Called when the queue is reset. - - A queue is reset when it was previously signaled and then becomes empty - as a result of a call to synchronize. - */ - virtual void reset () = 0; - -public: - //============================================================================ - - /** Add a raw call. - - @internal - - Custom implementations use this to control the allocation. - - @param c The call to add. The memory must come from the allocator. - */ - void callp (Work* c); - - /** Queue a raw call. - - Custom implementations use this to control the allocation. - - @param c The call to add. The memory must come from the allocator. - */ - void queuep (Work* c); - - /** Retrieve the allocator. - - @return The allocator to use when allocating a raw Work object. - */ - inline AllocatorType& getAllocator () - { - return m_allocator; - } - - /** See if the caller is on the association thread. - - @return `true` if the calling thread of execution is associated with the - queue. - */ - bool isAssociatedWithCurrentThread () const; - - /** See if the queue is being synchronized. - - This is used for diagnostics. - - @note This must be called from the associated thread or else the return - value is undefined. - - @return `true` if the call stack contains synchronize() for this queue. - */ - bool isBeingSynchronized () const - { - return m_isBeingSynchronized.isSignaled (); - } - -private: - template - class CallType : public Work - { - public: - explicit CallType (Functor f) : m_f (f) { } - void operator () () - { - m_f (); - } - - private: - Functor m_f; - }; - - bool doSynchronize (); - -private: - String const m_name; - Thread::ThreadID m_id; - LockFreeQueue m_queue; - AtomicFlag m_closed; - AtomicFlag m_isBeingSynchronized; - AllocatorType m_allocator; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.cpp deleted file mode 100644 index 91c0c53e30..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class ConcurrentObject::Deleter : private ThreadWithCallQueue::EntryPoints -{ -private: - Deleter () : m_thread ("AsyncDeleter") - { - m_thread.start (this); - } - - ~Deleter () - { - m_thread.stop (true); - } - - void performAtExit () - { - //delete this; - } - - static void doDelete (ConcurrentObject* sharedObject) - { - delete sharedObject; - } - -public: - void destroy (ConcurrentObject* sharedObject) - { - if (m_thread.isAssociatedWithCurrentThread ()) - delete sharedObject; - else - m_thread.call (&Deleter::doDelete, sharedObject); - } - - static Deleter& getInstance () - { - static Deleter instance; - - return instance; - } - -private: - ThreadWithCallQueue m_thread; -}; - -//------------------------------------------------------------------------------ - -ConcurrentObject::ConcurrentObject () -{ -} - -ConcurrentObject::~ConcurrentObject () -{ -} - -void ConcurrentObject::destroyConcurrentObject () -{ - Deleter::getInstance ().destroy (this); -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.h b/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.h deleted file mode 100644 index 4f2f531ec0..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentObject.h +++ /dev/null @@ -1,79 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CONCURRENTOBJECT_BEASTHEADER -#define BEAST_CONCURRENTOBJECT_BEASTHEADER - -/*============================================================================*/ -/** - A reference counted object with overridable destroy behavior. - - This is a reference counted object compatible with - ReferenceCountedObjectPtr. When the last reference is removed, the - object is queued for deletion on a separate, provided thread. On - program exit the thread will clean itself up - no other action is - required. - - This class is useful for offloading the deletion work of "deep" objects - shared by multiple threads: objects containing complex members, or a - hierarchy of allocated structures. For example, a ValueTree. The problem - of performing heavyweight memory or cleanup operations from either an - AudioIODeviceCallback or the message thread is avoided. - - The deletion behavior can be overriden by providing a replacement - for destroyConcurrentObject(). - - @ingroup beast_concurrent -*/ -class ConcurrentObject : Uncopyable -{ -public: - inline void incReferenceCount () noexcept - { - m_refs.addref (); - } - - inline void decReferenceCount () noexcept - { - if (m_refs.release ()) - destroyConcurrentObject (); - } - -protected: - ConcurrentObject (); - - virtual ~ConcurrentObject (); - - /** Delete the object. - - This function is called when the reference count drops to zero. The - default implementation performs the delete on a separate, provided thread - that cleans up after itself on exit. - */ - virtual void destroyConcurrentObject (); - -protected: - class Deleter; - -private: - AtomicCounter m_refs; -}; - -#endif - diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentState.h b/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentState.h deleted file mode 100644 index 6a5157fe9d..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ConcurrentState.h +++ /dev/null @@ -1,298 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CONCURRENTSTATE_BEASTHEADER -#define BEAST_CONCURRENTSTATE_BEASTHEADER - -/*============================================================================*/ -/** - Structured access to a shared state. - - This template wraps an object containing members representing state - information shared between multiple threads of execution, where any thread - may need to read or write as needed. Synchronized access to the concurrent - state is enforced at compile time through strongly typed accessor classes. - This interface design facilitates source code pattern matching to find all - areas where a concurrent state is accessed. - - There are three types of access: - - - ReadAccess - - Allows read access to the underlying object as `const`. ReadAccess may be - granted to one or more threads simultaneously. If one or more threads have - ReadAccess, requests to obtain WriteAccess are blocked. - - - WriteAccess - - Allows exclusive read/write access the underlying object. A WriteAccess - request blocks until all existing ReadAccess and WriteAccess requests are - released. While a WriteAccess exists, requests for ReadAccess will block. - - - UnlockedAccess - - Allows read access to the underlying object without using the lock. This - can be helpful when designing concurrent structures through composition. - It also makes it easier to search for places in code which use unlocked - access. - - This code example demonstrates various forms of access to a ConcurrentState: - - @code - - struct SharedData - { - int value1; - String value2; - }; - - typedef ConcurrentState SharedState; - - SharedState sharedState; - - void readExample () - { - SharedState::ReadAccess state (sharedState); - - print (state->value1); // read access - print (state->value2); // read access - - state->value1 = 42; // write disallowed: compile error - } - - void writeExample () - { - SharedState::WriteAccess state (sharedState); - - state->value2 = "Label"; // write access - } - - @endcode - - Forwarding constructors with up to eight parameters are provided. This lets - you write constructors into the underlying data object. For example: - - @code - - struct SharedData - { - explicit SharedData (int numSlots) - { - m_array.reserve (numSlots); - } - - std::vector m_array; - }; - - // Construct SharedData with one parameter - ConcurrentState sharedState (16); - - @endcode - - @param Object The type of object to encapsulate. - - @warning Recursive calls are not supported. It is generally not possible for - a thread of execution to acquire write access while it already has - read access. Such an attempt will result in undefined behavior. Calling into - unknown code while holding a lock can cause deadlock. See - @ref CallQueue::queue(). - - @ingroup beast_concurrent -*/ -template -class ConcurrentState : Uncopyable -{ -public: - class ReadAccess; - class WriteAccess; - class UnlockedAccess; - - /** Create a concurrent state. - - Up to 8 parameters can be specified in the constructor. These parameters - are forwarded to the corresponding constructor in Object. If no - constructor in Object matches the parameter list, a compile error is - generated. - */ - /** @{ */ - ConcurrentState () { } - - template - explicit ConcurrentState (T1 t1) - : m_obj (t1) { } - - template - ConcurrentState (T1 t1, T2 t2) - : m_obj (t1, t2) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3) - : m_obj (t1, t2, t3) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3, T4 t4) - : m_obj (t1, t2, t3, t4) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - : m_obj (t1, t2, t3, t4, t5) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - : m_obj (t1, t2, t3, t4, t5, t6) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) : m_obj (t1, t2, t3, t4, t5, t6, t7) { } - - template - ConcurrentState (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - : m_obj (t1, t2, t3, t4, t5, t6, t7, t8) { } - /** @} */ - -private: - typedef ReadWriteMutex ReadWriteMutexType; - - Object m_obj; - ReadWriteMutexType m_mutex; -}; - -//------------------------------------------------------------------------------ - -/** Unlocked access to a ConcurrentState. - - Use sparingly. -*/ -template -class ConcurrentState ::UnlockedAccess : Uncopyable -{ -public: - explicit UnlockedAccess (ConcurrentState const& state) - : m_state (state) - { - } - - Object const& getObject () const - { - return m_state.m_obj; - } - Object const& operator* () const - { - return getObject (); - } - Object const* operator-> () const - { - return &getObject (); - } - -private: - ConcurrentState const& m_state; -}; - -//------------------------------------------------------------------------------ - -/** Read only access to a ConcurrentState */ -template -class ConcurrentState ::ReadAccess : Uncopyable -{ -public: - /** Create a ReadAccess from the specified ConcurrentState */ - explicit ReadAccess (ConcurrentState const volatile& state) - : m_state (const_cast (state)) - , m_lock (m_state.m_mutex) - { - } - - /** Obtain a read only reference to Object */ - Object const& getObject () const - { - return m_state.m_obj; - } - - /** Obtain a read only reference to Object */ - Object const& operator* () const - { - return getObject (); - } - - /** Obtain a read only smart pointer to Object */ - Object const* operator-> () const - { - return &getObject (); - } - -private: - ConcurrentState const& m_state; - ReadWriteMutexType::ScopedReadLockType m_lock; -}; - -//------------------------------------------------------------------------------ - -/** Read/write access to a ConcurrentState */ -template -class ConcurrentState ::WriteAccess : Uncopyable -{ -public: - explicit WriteAccess (ConcurrentState& state) - : m_state (state) - , m_lock (m_state.m_mutex) - { - } - - /** Obtain a read only reference to Object */ - Object const* getObject () const - { - return m_state.m_obj; - } - - /** Obtain a read only reference to Object */ - Object const& operator* () const - { - return getObject (); - } - - /** Obtain a read only smart pointer to Object */ - Object const* operator-> () const - { - return &getObject (); - } - - /** Obtain a read/write pointer to Object */ - Object& getObject () - { - return m_state.m_obj; - } - - /** Obtain a read/write reference to Object */ - Object& operator* () - { - return getObject (); - } - - /** Obtain a read/write smart pointer to Object */ - Object* operator-> () - { - return &getObject (); - } - -private: - ConcurrentState& m_state; - ReadWriteMutexType::ScopedWriteLockType m_lock; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_GlobalThreadGroup.h b/Subtrees/beast/modules/beast_basics/threads/beast_GlobalThreadGroup.h deleted file mode 100644 index 6940ebde51..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_GlobalThreadGroup.h +++ /dev/null @@ -1,49 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_GLOBALTHREADGROUP_BEASTHEADER -#define BEAST_GLOBALTHREADGROUP_BEASTHEADER - -/*============================================================================*/ -/** - A ThreadGroup singleton. - - @see ThreadGroup - - @ingroup beast_concurrent -*/ -class GlobalThreadGroup : public ThreadGroup, - public RefCountedSingleton -{ -private: - friend class RefCountedSingleton ; - - GlobalThreadGroup () - : RefCountedSingleton ( - SingletonLifetime::persistAfterCreation) - { - } - - static GlobalThreadGroup* createInstance () - { - return new GlobalThreadGroup; - } -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.cpp deleted file mode 100644 index ed74edc43e..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.cpp +++ /dev/null @@ -1,225 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -InterruptibleThread::ThreadHelper::ThreadHelper (String name, - InterruptibleThread* owner) - : Thread (name) - , m_owner (owner) -{ -} - -InterruptibleThread* InterruptibleThread::ThreadHelper::getOwner () const -{ - return m_owner; -} - -void InterruptibleThread::ThreadHelper::run () -{ - m_owner->run (); -} - -//------------------------------------------------------------------------------ - -InterruptibleThread::InterruptibleThread (String name) - : m_thread (name, this) - , m_entryPoint (nullptr) - , m_state (stateRun) -{ -} - -InterruptibleThread::~InterruptibleThread () -{ - m_runEvent.signal (); - - join (); -} - -void InterruptibleThread::start (EntryPoint* const entryPoint) -{ - m_entryPoint = entryPoint; - - m_thread.startThread (); - - // Prevent data race with member variables - // - m_runEvent.signal (); -} - -void InterruptibleThread::join () -{ - m_thread.stopThread (-1); -} - -bool InterruptibleThread::wait (int milliSeconds) -{ - // Can only be called from the corresponding thread of execution. - // - bassert (isTheCurrentThread ()); - - bool interrupted = false; - - for (;;) - { - bassert (m_state != stateWait); - - // See if we are interrupted - // - if (m_state.tryChangeState (stateInterrupt, stateRun)) - { - // We were interrupted, state is changed to Run. Caller must run now. - // - interrupted = true; - break; - } - else if (m_state.tryChangeState (stateRun, stateWait) || - m_state.tryChangeState (stateReturn, stateWait)) - { - // Transitioned to wait. Caller must wait now. - // - interrupted = false; - break; - } - } - - if (!interrupted) - { - interrupted = m_thread.wait (milliSeconds); - - if (!interrupted) - { - if (m_state.tryChangeState (stateWait, stateRun)) - { - interrupted = false; - } - else - { - bassert (m_state == stateInterrupt); - - interrupted = true; - } - } - } - - return interrupted; -} - -void InterruptibleThread::interrupt () -{ - for (;;) - { - int const state = m_state; - - if (state == stateInterrupt || - state == stateReturn || - m_state.tryChangeState (stateRun, stateInterrupt)) - { - // Thread will see this at next interruption point. - // - break; - } - else if (m_state.tryChangeState (stateWait, stateRun)) - { - m_thread.notify (); - break; - } - } -} - -bool InterruptibleThread::interruptionPoint () -{ - // Can only be called from the thread of execution. - // - bassert (isTheCurrentThread ()); - - if (m_state == stateWait) - { - // It is impossible for this function to be called while in the wait state. - // - Throw (Error ().fail (__FILE__, __LINE__)); - } - else if (m_state == stateReturn) - { - // If this goes off it means the thread called the - // interruption a second time after already getting interrupted. - // - Throw (Error ().fail (__FILE__, __LINE__)); - } - - bool const interrupted = m_state.tryChangeState (stateInterrupt, stateRun); - - return interrupted; -} - -InterruptibleThread::id InterruptibleThread::getId () const -{ - return m_threadId; -} - -bool InterruptibleThread::isTheCurrentThread () const -{ - return m_thread.getCurrentThreadId () == m_threadId; -} - -void InterruptibleThread::setPriority (int priority) -{ - m_thread.setPriority (priority); -} - -InterruptibleThread* InterruptibleThread::getCurrentThread () -{ - InterruptibleThread* result = nullptr; - - Thread* const thread = Thread::getCurrentThread (); - - if (thread != nullptr) - { - ThreadHelper* const helper = dynamic_cast (thread); - - bassert (helper != nullptr); - - result = helper->getOwner (); - } - - return result; -} - -void InterruptibleThread::run () -{ - m_threadId = m_thread.getThreadId (); - - m_runEvent.wait (); - - //CatchAny (m_function); - m_entryPoint->threadRun (); -} - -//------------------------------------------------------------------------------ - -bool CurrentInterruptibleThread::interruptionPoint () -{ - bool interrupted = false; - - InterruptibleThread* const interruptibleThread (InterruptibleThread::getCurrentThread ()); - - bassert (interruptibleThread != nullptr); - - interrupted = interruptibleThread->interruptionPoint (); - - return interrupted; -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.h b/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.h deleted file mode 100644 index 2c56e9dc67..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_InterruptibleThread.h +++ /dev/null @@ -1,188 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_INTERRUPTIBLETHREAD_BEASTHEADER -#define BEAST_INTERRUPTIBLETHREAD_BEASTHEADER - -#include "../diagnostic/beast_SafeBool.h" -#include "../functor/beast_Function.h" - -//============================================================================== -/** - A thread with soft interruption support. - - The thread must periodically call interruptionPoint(), which returns `true` - the first time an interruption has occurred since the last call to - interruptionPoint(). - - To create a thread, derive your class from InterruptibleThread::EntryPoint - and implement the threadRun() function. Then, call run() with your object. - - @ingroup beast_core -*/ -class InterruptibleThread -{ -public: - /** InterruptibleThread entry point. - */ - class EntryPoint - { - public: - virtual ~EntryPoint () { } - - virtual void threadRun () = 0; - }; - -public: - typedef Thread::ThreadID id; - - /** Construct an interruptible thread. - - The name is used for debugger diagnostics. - - @param name The name of the thread. - */ - explicit InterruptibleThread (String name); - - /** Destroy the interruptible thread. - - This will signal an interrupt and wait until the thread exits. - */ - ~InterruptibleThread (); - - /** Start the thread. - */ - void start (EntryPoint* const entryPoint); - - /** Wait for the thread to exit. - */ - void join (); - - /** Wait for interrupt or timeout. - - This call blocks until the thread is interrupted, or until the timeout - expires if milliSeconds is non-negative. - - May only be called by the thread of execution. - - @param milliSeconds The amount of time to wait. Negative values mean - no timeout. - - @return `true` if the interrupt occurred, or `false` if the - timeout expired. - */ - bool wait (int milliSeconds = -1); - - /** Interrupt the thread of execution. - - This can be called from any thread. - */ - void interrupt (); - - /** Determine if an interruption is requested. - - After the function returns `true`, the interrupt status is cleared. - Subsequent calls will return `false` until another interrupt is requested. - - May only be called by the thread of execution. - - @see CurrentInterruptibleThread::interruptionPoint - - @return `true` if an interrupt was requested. - */ - bool interruptionPoint (); - - /** Get the ID of the associated thread. - - @return The ID of the thread. - */ - id getId () const; - - /** Determine if this is the thread of execution. - - @note The return value is undefined if the thread is not running. - - @return `true` if the caller is this thread of execution. - */ - bool isTheCurrentThread () const; - - /** Adjust the thread priority. - - @note This only affects some platforms. - - @param priority A number from 0..10 - */ - void setPriority (int priority); - - /** Get the InterruptibleThread for the thread of execution. - - This will return `nullptr` when called from the message thread, or from - a thread of execution that is not an InterruptibleThread. - */ - static InterruptibleThread* getCurrentThread (); - -private: - class ThreadHelper : public Thread - { - public: - ThreadHelper (String name, InterruptibleThread* owner); - - InterruptibleThread* getOwner () const; - - void run (); - - private: - InterruptibleThread* const m_owner; - }; - - void run (); - - ThreadHelper m_thread; - EntryPoint* m_entryPoint; - Function m_function; - WaitableEvent m_runEvent; - id m_threadId; - - enum - { - stateRun, - stateInterrupt, - stateReturn, - stateWait - }; - - AtomicState m_state; -}; - -//------------------------------------------------------------------------------ - -/** Global operations on the current InterruptibleThread. - - Calling members of the class from a thread of execution which is not an - InterruptibleThread results in undefined behavior. -*/ -class CurrentInterruptibleThread -{ -public: - /** Call the current thread's interrupt point function. - */ - static bool interruptionPoint (); -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.cpp deleted file mode 100644 index 3c1d11eec6..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.cpp +++ /dev/null @@ -1,765 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -// CallQueue item to process a Call for a particular listener. -// This is used to avoid bind overhead. -// -class ListenersBase::CallWork : public CallQueue::Work -{ -public: - inline CallWork (ListenersBase::Call* const c, void* const listener) - : m_call (c), m_listener (listener) - { - } - - void operator () () - { - m_call->operator () (m_listener); - } - -private: - ListenersBase::Call::Ptr m_call; - void* const m_listener; -}; - -//------------------------------------------------------------------------------ - -// CallQueue item to process a Call for a group. -// This is used to avoid bind overhead. -// -class ListenersBase::GroupWork : public CallQueue::Work -{ -public: - inline GroupWork (Group* group, - ListenersBase::Call* c, - const timestamp_t timestamp) - : m_group (group) - , m_call (c) - , m_timestamp (timestamp) - { - } - - void operator () () - { - m_group->do_call (m_call, m_timestamp); - } - -private: - Group::Ptr m_group; - ListenersBase::Call::Ptr m_call; - const timestamp_t m_timestamp; -}; - -//------------------------------------------------------------------------------ - -// CallQueue item to process a call for a particular listener. -// This is used to avoid bind overhead. -// -class ListenersBase::GroupWork1 : public CallQueue::Work -{ -public: - inline GroupWork1 (Group* group, - ListenersBase::Call* c, - const timestamp_t timestamp, - void* const listener) - : m_group (group) - , m_call (c) - , m_timestamp (timestamp) - , m_listener (listener) - { - } - - void operator () () - { - m_group->do_call1 (m_call, m_timestamp, m_listener); - } - -private: - Group::Ptr m_group; - ListenersBase::Call::Ptr m_call; - const timestamp_t m_timestamp; - void* const m_listener; -}; - -//------------------------------------------------------------------------------ - -// A Proxy maintains a list of Entry. -// Each Entry holds a group and the current Call (which can be updated). -// -struct ListenersBase::Proxy::Entry : Entries::Node, - ReferenceCountedObject, - AllocatedBy -{ - typedef ReferenceCountedObjectPtr Ptr; - - explicit Entry (Group* g) - : group (g) - { - } - - ~Entry () - { - bassert (call.get () == 0); - } - - Group::Ptr group; - AtomicPointer call; -}; - -//------------------------------------------------------------------------------ - -// A Group maintains a list of Entry. -// -struct ListenersBase::Group::Entry : List ::Node, - AllocatedBy -{ - Entry (void* const l, const timestamp_t t) - : listener (l) - , timestamp (t) - { - } - - void* const listener; - const timestamp_t timestamp; -}; - -//------------------------------------------------------------------------------ -// -// Group -// -//------------------------------------------------------------------------------ - -// - A list of listeners associated with the same CallQueue. -// -// - The list is only iterated on the CallQueue's thread. -// -// - It is safe to add or remove listeners from the group -// at any time. -// - -ListenersBase::Group::Group (CallQueue& callQueue) - : m_fifo (callQueue) - , m_listener (0) -{ -} - -ListenersBase::Group::~Group () -{ - // If this goes off it means a Listener forgot to remove itself. - bassert (m_list.empty ()); - - // shouldn't be deleting group during a call - bassert (m_listener == 0); -} - -// Add the listener with the given timestamp. -// The listener will only get calls with higher timestamps. -// The caller must prevent duplicates. -// -void ListenersBase::Group::add (void* listener, - const timestamp_t timestamp, - AllocatorType& allocator) -{ - ReadWriteMutex::ScopedWriteLockType lock (m_mutex); - - bassert (!contains (listener)); - - // Should never be able to get here while in call() - bassert (m_listener == 0); - - // Add the listener and remember the time stamp so we don't - // send it calls that were queued earlier than the add(). - m_list.push_back (*new (allocator) Entry (listener, timestamp)); -} - -// Removes the listener from the group if it exists. -// Returns true if the listener was removed. -// -bool ListenersBase::Group::remove (void* listener) -{ - bool found = false; - - ReadWriteMutex::ScopedWriteLockType lock (m_mutex); - - // Should never be able to get here while in call() - bassert (m_listener == 0); - - for (List ::iterator iter = m_list.begin (); iter != m_list.end (); ++iter) - { - Entry* entry = & (*iter); - - if (entry->listener == listener) - { - m_list.erase (m_list.iterator_to (*entry)); - delete entry; - found = true; - break; - } - } - - return found; -} - -// Used for assertions. -// The caller must synchronize. -// -bool ListenersBase::Group::contains (void* const listener) /*const*/ -{ - for (List ::iterator iter = m_list.begin (); iter != m_list.end (); iter++) - if (iter->listener == listener) - return true; - - return false; -} - -void ListenersBase::Group::call (Call* const c, const timestamp_t timestamp) -{ - bassert (!empty ()); - m_fifo.callp (new (m_fifo.getAllocator ()) GroupWork (this, c, timestamp)); -} - -void ListenersBase::Group::queue (Call* const c, const timestamp_t timestamp) -{ - bassert (!empty ()); - m_fifo.queuep (new (m_fifo.getAllocator ()) GroupWork (this, c, timestamp)); -} - -void ListenersBase::Group::call1 (Call* const c, - const timestamp_t timestamp, - void* const listener) -{ - m_fifo.callp (new (m_fifo.getAllocator ()) GroupWork1 ( - this, c, timestamp, listener)); -} - -void ListenersBase::Group::queue1 (Call* const c, - const timestamp_t timestamp, - void* const listener) -{ - m_fifo.queuep (new (m_fifo.getAllocator ()) GroupWork1 ( - this, c, timestamp, listener)); -} - -// Queues a reference to the Call on the thread queue of each listener -// that is currently in our list. The thread queue must be in the -// stack's call chain, either directly from CallQueue::synchronize(), -// or from Proxy::do_call() called from CallQueue::synchronize(). -// -void ListenersBase::Group::do_call (Call* const c, const timestamp_t timestamp) -{ - if (!empty ()) - { - ReadWriteMutex::ScopedReadLockType lock (m_mutex); - - // Recursion not allowed. - bassert (m_listener == 0); - - // The body of the loop MUST NOT cause listeners to get called. - // Therefore, we don't have to worry about listeners removing - // themselves while iterating the list. - // - for (List ::iterator iter = m_list.begin (); iter != m_list.end ();) - { - Entry* entry = & (*iter++); - - // Since it is possible for a listener to be added after a - // Call gets queued but before it executes, this prevents listeners - // from seeing Calls created before they were added. - // - if (timestamp > entry->timestamp) - { - m_listener = entry->listener; - - // The thread queue's synchronize() function MUST be in our call - // stack to guarantee that these calls will not execute immediately. - // They will be handled by the tail recusion unrolling in the - // thread queue. - bassert (m_fifo.isBeingSynchronized ()); - - m_fifo.callp (new (m_fifo.getAllocator ()) CallWork (c, m_listener)); - - m_listener = 0; - } - } - } - else - { - // last listener was removed before we got here, - // and the parent listener list may have been deleted. - } -} - -void ListenersBase::Group::do_call1 (Call* const c, const timestamp_t timestamp, - void* const listener) -{ - if (!empty ()) - { - ReadWriteMutex::ScopedReadLockType lock (m_mutex); - - // Recursion not allowed. - bassert (m_listener == 0); - - for (List ::iterator iter = m_list.begin (); iter != m_list.end ();) - { - Entry* entry = & (*iter++); - - if (entry->listener == listener) - { - if (timestamp > entry->timestamp) - { - m_listener = entry->listener; - - bassert (m_fifo.isBeingSynchronized ()); - - m_fifo.callp (new (m_fifo.getAllocator ()) CallWork (c, m_listener)); - - m_listener = 0; - } - } - } - } - else - { - // Listener was removed - } -} - -//------------------------------------------------------------------------------ -// -// Proxy -// -//------------------------------------------------------------------------------ - -// CallQueue item for processing a an Entry for a Proxy. -// This is used to avoid bind overhead. -// -class ListenersBase::Proxy::Work : public CallQueue::Work -{ -public: - inline Work (Proxy* proxy, - Entry* const entry, - const timestamp_t timestamp) - : m_proxy (proxy) - , m_entry (entry) - , m_timestamp (timestamp) - { - } - - void operator () () - { - ListenersBase::Call* c = m_entry->call.exchange (0); - - Group* group = m_entry->group; - - if (!group->empty ()) - group->do_call (c, m_timestamp); - - c->decReferenceCount (); - } - -private: - Proxy* const m_proxy; - Entry::Ptr m_entry; - const timestamp_t m_timestamp; -}; - -// Holds a Call, and gets put in the CallQueue in place of the Call. -// The Call may be replaced if it hasn't been processed yet. -// A Proxy exists for the lifetime of the Listeners. -// -ListenersBase::Proxy::Proxy (void const* const member, const size_t bytes) - : m_bytes (bytes) -{ - if (bytes > maxMemberBytes) - Throw (Error ().fail (__FILE__, __LINE__, "the Proxy member is too large")); - - memcpy (m_member, member, bytes); -} - -ListenersBase::Proxy::~Proxy () -{ - // If the proxy is getting destroyed it means: - // - the listeners object is getting destroyed - // - all listeners must have removed themselves - // - all thread queues have been fully processed - // Therefore, our entries should be gone. - - // NO it is possible for an empty Group, for which - // the parent listeners object has been destroyed, - // to still exist in a thread queue!!! - - // But all listeners should have removed themselves - // so our list of groups should still be empty. - bassert (m_entries.empty ()); -} - -// Adds the group to the Proxy. -// Caller must have the proxies mutex. -// Caller is responsible for preventing duplicates. -// -void ListenersBase::Proxy::add (Group* group, AllocatorType& allocator) -{ - Entry* entry (new (allocator) Entry (group)); - - // Manual addref and put raw pointer in list - entry->incReferenceCount (); - m_entries.push_back (*entry); -} - -// Removes the group from the Proxy. -// Caller must have the proxies mutex. -// Caller is responsible for making sure the group exists. -void ListenersBase::Proxy::remove (Group* group) -{ - for (Entries::iterator iter = m_entries.begin (); iter != m_entries.end ();) - { - Entry* entry = & (*iter++); - - if (entry->group == group) - { - // remove from list and manual release - m_entries.erase (m_entries.iterator_to (*entry)); - entry->decReferenceCount (); - - // Entry might still be in the empty group's thread queue - break; - } - } -} - -// For each group, updates the call. -// Queues each group that isn't already queued. -// Caller must acquire the group read lock. -// -void ListenersBase::Proxy::update (Call* const c, const timestamp_t timestamp) -{ - // why would we even want to be called? - bassert (!m_entries.empty ()); - - // With the read lock, this list can't change on us unless someone - // adds a listener to a new thread queue in response to a call. - for (Entries::iterator iter = m_entries.begin (); iter != m_entries.end ();) - { - Entry* entry = & (*iter++); - - // Manually add a reference since we use a raw pointer - c->incReferenceCount (); - - // Atomically exchange the new call for the old one - Call* old = entry->call.exchange (c); - - // If no old call then they need to be queued - if (!old) - { - CallQueue& callQueue = entry->group->getCallQueue (); - callQueue.callp (new (callQueue.getAllocator ()) Work (this, entry, timestamp)); - } - else - { - old->decReferenceCount (); - } - } -} - -bool ListenersBase::Proxy::match (void const* const member, const size_t bytes) const -{ - return m_bytes == bytes && memcmp (member, m_member, bytes) == 0; -} - -//------------------------------------------------------------------------------ -// -// ListenersBase -// -//------------------------------------------------------------------------------ - -ListenersBase::ListenersBase () - : m_timestamp (0) - , m_allocator (AllocatorType::getInstance ()) - , m_callAllocator (CallAllocatorType::getInstance ()) -{ -} - -ListenersBase::~ListenersBase () -{ - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - - // If this goes off it means a Listener forgot to remove. - bassert (group->empty ()); - - group->decReferenceCount (); - } - - // Proxies are never deleted until here. - for (Proxies::iterator iter = m_proxies.begin (); iter != m_proxies.end ();) - delete & (*iter++); -} - -void ListenersBase::add_void (void* const listener, CallQueue& callQueue) -{ - ReadWriteMutex::ScopedWriteLockType lock (m_groups_mutex); - -#if BEAST_DEBUG - - // Make sure the listener has not already been added - // SHOULD USE const_iterator! - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - - // We can be in do_call() on another thread now, but it - // doesn't modify the list, and we have the write lock. - bassert (!group->contains (listener)); - } - -#endif - - // See if we already have a Group for this thread queue. - Group::Ptr group; - - // SHOULD USE const_iterator - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group::Ptr cur = & (*iter++); - - if (&cur->getCallQueue () == &callQueue) - { - group = cur; - break; - } - } - - if (!group) - { - group = new (m_allocator) Group (callQueue); - - // Add it to the list, and give it a manual ref - // since the list currently uses raw pointers. - group->incReferenceCount (); - m_groups.push_back (*group); - - // Tell existing proxies to add the group - ReadWriteMutex::ScopedReadLockType lock (m_proxies_mutex); - - for (Proxies::iterator iter = m_proxies.begin (); iter != m_proxies.end ();) - (iter++)->add (group, *m_allocator); - } - - // Add the listener to the group with the current timestamp - group->add (listener, m_timestamp, *m_allocator); - - // Increment the timestamp within the mutex so - // future calls will be newer than this listener. - ++m_timestamp; -} - -void ListenersBase::remove_void (void* const listener) -{ - ReadWriteMutex::ScopedWriteLockType lock (m_groups_mutex); - - // Make sure the listener exists -#if BEAST_DEBUG - { - bool exists = false; - - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - - // this should never happen while we hold the mutex - bassert (!group->empty ()); - - if (group->contains (listener)) - { - bassert (!exists); // added twice? - - exists = true; - // keep going to make sure there are no empty groups - } - } - - bassert (exists); - } -#endif - - // Find the group and remove - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group::Ptr group = & (*iter++); - - // If the listener is in there, take it out. - if (group->remove (listener)) - { - // Are we the last listener? - if (group->empty ()) - { - // Tell proxies to remove the group - { - ReadWriteMutex::ScopedWriteLockType lock (m_proxies_mutex); - - for (Proxies::iterator iter = m_proxies.begin (); iter != m_proxies.end ();) - { - Proxy* proxy = & (*iter++); - proxy->remove (group); - } - } - - // Remove it from the list and manually release - // the reference since the list uses raw pointers. - m_groups.erase (m_groups.iterator_to (*group.getObject ())); - group->decReferenceCount (); - - // It is still possible for the group to exist at this - // point in a thread queue but it will get processed, - // do nothing, and release its own final reference. - } - - break; - } - } -} - -void ListenersBase::callp (Call::Ptr cp) -{ - Call* c = cp; - - ReadWriteMutex::ScopedReadLockType lock (m_groups_mutex); - - // can't be const iterator because queue() might cause called functors - // to modify the list. - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - (iter++)->call (c, m_timestamp); -} - -void ListenersBase::queuep (Call::Ptr cp) -{ - Call* c = cp; - - ReadWriteMutex::ScopedReadLockType lock (m_groups_mutex); - - // can't be const iterator because queue() might cause called functors - // to modify the list. - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - (iter++)->queue (c, m_timestamp); -} - -void ListenersBase::call1p_void (void* const listener, Call* c) -{ - ReadWriteMutex::ScopedReadLockType lock (m_groups_mutex); - - // can't be const iterator because queue() might cause called functors - // to modify the list. - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - - if (group->contains (listener)) - { - group->call1 (c, m_timestamp, listener); - break; - } - } -} - -void ListenersBase::queue1p_void (void* const listener, Call* c) -{ - ReadWriteMutex::ScopedReadLockType lock (m_groups_mutex); - - // can't be const iterator because queue() might cause called functors - // to modify the list. - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - - if (group->contains (listener)) - { - group->queue1 (c, m_timestamp, listener); - break; - } - } -} - -// Search for an existing Proxy that matches the pointer to -// member and replace it's Call, or create a new Proxy for it. -// -void ListenersBase::updatep (void const* const member, - const size_t bytes, Call::Ptr cp) -{ - Call* c = cp; - - ReadWriteMutex::ScopedReadLockType lock (m_groups_mutex); - - if (!m_groups.empty ()) - { - Proxy* proxy; - - { - ReadWriteMutex::ScopedReadLockType lock (m_proxies_mutex); - - // See if there's already a proxy - proxy = find_proxy (member, bytes); - } - - // Possibly create one - if (!proxy) - { - ReadWriteMutex::ScopedWriteLockType lock (m_proxies_mutex); - - // Have to search for it again in case someone else added it - proxy = find_proxy (member, bytes); - - if (!proxy) - { - // Create a new empty proxy - proxy = new (m_allocator) Proxy (member, bytes); - - // Add all current groups to the Proxy. - // We need the group read lock for this (caller provided). - for (Groups::iterator iter = m_groups.begin (); iter != m_groups.end ();) - { - Group* group = & (*iter++); - proxy->add (group, *m_allocator); - } - - // Add it to the list. - m_proxies.push_front (*proxy); - } - } - - // Requires the group read lock - proxy->update (c, m_timestamp); - } -} - -// Searches for a proxy that matches the pointer to member. -// Caller synchronizes. -// -ListenersBase::Proxy* ListenersBase::find_proxy (const void* member, size_t bytes) -{ - for (Proxies::iterator iter = m_proxies.begin (); iter != m_proxies.end ();) - { - Proxy* proxy = & (*iter++); - - if (proxy->match (member, bytes)) - return proxy; - } - - return 0; -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.h b/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.h deleted file mode 100644 index 9236771890..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_Listeners.h +++ /dev/null @@ -1,887 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LISTENERS_BEASTHEADER -#define BEAST_LISTENERS_BEASTHEADER - -/*============================================================================*/ -/** - A group of concurrent Listeners. - - A Listener is an object of class type which inherits from a defined - interface, and registers on a provided instance of Listeners to receive - asynchronous notifications of changes to concurrent states. Another way of - defining Listeners, is that it is similar to a Juce ListenerList but with - the provision that the Listener registers with the CallQueue upon which the - notification should be made. - - Listeners makes extensive use of CallQueue for providing the notifications, - and provides a higher level facility for implementing the concurrent - synchronization strategy outlined in CallQueue. Therefore, the same notes - which apply to functors in CallQueue also apply to Listener member - invocations. Their execution time should be brief, limited in scope to - updating the recipient's view of a shared state, and use reference counting - for parameters of class type. - - To use this system, first declare your Listener interface: - - @code - - struct Listener - { - // Sent on every output block - virtual void onOutputLevelChanged (const float outputLevel) { } - }; - - @endcode - - Now set up the place where you want to send the notifications. In this - example, we will set up the AudioIODeviceCallback to notify anyone who is - interested about changes in the current audio output level. We will use - this to implement a VU meter: - - @code - - Listeners listeners; - - // (Process audio data) - - // Calculate output level - float outputLevel = calcOutputLevel (); - - // Notify listeners - listeners.call (&Listener::onOutputLevelChanged, outputLevel); - - @endcode - - To receive notifications, derive from Listener and then add yourself to the - Listeners object using the desired CallQueue. - - @code - - // We want notifications on the message thread - GuiCallQueue fifo; - - struct VUMeter : public Listener, public Component - { - VUMeter () : m_outputLevel (0) - { - listeners.add (this, fifo); - } - - ~VUMeter () - { - listeners.remove (this); - } - - void onOutputLevelChanged (float outputLevel) - { - // Update our copy of the output level shared state. - m_outputLevel = outputLevel; - - // Now trigger a redraw of the control. - repaint (); - } - - float m_outputLevel; - }; - - @endcode - - In this example, the VUMeter constructs with the output level set to zero, - and must wait for a notification before it shows up to date data. For a - simple VU meter, this is likely not a problem. But if the shared state - contains complex information, such as dynamically allocated objects with - rich data, then we need a more solid system. - - We will add some classes to create a complete robust example of the use of - Listeners to synchronize shared state: - - @code - - // Handles audio device output. - class AudioDeviceOutput : public AudioIODeviceCallback - { - public: - struct Listener - { - // Sent on every output block. - virtual void onOutputLevelChanged (float outputLevel) { } - }; - - AudioDeviceOutput () : AudioDeviceOutput ("Audio CallQueue") - { - } - - ~AudioDeviceOutput () - { - m_fifo.close (); - } - - void addListener (Listener* listener, CallQueue& callQueue) - { - // Acquire read access to the shared state. - ConcurrentState ::ReadAccess state (m_state); - - // Add the listener. - m_listeners.add (listener, callQueue); - - // Queue an update for the listener to receive the initial state. - m_listeners.queue1 (listener, - &Listener::onOutputLevelChanged, - state->outputLevel); - } - - void removeListener (Listener* listener) - { - m_listeners.remove (listener); - } - - protected: - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) - { - // Synchronize our call queue. Not needed for this example but - // included here as a best-practice for audio device I/O callbacks. - m_fifo.synchronize (); - - // (Process audio data) - - // Calculate output level. - float newOutputLevel = calcOutputLevel (); - - // Update shared state. - { - ConcurrentState ::WriteAccess state (m_state); - - m_state->outputLevel = newOutputLevel; - } - - // Notify listeners. - listeners.call (&Listener::onOutputLevelChanged, newOutputLevel); - } - - private: - struct State - { - State () : outputLevel (0) { } - - float outputLevel; - }; - - ConcurrentState m_state; - - ManualCallQueue m_fifo; - }; - - @endcode - - Although the rigor demonstrated in the example above is not strictly - required when the shared state consists only of a single float, it - becomes necessary when there are dynamically allocated objects with complex - interactions in the shared state. - - @see CallQueue - - @class Listeners - @ingroup beast_concurrent -*/ -class ListenersBase -{ -public: - struct ListenersStructureTag { }; - - typedef GlobalFifoFreeStore AllocatorType; - - typedef GlobalFifoFreeStore CallAllocatorType; - - class Call : public ReferenceCountedObject, - public AllocatedBy - { - public: - typedef ReferenceCountedObjectPtr Ptr; - virtual void operator () (void* const listener) = 0; - }; - -private: - typedef unsigned long timestamp_t; - - class Group; - typedef List Groups; - - class Proxy; - typedef List Proxies; - - class CallWork; - class GroupWork; - class GroupWork1; - - // Maintains a list of listeners registered on the same CallQueue - // - class Group : public Groups::Node, - public ReferenceCountedObject, - public AllocatedBy - { - public: - typedef ReferenceCountedObjectPtr Ptr; - - explicit Group (CallQueue& callQueue); - ~Group (); - void add (void* listener, const timestamp_t timestamp, - AllocatorType& allocator); - bool remove (void* listener); - bool contains (void* const listener); - void call (Call* const c, const timestamp_t timestamp); - void queue (Call* const c, const timestamp_t timestamp); - void call1 (Call* const c, const timestamp_t timestamp, - void* const listener); - void queue1 (Call* const c, const timestamp_t timestamp, - void* const listener); - void do_call (Call* const c, const timestamp_t timestamp); - void do_call1 (Call* const c, const timestamp_t timestamp, - void* const listener); - - bool empty () const - { - return m_list.empty (); - } - CallQueue& getCallQueue () const - { - return m_fifo; - } - - private: - struct Entry; - - CallQueue& m_fifo; - List m_list; - void* m_listener; - CacheLine::Aligned m_mutex; - }; - - // A Proxy is keyed to a unique pointer-to-member of a - // ListenerClass and is used to consolidate multiple unprocessed - // Calls into a single call to prevent excess messaging. It is up - // to the user of the class to decide when this behavior is appropriate. - // - class Proxy : public Proxies::Node, - public AllocatedBy - { - public: - enum - { - maxMemberBytes = 16 - }; - - Proxy (void const* const member, const size_t bytes); - ~Proxy (); - - void add (Group* group, AllocatorType& allocator); - void remove (Group* group); - void update (Call* const c, const timestamp_t timestamp); - - bool match (void const* const member, const size_t bytes) const; - - private: - class Work; - struct Entry; - typedef List Entries; - char m_member [maxMemberBytes]; - const size_t m_bytes; - Entries m_entries; - }; - -protected: - ListenersBase (); - ~ListenersBase (); - - inline CallAllocatorType& getCallAllocator () - { - return *m_callAllocator; - } - - void add_void (void* const listener, CallQueue& callQueue); - void remove_void (void* const listener); - - void callp (Call::Ptr c); - void queuep (Call::Ptr c); - void call1p_void (void* const listener, Call* c); - void queue1p_void (void* const listener, Call* c); - void updatep (void const* const member, - const size_t bytes, Call::Ptr cp); - -private: - Proxy* find_proxy (const void* member, size_t bytes); - -private: - Groups m_groups; - Proxies m_proxies; - timestamp_t m_timestamp; - CacheLine::Aligned m_groups_mutex; - CacheLine::Aligned m_proxies_mutex; - AllocatorType::Ptr m_allocator; - CallAllocatorType::Ptr m_callAllocator; -}; - -/*============================================================================*/ - -template -class Listeners : public ListenersBase -{ -private: - template - class CallType : public Call - { - public: - CallType (Functor f) : m_f (f) - { - } - - void operator () (void* const listener) - { - ListenerClass* object = static_cast (listener); - m_f.operator () (object); - } - - private: - Functor m_f; - }; - - template - inline void callf (Functor f) - { - callp (new (getCallAllocator ()) CallType (f)); - } - - template - inline void queuef (Functor f) - { - queuep (new (getCallAllocator ()) CallType (f)); - } - - inline void call1p (ListenerClass* const listener, Call::Ptr c) - { - call1p_void (listener, c); - } - - inline void queue1p (ListenerClass* const listener, Call::Ptr c) - { - queue1p_void (listener, c); - } - - template - inline void call1f (ListenerClass* const listener, Functor f) - { - call1p (listener, new (getCallAllocator ()) CallType (f)); - } - - template - inline void queue1f (ListenerClass* const listener, Functor f) - { - queue1p (listener, new (getCallAllocator ()) CallType (f)); - } - - template - inline void updatef (Member member, Functor f) - { - updatep (reinterpret_cast (&member), sizeof (Member), - new (getCallAllocator ()) CallType (f)); - } - -public: - /** Add a listener. - - The specified listener is associated with the specified CallQueue and - added to the list. - - Invariants: - - - All other members of Listeners are blocked during add(). - - - The listener is guaranteed to receive every subsequent call. - - - The listener must not already exist in the list. - - - Safe to call from any thread. - - @param listener The listener to add. - - @param callQueue The CallQueue to associate with the listener. - */ - void add (ListenerClass* const listener, CallQueue& callQueue) - { - add_void (listener, callQueue); - } - - /** Remove a listener. - - The specified listener, which must have been previously added, is removed - from the list. A listener always needs to remove itself before the - associated CallQueue is closed. - - Invariants: - - - All other members of Listeners are blocked during remove(). - - - The listener is guaranteed not to receive calls after remove() returns. - - - Safe to call from any thread. - - @param listener The listener to remove. - */ - void remove (ListenerClass* const listener) - { - remove_void (listener); - } - - /** Call a member function on every added listener, on its associated - CallQueue. - - A listener's CallQueue will be synchronized if this function is called - from it's associated thread. - - Invariants: - - - A listener that later removes itself afterwards may not get called. - - - Calls from the same thread always execute in order. - - - A listener can remove itself even if it has a pending call. - - @param mf The member function to call. This may be followed by up to 8 - arguments. - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - inline void call (Mf mf) - { - callf (bind (mf, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void call (Mf mf, T1 t1) - { - callf (bind (mf, _1, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void call (Mf mf, T1 t1, T2 t2) - { - callf (bind (mf, _1, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3) - { - callf (bind (mf, _1, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4) - { - callf (bind (mf, _1, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - callf (bind (mf, _1, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - callf (bind (mf, _1, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - callf (bind (mf, _1, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void call (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - callf (bind (mf, _1, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - - /** Queue a member function on every added listener, without synchronizing. - - Operates like call(), but no CallQueue synchronization takes place. This - can be necessary when the call to queue() is made inside a held lock. - - @param mf The member function to call. This may be followed by up to 8 - arguments. - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - inline void queue (Mf mf) - { - queuef (bind (mf, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void queue (Mf mf, T1 t1) - { - queuef (bind (mf, _1, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void queue (Mf mf, T1 t1, T2 t2) - { - queuef (bind (mf, _1, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3) - { - queuef (bind (mf, _1, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4) - { - queuef (bind (mf, _1, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - queuef (bind (mf, _1, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - queuef (bind (mf, _1, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - queuef (bind (mf, _1, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void queue (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - queuef (bind (mf, _1, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - - /** Call a member function on every added listener, replacing pending - calls to the same member. - - This operates like call(), except that if there are pending unprocessed - calls to the same member function,they will be replaced, with the previous - parameters destroyed normally. This functionality is useful for - high frequency notifications of non critical data, where the recipient - may not catch up often enough. For example, the output level of the - AudioIODeviceCallback in the example is a candidate for the use of - update(). - - @param mf The member function to call. This may be followed by up to 8 - arguments. - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - inline void update (Mf mf) - { - updatef (mf, bind (mf, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void update (Mf mf, T1 t1) - { - updatef (mf, bind (mf, _1, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void update (Mf mf, T1 t1, T2 t2) - { - updatef (mf, bind (mf, _1, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3) - { - updatef (mf, bind (mf, _1, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4) - { - updatef (mf, bind (mf, _1, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - updatef (mf, bind (mf, _1, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - updatef (mf, bind (mf, _1, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - updatef (mf, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void update (Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - updatef (mf, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - - /** Call a member function on a specific listener. - - Like call(), except that one listener is targeted only. This is useful when - builing complex behaviors during the addition of a listener, such as - providing an initial state. - - @param listener The listener to call. - - @param mf The member function to call. This may be followed by up - to 8 arguments. - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - inline void call1 (ListenerClass* const listener, Mf mf) - { - call1f (listener, bind (mf, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1) - { - call1f (listener, bind (mf, _1, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2) - { - call1f (listener, bind (mf, _1, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3) - { - call1f (listener, bind (mf, _1, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4) - { - call1f (listener, bind (mf, _1, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - call1f (listener, bind (mf, _1, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - call1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - call1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void call1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - call1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - - /** Queue a member function on a specific listener. - - Like call1(), except that no CallQueue synchronization takes place. - - @param listener The listener to call. - - @param mf The member function to call. This may be followed by up - to 8 arguments. - */ - /** @{ */ -#if BEAST_VARIADIC_MAX >= 1 - template - inline void queue1 (ListenerClass* const listener, Mf mf) - { - queue1f (listener, bind (mf, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1) - { - queue1f (listener, bind (mf, _1, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2) - { - queue1f (listener, bind (mf, _1, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3) - { - queue1f (listener, bind (mf, _1, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4) - { - queue1f (listener, bind (mf, _1, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - queue1f (listener, bind (mf, _1, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - queue1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - queue1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void queue1 (ListenerClass* const listener, Mf mf, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - queue1f (listener, bind (mf, _1, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ -}; -/** @} */ - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.cpp deleted file mode 100644 index cd03818be3..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/*============================================================================*/ -/* - VFLib: https://github.com/vinniefalco/VFLib - - Copyright (C) 2008 by Vinnie Falco - - This library contains portions of other open source products covered by - separate licenses. Please see the corresponding source files for specific - terms. - - VFLib is provided under the terms of The MIT License (MIT): - - 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, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - 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. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -/*============================================================================*/ - -ManualCallQueue::ManualCallQueue (String name) - : CallQueue (name) -{ -} - -void ManualCallQueue::close () -{ - CallQueue::close (); -} - -bool ManualCallQueue::synchronize () -{ - return CallQueue::synchronize (); -} - -void ManualCallQueue::signal () -{ -} - -void ManualCallQueue::reset () -{ -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.h b/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.h deleted file mode 100644 index 67cc0940ab..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ManualCallQueue.h +++ /dev/null @@ -1,108 +0,0 @@ -/*============================================================================*/ -/* - VFLib: https://github.com/vinniefalco/VFLib - - Copyright (C) 2008 by Vinnie Falco - - This library contains portions of other open source products covered by - separate licenses. Please see the corresponding source files for specific - terms. - - VFLib is provided under the terms of The MIT License (MIT): - - 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, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - 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. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -/*============================================================================*/ - -#ifndef VF_MANUALCALLQUEUE_VFHEADER -#define VF_MANUALCALLQUEUE_VFHEADER - -/*============================================================================*/ -/** - A CallQueue that requires periodic manual synchronization. - - To use this, declare an instance and then place calls into it as usual. - Every so often, you must call synchronize() from the thread you want to - associate with the queue. Typically this is done within an - AudioIODeviceCallback: - - @code - - class AudioIODeviceCallbackWithCallQueue - : public AudioIODeviceCallback - , public CallQueue - { - public: - AudioIODeviceCallbackWithCallQueue () : m_fifo ("Audio CallQueue") - { - } - - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) - { - CallQueue::synchronize (); - - // do audio i/o - } - - void signal () { } // No action required - void reset () { } // No action required - }; - - @endcode - - The close() function is provided for diagnostics. Call it as early as - possible based on the exit or shutdown logic of your application. If calls - are put into the queue after it is closed, it will generate an exception so - you can track it down. - - @see CallQueue - - @ingroup vf_concurrent -*/ -class ManualCallQueue : public CallQueue -{ -public: - /** Create a ManualCallQueue. - - @param name A string used to help identify the associated - thread for debugging. - */ - explicit ManualCallQueue (String name); - - /** Close the queue. If calls are placed into a closed queue, an exception - is thrown. - */ - void close (); - - /** Synchronize the queue by calling all pending functors. - - @return `true` if any functors were called. - */ - bool synchronize (); - -private: - void signal (); - void reset (); -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.cpp deleted file mode 100644 index 62a9b9e6eb..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ParallelFor::ParallelFor (ThreadGroup& pool) - : m_pool (pool) - , m_finishedEvent (false) // auto-reset -{ -} - -int ParallelFor::getNumberOfThreads () const -{ - return m_pool.getNumberOfThreads (); -} - -void ParallelFor::doLoop (int numberOfIterations, Iteration& iteration) -{ - if (numberOfIterations > 1) - { - int const numberOfThreads = m_pool.getNumberOfThreads (); - - // The largest number of pool threads we need is one less than the number - // of iterations, because we also run the loop body on the caller's thread. - // - int const maxThreads = numberOfIterations - 1; - - // Calculate the number of parallel instances as the smaller of the number - // of threads available (including the caller's) and the number of iterations. - // - int const numberOfParallelInstances = std::min ( - numberOfThreads + 1, numberOfIterations); - - LoopState* loopState (new (m_pool.getAllocator ()) LoopState ( - iteration, m_finishedEvent, numberOfIterations, numberOfParallelInstances)); - - m_pool.call (maxThreads, &LoopState::forLoopBody, loopState); - - // Also use the caller's thread to run the loop body. - loopState->forLoopBody (); - - m_finishedEvent.wait (); - } - else if (numberOfIterations == 1) - { - // Just one iteration, so do it. - iteration (0); - } -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.h b/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.h deleted file mode 100644 index 7cf6b45d5c..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ParallelFor.h +++ /dev/null @@ -1,491 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PARALLELFOR_BEASTHEADER -#define BEAST_PARALLELFOR_BEASTHEADER - -/*============================================================================*/ -/** - Parallel for loop. - - This uses a ThreadGroup to iterate through a for loop in parallel. The - following two pieces of code perform identical operations: - - @code - - extern void function (int loopIndex); - - // Serial computation - // - for (int i = 0; i < numberOfIterations; ++i) - function (i); - - // Parallel computation - // - ParallelFor().loop (numberOfIterations, &function); - - @endcode - - `function` is a caller provided functor. Convenience functions are provided - for automatic binding to member or non member functions with up to 8 - arguments (not including the loop index). - - @note The last argument to function () is always the loop index. - - @see ThreadGroup - - @ingroup beast_concurrent -*/ -class ParallelFor : Uncopyable -{ -public: - /** Create a parallel for loop. - - It is best to keep this object around instead of creating and destroying - it every time you need to run a loop. - - @param pool The ThreadGroup to use. If this is omitted then a singleton - ThreadGroup is used which contains one thread per CPU. - */ - explicit ParallelFor (ThreadGroup& pool = *GlobalThreadGroup::getInstance ()); - - /** Determine the number of threads in the group. - - @return The number of threads in the group. - */ - int getNumberOfThreads () const; - - template - void operator () (int numberOfIterations, T1 t1) - { - } - - /** Execute parallel for loop. - - Functor is called once for each value in the range - [0, numberOfIterations), using the ThreadGroup. - - @param numberOfIterations The number of times to loop. - - @param f The functor to call for each loop index. - */ - /** @{ */ - template - void loopf (int numberOfIterations, Functor const& f) - { - IterationType iteration (f); - - doLoop (numberOfIterations, iteration); - } - -#if BEAST_VARIADIC_MAX >= 1 - template - void loop (int n, Fn f) - { - loopf (n, bind (f, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void loop (int n, Fn f, T1 t1) - { - loopf (n, bind (f, t1, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void loop (int n, Fn f, T1 t1, T2 t2) - { - loopf (n, bind (f, t1, t2, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3) - { - loopf (n, bind (f, t1, t2, t3, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3, T4 t4) - { - loopf (n, bind (f, t1, t2, t3, t4, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - loopf (n, bind (f, t1, t2, t3, t4, t5, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - loopf (n, bind (f, t1, t2, t3, t4, t5, t6, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - loopf (n, bind (f, t1, t2, t3, t4, t5, t6, t7, _1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void loop (int n, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - loopf (n, bind (f, t1, t2, t3, t4, t5, t6, t7, t8, _1)); - } -#endif - /** @} */ - -private: - class Iteration - { - public: - virtual ~Iteration () { } - virtual void operator () (int loopIndex) = 0; - }; - - template - class IterationType : public Iteration, Uncopyable - { - public: - explicit IterationType (Functor const& f) : m_f (f) - { - } - - void operator () (int loopIndex) - { - m_f (loopIndex); - } - - private: - Functor m_f; - }; - -private: - class LoopState - : public AllocatedBy - , Uncopyable - { - private: - Iteration& m_iteration; - WaitableEvent& m_finishedEvent; - int const m_numberOfIterations; - Atomic m_loopIndex; - Atomic m_iterationsRemaining; - Atomic m_numberOfParallelInstances; - - public: - LoopState (Iteration& iteration, - WaitableEvent& finishedEvent, - int numberOfIterations, - int numberOfParallelInstances) - : m_iteration (iteration) - , m_finishedEvent (finishedEvent) - , m_numberOfIterations (numberOfIterations) - , m_loopIndex (-1) - , m_iterationsRemaining (numberOfIterations) - , m_numberOfParallelInstances (numberOfParallelInstances) - { - } - - ~LoopState () - { - } - - void forLoopBody () - { - for (;;) - { - // Request a loop index to process. - int const loopIndex = ++m_loopIndex; - - // Is it in range? - if (loopIndex < m_numberOfIterations) - { - // Yes, so process it. - m_iteration (loopIndex); - - // Was this the last work item to complete? - if (--m_iterationsRemaining == 0) - { - // Yes, signal. - m_finishedEvent.signal (); - break; - } - } - else - { - // Out of range, all work is complete or assigned. - break; - } - } - - release (); - } - - void release () - { - if (--m_numberOfParallelInstances == 0) - delete this; - } - }; - -private: - void doLoop (int numberOfIterations, Iteration& iteration); - -private: - ThreadGroup& m_pool; - WaitableEvent m_finishedEvent; - Atomic m_currentIndex; - Atomic m_numberOfInstances; - int m_numberOfIterations; -}; - -//------------------------------------------------------------------------------ - -class ParallelFor2 : Uncopyable -{ -public: - /** Create a parallel for loop. - - It is best to keep this object around instead of creating and destroying - it every time you need to run a loop. - - @param pool The ThreadGroup to use. If this is omitted then a singleton - ThreadGroup is used which contains one thread per CPU. - */ - explicit ParallelFor2 (ThreadGroup& pool = *GlobalThreadGroup::getInstance ()) - : m_pool (pool) - , m_finishedEvent (false) // auto-reset - { - } - - /** Determine the number of threads in the group. - - @return The number of threads in the group. - */ - int getNumberOfThreads () const - { - return m_pool.getNumberOfThreads (); - } - - - template - void operator () (int numberOfIterations, T1 t1, T2 t2, T3 t3, T4 t4) - { - Factory4 f (t1, t2, t3, t4); - doLoop (numberOfIterations, f); - } - -private: - typedef ThreadGroup::AllocatorType AllocatorType; - - //--- - - struct Iterator : public AllocatedBy - { - virtual ~Iterator () { } - virtual void operator () (int loopIndex) = 0; - }; - - //--- - - template - struct IteratorType : public Iterator, Uncopyable - { - explicit IteratorType (Functor f) : m_f (f) - { - } - - void operator () (int loopIndex) - { - m_f (loopIndex); - } - - private: - Functor m_f; - }; - - //--- - - struct Factory - { - virtual ~Factory () { } - virtual Iterator* operator () (AllocatorType& allocator) = 0; - }; - - template - struct Factory4 : Factory - { - Factory4 (T1 t1, T2 t2, T3 t3, T4 t4) - : m_t1 (t1), m_t2 (t2), m_t3 (t3), m_t4 (t4) { } - - Iterator* operator () (AllocatorType& allocator) - { - return new (allocator) IteratorType (m_t1, m_t2, m_t3, m_t4); - } - - private: - T1 m_t1; - T2 m_t2; - T3 m_t3; - T4 m_t4; - }; - -private: - class LoopState - : public AllocatedBy - , Uncopyable - { - private: - Factory& m_factory; - WaitableEvent& m_finishedEvent; - int const m_numberOfIterations; - Atomic m_loopIndex; - Atomic m_iterationsRemaining; - Atomic m_numberOfParallelInstances; - AllocatorType& m_allocator; - - public: - LoopState (Factory& factory, - WaitableEvent& finishedEvent, - int numberOfIterations, - int numberOfParallelInstances, - AllocatorType& allocator) - : m_factory (factory) - , m_finishedEvent (finishedEvent) - , m_numberOfIterations (numberOfIterations) - , m_loopIndex (-1) - , m_iterationsRemaining (numberOfIterations) - , m_numberOfParallelInstances (numberOfParallelInstances) - , m_allocator (allocator) - { - } - - ~LoopState () - { - } - - void forLoopBody () - { - Iterator* iterator = m_factory (m_allocator); - - for (;;) - { - // Request a loop index to process. - int const loopIndex = ++m_loopIndex; - - // Is it in range? - if (loopIndex < m_numberOfIterations) - { - // Yes, so process it. - (*iterator) (loopIndex); - - // Was this the last work item to complete? - if (--m_iterationsRemaining == 0) - { - // Yes, signal. - m_finishedEvent.signal (); - break; - } - } - else - { - // Out of range, all work is complete or assigned. - break; - } - } - - release (); - - delete iterator; - } - - void release () - { - if (--m_numberOfParallelInstances == 0) - delete this; - } - }; - -private: - void doLoop (int numberOfIterations, Factory& factory) - { - if (numberOfIterations > 1) - { - int const numberOfThreads = m_pool.getNumberOfThreads (); - - // The largest number of pool threads we need is one less than the number - // of iterations, because we also run the loop body on the caller's thread. - // - int const maxThreads = numberOfIterations - 1; - - // Calculate the number of parallel instances as the smaller of the number - // of threads available (including the caller's) and the number of iterations. - // - int const numberOfParallelInstances = std::min ( - numberOfThreads + 1, numberOfIterations); - - LoopState* loopState (new (m_pool.getAllocator ()) LoopState ( - factory, - m_finishedEvent, - numberOfIterations, - numberOfParallelInstances, - m_pool.getAllocator ())); - - m_pool.call (maxThreads, &LoopState::forLoopBody, loopState); - - // Also use the caller's thread to run the loop body. - loopState->forLoopBody (); - - m_finishedEvent.wait (); - } - else if (numberOfIterations == 1) - { - // Just one iteration, so do it. - Iterator* iter = factory (m_pool.getAllocator ()); - (*iter) (0); - delete iter; - } - } - -private: - ThreadGroup& m_pool; - WaitableEvent m_finishedEvent; - Atomic m_currentIndex; - Atomic m_numberOfInstances; - int m_numberOfIterations; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.cpp deleted file mode 100644 index 6118e4e26a..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.cpp +++ /dev/null @@ -1,98 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ReadWriteMutex::ReadWriteMutex () noexcept -{ -} - -ReadWriteMutex::~ReadWriteMutex () noexcept -{ -} - -void ReadWriteMutex::enterRead () const noexcept -{ - for (;;) - { - // attempt the lock optimistically - // THIS IS NOT CACHE-FRIENDLY! - m_readers->addref (); - - // is there a writer? - // THIS IS NOT CACHE-FRIENDLY! - if (m_writes->isSignaled ()) - { - // a writer exists, give up the read lock - m_readers->release (); - - // block until the writer is done - { - CriticalSection::ScopedLockType lock (m_mutex); - } - - // now try the loop again - } - else - { - break; - } - } -} - -void ReadWriteMutex::exitRead () const noexcept -{ - m_readers->release (); -} - -void ReadWriteMutex::enterWrite () const noexcept -{ - // Optimistically acquire the write lock. - m_writes->addref (); - - // Go for the mutex. - // Another writer might block us here. - m_mutex.enter (); - - // Only one competing writer will get here, - // but we don't know who, so we have to drain - // readers no matter what. New readers will be - // blocked by the mutex. - // - if (m_readers->isSignaled ()) - { - SpinDelay delay; - - do - { - delay.pause (); - } - while (m_readers->isSignaled ()); - } -} - -void ReadWriteMutex::exitWrite () const noexcept -{ - // Releasing the mutex first and then decrementing the - // writer count allows another waiting writer to atomically - // acquire the lock, thus starving readers. This fulfills - // the write-preferencing requirement. - - m_mutex.exit (); - - m_writes->release (); -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.h b/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.h deleted file mode 100644 index ff1f987e27..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ReadWriteMutex.h +++ /dev/null @@ -1,146 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_READWRITEMUTEX_BEASTHEADER -#define BEAST_READWRITEMUTEX_BEASTHEADER - -/*============================================================================*/ -/** - Multiple consumer, single producer (MCSP) synchronization. - - This is an optimized lock for the multiple reader, single writer - scenario. It provides only a subset of features of the more general - traditional read/write lock. Specifically, these rules apply: - - - A caller cannot hold a read lock while acquiring a write lock. - - - Write locks are only recursive with respect to write locks. - - - Read locks are only recursive with respect to read locks. - - - A write lock cannot be downgraded. - - - Writes are preferenced over reads. - - For real-time applications, these restrictions are often not an issue. - - The implementation is wait-free in the fast path: acquiring read access - for a lock without contention - just one interlocked increment! - - @class ReadWriteMutex - @ingroup beast_concurrent -*/ - -/*============================================================================*/ -/** - Scoped read lock for ReadWriteMutex. - - @ingroup beast_concurrent -*/ -template -struct GenericScopedReadLock : Uncopyable -{ - inline explicit GenericScopedReadLock (LockType const& lock) noexcept -: - m_lock (lock) - { - m_lock.enterRead (); - } - - inline ~GenericScopedReadLock () noexcept - { - m_lock.exitRead (); - } - -private: - LockType const& m_lock; -}; - -/*============================================================================*/ -/** - Scoped write lock for ReadWriteMutex. - - @ingroup beast_concurrent -*/ -template -struct GenericScopedWriteLock : Uncopyable -{ - inline explicit GenericScopedWriteLock (LockType const& lock) noexcept -: - m_lock (lock) - { - m_lock.enterWrite (); - } - - inline ~GenericScopedWriteLock () noexcept - { - m_lock.exitWrite (); - } - -private: - LockType const& m_lock; -}; - -class ReadWriteMutex -{ -public: - /** Provides the type of scoped read lock to use with a ReadWriteMutex. */ - typedef GenericScopedReadLock ScopedReadLockType; - - /** Provides the type of scoped write lock to use with a ReadWriteMutex. */ - typedef GenericScopedWriteLock ScopedWriteLockType; - - /** Create a ReadWriteMutex */ - ReadWriteMutex () noexcept; - - /** Destroy a ReadWriteMutex - - If the object is destroyed while a lock is held, the result is - undefined behavior. - */ - ~ReadWriteMutex () noexcept; - - /** Acquire a read lock. - - This is recursive with respect to other read locks. Calling this while - holding a write lock is undefined. - */ - void enterRead () const noexcept; - - /** Release a previously acquired read lock */ - void exitRead () const noexcept; - - /** Acquire a write lock. - - This is recursive with respect to other write locks. Calling this while - holding a read lock is undefined. - */ - void enterWrite () const noexcept; - - /** Release a previously acquired write lock */ - void exitWrite () const noexcept; - -private: - CriticalSection m_mutex; - - mutable CacheLine::Padded m_writes; - mutable CacheLine::Padded m_readers; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.cpp deleted file mode 100644 index 9ca4d986e3..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.cpp +++ /dev/null @@ -1,117 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Semaphore::WaitingThread::WaitingThread () - : m_event (false) // auto-reset -{ -} - -void Semaphore::WaitingThread::wait () -{ - m_event.wait (); -} - -void Semaphore::WaitingThread::signal () -{ - m_event.signal (); -} - -//============================================================================== - -Semaphore::Semaphore (int initialCount) - : m_counter (initialCount) -{ -} - -Semaphore::~Semaphore () -{ - // Can't delete the semaphore while threads are waiting on it!! - bassert (m_waitingThreads.pop_front () == nullptr); - - for (;;) - { - WaitingThread* waitingThread = m_deleteList.pop_front (); - - if (waitingThread != nullptr) - delete waitingThread; - else - break; - } -} - -void Semaphore::signal (int amount) -{ - bassert (amount > 0); - - while (amount--) - { - // Make counter and list operations atomic. - LockType::ScopedLockType lock (m_mutex); - - if (++m_counter <= 0) - { - WaitingThread* waitingThread = m_waitingThreads.pop_front (); - - bassert (waitingThread != nullptr); - - waitingThread->signal (); - } - } -} - -void Semaphore::wait () -{ - // Always prepare the WaitingThread object first, either - // from the delete list or through a new allocation. - // - WaitingThread* waitingThread = m_deleteList.pop_front (); - - if (waitingThread == nullptr) - waitingThread = new WaitingThread; - - { - // Make counter and list operations atomic. - LockType::ScopedLockType lock (m_mutex); - - if (--m_counter >= 0) - { - // Acquired the resource so put waitingThread back. - m_deleteList.push_front (waitingThread); - - waitingThread = nullptr; - } - else - { - // Out of resources, go on to the waiting list. - m_waitingThreads.push_front (waitingThread); - } - } - - // Do we need to wait? - if (waitingThread != nullptr) - { - // Yes so do it. - waitingThread->wait (); - - // If the wait is satisfied, then we've been taken off the - // waiting list so put waitingThread back in the delete list. - // - m_deleteList.push_front (waitingThread); - } -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.h b/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.h deleted file mode 100644 index 4d8ec2cebe..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_Semaphore.h +++ /dev/null @@ -1,78 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SEMAPHORE_BEASTHEADER -#define BEAST_SEMAPHORE_BEASTHEADER - -/*============================================================================*/ -/** - A semaphore. - - This provides a traditional semaphore synchronization primitive. There is no - upper limit on the number of signals. - - @note There is no tryWait() or timeout facility for acquiring a resource. - - @ingroup beast_core -*/ -class Semaphore -{ -public: - /** Create a semaphore with the specified number of resources. - - @param initialCount The starting number of resources. - */ - explicit Semaphore (int initialCount); - - ~Semaphore (); - - /** Increase the number of available resources. - - @param amount The number of new resources available. - */ - void signal (int amount = 1); - - /** Wait for a resource. - */ - void wait (); - -private: - class WaitingThread - : public LockFreeStack ::Node - , LeakChecked - { - public: - WaitingThread (); - - void wait (); - void signal (); - - private: - WaitableEvent m_event; - }; - - typedef SpinLock LockType; - - LockType m_mutex; - Atomic m_counter; - LockFreeStack m_waitingThreads; - LockFreeStack m_deleteList; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_SerialFor.h b/Subtrees/beast/modules/beast_basics/threads/beast_SerialFor.h deleted file mode 100644 index 3d736fe26b..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_SerialFor.h +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SERIALFOR_BEASTHEADER -#define BEAST_SERIALFOR_BEASTHEADER - -/*============================================================================*/ - -/** Serial for loop. - - Iterates a for loop sequentially. This is a drop in replacement for - ParallelFor. - - @see ParallelFor - - @ingroup beast_core -*/ -class SerialFor : Uncopyable -{ -public: - /** Create a serial for loop. - */ - inline SerialFor () - { - } - - /** Determine the number of threads used to process loops. - - @return Always 1. - */ - inline int getNumberOfThreads () const - { - return 1; - } - - template - inline void operator () (int numberOfIterations) - { - F f; - - for (int i = 0; i < numberOfIterations; ++i) - f (i); - } - - template - inline void operator () (int numberOfIterations, T1 t1) - { - F f (t1); - - for (int i = 0; i < numberOfIterations; ++i) - f (i); - } -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.cpp deleted file mode 100644 index bc05afb211..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -SharedObject::ThreadedScope::ThreadedScope (char const* name) - : m_thread (name) -{ - m_thread.start (this); -} - -void SharedObject::ThreadedScope::destroySharedObject (SharedObject* const object) -{ - deleteAsync (object); -} - -//------------------------------------------------------------------------------ - -void SharedObject::destroySharedObject () -{ - delete this; -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.h b/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.h deleted file mode 100644 index 7d9e80761b..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_SharedObject.h +++ /dev/null @@ -1,310 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SHAREDOBJECT_BEASTHEADER -#define BEAST_SHAREDOBJECT_BEASTHEADER - -//============================================================================== -/** - A reference counted object with overridable destroy behavior. - - This is a reference counted object compatible with SharedObjectPtr or - ReferenceCountedObjectPtr. When the last reference is removed, an - overridable virtual function is called to destroy the object. The default - behavior simply calls operator delete. Overrides can perform more complex - dispose actions, typically to destroy the object on a separate thread. - - @ingroup beast_concurrent -*/ -class SharedObject : Uncopyable -{ -public: - /** Abstract SharedObject scope. - - The scope is invoked to destroy the object. - */ - class Scope - { - public: - virtual ~Scope () { } - - virtual void destroySharedObject (SharedObject* const object) = 0; - }; - -public: - /** Separate thread for a SharedObject scope. - - This Scope deletes the shared object on a separate provided thread. - */ - class ThreadedScope - : public Scope - , private ThreadWithCallQueue::EntryPoints - { - public: - /** Create a ThreadedScope. - - @param name The name of the provided thread, for diagnostics. - */ - explicit ThreadedScope (char const* name); - - void destroySharedObject (SharedObject* const object); - - /** Delete a dynamic object asynchronously. - - This convenient template will delete a dynamically allocated - object on the provided thread. - */ - template - void deleteAsync (Object* const object) - { - // If an object being deleted recursively triggers async deletes, - // it is possible that the call queue has already been closed. - // We detect this condition by checking the associated thread and - // doing the delete directly. - // - if (m_thread.isAssociatedWithCurrentThread ()) - delete object; - else - m_thread.callf (Delete (object)); - } - - private: - // Simple functor to delete an object. - // - template - struct Delete - { - Delete (Object* const object) : m_object (object) - { - } - - void operator () () - { - delete m_object; - } - - private: - Delete& operator= (Delete const&); - - Object* const m_object; - }; - - private: - ThreadWithCallQueue m_thread; - }; - -protected: - /** Construct a SharedObject. - - The constructor is protected to require subclassing. - */ - SharedObject () { } - - virtual ~SharedObject () { } - - /** Delete the object. - - The default behavior calls operator delete. - */ - virtual void destroySharedObject (); - -public: - /** Increment the reference count. - - It should not be necessary to call this function directly. Use one of - the RAII containers that manages the reference count to hold the - object instead. - */ - inline void incReferenceCount () noexcept - { - m_refs.addref (); - } - - /** Decrement the reference count. - - It should not be necessary to call this function directly. Use one of - the RAII containers that manages the reference count to hold the - object instead. - */ - inline void decReferenceCount () noexcept - { - if (m_refs.release ()) - destroySharedObject (); - } - -private: - AtomicCounter m_refs; -}; - -//------------------------------------------------------------------------------ - -/** RAII container for SharedObject. - - This container is used to hold a pointer to a SharedObject and manage the - reference counts for you. -*/ -template -class SharedObjectPtr -{ -public: - typedef Object ReferencedType; - - inline SharedObjectPtr () noexcept -: - m_object (nullptr) - { - } - - inline SharedObjectPtr (Object* const refCountedObject) noexcept -: - m_object (refCountedObject) - { - if (refCountedObject != nullptr) - refCountedObject->incReferenceCount (); - } - - inline SharedObjectPtr (const SharedObjectPtr& other) noexcept -: - m_object (other.m_object) - { - if (m_object != nullptr) - m_object->incReferenceCount (); - } - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - inline SharedObjectPtr (SharedObjectPtr&& other) noexcept -: - m_object (other.m_object) - { - other.m_object = nullptr; - } -#endif - - template - inline SharedObjectPtr (const SharedObjectPtr & other) noexcept -: - m_object (static_cast (other.get ())) - { - if (m_object != nullptr) - m_object->incReferenceCount (); - } - - SharedObjectPtr& operator= (const SharedObjectPtr& other) - { - return operator= (other.m_object); - } - - template - SharedObjectPtr& operator= (const SharedObjectPtr & other) - { - return operator= (static_cast (other.get ())); - } - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - SharedObjectPtr& operator= (SharedObjectPtr && other) - { - std::swap (m_object, other.m_object); - return *this; - } -#endif - - SharedObjectPtr& operator= (Object* const newObject) - { - if (m_object != newObject) - { - if (newObject != nullptr) - newObject->incReferenceCount (); - - Object* const oldObject = m_object; - m_object = newObject; - - if (oldObject != nullptr) - oldObject->decReferenceCount (); - } - - return *this; - } - - inline ~SharedObjectPtr () - { - if (m_object != nullptr) - m_object->decReferenceCount (); - } - - inline operator Object* () const noexcept - { - return m_object; - } - - inline Object* operator-> () const noexcept - { - return m_object; - } - - inline Object* get () const noexcept - { - return m_object; - } - - inline Object* getObject () const noexcept - { - return m_object; - } - -private: - Object* m_object; -}; - -template -bool operator== (const SharedObjectPtr & object1, Object* const object2) noexcept -{ - return object1.get () == object2; -} - -template -bool operator== (const SharedObjectPtr & object1, const SharedObjectPtr & object2) noexcept -{ - return object1.get () == object2.get (); -} - -template -bool operator== (Object* object1, SharedObjectPtr & object2) noexcept -{ - return object1 == object2.get (); -} - -template -bool operator!= (const SharedObjectPtr & object1, const Object* object2) noexcept -{ - return object1.get () != object2; -} - -template -bool operator!= (const SharedObjectPtr & object1, SharedObjectPtr & object2) noexcept -{ - return object1.get () != object2.get (); -} - -template -bool operator!= (Object* object1, SharedObjectPtr & object2) noexcept -{ - return object1 != object2.get (); -} - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_SpinDelay.h b/Subtrees/beast/modules/beast_basics/threads/beast_SpinDelay.h deleted file mode 100644 index 03694706a1..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_SpinDelay.h +++ /dev/null @@ -1,44 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SPINDELAY_BEASTHEADER -#define BEAST_SPINDELAY_BEASTHEADER - -// -// Synchronization element -// - -class SpinDelay -{ -public: - SpinDelay () : m_count (0) - { - } - - inline void pause () - { - if (++m_count > 20) - Thread::yield (); - } - -private: - int m_count; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.cpp deleted file mode 100644 index 1cce72781b..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void ThreadGroup::QuitType::operator () (Worker* worker) -{ - worker->setShouldExit (); -} - -//============================================================================== - -ThreadGroup::Worker::Worker (String name, ThreadGroup& group) - : Thread (name) - , m_group (group) - , m_shouldExit (false) -{ - startThread (); -} - -ThreadGroup::Worker::~Worker () -{ - // Make sure the thread is stopped. - stopThread (-1); -} - -void ThreadGroup::Worker::setShouldExit () -{ - m_shouldExit = true; -} - -void ThreadGroup::Worker::run () -{ - do - { - m_group.m_semaphore.wait (); - - Work* work = m_group.m_queue.pop_front (); - - bassert (work != nullptr); - - work->operator () (this); - - delete work; - } - while (!m_shouldExit); -} - -//============================================================================== - -ThreadGroup::ThreadGroup (int numberOfThreads) - : m_numberOfThreads (numberOfThreads) - , m_semaphore (0) -{ - for (int i = 0; i++ < numberOfThreads; ) - { - String s; - s << "ThreadGroup (" << i << ")"; - - m_threads.push_front (new Worker (s, *this)); - } -} - -ThreadGroup::~ThreadGroup () -{ - // Put one quit item in the queue for each worker to stop. - for (int i = 0; i < m_numberOfThreads; ++i) - { - m_queue.push_front (new (getAllocator ()) QuitType); - - m_semaphore.signal (); - } - - for (;;) - { - Worker* worker = m_threads.pop_front (); - - if (worker != nullptr) - delete worker; - else - break; - } - - // There must not be pending work! - bassert (m_queue.pop_front () == nullptr); -} - -int ThreadGroup::getNumberOfThreads () const -{ - return m_numberOfThreads; -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.h b/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.h deleted file mode 100644 index b74a9a08a6..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadGroup.h +++ /dev/null @@ -1,233 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THREADGROUP_BEASTHEADER -#define BEAST_THREADGROUP_BEASTHEADER - -/*============================================================================*/ -/** - @ingroup beast_concurrent - - @brief A group of threads for parallelizing tasks. - - @see ParallelFor -*/ -class ThreadGroup -{ -public: - typedef FifoFreeStoreType AllocatorType; - - /** Creates the specified number of threads. - - @param numberOfThreads The number of threads in the group. This must be - greater than zero. If this parameter is omitted, - one thread is created per available CPU. - */ - explicit ThreadGroup (int numberOfThreads = SystemStats::getNumCpus ()); - - ~ThreadGroup (); - - /** Allocator access. - */ - inline AllocatorType& getAllocator () - { - return m_allocator; - } - - /** Determine the number of threads in the group. - - @return The number of threads in the group. - */ - int getNumberOfThreads () const; - - /** Calls a functor on multiple threads. - - The specified functor is executed on some or all available threads at once. - A call is always guaranteed to execute. - - @param maxThreads The maximum number of threads to use, or -1 for all. - - @param f The functor to call for each thread. - */ - /** @{ */ - template - void callf (int maxThreads, Functor f) - { - bassert (maxThreads > 0 || maxThreads == -1); - - int numberOfThreads = getNumberOfThreads (); - - if (maxThreads != -1 && maxThreads < numberOfThreads) - numberOfThreads = maxThreads; - - while (numberOfThreads--) - { - m_queue.push_front (new (getAllocator ()) WorkType (f)); - m_semaphore.signal (); - } - } - -#if BEAST_VARIADIC_MAX >= 1 - template - void call (int maxThreads, Fn f) - { - callf (maxThreads, bind (f)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 2 - template - void call (int maxThreads, Fn f, T1 t1) - { - callf (maxThreads, bind (f, t1)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 3 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2) - { - callf (maxThreads, bind (f, t1, t2)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 4 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3) - { - callf (maxThreads, bind (f, t1, t2, t3)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 5 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3, T4 t4) - { - callf (maxThreads, bind (f, t1, t2, t3, t4)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 6 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - callf (maxThreads, bind (f, t1, t2, t3, t4, t5)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 7 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - callf (maxThreads, bind (f, t1, t2, t3, t4, t5, t6)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 8 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) - { - callf (maxThreads, bind (f, t1, t2, t3, t4, t5, t6, t7)); - } -#endif - -#if BEAST_VARIADIC_MAX >= 9 - template - void call (int maxThreads, Fn f, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) - { - callf (maxThreads, bind (f, t1, t2, t3, t4, t5, t6, t7, t8)); - } -#endif - /** @} */ - -private: - void stopThreads (int numberOfThreadsToStop); - - //============================================================================ -private: - /** A thread in the group. - */ - class Worker - : public LockFreeStack ::Node - , public Thread - , LeakChecked - { - public: - Worker (String name, ThreadGroup& group); - ~Worker (); - - void setShouldExit (); - - private: - void run (); - - private: - ThreadGroup& m_group; - bool m_shouldExit; - }; - - //============================================================================ -private: - /** Abstract work item. - */ - class Work : public LockFreeStack ::Node - , public AllocatedBy - { - public: - virtual ~Work () { } - - /* The worker is passed in so we can make it quit later. - */ - virtual void operator () (Worker* worker) = 0; - }; - - template - class WorkType : public Work, LeakChecked > - { - public: - explicit WorkType (Functor const& f) : m_f (f) { } - ~WorkType () { } - void operator () (Worker*) - { - m_f (); - } - - private: - Functor m_f; - }; - - /** Used to make a Worker stop - */ - class QuitType - : public Work - , LeakChecked - { - public: - void operator () (Worker* worker); - }; - -private: - int const m_numberOfThreads; - Semaphore m_semaphore; - AllocatorType m_allocator; - LockFreeStack m_queue; - LockFreeStack m_threads; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.cpp b/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.cpp deleted file mode 100644 index b0141aaeac..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ThreadWithCallQueue::ThreadWithCallQueue (String name) - : CallQueue (name) - , m_thread (name) - , m_entryPoints (nullptr) - , m_calledStart (false) - , m_calledStop (false) - , m_shouldStop (false) -{ -} - -ThreadWithCallQueue::~ThreadWithCallQueue () -{ - stop (true); -} - -void ThreadWithCallQueue::start (EntryPoints* const entryPoints) -{ - { - // This is mostly for diagnostics - // TODO: Atomic flag for this whole thing - CriticalSection::ScopedLockType lock (m_mutex); - - // start() MUST be called. - bassert (!m_calledStart); - m_calledStart = true; - } - - m_entryPoints = entryPoints; - - m_thread.start (this); -} - -void ThreadWithCallQueue::stop (bool const wait) -{ - // can't call stop(true) from within a thread function - bassert (!wait || !m_thread.isTheCurrentThread ()); - - { - CriticalSection::ScopedLockType lock (m_mutex); - - // start() MUST be called. - bassert (m_calledStart); - - // TODO: Atomic for this - if (!m_calledStop) - { - m_calledStop = true; - - { - CriticalSection::ScopedUnlockType unlock (m_mutex); // getting fancy - - call (&ThreadWithCallQueue::doStop, this); - - // in theory something could slip in here - - close (); - } - } - } - - if (wait) - m_thread.join (); -} - -// Should be called periodically by the idle function. -// There are three possible results: -// -// #1 Returns false. The idle function may continue or return. -// #2 Returns true. The idle function should return as soon as possible. -// #3 Throws a Thread::Interruption exception. -// -// If interruptionPoint returns true or throws, it must -// not be called again before the thread has the opportunity to reset. -// -bool ThreadWithCallQueue::interruptionPoint () -{ - return m_thread.interruptionPoint (); -} - -// Interrupts the idle function by queueing a call that does nothing. -void ThreadWithCallQueue::interrupt () -{ - call (&ThreadWithCallQueue::doNothing); -} - -void ThreadWithCallQueue::doNothing () -{ - // Intentionally empty -} - -void ThreadWithCallQueue::signal () -{ - m_thread.interrupt (); -} - -void ThreadWithCallQueue::reset () -{ -} - -void ThreadWithCallQueue::doStop () -{ - m_shouldStop = true; -} - -void ThreadWithCallQueue::threadRun () -{ - m_entryPoints->threadInit (); - - for (;;) - { - CallQueue::synchronize (); - - if (m_shouldStop) - break; - - bool interrupted = m_entryPoints->threadIdle (); - - if (!interrupted) - interrupted = interruptionPoint (); - - if (!interrupted) - m_thread.wait (); - } - - m_entryPoints->threadExit (); -} diff --git a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.h b/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.h deleted file mode 100644 index 6f94b42a97..0000000000 --- a/Subtrees/beast/modules/beast_basics/threads/beast_ThreadWithCallQueue.h +++ /dev/null @@ -1,144 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THREADWITHCALLQUEUE_BEASTHEADER -#define BEAST_THREADWITHCALLQUEUE_BEASTHEADER - -/*============================================================================*/ -/** - An InterruptibleThread with a CallQueue. - - This combines an InterruptibleThread with a CallQueue, allowing functors to - be queued for asynchronous execution on the thread. - - The thread runs an optional user-defined idle function, which must regularly - check for an interruption using the InterruptibleThread interface. When an - interruption is signaled, the idle function returns and the CallQueue is - synchronized. Then, the idle function is resumed. - - When the ThreadWithCallQueue first starts up, an optional user-defined - initialization function is executed on the thread. When the thread exits, - a user-defined exit function may be executed on the thread. - - @see CallQueue - - @ingroup beast_concurrent -*/ -class ThreadWithCallQueue - : public CallQueue - , private InterruptibleThread::EntryPoint -{ -public: - /** Entry points for a ThreadWithCallQueue. - */ - class EntryPoints - { - public: - virtual ~EntryPoints () { } - - virtual void threadInit () { } - - virtual void threadExit () { } - - virtual bool threadIdle () - { - bool interrupted = false; - - return interrupted; - } - }; - - /** Create a thread. - - @param name The name of the InterruptibleThread and CallQueue, used - for diagnostics when debugging. - */ - explicit ThreadWithCallQueue (String name); - - /** Destroy a ThreadWithCallQueue. - - If the thread is still running it is stopped. The destructor blocks - until the thread exits cleanly. - */ - ~ThreadWithCallQueue (); - - /** Start the thread. - */ - void start (EntryPoints* const entryPoints); - - /* Stop the thread. - - Stops the thread and optionally wait until it exits. It is safe to call - this function at any time and as many times as desired. - - After a call to stop () the CallQueue is closed, and attempts to queue new - functors will throw a runtime exception. Existing functors will still - execute. - - Any listeners registered on the CallQueue need to be removed - before stop is called - - @invariant The caller is not on the associated thread. - - @param wait `true` if the function should wait until the thread exits - before returning. - */ - - void stop (bool const wait); - - /** - Determine if the thread needs interruption. - - Should be called periodically by the idle function. If interruptionPoint - returns true or throws, it must not be called again until the idle function - returns and is re-entered. - - @invariant No previous calls to interruptionPoint() made after the idle - function entry point returned `true`. - - @return `false` if the idle function may continue, or `true` if the - idle function must return as soon as possible. - */ - bool interruptionPoint (); - - /* Interrupts the idle function. - */ - void interrupt (); - -private: - static void doNothing (); - - void signal (); - - void reset (); - - void doStop (); - - void threadRun (); - -private: - InterruptibleThread m_thread; - EntryPoints* m_entryPoints; - bool m_calledStart; - bool m_calledStop; - bool m_shouldStop; - CriticalSection m_mutex; -}; - -#endif diff --git a/Subtrees/beast/modules/beast_core/beast_core.cpp b/Subtrees/beast/modules/beast_core/beast_core.cpp deleted file mode 100644 index 0514b14c54..0000000000 --- a/Subtrees/beast/modules/beast_core/beast_core.cpp +++ /dev/null @@ -1,216 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if defined (BEAST_CORE_BEASTHEADER) && ! BEAST_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of BEAST cpp file" -#endif - -// Your project must contain a BeastConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "BeastConfig.h" - -//============================================================================== -#include "native/beast_BasicNativeHeaders.h" -#include "beast_core.h" - -#include -#include - -#if ! BEAST_BSD - #include -#endif - -#if ! BEAST_ANDROID - #include -#endif - -#if BEAST_WINDOWS - #include - #include - #include - - #if ! BEAST_MINGW - #include - - #if ! BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #pragma comment (lib, "DbgHelp.lib") - #endif - #endif - - #if BEAST_MINGW - #include - #endif - -#else - #if BEAST_LINUX || BEAST_ANDROID - #include - #include - #include - #include - #include - #endif - - #if BEAST_LINUX - #include - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - - #if ! BEAST_ANDROID && ! BEAST_BSD - #include - #endif -#endif - -#if BEAST_MAC || BEAST_IOS - #include - #include -#endif - -#if BEAST_ANDROID - #include -#endif - - -//============================================================================== -namespace beast -{ - -#include "containers/beast_AbstractFifo.cpp" -#include "containers/beast_DynamicObject.cpp" -#include "containers/beast_NamedValueSet.cpp" -#include "containers/beast_PropertySet.cpp" -#include "containers/beast_Variant.cpp" -#include "files/beast_DirectoryIterator.cpp" -#include "files/beast_File.cpp" -#include "files/beast_FileInputStream.cpp" -#include "files/beast_FileOutputStream.cpp" -#include "files/beast_FileSearchPath.cpp" -#include "files/beast_TemporaryFile.cpp" -#include "json/beast_JSON.cpp" -#include "logging/beast_FileLogger.cpp" -#include "logging/beast_Logger.cpp" -#include "maths/beast_BigInteger.cpp" -#include "maths/beast_Expression.cpp" -#include "maths/beast_Random.cpp" -#include "memory/beast_MemoryBlock.cpp" -#include "misc/beast_Result.cpp" -#include "misc/beast_Uuid.cpp" -#include "network/beast_MACAddress.cpp" -#include "network/beast_NamedPipe.cpp" -#include "network/beast_Socket.cpp" -#include "network/beast_URL.cpp" -#include "network/beast_IPAddress.cpp" -#include "streams/beast_BufferedInputStream.cpp" -#include "streams/beast_FileInputSource.cpp" -#include "streams/beast_InputStream.cpp" -#include "streams/beast_MemoryInputStream.cpp" -#include "streams/beast_MemoryOutputStream.cpp" -#include "streams/beast_OutputStream.cpp" -#include "streams/beast_SubregionStream.cpp" -#include "system/beast_SystemStats.cpp" -#include "text/beast_CharacterFunctions.cpp" -#include "text/beast_Identifier.cpp" -#include "text/beast_LocalisedStrings.cpp" -#include "text/beast_String.cpp" -#include "text/beast_StringArray.cpp" -#include "text/beast_StringPairArray.cpp" -#include "text/beast_StringPool.cpp" -#include "text/beast_TextDiff.cpp" -#include "threads/beast_ChildProcess.cpp" -#include "threads/beast_ReadWriteLock.cpp" -#include "threads/beast_Thread.cpp" -#include "threads/beast_ThreadPool.cpp" -#include "threads/beast_TimeSliceThread.cpp" -#include "time/beast_PerformanceCounter.cpp" -#include "time/beast_RelativeTime.cpp" -#include "time/beast_Time.cpp" -#include "unit_tests/beast_UnitTest.cpp" -#include "xml/beast_XmlDocument.cpp" -#include "xml/beast_XmlElement.cpp" -#include "zip/beast_GZIPDecompressorInputStream.cpp" -#include "zip/beast_GZIPCompressorOutputStream.cpp" -#include "zip/beast_ZipFile.cpp" - -//============================================================================== -#if BEAST_MAC || BEAST_IOS -#include "native/beast_osx_ObjCHelpers.h" -#endif - -#if BEAST_ANDROID -#include "native/beast_android_JNIHelpers.h" -#endif - -#if ! BEAST_WINDOWS -#include "native/beast_posix_SharedCode.h" -#include "native/beast_posix_NamedPipe.cpp" -#endif - -//============================================================================== -#if BEAST_MAC || BEAST_IOS -#include "native/beast_mac_Files.mm" -#include "native/beast_mac_Network.mm" -#include "native/beast_mac_Strings.mm" -#include "native/beast_mac_SystemStats.mm" -#include "native/beast_mac_Threads.mm" - -//============================================================================== -#elif BEAST_WINDOWS -#include "native/beast_win32_ComSmartPtr.h" -#include "native/beast_win32_Files.cpp" -#include "native/beast_win32_Network.cpp" -#include "native/beast_win32_Registry.cpp" -#include "native/beast_win32_SystemStats.cpp" -#include "native/beast_win32_Threads.cpp" - -//============================================================================== -#elif BEAST_LINUX -#include "native/beast_linux_Files.cpp" -#include "native/beast_linux_Network.cpp" -#include "native/beast_linux_SystemStats.cpp" -#include "native/beast_linux_Threads.cpp" - -//============================================================================== -#elif BEAST_ANDROID -#include "native/beast_android_Files.cpp" -#include "native/beast_android_Misc.cpp" -#include "native/beast_android_Network.cpp" -#include "native/beast_android_SystemStats.cpp" -#include "native/beast_android_Threads.cpp" - -#endif - -#include "threads/beast_HighResolutionTimer.cpp" - -} diff --git a/Subtrees/beast/modules/beast_core/beast_core.h b/Subtrees/beast/modules/beast_core/beast_core.h deleted file mode 100644 index a37730cd61..0000000000 --- a/Subtrees/beast/modules/beast_core/beast_core.h +++ /dev/null @@ -1,440 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CORE_BEASTHEADER -#define BEAST_CORE_BEASTHEADER - -#ifndef BEAST_BEASTCONFIG_HEADER - /* If you fail to make sure that all your compile units are building Beast with the same set of - option flags, then there's a risk that different compile units will treat the classes as having - different memory layouts, leading to very nasty memory corruption errors when they all get - linked together. That's why it's best to always include the BeastConfig.h file before any beast headers. - */ - #ifdef _MSC_VER -#pragma message ("Have you included your BeastConfig.h file before including the Beast headers?") - #else - #warning "Have you included your BeastConfig.h file before including the Beast headers?" - #endif -#endif - -//============================================================================== -#include "system/beast_TargetPlatform.h" - -//============================================================================= -/** Config: BEAST_FORCE_DEBUG - - Normally, BEAST_DEBUG is set to 1 or 0 based on compiler and project settings, - but if you define this value, you can override this to force it to be true or false. -*/ -#ifndef BEAST_FORCE_DEBUG - //#define BEAST_FORCE_DEBUG 0 -#endif - -//============================================================================= -/** Config: BEAST_LOG_ASSERTIONS - - If this flag is enabled, the the bassert and bassertfalse macros will always use Logger::writeToLog() - to write a message when an assertion happens. - - Enabling it will also leave this turned on in release builds. When it's disabled, - however, the bassert and bassertfalse macros will not be compiled in a - release build. - - @see bassert, bassertfalse, Logger -*/ -#ifndef BEAST_LOG_ASSERTIONS - #if BEAST_ANDROID - #define BEAST_LOG_ASSERTIONS 1 - #else - #define BEAST_LOG_ASSERTIONS 0 - #endif -#endif - -//============================================================================= -/** Config: BEAST_CHECK_MEMORY_LEAKS - - Enables a memory-leak check for certain objects when the app terminates. See the LeakedObjectDetector - class and the BEAST_LEAK_DETECTOR macro for more details about enabling leak checking for specific classes. -*/ -#if BEAST_DEBUG && ! defined (BEAST_CHECK_MEMORY_LEAKS) - #define BEAST_CHECK_MEMORY_LEAKS 1 -#endif - -//============================================================================= -/** Config: BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - - In a Visual C++ build, this can be used to stop the required system libs being - automatically added to the link stage. -*/ -#ifndef BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #define BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES 0 -#endif - -/* Config: BEAST_INCLUDE_ZLIB_CODE - This can be used to disable Beast's embedded 3rd-party zlib code. - You might need to tweak this if you're linking to an external zlib library in your app, - but for normal apps, this option should be left alone. - - If you disable this, you might also want to set a value for BEAST_ZLIB_INCLUDE_PATH, to - specify the path where your zlib headers live. -*/ -#ifndef BEAST_INCLUDE_ZLIB_CODE - #define BEAST_INCLUDE_ZLIB_CODE 1 -#endif - -#ifndef BEAST_ZLIB_INCLUDE_PATH - #define BEAST_ZLIB_INCLUDE_PATH -#endif - -/* Config: BEAST_CATCH_UNHANDLED_EXCEPTIONS - If enabled, this will add some exception-catching code to forward unhandled exceptions - to your BEASTApplication::unhandledException() callback. -*/ -#ifndef BEAST_CATCH_UNHANDLED_EXCEPTIONS - //#define BEAST_CATCH_UNHANDLED_EXCEPTIONS 1 -#endif - -//============================================================================= -//============================================================================= -#if BEAST_MSVC - #pragma warning (disable: 4251) // (DLL build warning, must be disabled before pushing the warning state) - #pragma warning (push) - #pragma warning (disable: 4786) // (long class name warning) - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) - #endif -#endif - -#include "system/beast_StandardHeader.h" - -namespace beast -{ - -// START_AUTOINCLUDE containers, files, json, logging, maths, memory, misc, network, -// streams, system, text, threads, time, unit_tests, xml, zip -#ifndef BEAST_ABSTRACTFIFO_BEASTHEADER - #include "containers/beast_AbstractFifo.h" -#endif -#ifndef BEAST_ARRAY_BEASTHEADER - #include "containers/beast_Array.h" -#endif -#ifndef BEAST_ARRAYALLOCATIONBASE_BEASTHEADER - #include "containers/beast_ArrayAllocationBase.h" -#endif -#ifndef BEAST_DYNAMICOBJECT_BEASTHEADER - #include "containers/beast_DynamicObject.h" -#endif -#ifndef BEAST_ELEMENTCOMPARATOR_BEASTHEADER - #include "containers/beast_ElementComparator.h" -#endif -#ifndef BEAST_HASHMAP_BEASTHEADER - #include "containers/beast_HashMap.h" -#endif -#ifndef BEAST_LINKEDLISTPOINTER_BEASTHEADER - #include "containers/beast_LinkedListPointer.h" -#endif -#ifndef BEAST_NAMEDVALUESET_BEASTHEADER - #include "containers/beast_NamedValueSet.h" -#endif -#ifndef BEAST_OWNEDARRAY_BEASTHEADER - #include "containers/beast_OwnedArray.h" -#endif -#ifndef BEAST_PROPERTYSET_BEASTHEADER - #include "containers/beast_PropertySet.h" -#endif -#ifndef BEAST_REFERENCECOUNTEDARRAY_BEASTHEADER - #include "containers/beast_ReferenceCountedArray.h" -#endif -#ifndef BEAST_SCOPEDVALUESETTER_BEASTHEADER - #include "containers/beast_ScopedValueSetter.h" -#endif -#ifndef BEAST_SORTEDSET_BEASTHEADER - #include "containers/beast_SortedSet.h" -#endif -#ifndef BEAST_SPARSESET_BEASTHEADER - #include "containers/beast_SparseSet.h" -#endif -#ifndef BEAST_VARIANT_BEASTHEADER - #include "containers/beast_Variant.h" -#endif -#ifndef BEAST_DIRECTORYITERATOR_BEASTHEADER - #include "files/beast_DirectoryIterator.h" -#endif -#ifndef BEAST_FILE_BEASTHEADER - #include "files/beast_File.h" -#endif -#ifndef BEAST_FILEINPUTSTREAM_BEASTHEADER - #include "files/beast_FileInputStream.h" -#endif -#ifndef BEAST_FILEOUTPUTSTREAM_BEASTHEADER - #include "files/beast_FileOutputStream.h" -#endif -#ifndef BEAST_FILESEARCHPATH_BEASTHEADER - #include "files/beast_FileSearchPath.h" -#endif -#ifndef BEAST_MEMORYMAPPEDFILE_BEASTHEADER - #include "files/beast_MemoryMappedFile.h" -#endif -#ifndef BEAST_TEMPORARYFILE_BEASTHEADER - #include "files/beast_TemporaryFile.h" -#endif -#ifndef BEAST_JSON_BEASTHEADER - #include "json/beast_JSON.h" -#endif -#ifndef BEAST_FILELOGGER_BEASTHEADER - #include "logging/beast_FileLogger.h" -#endif -#ifndef BEAST_LOGGER_BEASTHEADER - #include "logging/beast_Logger.h" -#endif -#ifndef BEAST_BIGINTEGER_BEASTHEADER - #include "maths/beast_BigInteger.h" -#endif -#ifndef BEAST_EXPRESSION_BEASTHEADER - #include "maths/beast_Expression.h" -#endif -#ifndef BEAST_MATHSFUNCTIONS_BEASTHEADER - #include "maths/beast_MathsFunctions.h" -#endif -#ifndef BEAST_RANDOM_BEASTHEADER - #include "maths/beast_Random.h" -#endif -#ifndef BEAST_RANGE_BEASTHEADER - #include "maths/beast_Range.h" -#endif -#ifndef BEAST_ATOMIC_BEASTHEADER - #include "memory/beast_Atomic.h" -#endif -#ifndef BEAST_BYTEORDER_BEASTHEADER - #include "memory/beast_ByteOrder.h" -#endif -#ifndef BEAST_HEAPBLOCK_BEASTHEADER - #include "memory/beast_HeapBlock.h" -#endif -#ifndef BEAST_LEAKEDOBJECTDETECTOR_BEASTHEADER - #include "memory/beast_LeakedObjectDetector.h" -#endif -#ifndef BEAST_MEMORY_BEASTHEADER - #include "memory/beast_Memory.h" -#endif -#ifndef BEAST_MEMORYBLOCK_BEASTHEADER - #include "memory/beast_MemoryBlock.h" -#endif -#ifndef BEAST_OPTIONALSCOPEDPOINTER_BEASTHEADER - #include "memory/beast_OptionalScopedPointer.h" -#endif -#ifndef BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER - #include "memory/beast_ReferenceCountedObject.h" -#endif -#ifndef BEAST_SCOPEDPOINTER_BEASTHEADER - #include "memory/beast_ScopedPointer.h" -#endif -#ifndef BEAST_SINGLETON_BEASTHEADER - #include "memory/beast_Singleton.h" -#endif -#ifndef BEAST_WEAKREFERENCE_BEASTHEADER - #include "memory/beast_WeakReference.h" -#endif -#ifndef BEAST_RESULT_BEASTHEADER - #include "misc/beast_Result.h" -#endif -#ifndef BEAST_UUID_BEASTHEADER - #include "misc/beast_Uuid.h" -#endif -#ifndef BEAST_WINDOWSREGISTRY_BEASTHEADER - #include "misc/beast_WindowsRegistry.h" -#endif -#ifndef BEAST_IPADDRESS_BEASTHEADER - #include "network/beast_IPAddress.h" -#endif -#ifndef BEAST_MACADDRESS_BEASTHEADER - #include "network/beast_MACAddress.h" -#endif -#ifndef BEAST_NAMEDPIPE_BEASTHEADER - #include "network/beast_NamedPipe.h" -#endif -#ifndef BEAST_SOCKET_BEASTHEADER - #include "network/beast_Socket.h" -#endif -#ifndef BEAST_URL_BEASTHEADER - #include "network/beast_URL.h" -#endif -#ifndef BEAST_BUFFEREDINPUTSTREAM_BEASTHEADER - #include "streams/beast_BufferedInputStream.h" -#endif -#ifndef BEAST_FILEINPUTSOURCE_BEASTHEADER - #include "streams/beast_FileInputSource.h" -#endif -#ifndef BEAST_INPUTSOURCE_BEASTHEADER - #include "streams/beast_InputSource.h" -#endif -#ifndef BEAST_INPUTSTREAM_BEASTHEADER - #include "streams/beast_InputStream.h" -#endif -#ifndef BEAST_MEMORYINPUTSTREAM_BEASTHEADER - #include "streams/beast_MemoryInputStream.h" -#endif -#ifndef BEAST_MEMORYOUTPUTSTREAM_BEASTHEADER - #include "streams/beast_MemoryOutputStream.h" -#endif -#ifndef BEAST_OUTPUTSTREAM_BEASTHEADER - #include "streams/beast_OutputStream.h" -#endif -#ifndef BEAST_SUBREGIONSTREAM_BEASTHEADER - #include "streams/beast_SubregionStream.h" -#endif -#ifndef BEAST_PLATFORMDEFS_BEASTHEADER - #include "system/beast_PlatformDefs.h" -#endif -#ifndef BEAST_STANDARDHEADER_BEASTHEADER - #include "system/beast_StandardHeader.h" -#endif -#ifndef BEAST_SYSTEMSTATS_BEASTHEADER - #include "system/beast_SystemStats.h" -#endif -#ifndef BEAST_TARGETPLATFORM_BEASTHEADER - #include "system/beast_TargetPlatform.h" -#endif -#ifndef BEAST_CHARACTERFUNCTIONS_BEASTHEADER - #include "text/beast_CharacterFunctions.h" -#endif -#ifndef BEAST_CHARPOINTER_ASCII_BEASTHEADER - #include "text/beast_CharPointer_ASCII.h" -#endif -#ifndef BEAST_CHARPOINTER_UTF16_BEASTHEADER - #include "text/beast_CharPointer_UTF16.h" -#endif -#ifndef BEAST_CHARPOINTER_UTF32_BEASTHEADER - #include "text/beast_CharPointer_UTF32.h" -#endif -#ifndef BEAST_CHARPOINTER_UTF8_BEASTHEADER - #include "text/beast_CharPointer_UTF8.h" -#endif -#ifndef BEAST_IDENTIFIER_BEASTHEADER - #include "text/beast_Identifier.h" -#endif -#ifndef BEAST_LOCALISEDSTRINGS_BEASTHEADER - #include "text/beast_LocalisedStrings.h" -#endif -#ifndef BEAST_NEWLINE_BEASTHEADER - #include "text/beast_NewLine.h" -#endif -#ifndef BEAST_STRING_BEASTHEADER - #include "text/beast_String.h" -#endif -#ifndef BEAST_STRINGARRAY_BEASTHEADER - #include "text/beast_StringArray.h" -#endif -#ifndef BEAST_STRINGPAIRARRAY_BEASTHEADER - #include "text/beast_StringPairArray.h" -#endif -#ifndef BEAST_STRINGPOOL_BEASTHEADER - #include "text/beast_StringPool.h" -#endif -#ifndef BEAST_TEXTDIFF_BEASTHEADER - #include "text/beast_TextDiff.h" -#endif -#ifndef BEAST_CHILDPROCESS_BEASTHEADER - #include "threads/beast_ChildProcess.h" -#endif -#ifndef BEAST_CRITICALSECTION_BEASTHEADER - #include "threads/beast_CriticalSection.h" -#endif -#ifndef BEAST_DYNAMICLIBRARY_BEASTHEADER - #include "threads/beast_DynamicLibrary.h" -#endif -#ifndef BEAST_HIGHRESOLUTIONTIMER_BEASTHEADER - #include "threads/beast_HighResolutionTimer.h" -#endif -#ifndef BEAST_INTERPROCESSLOCK_BEASTHEADER - #include "threads/beast_InterProcessLock.h" -#endif -#ifndef BEAST_PROCESS_BEASTHEADER - #include "threads/beast_Process.h" -#endif -#ifndef BEAST_READWRITELOCK_BEASTHEADER - #include "threads/beast_ReadWriteLock.h" -#endif -#ifndef BEAST_SCOPEDLOCK_BEASTHEADER - #include "threads/beast_ScopedLock.h" -#endif -#ifndef BEAST_SCOPEDREADLOCK_BEASTHEADER - #include "threads/beast_ScopedReadLock.h" -#endif -#ifndef BEAST_SCOPEDWRITELOCK_BEASTHEADER - #include "threads/beast_ScopedWriteLock.h" -#endif -#ifndef BEAST_SPINLOCK_BEASTHEADER - #include "threads/beast_SpinLock.h" -#endif -#ifndef BEAST_THREAD_BEASTHEADER - #include "threads/beast_Thread.h" -#endif -#ifndef BEAST_THREADLOCALVALUE_BEASTHEADER - #include "threads/beast_ThreadLocalValue.h" -#endif -#ifndef BEAST_THREADPOOL_BEASTHEADER - #include "threads/beast_ThreadPool.h" -#endif -#ifndef BEAST_TIMESLICETHREAD_BEASTHEADER - #include "threads/beast_TimeSliceThread.h" -#endif -#ifndef BEAST_WAITABLEEVENT_BEASTHEADER - #include "threads/beast_WaitableEvent.h" -#endif -#ifndef BEAST_PERFORMANCECOUNTER_BEASTHEADER - #include "time/beast_PerformanceCounter.h" -#endif -#ifndef BEAST_RELATIVETIME_BEASTHEADER - #include "time/beast_RelativeTime.h" -#endif -#ifndef BEAST_TIME_BEASTHEADER - #include "time/beast_Time.h" -#endif -#ifndef BEAST_UNITTEST_BEASTHEADER - #include "unit_tests/beast_UnitTest.h" -#endif -#ifndef BEAST_XMLDOCUMENT_BEASTHEADER - #include "xml/beast_XmlDocument.h" -#endif -#ifndef BEAST_XMLELEMENT_BEASTHEADER - #include "xml/beast_XmlElement.h" -#endif -#ifndef BEAST_GZIPCOMPRESSOROUTPUTSTREAM_BEASTHEADER - #include "zip/beast_GZIPCompressorOutputStream.h" -#endif -#ifndef BEAST_GZIPDECOMPRESSORINPUTSTREAM_BEASTHEADER - #include "zip/beast_GZIPDecompressorInputStream.h" -#endif -#ifndef BEAST_ZIPFILE_BEASTHEADER - #include "zip/beast_ZipFile.h" -#endif -// END_AUTOINCLUDE - -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -#endif // BEAST_CORE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/beast_core.mm b/Subtrees/beast/modules/beast_core/beast_core.mm deleted file mode 100644 index 2b9492c624..0000000000 --- a/Subtrees/beast/modules/beast_core/beast_core.mm +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#include "beast_core.cpp" diff --git a/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.cpp b/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.cpp deleted file mode 100644 index 9663e79f6a..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.cpp +++ /dev/null @@ -1,229 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -AbstractFifo::AbstractFifo (const int capacity) noexcept - : bufferSize (capacity) -{ - bassert (bufferSize > 0); -} - -AbstractFifo::~AbstractFifo() {} - -int AbstractFifo::getTotalSize() const noexcept { return bufferSize; } -int AbstractFifo::getFreeSpace() const noexcept { return bufferSize - getNumReady(); } - -int AbstractFifo::getNumReady() const noexcept -{ - const int vs = validStart.get(); - const int ve = validEnd.get(); - return ve >= vs ? (ve - vs) : (bufferSize - (vs - ve)); -} - -void AbstractFifo::reset() noexcept -{ - validEnd = 0; - validStart = 0; -} - -void AbstractFifo::setTotalSize (int newSize) noexcept -{ - bassert (newSize > 0); - reset(); - bufferSize = newSize; -} - -//============================================================================== -void AbstractFifo::prepareToWrite (int numToWrite, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept -{ - const int vs = validStart.get(); - const int ve = validEnd.value; - - const int freeSpace = ve >= vs ? (bufferSize - (ve - vs)) : (vs - ve); - numToWrite = bmin (numToWrite, freeSpace - 1); - - if (numToWrite <= 0) - { - startIndex1 = 0; - startIndex2 = 0; - blockSize1 = 0; - blockSize2 = 0; - } - else - { - startIndex1 = ve; - startIndex2 = 0; - blockSize1 = bmin (bufferSize - ve, numToWrite); - numToWrite -= blockSize1; - blockSize2 = numToWrite <= 0 ? 0 : bmin (numToWrite, vs); - } -} - -void AbstractFifo::finishedWrite (int numWritten) noexcept -{ - bassert (numWritten >= 0 && numWritten < bufferSize); - int newEnd = validEnd.value + numWritten; - if (newEnd >= bufferSize) - newEnd -= bufferSize; - - validEnd = newEnd; -} - -void AbstractFifo::prepareToRead (int numWanted, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept -{ - const int vs = validStart.value; - const int ve = validEnd.get(); - - const int numReady = ve >= vs ? (ve - vs) : (bufferSize - (vs - ve)); - numWanted = bmin (numWanted, numReady); - - if (numWanted <= 0) - { - startIndex1 = 0; - startIndex2 = 0; - blockSize1 = 0; - blockSize2 = 0; - } - else - { - startIndex1 = vs; - startIndex2 = 0; - blockSize1 = bmin (bufferSize - vs, numWanted); - numWanted -= blockSize1; - blockSize2 = numWanted <= 0 ? 0 : bmin (numWanted, ve); - } -} - -void AbstractFifo::finishedRead (int numRead) noexcept -{ - bassert (numRead >= 0 && numRead <= bufferSize); - - int newStart = validStart.value + numRead; - if (newStart >= bufferSize) - newStart -= bufferSize; - - validStart = newStart; -} - -//============================================================================== -//============================================================================== -#if BEAST_UNIT_TESTS - -class AbstractFifoTests : public UnitTest -{ -public: - AbstractFifoTests() : UnitTest ("Abstract Fifo") {} - - class WriteThread : public Thread - { - public: - WriteThread (AbstractFifo& fifo_, int* buffer_) - : Thread ("fifo writer"), fifo (fifo_), buffer (buffer_) - { - startThread(); - } - - ~WriteThread() - { - stopThread (5000); - } - - void run() - { - int n = 0; - Random r; - - while (! threadShouldExit()) - { - int num = r.nextInt (2000) + 1; - - int start1, size1, start2, size2; - fifo.prepareToWrite (num, start1, size1, start2, size2); - - bassert (size1 >= 0 && size2 >= 0); - bassert (size1 == 0 || (start1 >= 0 && start1 < fifo.getTotalSize())); - bassert (size2 == 0 || (start2 >= 0 && start2 < fifo.getTotalSize())); - - for (int i = 0; i < size1; ++i) - buffer [start1 + i] = n++; - - for (int i = 0; i < size2; ++i) - buffer [start2 + i] = n++; - - fifo.finishedWrite (size1 + size2); - } - } - - private: - AbstractFifo& fifo; - int* buffer; - }; - - void runTest() - { - beginTest ("AbstractFifo"); - - int buffer [5000]; - AbstractFifo fifo (numElementsInArray (buffer)); - - WriteThread writer (fifo, buffer); - - int n = 0; - Random r; - - for (int count = 100000; --count >= 0;) - { - int num = r.nextInt (6000) + 1; - - int start1, size1, start2, size2; - fifo.prepareToRead (num, start1, size1, start2, size2); - - if (! (size1 >= 0 && size2 >= 0) - && (size1 == 0 || (start1 >= 0 && start1 < fifo.getTotalSize())) - && (size2 == 0 || (start2 >= 0 && start2 < fifo.getTotalSize()))) - { - expect (false, "prepareToRead returned -ve values"); - break; - } - - bool failed = false; - - for (int i = 0; i < size1; ++i) - failed = (buffer [start1 + i] != n++) || failed; - - for (int i = 0; i < size2; ++i) - failed = (buffer [start2 + i] != n++) || failed; - - if (failed) - { - expect (false, "read values were incorrect"); - break; - } - - fifo.finishedRead (size1 + size2); - } - } -}; - -static AbstractFifoTests fifoUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.h b/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.h deleted file mode 100644 index 4c5e6856c8..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_AbstractFifo.h +++ /dev/null @@ -1,217 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ABSTRACTFIFO_BEASTHEADER -#define BEAST_ABSTRACTFIFO_BEASTHEADER - -#include "../memory/beast_Atomic.h" - - -//============================================================================== -/** - Encapsulates the logic required to implement a lock-free FIFO. - - This class handles the logic needed when building a single-reader, single-writer FIFO. - - It doesn't actually hold any data itself, but your FIFO class can use one of these to manage - its position and status when reading or writing to it. - - To use it, you can call prepareToWrite() to determine the position within your own buffer that - an incoming block of data should be stored, and prepareToRead() to find out when the next - outgoing block should be read from. - - e.g. - @code - class MyFifo - { - public: - MyFifo() : abstractFifo (1024) - { - } - - void addToFifo (const int* someData, int numItems) - { - int start1, size1, start2, size2; - abstractFifo.prepareToWrite (numItems, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (myBuffer + start1, someData, size1); - - if (size2 > 0) - copySomeData (myBuffer + start2, someData + size1, size2); - - abstractFifo.finishedWrite (size1 + size2); - } - - void readFromFifo (int* someData, int numItems) - { - int start1, size1, start2, size2; - abstractFifo.prepareToRead (numSamples, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (someData, myBuffer + start1, size1); - - if (size2 > 0) - copySomeData (someData + size1, myBuffer + start2, size2); - - abstractFifo.finishedRead (size1 + size2); - } - - private: - AbstractFifo abstractFifo; - int myBuffer [1024]; - }; - @endcode -*/ -class BEAST_API AbstractFifo -{ -public: - //============================================================================== - /** Creates a FIFO to manage a buffer with the specified capacity. */ - AbstractFifo (int capacity) noexcept; - - /** Destructor */ - ~AbstractFifo(); - - //============================================================================== - /** Returns the total size of the buffer being managed. */ - int getTotalSize() const noexcept; - - /** Returns the number of items that can currently be added to the buffer without it overflowing. */ - int getFreeSpace() const noexcept; - - /** Returns the number of items that can currently be read from the buffer. */ - int getNumReady() const noexcept; - - /** Clears the buffer positions, so that it appears empty. */ - void reset() noexcept; - - /** Changes the buffer's total size. - Note that this isn't thread-safe, so don't call it if there's any danger that it - might overlap with a call to any other method in this class! - */ - void setTotalSize (int newSize) noexcept; - - //============================================================================== - /** Returns the location within the buffer at which an incoming block of data should be written. - - Because the section of data that you want to add to the buffer may overlap the end - and wrap around to the start, two blocks within your buffer are returned, and you - should copy your data into the first one, with any remaining data spilling over into - the second. - - If the number of items you ask for is too large to fit within the buffer's free space, then - blockSize1 + blockSize2 may add up to a lower value than numToWrite. If this happens, you - may decide to keep waiting and re-trying the method until there's enough space available. - - After calling this method, if you choose to write your data into the blocks returned, you - must call finishedWrite() to tell the FIFO how much data you actually added. - - e.g. - @code - void addToFifo (const int* someData, int numItems) - { - int start1, size1, start2, size2; - prepareToWrite (numItems, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (myBuffer + start1, someData, size1); - - if (size2 > 0) - copySomeData (myBuffer + start2, someData + size1, size2); - - finishedWrite (size1 + size2); - } - @endcode - - @param numToWrite indicates how many items you'd like to add to the buffer - @param startIndex1 on exit, this will contain the start index in your buffer at which your data should be written - @param blockSize1 on exit, this indicates how many items can be written to the block starting at startIndex1 - @param startIndex2 on exit, this will contain the start index in your buffer at which any data that didn't fit into - the first block should be written - @param blockSize2 on exit, this indicates how many items can be written to the block starting at startIndex2 - @see finishedWrite - */ - void prepareToWrite (int numToWrite, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept; - - /** Called after writing from the FIFO, to indicate that this many items have been added. - @see prepareToWrite - */ - void finishedWrite (int numWritten) noexcept; - - /** Returns the location within the buffer from which the next block of data should be read. - - Because the section of data that you want to read from the buffer may overlap the end - and wrap around to the start, two blocks within your buffer are returned, and you - should read from both of them. - - If the number of items you ask for is greater than the amount of data available, then - blockSize1 + blockSize2 may add up to a lower value than numWanted. If this happens, you - may decide to keep waiting and re-trying the method until there's enough data available. - - After calling this method, if you choose to read the data, you must call finishedRead() to - tell the FIFO how much data you have consumed. - - e.g. - @code - void readFromFifo (int* someData, int numItems) - { - int start1, size1, start2, size2; - prepareToRead (numSamples, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (someData, myBuffer + start1, size1); - - if (size2 > 0) - copySomeData (someData + size1, myBuffer + start2, size2); - - finishedRead (size1 + size2); - } - @endcode - - @param numWanted indicates how many items you'd like to add to the buffer - @param startIndex1 on exit, this will contain the start index in your buffer at which your data should be written - @param blockSize1 on exit, this indicates how many items can be written to the block starting at startIndex1 - @param startIndex2 on exit, this will contain the start index in your buffer at which any data that didn't fit into - the first block should be written - @param blockSize2 on exit, this indicates how many items can be written to the block starting at startIndex2 - @see finishedRead - */ - void prepareToRead (int numWanted, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept; - - /** Called after reading from the FIFO, to indicate that this many items have now been consumed. - @see prepareToRead - */ - void finishedRead (int numRead) noexcept; - - -private: - //============================================================================== - int bufferSize; - Atomic validStart, validEnd; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AbstractFifo) -}; - - -#endif // BEAST_ABSTRACTFIFO_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_Array.h b/Subtrees/beast/modules/beast_core/containers/beast_Array.h deleted file mode 100644 index 1cec6d7fdd..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_Array.h +++ /dev/null @@ -1,1047 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ARRAY_BEASTHEADER -#define BEAST_ARRAY_BEASTHEADER - -#include "beast_ArrayAllocationBase.h" -#include "beast_ElementComparator.h" -#include "../threads/beast_CriticalSection.h" - - -//============================================================================== -/** - Holds a resizable array of primitive or copy-by-value objects. - - Examples of arrays are: Array, Array or Array - - The Array class can be used to hold simple, non-polymorphic objects as well as primitive types - to - do so, the class must fulfil these requirements: - - it must have a copy constructor and assignment operator - - it must be able to be relocated in memory by a memcpy without this causing any problems - so - objects whose functionality relies on external pointers or references to themselves can be used. - - You can of course have an array of pointers to any kind of object, e.g. Array , but if - you do this, the array doesn't take any ownership of the objects - see the OwnedArray class or the - ReferenceCountedArray class for more powerful ways of holding lists of objects. - - For holding lists of strings, you can use Array\, but it's usually better to use the - specialised class StringArray, which provides more useful functions. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see OwnedArray, ReferenceCountedArray, StringArray, CriticalSection -*/ -template -class Array -{ -private: - typedef PARAMETER_TYPE (ElementType) ParameterType; - -public: - //============================================================================== - /** Creates an empty array. */ - Array() noexcept - : numUsed (0) - { - } - - /** Creates a copy of another array. - @param other the array to copy - */ - Array (const Array& other) - { - const ScopedLockType lock (other.getLock()); - numUsed = other.numUsed; - data.setAllocatedSize (other.numUsed); - - for (int i = 0; i < numUsed; ++i) - new (data.elements + i) ElementType (other.data.elements[i]); - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - Array (Array&& other) noexcept - : data (static_cast &&> (other.data)), - numUsed (other.numUsed) - { - other.numUsed = 0; - } - #endif - - /** Initalises from a null-terminated C array of values. - - @param values the array to copy from - */ - template - explicit Array (const TypeToCreateFrom* values) - : numUsed (0) - { - while (*values != TypeToCreateFrom()) - add (*values++); - } - - /** Initalises from a C array of values. - - @param values the array to copy from - @param numValues the number of values in the array - */ - template - Array (const TypeToCreateFrom* values, int numValues) - : numUsed (numValues) - { - data.setAllocatedSize (numValues); - - for (int i = 0; i < numValues; ++i) - new (data.elements + i) ElementType (values[i]); - } - - /** Destructor. */ - ~Array() - { - deleteAllElements(); - } - - /** Copies another array. - @param other the array to copy - */ - Array& operator= (const Array& other) - { - if (this != &other) - { - Array otherCopy (other); - swapWithArray (otherCopy); - } - - return *this; - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - Array& operator= (Array&& other) noexcept - { - const ScopedLockType lock (getLock()); - data = static_cast &&> (other.data); - numUsed = other.numUsed; - other.numUsed = 0; - return *this; - } - #endif - - //============================================================================== - /** Compares this array to another one. - Two arrays are considered equal if they both contain the same set of - elements, in the same order. - @param other the other array to compare with - */ - template - bool operator== (const OtherArrayType& other) const - { - const ScopedLockType lock (getLock()); - const typename OtherArrayType::ScopedLockType lock2 (other.getLock()); - - if (numUsed != other.numUsed) - return false; - - for (int i = numUsed; --i >= 0;) - if (! (data.elements [i] == other.data.elements [i])) - return false; - - return true; - } - - /** Compares this array to another one. - Two arrays are considered equal if they both contain the same set of - elements, in the same order. - @param other the other array to compare with - */ - template - bool operator!= (const OtherArrayType& other) const - { - return ! operator== (other); - } - - //============================================================================== - /** Removes all elements from the array. - This will remove all the elements, and free any storage that the array is - using. To clear the array without freeing the storage, use the clearQuick() - method instead. - - @see clearQuick - */ - void clear() - { - const ScopedLockType lock (getLock()); - deleteAllElements(); - data.setAllocatedSize (0); - numUsed = 0; - } - - /** Removes all elements from the array without freeing the array's allocated storage. - - @see clear - */ - void clearQuick() - { - const ScopedLockType lock (getLock()); - deleteAllElements(); - numUsed = 0; - } - - //============================================================================== - /** Returns the current number of elements in the array. - */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns one of the elements in the array. - If the index passed in is beyond the range of valid elements, this - will return a default value. - - If you're certain that the index will always be a valid element, you - can call getUnchecked() instead, which is faster. - - @param index the index of the element being requested (0 is the first element in the array) - @see getUnchecked, getFirst, getLast - */ - ElementType operator[] (const int index) const - { - const ScopedLockType lock (getLock()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : ElementType(); - } - - /** Returns one of the elements in the array, without checking the index passed in. - - Unlike the operator[] method, this will try to return an element without - checking that the index is within the bounds of the array, so should only - be used when you're confident that it will always be a valid index. - - @param index the index of the element being requested (0 is the first element in the array) - @see operator[], getFirst, getLast - */ - inline ElementType getUnchecked (const int index) const - { - const ScopedLockType lock (getLock()); - bassert (isPositiveAndBelow (index, numUsed)); - return data.elements [index]; - } - - /** Returns a direct reference to one of the elements in the array, without checking the index passed in. - - This is like getUnchecked, but returns a direct reference to the element, so that - you can alter it directly. Obviously this can be dangerous, so only use it when - absolutely necessary. - - @param index the index of the element being requested (0 is the first element in the array) - @see operator[], getFirst, getLast - */ - inline ElementType& getReference (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - bassert (isPositiveAndBelow (index, numUsed)); - return data.elements [index]; - } - - /** Returns the first element in the array, or a default value if the array is empty. - - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const - { - const ScopedLockType lock (getLock()); - return (numUsed > 0) ? data.elements [0] - : ElementType(); - } - - /** Returns the last element in the array, or a default value if the array is empty. - - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const - { - const ScopedLockType lock (getLock()); - return (numUsed > 0) ? data.elements [numUsed - 1] - : ElementType(); - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ElementType* getRawDataPointer() noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* end() const noexcept - { - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of the first element which matches the value passed in. - - This will search the array for the given object, and return the index - of its first occurrence. If the object isn't found, the method will return -1. - - @param elementToLookFor the value or object to look for - @returns the index of the object, or -1 if it's not found - */ - int indexOf (ParameterType elementToLookFor) const - { - const ScopedLockType lock (getLock()); - const ElementType* e = data.elements.getData(); - const ElementType* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (elementToLookFor == *e) - return static_cast (e - data.elements.getData()); - - return -1; - } - - /** Returns true if the array contains at least one occurrence of an object. - - @param elementToLookFor the value or object to look for - @returns true if the item is found - */ - bool contains (ParameterType elementToLookFor) const - { - const ScopedLockType lock (getLock()); - const ElementType* e = data.elements.getData(); - const ElementType* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (elementToLookFor == *e) - return true; - - return false; - } - - //============================================================================== - /** Appends a new element at the end of the array. - - @param newElement the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted, addUsingDefaultSort, addArray - */ - void add (ParameterType newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (newElement); - } - - /** Inserts a new element into the array at a given position. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the new element should be - inserted (pass in -1 to add it to the end) - @param newElement the new object to add to the array - @see add, addSorted, addUsingDefaultSort, set - */ - void insert (int indexToInsertAt, ParameterType newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - ElementType* const insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - - if (numberToMove > 0) - memmove (insertPos + 1, insertPos, ((size_t) numberToMove) * sizeof (ElementType)); - - new (insertPos) ElementType (newElement); - ++numUsed; - } - else - { - new (data.elements + numUsed++) ElementType (newElement); - } - } - - /** Inserts multiple copies of an element into the array at a given position. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the new element should be inserted - @param newElement the new object to add to the array - @param numberOfTimesToInsertIt how many copies of the value to insert - @see insert, add, addSorted, set - */ - void insertMultiple (int indexToInsertAt, ParameterType newElement, - int numberOfTimesToInsertIt) - { - if (numberOfTimesToInsertIt > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfTimesToInsertIt); - ElementType* insertPos; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - memmove (insertPos + numberOfTimesToInsertIt, insertPos, ((size_t) numberToMove) * sizeof (ElementType)); - } - else - { - insertPos = data.elements + numUsed; - } - - numUsed += numberOfTimesToInsertIt; - - while (--numberOfTimesToInsertIt >= 0) - new (insertPos++) ElementType (newElement); - } - } - - /** Inserts an array of values into this array at a given position. - - If the index is less than 0 or greater than the size of the array, the - new elements will be added to the end of the array. - Otherwise, they will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the first new element should be inserted - @param newElements the new values to add to the array - @param numberOfElements how many items are in the array - @see insert, add, addSorted, set - */ - void insertArray (int indexToInsertAt, - const ElementType* newElements, - int numberOfElements) - { - if (numberOfElements > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfElements); - ElementType* insertPos = data.elements; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos += indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ElementType)); - } - else - { - insertPos += numUsed; - } - - numUsed += numberOfElements; - - while (--numberOfElements >= 0) - new (insertPos++) ElementType (*newElements++); - } - } - - /** Appends a new element at the end of the array as long as the array doesn't - already contain it. - - If the array already contains an element that matches the one passed in, nothing - will be done. - - @param newElement the new object to add to the array - */ - void addIfNotAlreadyThere (ParameterType newElement) - { - const ScopedLockType lock (getLock()); - - if (! contains (newElement)) - add (newElement); - } - - /** Replaces an element with a new value. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the item is added to the end of the array. - - @param indexToChange the index whose value you want to change - @param newValue the new value to set for this index. - @see add, insert - */ - void set (const int indexToChange, ParameterType newValue) - { - bassert (indexToChange >= 0); - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToChange, numUsed)) - { - data.elements [indexToChange] = newValue; - } - else if (indexToChange >= 0) - { - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (newValue); - } - } - - /** Replaces an element with a new value without doing any bounds-checking. - - This just sets a value directly in the array's internal storage, so you'd - better make sure it's in range! - - @param indexToChange the index whose value you want to change - @param newValue the new value to set for this index. - @see set, getUnchecked - */ - void setUnchecked (const int indexToChange, ParameterType newValue) - { - const ScopedLockType lock (getLock()); - bassert (isPositiveAndBelow (indexToChange, numUsed)); - data.elements [indexToChange] = newValue; - } - - /** Adds elements from an array to the end of this array. - - @param elementsToAdd the array of elements to add - @param numElementsToAdd how many elements are in this other array - @see add - */ - void addArray (const ElementType* elementsToAdd, int numElementsToAdd) - { - const ScopedLockType lock (getLock()); - - if (numElementsToAdd > 0) - { - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - { - new (data.elements + numUsed) ElementType (*elementsToAdd++); - ++numUsed; - } - } - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - void swapWithArray (Array& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherArray.getLock()); - - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addArray (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - while (--numElementsToAdd >= 0) - add (arrayToAddFrom.getUnchecked (startIndex++)); - } - } - - /** This will enlarge or shrink the array to the given number of elements, by adding - or removing items from its end. - - If the array is smaller than the given target size, empty elements will be appended - until its size is as specified. If its size is larger than the target, items will be - removed from its end to shorten it. - */ - void resize (const int targetNumItems) - { - bassert (targetNumItems >= 0); - - const int numToAdd = targetNumItems - numUsed; - if (numToAdd > 0) - insertMultiple (numUsed, ElementType(), numToAdd); - else if (numToAdd < 0) - removeRange (targetNumItems, -numToAdd); - } - - /** Inserts a new element into the array, assuming that the array is sorted. - - This will use a comparator to find the position at which the new element - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param newElement the new element to insert to the array - @returns the index at which the new item was added - @see addUsingDefaultSort, add, sort - */ - template - int addSorted (ElementComparator& comparator, ParameterType newElement) - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newElement, 0, numUsed); - insert (index, newElement); - return index; - } - - /** Inserts a new element into the array, assuming that the array is sorted. - - This will use the DefaultElementComparator class for sorting, so your ElementType - must be suitable for use with that class. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param newElement the new element to insert to the array - @see addSorted, sort - */ - void addUsingDefaultSort (ParameterType newElement) - { - DefaultElementComparator comparator; - addSorted (comparator, newElement); - } - - /** Finds the index of an element in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param elementToLookFor the element to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - - for (int s = 0, e = numUsed;;) - { - if (s >= e) - return -1; - - if (comparator.compareElements (elementToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - return -1; - - if (comparator.compareElements (elementToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - } - - //============================================================================== - /** Removes an element from the array. - - This will remove the element at a given index, and move back - all the subsequent elements to close the gap. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @returns the element that has been removed - @see removeValue, removeRange - */ - ElementType remove (const int indexToRemove) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ElementType removed (data.elements[indexToRemove]); - removeInternal (indexToRemove); - return removed; - } - - return ElementType(); - } - - /** Removes an item from the array. - - This will remove the first occurrence of the given element from the array. - If the item isn't found, no action is taken. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeFirstMatchingValue (ParameterType valueToRemove) - { - const ScopedLockType lock (getLock()); - ElementType* const e = data.elements; - - for (int i = 0; i < numUsed; ++i) - { - if (valueToRemove == e[i]) - { - removeInternal (i); - break; - } - } - } - - /** Removes an item from the array. - - This will remove the first occurrence of the given element from the array. - If the item isn't found, no action is taken. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeAllInstancesOf (ParameterType valueToRemove) - { - const ScopedLockType lock (getLock()); - - for (int i = numUsed; --i >= 0;) - if (valueToRemove == data.elements[i]) - removeInternal (i); - } - - /** Removes a range of elements from the array. - - This will remove a set of elements, starting from the given index, - and move subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first element to remove - @param numberToRemove how many elements should be removed - @see remove, removeValue - */ - void removeRange (int startIndex, int numberToRemove) - { - const ScopedLockType lock (getLock()); - const int endIndex = blimit (0, numUsed, startIndex + numberToRemove); - startIndex = blimit (0, numUsed, startIndex); - - if (endIndex > startIndex) - { - ElementType* const e = data.elements + startIndex; - - numberToRemove = endIndex - startIndex; - for (int i = 0; i < numberToRemove; ++i) - e[i].~ElementType(); - - const int numToShift = numUsed - endIndex; - if (numToShift > 0) - memmove (e, e + numberToRemove, ((size_t) numToShift) * sizeof (ElementType)); - - numUsed -= numberToRemove; - minimiseStorageAfterRemoval(); - } - } - - /** Removes the last n elements from the array. - - @param howManyToRemove how many elements to remove from the end of the array - @see remove, removeValue, removeRange - */ - void removeLast (int howManyToRemove = 1) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove > numUsed) - howManyToRemove = numUsed; - - for (int i = 1; i <= howManyToRemove; ++i) - data.elements [numUsed - i].~ElementType(); - - numUsed -= howManyToRemove; - minimiseStorageAfterRemoval(); - } - - /** Removes any elements which are also in another array. - - @param otherArray the other array in which to look for elements to remove - @see removeValuesNotIn, remove, removeValue, removeRange - */ - template - void removeValuesIn (const OtherArrayType& otherArray) - { - const typename OtherArrayType::ScopedLockType lock1 (otherArray.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this == &otherArray) - { - clear(); - } - else - { - if (otherArray.size() > 0) - { - for (int i = numUsed; --i >= 0;) - if (otherArray.contains (data.elements [i])) - removeInternal (i); - } - } - } - - /** Removes any elements which are not found in another array. - - Only elements which occur in this other array will be retained. - - @param otherArray the array in which to look for elements NOT to remove - @see removeValuesIn, remove, removeValue, removeRange - */ - template - void removeValuesNotIn (const OtherArrayType& otherArray) - { - const typename OtherArrayType::ScopedLockType lock1 (otherArray.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this != &otherArray) - { - if (otherArray.size() <= 0) - { - clear(); - } - else - { - for (int i = numUsed; --i >= 0;) - if (! otherArray.contains (data.elements [i])) - removeInternal (i); - } - } - } - - /** Swaps over two elements in the array. - - This swaps over the elements found at the two indexes passed in. - If either index is out-of-range, this method will do nothing. - - @param index1 index of one of the elements to swap - @param index2 index of the other element to swap - */ - void swap (const int index1, - const int index2) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the values to a different position. - - This will move the value to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the value to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this value to end up. If this - is less than zero, the value will be moved to the end - of the array - */ - void move (const int currentIndex, int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - char tempCopy [sizeof (ElementType)]; - memcpy (tempCopy, data.elements + currentIndex, sizeof (ElementType)); - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ElementType) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ElementType) * (size_t) (currentIndex - newIndex)); - } - - memcpy (data.elements + newIndex, tempCopy, sizeof (ElementType)); - } - } - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - - @see addSorted, indexOfSorted, sortArray - */ - template - void sort (ElementComparator& comparator, - const bool retainOrderOfEquivalentItems = false) const - { - const ScopedLockType lock (getLock()); - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - void removeInternal (const int indexToRemove) - { - --numUsed; - ElementType* const e = data.elements + indexToRemove; - e->~ElementType(); - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, ((size_t) numberToShift) * sizeof (ElementType)); - - minimiseStorageAfterRemoval(); - } - - inline void deleteAllElements() noexcept - { - for (int i = 0; i < numUsed; ++i) - data.elements[i].~ElementType(); - } - - void minimiseStorageAfterRemoval() - { - if (data.numAllocated > bmax (minimumAllocatedSize, numUsed * 2)) - data.shrinkToNoMoreThan (bmax (numUsed, bmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType)))); - } -}; - - -#endif // BEAST_ARRAY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_ArrayAllocationBase.h b/Subtrees/beast/modules/beast_core/containers/beast_ArrayAllocationBase.h deleted file mode 100644 index 479fb9091f..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_ArrayAllocationBase.h +++ /dev/null @@ -1,133 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ARRAYALLOCATIONBASE_BEASTHEADER -#define BEAST_ARRAYALLOCATIONBASE_BEASTHEADER - -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** - Implements some basic array storage allocation functions. - - This class isn't really for public use - it's used by the other - array classes, but might come in handy for some purposes. - - It inherits from a critical section class to allow the arrays to use - the "empty base class optimisation" pattern to reduce their footprint. - - @see Array, OwnedArray, ReferenceCountedArray -*/ -template -class ArrayAllocationBase : public TypeOfCriticalSectionToUse -{ -public: - //============================================================================== - /** Creates an empty array. */ - ArrayAllocationBase() noexcept - : numAllocated (0) - { - } - - /** Destructor. */ - ~ArrayAllocationBase() noexcept - { - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - ArrayAllocationBase (ArrayAllocationBase&& other) noexcept - : elements (static_cast &&> (other.elements)), - numAllocated (other.numAllocated) - { - } - - ArrayAllocationBase& operator= (ArrayAllocationBase&& other) noexcept - { - elements = static_cast &&> (other.elements); - numAllocated = other.numAllocated; - return *this; - } - #endif - - //============================================================================== - /** Changes the amount of storage allocated. - - This will retain any data currently held in the array, and either add or - remove extra space at the end. - - @param numElements the number of elements that are needed - */ - void setAllocatedSize (const int numElements) - { - if (numAllocated != numElements) - { - if (numElements > 0) - elements.realloc ((size_t) numElements); - else - elements.free(); - - numAllocated = numElements; - } - } - - /** Increases the amount of storage allocated if it is less than a given amount. - - This will retain any data currently held in the array, but will add - extra space at the end to make sure there it's at least as big as the size - passed in. If it's already bigger, no action is taken. - - @param minNumElements the minimum number of elements that are needed - */ - void ensureAllocatedSize (const int minNumElements) - { - if (minNumElements > numAllocated) - setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7); - } - - /** Minimises the amount of storage allocated so that it's no more than - the given number of elements. - */ - void shrinkToNoMoreThan (const int maxNumElements) - { - if (maxNumElements < numAllocated) - setAllocatedSize (maxNumElements); - } - - /** Swap the contents of two objects. */ - void swapWith (ArrayAllocationBase & other) noexcept - { - elements.swapWith (other.elements); - std::swap (numAllocated, other.numAllocated); - } - - //============================================================================== - HeapBlock elements; - int numAllocated; - -private: - BEAST_DECLARE_NON_COPYABLE (ArrayAllocationBase) -}; - - -#endif // BEAST_ARRAYALLOCATIONBASE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.cpp b/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.cpp deleted file mode 100644 index 0a5e15462d..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -DynamicObject::DynamicObject() -{ -} - -DynamicObject::~DynamicObject() -{ -} - -bool DynamicObject::hasProperty (const Identifier& propertyName) const -{ - const var* const v = properties.getVarPointer (propertyName); - return v != nullptr && ! v->isMethod(); -} - -var DynamicObject::getProperty (const Identifier& propertyName) const -{ - return properties [propertyName]; -} - -void DynamicObject::setProperty (const Identifier& propertyName, const var& newValue) -{ - properties.set (propertyName, newValue); -} - -void DynamicObject::removeProperty (const Identifier& propertyName) -{ - properties.remove (propertyName); -} - -bool DynamicObject::hasMethod (const Identifier& methodName) const -{ - return getProperty (methodName).isMethod(); -} - -var DynamicObject::invokeMethod (const Identifier& methodName, - const var* parameters, - int numParameters) -{ - return properties [methodName].invokeMethod (this, parameters, numParameters); -} - -void DynamicObject::setMethod (const Identifier& name, - var::MethodFunction methodFunction) -{ - properties.set (name, var (methodFunction)); -} - -void DynamicObject::clear() -{ - properties.clear(); -} diff --git a/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.h b/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.h deleted file mode 100644 index 08ce6d21b7..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_DynamicObject.h +++ /dev/null @@ -1,121 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_DYNAMICOBJECT_BEASTHEADER -#define BEAST_DYNAMICOBJECT_BEASTHEADER - -#include "beast_NamedValueSet.h" -#include "../memory/beast_ReferenceCountedObject.h" - - -//============================================================================== -/** - Represents a dynamically implemented object. - - This class is primarily intended for wrapping scripting language objects, - but could be used for other purposes. - - An instance of a DynamicObject can be used to store named properties, and - by subclassing hasMethod() and invokeMethod(), you can give your object - methods. -*/ -class BEAST_API DynamicObject : public ReferenceCountedObject -{ -public: - //============================================================================== - DynamicObject(); - - /** Destructor. */ - virtual ~DynamicObject(); - - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== - /** Returns true if the object has a property with this name. - Note that if the property is actually a method, this will return false. - */ - virtual bool hasProperty (const Identifier& propertyName) const; - - /** Returns a named property. - This returns a void if no such property exists. - */ - virtual var getProperty (const Identifier& propertyName) const; - - /** Sets a named property. */ - virtual void setProperty (const Identifier& propertyName, const var& newValue); - - /** Removes a named property. */ - virtual void removeProperty (const Identifier& propertyName); - - //============================================================================== - /** Checks whether this object has the specified method. - - The default implementation of this just checks whether there's a property - with this name that's actually a method, but this can be overridden for - building objects with dynamic invocation. - */ - virtual bool hasMethod (const Identifier& methodName) const; - - /** Invokes a named method on this object. - - The default implementation looks up the named property, and if it's a method - call, then it invokes it. - - This method is virtual to allow more dynamic invocation to used for objects - where the methods may not already be set as properies. - */ - virtual var invokeMethod (const Identifier& methodName, - const var* parameters, - int numParameters); - - /** Sets up a method. - - This is basically the same as calling setProperty (methodName, (var::MethodFunction) myFunction), but - helps to avoid accidentally invoking the wrong type of var constructor. It also makes - the code easier to read, - - The compiler will probably force you to use an explicit cast your method to a (var::MethodFunction), e.g. - @code - setMethod ("doSomething", (var::MethodFunction) &MyClass::doSomething); - @endcode - */ - void setMethod (const Identifier& methodName, - var::MethodFunction methodFunction); - - //============================================================================== - /** Removes all properties and methods from the object. */ - void clear(); - - /** Returns the NamedValueSet that holds the object's properties. */ - NamedValueSet& getProperties() noexcept { return properties; } - -private: - //============================================================================== - NamedValueSet properties; - - BEAST_LEAK_DETECTOR (DynamicObject) -}; - - - -#endif // BEAST_DYNAMICOBJECT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_ElementComparator.h b/Subtrees/beast/modules/beast_core/containers/beast_ElementComparator.h deleted file mode 100644 index 7ad71b3ea7..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_ElementComparator.h +++ /dev/null @@ -1,274 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ELEMENTCOMPARATOR_BEASTHEADER -#define BEAST_ELEMENTCOMPARATOR_BEASTHEADER - - -//============================================================================== -/** - Sorts a range of elements in an array. - - The comparator object that is passed-in must define a public method with the following - signature: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator an object which defines a compareElements() method - @param array the array to sort - @param firstElement the index of the first element of the range to be sorted - @param lastElement the index of the last element in the range that needs - sorting (this is inclusive) - @param retainOrderOfEquivalentItems if true, the order of items that the - comparator deems the same will be maintained - this will be - a slower algorithm than if they are allowed to be moved around. - - @see sortArrayRetainingOrder -*/ -template -static void sortArray (ElementComparator& comparator, - ElementType* const array, - int firstElement, - int lastElement, - const bool retainOrderOfEquivalentItems) -{ - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - if (lastElement > firstElement) - { - if (retainOrderOfEquivalentItems) - { - for (int i = firstElement; i < lastElement; ++i) - { - if (comparator.compareElements (array[i], array [i + 1]) > 0) - { - std::swap (array[i], array[i + 1]); - - if (i > firstElement) - i -= 2; - } - } - } - else - { - int fromStack[30], toStack[30]; - int stackIndex = 0; - - for (;;) - { - const int size = (lastElement - firstElement) + 1; - - if (size <= 8) - { - int j = lastElement; - int maxIndex; - - while (j > firstElement) - { - maxIndex = firstElement; - for (int k = firstElement + 1; k <= j; ++k) - if (comparator.compareElements (array[k], array [maxIndex]) > 0) - maxIndex = k; - - std::swap (array[j], array[maxIndex]); - --j; - } - } - else - { - const int mid = firstElement + (size >> 1); - std::swap (array[mid], array[firstElement]); - - int i = firstElement; - int j = lastElement + 1; - - for (;;) - { - while (++i <= lastElement - && comparator.compareElements (array[i], array [firstElement]) <= 0) - {} - - while (--j > firstElement - && comparator.compareElements (array[j], array [firstElement]) >= 0) - {} - - if (j < i) - break; - - std::swap (array[i], array[j]); - } - - std::swap (array[j], array[firstElement]); - - if (j - 1 - firstElement >= lastElement - i) - { - if (firstElement + 1 < j) - { - fromStack [stackIndex] = firstElement; - toStack [stackIndex] = j - 1; - ++stackIndex; - } - - if (i < lastElement) - { - firstElement = i; - continue; - } - } - else - { - if (i < lastElement) - { - fromStack [stackIndex] = i; - toStack [stackIndex] = lastElement; - ++stackIndex; - } - - if (firstElement + 1 < j) - { - lastElement = j - 1; - continue; - } - } - } - - if (--stackIndex < 0) - break; - - bassert (stackIndex < numElementsInArray (fromStack)); - - firstElement = fromStack [stackIndex]; - lastElement = toStack [stackIndex]; - } - } - } -} - - -//============================================================================== -/** - Searches a sorted array of elements, looking for the index at which a specified value - should be inserted for it to be in the correct order. - - The comparator object that is passed-in must define a public method with the following - signature: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator an object which defines a compareElements() method - @param array the array to search - @param newElement the value that is going to be inserted - @param firstElement the index of the first element to search - @param lastElement the index of the last element in the range (this is non-inclusive) -*/ -template -static int findInsertIndexInSortedArray (ElementComparator& comparator, - ElementType* const array, - const ElementType newElement, - int firstElement, - int lastElement) -{ - bassert (firstElement <= lastElement); - - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - while (firstElement < lastElement) - { - if (comparator.compareElements (newElement, array [firstElement]) == 0) - { - ++firstElement; - break; - } - else - { - const int halfway = (firstElement + lastElement) >> 1; - - if (halfway == firstElement) - { - if (comparator.compareElements (newElement, array [halfway]) >= 0) - ++firstElement; - - break; - } - else if (comparator.compareElements (newElement, array [halfway]) >= 0) - { - firstElement = halfway; - } - else - { - lastElement = halfway; - } - } - } - - return firstElement; -} - -//============================================================================== -/** - A simple ElementComparator class that can be used to sort an array of - objects that support the '<' operator. - - This will work for primitive types and objects that implement operator<(). - - Example: @code - Array myArray; - DefaultElementComparator sorter; - myArray.sort (sorter); - @endcode - - @see ElementComparator -*/ -template -class DefaultElementComparator -{ -private: - typedef PARAMETER_TYPE (ElementType) ParameterType; - -public: - static int compareElements (ParameterType first, ParameterType second) - { - return (first < second) ? -1 : ((second < first) ? 1 : 0); - } -}; - - -#endif // BEAST_ELEMENTCOMPARATOR_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_HashMap.h b/Subtrees/beast/modules/beast_core/containers/beast_HashMap.h deleted file mode 100644 index d488020bcc..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_HashMap.h +++ /dev/null @@ -1,447 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_HASHMAP_BEASTHEADER -#define BEAST_HASHMAP_BEASTHEADER - -#include "beast_OwnedArray.h" -#include "beast_LinkedListPointer.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - A simple class to generate hash functions for some primitive types, intended for - use with the HashMap class. - @see HashMap -*/ -class DefaultHashFunctions -{ -public: - /** Generates a simple hash from an integer. */ - static int generateHash (const int key, const int upperLimit) noexcept { return std::abs (key) % upperLimit; } - /** Generates a simple hash from an int64. */ - static int generateHash (const int64 key, const int upperLimit) noexcept { return std::abs ((int) key) % upperLimit; } - /** Generates a simple hash from a string. */ - static int generateHash (const String& key, const int upperLimit) noexcept { return (int) (((uint32) key.hashCode()) % (uint32) upperLimit); } - /** Generates a simple hash from a variant. */ - static int generateHash (const var& key, const int upperLimit) noexcept { return generateHash (key.toString(), upperLimit); } -}; - - -//============================================================================== -/** - Holds a set of mappings between some key/value pairs. - - The types of the key and value objects are set as template parameters. - You can also specify a class to supply a hash function that converts a key value - into an hashed integer. This class must have the form: - - @code - struct MyHashGenerator - { - static int generateHash (MyKeyType key, int upperLimit) - { - // The function must return a value 0 <= x < upperLimit - return someFunctionOfMyKeyType (key) % upperLimit; - } - }; - @endcode - - Like the Array class, the key and value types are expected to be copy-by-value types, so - if you define them to be pointer types, this class won't delete the objects that they - point to. - - If you don't supply a class for the HashFunctionToUse template parameter, the - default one provides some simple mappings for strings and ints. - - @code - HashMap hash; - hash.set (1, "item1"); - hash.set (2, "item2"); - - DBG (hash [1]); // prints "item1" - DBG (hash [2]); // prints "item2" - - // This iterates the map, printing all of its key -> value pairs.. - for (HashMap::Iterator i (hash); i.next();) - DBG (i.getKey() << " -> " << i.getValue()); - @endcode - - @see CriticalSection, DefaultHashFunctions, NamedValueSet, SortedSet -*/ -template -class HashMap -{ -private: - typedef PARAMETER_TYPE (KeyType) KeyTypeParameter; - typedef PARAMETER_TYPE (ValueType) ValueTypeParameter; - -public: - //============================================================================== - /** Creates an empty hash-map. - - The numberOfSlots parameter specifies the number of hash entries the map will use. This - will be the "upperLimit" parameter that is passed to your generateHash() function. The number - of hash slots will grow automatically if necessary, or it can be remapped manually using remapTable(). - */ - explicit HashMap (const int numberOfSlots = defaultHashTableSize) - : totalNumItems (0) - { - slots.insertMultiple (0, nullptr, numberOfSlots); - } - - /** Destructor. */ - ~HashMap() - { - clear(); - } - - //============================================================================== - /** Removes all values from the map. - Note that this will clear the content, but won't affect the number of slots (see - remapTable and getNumSlots). - */ - void clear() - { - const ScopedLockType sl (getLock()); - - for (int i = slots.size(); --i >= 0;) - { - HashEntry* h = slots.getUnchecked(i); - - while (h != nullptr) - { - const ScopedPointer deleter (h); - h = h->nextEntry; - } - - slots.set (i, nullptr); - } - - totalNumItems = 0; - } - - //============================================================================== - /** Returns the current number of items in the map. */ - inline int size() const noexcept - { - return totalNumItems; - } - - /** Returns the value corresponding to a given key. - If the map doesn't contain the key, a default instance of the value type is returned. - @param keyToLookFor the key of the item being requested - */ - inline ValueType operator[] (KeyTypeParameter keyToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (const HashEntry* entry = slots.getUnchecked (generateHashFor (keyToLookFor)); entry != nullptr; entry = entry->nextEntry) - if (entry->key == keyToLookFor) - return entry->value; - - return ValueType(); - } - - //============================================================================== - /** Returns true if the map contains an item with the specied key. */ - bool contains (KeyTypeParameter keyToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (const HashEntry* entry = slots.getUnchecked (generateHashFor (keyToLookFor)); entry != nullptr; entry = entry->nextEntry) - if (entry->key == keyToLookFor) - return true; - - return false; - } - - /** Returns true if the hash contains at least one occurrence of a given value. */ - bool containsValue (ValueTypeParameter valueToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (int i = getNumSlots(); --i >= 0;) - for (const HashEntry* entry = slots.getUnchecked(i); entry != nullptr; entry = entry->nextEntry) - if (entry->value == valueToLookFor) - return true; - - return false; - } - - //============================================================================== - /** Adds or replaces an element in the hash-map. - If there's already an item with the given key, this will replace its value. Otherwise, a new item - will be added to the map. - */ - void set (KeyTypeParameter newKey, ValueTypeParameter newValue) - { - const ScopedLockType sl (getLock()); - const int hashIndex = generateHashFor (newKey); - - HashEntry* const firstEntry = slots.getUnchecked (hashIndex); - - for (HashEntry* entry = firstEntry; entry != nullptr; entry = entry->nextEntry) - { - if (entry->key == newKey) - { - entry->value = newValue; - return; - } - } - - slots.set (hashIndex, new HashEntry (newKey, newValue, firstEntry)); - ++totalNumItems; - - if (totalNumItems > (getNumSlots() * 3) / 2) - remapTable (getNumSlots() * 2); - } - - /** Removes an item with the given key. */ - void remove (KeyTypeParameter keyToRemove) - { - const ScopedLockType sl (getLock()); - const int hashIndex = generateHashFor (keyToRemove); - HashEntry* entry = slots.getUnchecked (hashIndex); - HashEntry* previous = nullptr; - - while (entry != nullptr) - { - if (entry->key == keyToRemove) - { - const ScopedPointer deleter (entry); - - entry = entry->nextEntry; - - if (previous != nullptr) - previous->nextEntry = entry; - else - slots.set (hashIndex, entry); - - --totalNumItems; - } - else - { - previous = entry; - entry = entry->nextEntry; - } - } - } - - /** Removes all items with the given value. */ - void removeValue (ValueTypeParameter valueToRemove) - { - const ScopedLockType sl (getLock()); - - for (int i = getNumSlots(); --i >= 0;) - { - HashEntry* entry = slots.getUnchecked(i); - HashEntry* previous = nullptr; - - while (entry != nullptr) - { - if (entry->value == valueToRemove) - { - const ScopedPointer deleter (entry); - - entry = entry->nextEntry; - - if (previous != nullptr) - previous->nextEntry = entry; - else - slots.set (i, entry); - - --totalNumItems; - } - else - { - previous = entry; - entry = entry->nextEntry; - } - } - } - } - - /** Remaps the hash-map to use a different number of slots for its hash function. - Each slot corresponds to a single hash-code, and each one can contain multiple items. - @see getNumSlots() - */ - void remapTable (int newNumberOfSlots) - { - HashMap newTable (newNumberOfSlots); - - for (int i = getNumSlots(); --i >= 0;) - for (const HashEntry* entry = slots.getUnchecked(i); entry != nullptr; entry = entry->nextEntry) - newTable.set (entry->key, entry->value); - - swapWith (newTable); - } - - /** Returns the number of slots which are available for hashing. - Each slot corresponds to a single hash-code, and each one can contain multiple items. - @see getNumSlots() - */ - inline int getNumSlots() const noexcept - { - return slots.size(); - } - - //============================================================================== - /** Efficiently swaps the contents of two hash-maps. */ - void swapWith (HashMap& otherHashMap) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherHashMap.getLock()); - - slots.swapWithArray (otherHashMap.slots); - std::swap (totalNumItems, otherHashMap.totalNumItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this structure. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return lock; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - -private: - //============================================================================== - class HashEntry - { - public: - HashEntry (KeyTypeParameter k, ValueTypeParameter val, HashEntry* const next) - : key (k), value (val), nextEntry (next) - {} - - const KeyType key; - ValueType value; - HashEntry* nextEntry; - - BEAST_DECLARE_NON_COPYABLE (HashEntry) - }; - -public: - //============================================================================== - /** Iterates over the items in a HashMap. - - To use it, repeatedly call next() until it returns false, e.g. - @code - HashMap myMap; - - HashMap::Iterator i (myMap); - - while (i.next()) - { - DBG (i.getKey() << " -> " << i.getValue()); - } - @endcode - - The order in which items are iterated bears no resemblence to the order in which - they were originally added! - - Obviously as soon as you call any non-const methods on the original hash-map, any - iterators that were created beforehand will cease to be valid, and should not be used. - - @see HashMap - */ - class Iterator - { - public: - //============================================================================== - Iterator (const HashMap& hashMapToIterate) - : hashMap (hashMapToIterate), entry (nullptr), index (0) - {} - - /** Moves to the next item, if one is available. - When this returns true, you can get the item's key and value using getKey() and - getValue(). If it returns false, the iteration has finished and you should stop. - */ - bool next() - { - if (entry != nullptr) - entry = entry->nextEntry; - - while (entry == nullptr) - { - if (index >= hashMap.getNumSlots()) - return false; - - entry = hashMap.slots.getUnchecked (index++); - } - - return true; - } - - /** Returns the current item's key. - This should only be called when a call to next() has just returned true. - */ - KeyType getKey() const - { - return entry != nullptr ? entry->key : KeyType(); - } - - /** Returns the current item's value. - This should only be called when a call to next() has just returned true. - */ - ValueType getValue() const - { - return entry != nullptr ? entry->value : ValueType(); - } - - private: - //============================================================================== - const HashMap& hashMap; - HashEntry* entry; - int index; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Iterator) - }; - -private: - //============================================================================== - enum { defaultHashTableSize = 101 }; - friend class Iterator; - - Array slots; - int totalNumItems; - TypeOfCriticalSectionToUse lock; - - int generateHashFor (KeyTypeParameter key) const - { - const int hash = HashFunctionToUse::generateHash (key, getNumSlots()); - bassert (isPositiveAndBelow (hash, getNumSlots())); // your hash function is generating out-of-range numbers! - return hash; - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HashMap) -}; - - -#endif // BEAST_HASHMAP_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_LinkedListPointer.h b/Subtrees/beast/modules/beast_core/containers/beast_LinkedListPointer.h deleted file mode 100644 index 4ac97c5849..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_LinkedListPointer.h +++ /dev/null @@ -1,366 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LINKEDLISTPOINTER_BEASTHEADER -#define BEAST_LINKEDLISTPOINTER_BEASTHEADER - - -//============================================================================== -/** - Helps to manipulate singly-linked lists of objects. - - For objects that are designed to contain a pointer to the subsequent item in the - list, this class contains methods to deal with the list. To use it, the ObjectType - class that it points to must contain a LinkedListPointer called nextListItem, e.g. - - @code - struct MyObject - { - int x, y, z; - - // A linkable object must contain a member with this name and type, which must be - // accessible by the LinkedListPointer class. (This doesn't mean it has to be public - - // you could make your class a friend of a LinkedListPointer instead). - LinkedListPointer nextListItem; - }; - - LinkedListPointer myList; - myList.append (new MyObject()); - myList.append (new MyObject()); - - int numItems = myList.size(); // returns 2 - MyObject* lastInList = myList.getLast(); - @endcode -*/ -template -class LinkedListPointer -{ -public: - //============================================================================== - /** Creates a null pointer to an empty list. */ - LinkedListPointer() noexcept - : item (nullptr) - { - } - - /** Creates a pointer to a list whose head is the item provided. */ - explicit LinkedListPointer (ObjectType* const headItem) noexcept - : item (headItem) - { - } - - /** Sets this pointer to point to a new list. */ - LinkedListPointer& operator= (ObjectType* const newItem) noexcept - { - item = newItem; - return *this; - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - LinkedListPointer (LinkedListPointer&& other) noexcept - : item (other.item) - { - other.item = nullptr; - } - - LinkedListPointer& operator= (LinkedListPointer&& other) noexcept - { - bassert (this != &other); // hopefully the compiler should make this situation impossible! - - item = other.item; - other.item = nullptr; - return *this; - } - #endif - - //============================================================================== - /** Returns the item which this pointer points to. */ - inline operator ObjectType*() const noexcept - { - return item; - } - - /** Returns the item which this pointer points to. */ - inline ObjectType* get() const noexcept - { - return item; - } - - /** Returns the last item in the list which this pointer points to. - This will iterate the list and return the last item found. Obviously the speed - of this operation will be proportional to the size of the list. If the list is - empty the return value will be this object. - If you're planning on appending a number of items to your list, it's much more - efficient to use the Appender class than to repeatedly call getLast() to find the end. - */ - LinkedListPointer& getLast() noexcept - { - LinkedListPointer* l = this; - - while (l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns the number of items in the list. - Obviously with a simple linked list, getting the size involves iterating the list, so - this can be a lengthy operation - be careful when using this method in your code. - */ - int size() const noexcept - { - int total = 0; - - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - ++total; - - return total; - } - - /** Returns the item at a given index in the list. - Since the only way to find an item is to iterate the list, this operation can obviously - be slow, depending on its size, so you should be careful when using this in algorithms. - */ - LinkedListPointer& operator[] (int index) noexcept - { - LinkedListPointer* l = this; - - while (--index >= 0 && l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns the item at a given index in the list. - Since the only way to find an item is to iterate the list, this operation can obviously - be slow, depending on its size, so you should be careful when using this in algorithms. - */ - const LinkedListPointer& operator[] (int index) const noexcept - { - const LinkedListPointer* l = this; - - while (--index >= 0 && l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns true if the list contains the given item. */ - bool contains (const ObjectType* const itemToLookFor) const noexcept - { - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - if (itemToLookFor == i) - return true; - - return false; - } - - //============================================================================== - /** Inserts an item into the list, placing it before the item that this pointer - currently points to. - */ - void insertNext (ObjectType* const newItem) - { - bassert (newItem != nullptr); - bassert (newItem->nextListItem == nullptr); - newItem->nextListItem = item; - item = newItem; - } - - /** Inserts an item at a numeric index in the list. - Obviously this will involve iterating the list to find the item at the given index, - so be careful about the impact this may have on execution time. - */ - void insertAtIndex (int index, ObjectType* newItem) - { - bassert (newItem != nullptr); - LinkedListPointer* l = this; - - while (index != 0 && l->item != nullptr) - { - l = &(l->item->nextListItem); - --index; - } - - l->insertNext (newItem); - } - - /** Replaces the object that this pointer points to, appending the rest of the list to - the new object, and returning the old one. - */ - ObjectType* replaceNext (ObjectType* const newItem) noexcept - { - bassert (newItem != nullptr); - bassert (newItem->nextListItem == nullptr); - - ObjectType* const oldItem = item; - item = newItem; - item->nextListItem = oldItem->nextListItem.item; - oldItem->nextListItem.item = nullptr; - return oldItem; - } - - /** Adds an item to the end of the list. - - This operation involves iterating the whole list, so can be slow - if you need to - append a number of items to your list, it's much more efficient to use the Appender - class than to repeatedly call append(). - */ - void append (ObjectType* const newItem) - { - getLast().item = newItem; - } - - /** Creates copies of all the items in another list and adds them to this one. - This will use the ObjectType's copy constructor to try to create copies of each - item in the other list, and appends them to this list. - */ - void addCopyOfList (const LinkedListPointer& other) - { - LinkedListPointer* insertPoint = this; - - for (ObjectType* i = other.item; i != nullptr; i = i->nextListItem) - { - insertPoint->insertNext (new ObjectType (*i)); - insertPoint = &(insertPoint->item->nextListItem); - } - } - - /** Removes the head item from the list. - This won't delete the object that is removed, but returns it, so the caller can - delete it if necessary. - */ - ObjectType* removeNext() noexcept - { - ObjectType* const oldItem = item; - - if (oldItem != nullptr) - { - item = oldItem->nextListItem; - oldItem->nextListItem.item = nullptr; - } - - return oldItem; - } - - /** Removes a specific item from the list. - Note that this will not delete the item, it simply unlinks it from the list. - */ - void remove (ObjectType* const itemToRemove) - { - if (LinkedListPointer* const l = findPointerTo (itemToRemove)) - l->removeNext(); - } - - /** Iterates the list, calling the delete operator on all of its elements and - leaving this pointer empty. - */ - void deleteAll() - { - while (item != nullptr) - { - ObjectType* const oldItem = item; - item = oldItem->nextListItem; - delete oldItem; - } - } - - /** Finds a pointer to a given item. - If the item is found in the list, this returns the pointer that points to it. If - the item isn't found, this returns null. - */ - LinkedListPointer* findPointerTo (ObjectType* const itemToLookFor) noexcept - { - LinkedListPointer* l = this; - - while (l->item != nullptr) - { - if (l->item == itemToLookFor) - return l; - - l = &(l->item->nextListItem); - } - - return nullptr; - } - - /** Copies the items in the list to an array. - The destArray must contain enough elements to hold the entire list - no checks are - made for this! - */ - void copyToArray (ObjectType** destArray) const noexcept - { - bassert (destArray != nullptr); - - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - *destArray++ = i; - } - - /** Swaps this pointer with another one */ - void swapWith (LinkedListPointer& other) noexcept - { - std::swap (item, other.item); - } - - //============================================================================== - /** - Allows efficient repeated insertions into a list. - - You can create an Appender object which points to the last element in your - list, and then repeatedly call Appender::append() to add items to the end - of the list in O(1) time. - */ - class Appender - { - public: - /** Creates an appender which will add items to the given list. - */ - Appender (LinkedListPointer& endOfListPointer) noexcept - : endOfList (&endOfListPointer) - { - // This can only be used to add to the end of a list. - bassert (endOfListPointer.item == nullptr); - } - - /** Appends an item to the list. */ - void append (ObjectType* const newItem) noexcept - { - *endOfList = newItem; - endOfList = &(newItem->nextListItem); - } - - private: - LinkedListPointer* endOfList; - - BEAST_DECLARE_NON_COPYABLE (Appender) - }; - -private: - //============================================================================== - ObjectType* item; - - BEAST_DECLARE_NON_COPYABLE (LinkedListPointer) -}; - - -#endif // BEAST_LINKEDLISTPOINTER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.cpp b/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.cpp deleted file mode 100644 index e092865eb4..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.cpp +++ /dev/null @@ -1,304 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -NamedValueSet::NamedValue::NamedValue() noexcept -{ -} - -inline NamedValueSet::NamedValue::NamedValue (const Identifier n, const var& v) - : name (n), value (v) -{ -} - -NamedValueSet::NamedValue::NamedValue (const NamedValue& other) - : name (other.name), value (other.value) -{ -} - -NamedValueSet::NamedValue& NamedValueSet::NamedValue::operator= (const NamedValueSet::NamedValue& other) -{ - name = other.name; - value = other.value; - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -NamedValueSet::NamedValue::NamedValue (NamedValue&& other) noexcept - : nextListItem (static_cast &&> (other.nextListItem)), - name (static_cast (other.name)), - value (static_cast (other.value)) -{ -} - -inline NamedValueSet::NamedValue::NamedValue (const Identifier n, var&& v) - : name (n), value (static_cast (v)) -{ -} - -NamedValueSet::NamedValue& NamedValueSet::NamedValue::operator= (NamedValue&& other) noexcept -{ - nextListItem = static_cast &&> (other.nextListItem); - name = static_cast (other.name); - value = static_cast (other.value); - return *this; -} -#endif - -bool NamedValueSet::NamedValue::operator== (const NamedValueSet::NamedValue& other) const noexcept -{ - return name == other.name && value == other.value; -} - -//============================================================================== -NamedValueSet::NamedValueSet() noexcept -{ -} - -NamedValueSet::NamedValueSet (const NamedValueSet& other) -{ - values.addCopyOfList (other.values); -} - -NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other) -{ - clear(); - values.addCopyOfList (other.values); - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept - : values (static_cast &&> (other.values)) -{ -} - -NamedValueSet& NamedValueSet::operator= (NamedValueSet&& other) noexcept -{ - other.values.swapWith (values); - return *this; -} -#endif - -NamedValueSet::~NamedValueSet() -{ - clear(); -} - -void NamedValueSet::clear() -{ - values.deleteAll(); -} - -bool NamedValueSet::operator== (const NamedValueSet& other) const -{ - const NamedValue* i1 = values; - const NamedValue* i2 = other.values; - - while (i1 != nullptr && i2 != nullptr) - { - if (! (*i1 == *i2)) - return false; - - i1 = i1->nextListItem; - i2 = i2->nextListItem; - } - - return true; -} - -bool NamedValueSet::operator!= (const NamedValueSet& other) const -{ - return ! operator== (other); -} - -int NamedValueSet::size() const noexcept -{ - return values.size(); -} - -const var& NamedValueSet::operator[] (const Identifier name) const -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - if (i->name == name) - return i->value; - - return var::null; -} - -var NamedValueSet::getWithDefault (const Identifier name, const var& defaultReturnValue) const -{ - if (const var* const v = getVarPointer (name)) - return *v; - - return defaultReturnValue; -} - -var* NamedValueSet::getVarPointer (const Identifier name) const noexcept -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - if (i->name == name) - return &(i->value); - - return nullptr; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -bool NamedValueSet::set (const Identifier name, var&& newValue) -{ - LinkedListPointer* i = &values; - - while (i->get() != nullptr) - { - NamedValue* const v = i->get(); - - if (v->name == name) - { - if (v->value.equalsWithSameType (newValue)) - return false; - - v->value = static_cast (newValue); - return true; - } - - i = &(v->nextListItem); - } - - i->insertNext (new NamedValue (name, static_cast (newValue))); - return true; -} -#endif - -bool NamedValueSet::set (const Identifier name, const var& newValue) -{ - LinkedListPointer* i = &values; - - while (i->get() != nullptr) - { - NamedValue* const v = i->get(); - - if (v->name == name) - { - if (v->value.equalsWithSameType (newValue)) - return false; - - v->value = newValue; - return true; - } - - i = &(v->nextListItem); - } - - i->insertNext (new NamedValue (name, newValue)); - return true; -} - -bool NamedValueSet::contains (const Identifier name) const -{ - return getVarPointer (name) != nullptr; -} - -bool NamedValueSet::remove (const Identifier name) -{ - LinkedListPointer* i = &values; - - for (;;) - { - NamedValue* const v = i->get(); - - if (v == nullptr) - break; - - if (v->name == name) - { - delete i->removeNext(); - return true; - } - - i = &(v->nextListItem); - } - - return false; -} - -const Identifier NamedValueSet::getName (const int index) const -{ - const NamedValue* const v = values[index]; - bassert (v != nullptr); - return v->name; -} - -const var& NamedValueSet::getValueAt (const int index) const -{ - const NamedValue* const v = values[index]; - bassert (v != nullptr); - return v->value; -} - -void NamedValueSet::setFromXmlAttributes (const XmlElement& xml) -{ - clear(); - LinkedListPointer::Appender appender (values); - - const int numAtts = xml.getNumAttributes(); // xxx inefficient - should write an att iterator.. - - for (int i = 0; i < numAtts; ++i) - { - const String& name = xml.getAttributeName (i); - const String& value = xml.getAttributeValue (i); - - if (name.startsWith ("base64:")) - { - MemoryBlock mb; - - if (mb.fromBase64Encoding (value)) - { - appender.append (new NamedValue (name.substring (7), var (mb))); - continue; - } - } - - appender.append (new NamedValue (name, var (value))); - } -} - -void NamedValueSet::copyToXmlAttributes (XmlElement& xml) const -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - { - if (const MemoryBlock* mb = i->value.getBinaryData()) - { - xml.setAttribute ("base64:" + i->name.toString(), - mb->toBase64Encoding()); - } - else - { - // These types can't be stored as XML! - bassert (! i->value.isObject()); - bassert (! i->value.isMethod()); - bassert (! i->value.isArray()); - - xml.setAttribute (i->name.toString(), - i->value.toString()); - } - } -} diff --git a/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.h b/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.h deleted file mode 100644 index 1c2d08d93b..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_NamedValueSet.h +++ /dev/null @@ -1,164 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_NAMEDVALUESET_BEASTHEADER -#define BEAST_NAMEDVALUESET_BEASTHEADER - -#include "beast_Variant.h" -#include "../containers/beast_LinkedListPointer.h" -class XmlElement; -#ifndef DOXYGEN - class JSONFormatter; -#endif - - -//============================================================================== -/** Holds a set of named var objects. - - This can be used as a basic structure to hold a set of var object, which can - be retrieved by using their identifier. -*/ -class BEAST_API NamedValueSet -{ -public: - /** Creates an empty set. */ - NamedValueSet() noexcept; - - /** Creates a copy of another set. */ - NamedValueSet (const NamedValueSet& other); - - /** Replaces this set with a copy of another set. */ - NamedValueSet& operator= (const NamedValueSet& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValueSet (NamedValueSet&& other) noexcept; - NamedValueSet& operator= (NamedValueSet&& other) noexcept; - #endif - - /** Destructor. */ - ~NamedValueSet(); - - bool operator== (const NamedValueSet& other) const; - bool operator!= (const NamedValueSet& other) const; - - //============================================================================== - /** Returns the total number of values that the set contains. */ - int size() const noexcept; - - /** Returns the value of a named item. - If the name isn't found, this will return a void variant. - @see getProperty - */ - const var& operator[] (const Identifier name) const; - - /** Tries to return the named value, but if no such value is found, this will - instead return the supplied default value. - */ - var getWithDefault (const Identifier name, const var& defaultReturnValue) const; - - /** Changes or adds a named value. - @returns true if a value was changed or added; false if the - value was already set the the value passed-in. - */ - bool set (const Identifier name, const var& newValue); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Changes or adds a named value. - @returns true if a value was changed or added; false if the - value was already set the the value passed-in. - */ - bool set (const Identifier name, var&& newValue); - #endif - - /** Returns true if the set contains an item with the specified name. */ - bool contains (const Identifier name) const; - - /** Removes a value from the set. - @returns true if a value was removed; false if there was no value - with the name that was given. - */ - bool remove (const Identifier name); - - /** Returns the name of the value at a given index. - The index must be between 0 and size() - 1. - */ - const Identifier getName (int index) const; - - /** Returns the value of the item at a given index. - The index must be between 0 and size() - 1. - */ - const var& getValueAt (int index) const; - - /** Removes all values. */ - void clear(); - - //============================================================================== - /** Returns a pointer to the var that holds a named value, or null if there is - no value with this name. - - Do not use this method unless you really need access to the internal var object - for some reason - for normal reading and writing always prefer operator[]() and set(). - */ - var* getVarPointer (const Identifier name) const noexcept; - - //============================================================================== - /** Sets properties to the values of all of an XML element's attributes. */ - void setFromXmlAttributes (const XmlElement& xml); - - /** Sets attributes in an XML element corresponding to each of this object's - properties. - */ - void copyToXmlAttributes (XmlElement& xml) const; - -private: - //============================================================================== - class NamedValue - { - public: - NamedValue() noexcept; - NamedValue (const NamedValue&); - NamedValue (const Identifier name, const var& value); - NamedValue& operator= (const NamedValue&); - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValue (NamedValue&&) noexcept; - NamedValue (const Identifier name, var&& value); - NamedValue& operator= (NamedValue&&) noexcept; - #endif - bool operator== (const NamedValue& other) const noexcept; - - LinkedListPointer nextListItem; - Identifier name; - var value; - - private: - BEAST_LEAK_DETECTOR (NamedValue) - }; - - friend class LinkedListPointer; - LinkedListPointer values; - - friend class JSONFormatter; -}; - - -#endif // BEAST_NAMEDVALUESET_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h b/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h deleted file mode 100644 index e4a13429ff..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_OwnedArray.h +++ /dev/null @@ -1,865 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_OWNEDARRAY_BEASTHEADER -#define BEAST_OWNEDARRAY_BEASTHEADER - -#include "beast_ArrayAllocationBase.h" -#include "beast_ElementComparator.h" -#include "../threads/beast_CriticalSection.h" - - -//============================================================================== -/** An array designed for holding objects. - - This holds a list of pointers to objects, and will automatically - delete the objects when they are removed from the array, or when the - array is itself deleted. - - Declare it in the form: OwnedArray - - ..and then add new objects, e.g. myOwnedArray.add (new MyObjectClass()); - - After adding objects, they are 'owned' by the array and will be deleted when - removed or replaced. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, ReferenceCountedArray, StringArray, CriticalSection -*/ -template - -class OwnedArray -{ -public: - //============================================================================== - /** Creates an empty array. */ - OwnedArray() noexcept - : numUsed (0) - { - } - - /** Deletes the array and also deletes any objects inside it. - - To get rid of the array without deleting its objects, use its - clear (false) method before deleting it. - */ - ~OwnedArray() - { - deleteAllObjects(); - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - OwnedArray (OwnedArray&& other) noexcept - : data (static_cast &&> (other.data)), - numUsed (other.numUsed) - { - other.numUsed = 0; - } - - OwnedArray& operator= (OwnedArray&& other) noexcept - { - const ScopedLockType lock (getLock()); - deleteAllObjects(); - - data = static_cast &&> (other.data); - numUsed = other.numUsed; - other.numUsed = 0; - return *this; - } - #endif - - //============================================================================== - /** Clears the array, optionally deleting the objects inside it first. */ - void clear (const bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - - if (deleteObjects) - deleteAllObjects(); - - data.setAllocatedSize (0); - numUsed = 0; - } - - //============================================================================== - /** Returns the number of items currently in the array. - @see operator[] - */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns a pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClass* operator[] (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : static_cast (nullptr); - } - - /** Returns a pointer to the object at this index in the array, without checking whether the index is in-range. - - This is a faster and less safe version of operator[] which doesn't check the index passed in, so - it can be used when you're sure the index is always going to be legal. - */ - inline ObjectClass* getUnchecked (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - bassert (isPositiveAndBelow (index, numUsed)); - return data.elements [index]; - } - - /** Returns a pointer to the first object in the array. - - This will return a null pointer if the array's empty. - @see getLast - */ - inline ObjectClass* getFirst() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [0] - : static_cast (nullptr); - } - - /** Returns a pointer to the last object in the array. - - This will return a null pointer if the array's empty. - @see getFirst - */ - inline ObjectClass* getLast() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [numUsed - 1] - : static_cast (nullptr); - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ObjectClass** getRawDataPointer() noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** end() const noexcept - { - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of an object which might be in the array. - - @param objectToLookFor the object to look for - @returns the index at which the object was found, or -1 if it's not found - */ - int indexOf (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass* const* e = data.elements.getData(); - ObjectClass* const* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (objectToLookFor == *e) - return static_cast (e - data.elements.getData()); - - return -1; - } - - /** Returns true if the array contains a specified object. - - @param objectToLookFor the object to look for - @returns true if the object is in the array - */ - bool contains (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass* const* e = data.elements.getData(); - ObjectClass* const* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (objectToLookFor == *e) - return true; - - return false; - } - - //============================================================================== - /** Appends a new object to the end of the array. - - Note that the this object will be deleted by the OwnedArray when it - is removed, so be careful not to delete it somewhere else. - - Also be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param newObject the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted - */ - void add (const ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = const_cast (newObject); - } - - /** Inserts a new object into the array at the given index. - - Note that the this object will be deleted by the OwnedArray when it - is removed, so be careful not to delete it somewhere else. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - Be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param indexToInsertAt the index at which the new element should be inserted - @param newObject the new object to add to the array - @see add, addSorted, addIfNotAlreadyThere, set - */ - void insert (int indexToInsertAt, - const ObjectClass* const newObject) noexcept - { - if (indexToInsertAt >= 0) - { - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - - ObjectClass** const e = data.elements + indexToInsertAt; - const int numToMove = numUsed - indexToInsertAt; - - if (numToMove > 0) - memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove); - - *e = const_cast (newObject); - ++numUsed; - } - else - { - add (newObject); - } - } - - /** Inserts an array of values into this array at a given position. - - If the index is less than 0 or greater than the size of the array, the - new elements will be added to the end of the array. - Otherwise, they will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the first new element should be inserted - @param newObjects the new values to add to the array - @param numberOfElements how many items are in the array - @see insert, add, addSorted, set - */ - void insertArray (int indexToInsertAt, - ObjectClass* const* newObjects, - int numberOfElements) - { - if (numberOfElements > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfElements); - ObjectClass** insertPos = data.elements; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos += indexToInsertAt; - const size_t numberToMove = (size_t) (numUsed - indexToInsertAt); - memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ObjectClass*)); - } - else - { - insertPos += numUsed; - } - - numUsed += numberOfElements; - - while (--numberOfElements >= 0) - *insertPos++ = *newObjects++; - } - } - - /** Appends a new object at the end of the array as long as the array doesn't - already contain it. - - If the array already contains a matching object, nothing will be done. - - @param newObject the new object to add to the array - */ - void addIfNotAlreadyThere (const ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - - if (! contains (newObject)) - add (newObject); - } - - /** Replaces an object in the array with a different one. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the new object is added to the end of the array. - - Be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param indexToChange the index whose value you want to change - @param newObject the new value to set for this index. - @param deleteOldElement whether to delete the object that's being replaced with the new one - @see add, insert, remove - */ - void set (const int indexToChange, - const ObjectClass* const newObject, - const bool deleteOldElement = true) - { - if (indexToChange >= 0) - { - ObjectClass* toDelete = nullptr; - - { - const ScopedLockType lock (getLock()); - - if (indexToChange < numUsed) - { - if (deleteOldElement) - { - toDelete = data.elements [indexToChange]; - - if (toDelete == newObject) - toDelete = nullptr; - } - - data.elements [indexToChange] = const_cast (newObject); - } - else - { - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = const_cast (newObject); - } - } - - delete toDelete; // don't want to use a ScopedPointer here because if the - // object has a private destructor, both OwnedArray and - // ScopedPointer would need to be friend classes.. - } - else - { - bassertfalse; // you're trying to set an object at a negative index, which doesn't have - // any effect - but since the object is not being added, it may be leaking.. - } - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addArray (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - { - data.elements [numUsed] = arrayToAddFrom.getUnchecked (startIndex++); - ++numUsed; - } - } - - /** Adds copies of the elements in another array to the end of this array. - - The other array must be either an OwnedArray of a compatible type of object, or an Array - containing pointers to the same kind of object. The objects involved must provide - a copy constructor, and this will be used to create new copies of each element, and - add them to this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addCopiesOf (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - { - data.elements [numUsed] = new ObjectClass (*arrayToAddFrom.getUnchecked (startIndex++)); - ++numUsed; - } - } - - /** Inserts a new object into the array assuming that the array is sorted. - - This will use a comparator to find the position at which the new object - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort method - for details about this object's structure - @param newObject the new object to insert to the array - @returns the index at which the new object was added - @see add, sort, indexOfSorted - */ - template - int addSorted (ElementComparator& comparator, ObjectClass* const newObject) noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - insert (index, newObject); - return index; - } - - /** Finds the index of an object in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param objectToLookFor the object to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, const ObjectClass* const objectToLookFor) const noexcept - { - (void) comparator; - const ScopedLockType lock (getLock()); - int s = 0, e = numUsed; - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } - - //============================================================================== - /** Removes an object from the array. - - This will remove the object at a given index (optionally also - deleting it) and move back all the subsequent objects to close the gap. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @param deleteObject whether to delete the object that is removed - @see removeObject, removeRange - */ - void remove (const int indexToRemove, - const bool deleteObject = true) - { - ObjectClass* toDelete = nullptr; - - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (deleteObject) - toDelete = *e; - - --numUsed; - const int numToShift = numUsed - indexToRemove; - - if (numToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift); - } - } - - delete toDelete; // don't want to use a ScopedPointer here because if the - // object has a private destructor, both OwnedArray and - // ScopedPointer would need to be friend classes.. - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - /** Removes and returns an object from the array without deleting it. - - This will remove the object at a given index and return it, moving back all - the subsequent objects to close the gap. If the index passed in is out-of-range, - nothing will happen. - - @param indexToRemove the index of the element to remove - @see remove, removeObject, removeRange - */ - ObjectClass* removeAndReturn (const int indexToRemove) - { - ObjectClass* removedItem = nullptr; - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - removedItem = *e; - - --numUsed; - const int numToShift = numUsed - indexToRemove; - - if (numToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - return removedItem; - } - - /** Removes a specified object from the array. - - If the item isn't found, no action is taken. - - @param objectToRemove the object to try to remove - @param deleteObject whether to delete the object (if it's found) - @see remove, removeRange - */ - void removeObject (const ObjectClass* const objectToRemove, - const bool deleteObject = true) - { - const ScopedLockType lock (getLock()); - ObjectClass** const e = data.elements.getData(); - - for (int i = 0; i < numUsed; ++i) - { - if (objectToRemove == e[i]) - { - remove (i, deleteObject); - break; - } - } - } - - /** Removes a range of objects from the array. - - This will remove a set of objects, starting from the given index, - and move any subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first object to remove - @param numberToRemove how many objects should be removed - @param deleteObjects whether to delete the objects that get removed - @see remove, removeObject - */ - void removeRange (int startIndex, - const int numberToRemove, - const bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - const int endIndex = blimit (0, numUsed, startIndex + numberToRemove); - startIndex = blimit (0, numUsed, startIndex); - - if (endIndex > startIndex) - { - if (deleteObjects) - { - for (int i = startIndex; i < endIndex; ++i) - { - delete data.elements [i]; - data.elements [i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) - } - } - - const int rangeSize = endIndex - startIndex; - ObjectClass** e = data.elements + startIndex; - int numToShift = numUsed - endIndex; - numUsed -= rangeSize; - - while (--numToShift >= 0) - { - *e = e [rangeSize]; - ++e; - } - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes the last n objects from the array. - - @param howManyToRemove how many objects to remove from the end of the array - @param deleteObjects whether to also delete the objects that are removed - @see remove, removeObject, removeRange - */ - void removeLast (int howManyToRemove = 1, - const bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove >= numUsed) - clear (deleteObjects); - else - removeRange (numUsed - howManyToRemove, howManyToRemove, deleteObjects); - } - - /** Swaps a pair of objects in the array. - - If either of the indexes passed in is out-of-range, nothing will happen, - otherwise the two objects at these positions will be exchanged. - */ - void swap (const int index1, - const int index2) noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the objects to a different position. - - This will move the object to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the object to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this object to end up. If this - is less than zero, it will be moved to the end of the array - */ - void move (const int currentIndex, - int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - ObjectClass* const value = data.elements [currentIndex]; - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex)); - } - - data.elements [newIndex] = value; - } - } - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - void swapWithArray (OwnedArray& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherArray.getLock()); - - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - @see sortArray, indexOfSorted - */ - template - void sort (ElementComparator& comparator, - const bool retainOrderOfEquivalentItems = false) const noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - void deleteAllObjects() - { - while (numUsed > 0) - delete data.elements [--numUsed]; - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray) -}; - - -#endif // BEAST_OWNEDARRAY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.cpp b/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.cpp deleted file mode 100644 index cf2ff79df2..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.cpp +++ /dev/null @@ -1,218 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -PropertySet::PropertySet (const bool ignoreCaseOfKeyNames) - : properties (ignoreCaseOfKeyNames), - fallbackProperties (nullptr), - ignoreCaseOfKeys (ignoreCaseOfKeyNames) -{ -} - -PropertySet::PropertySet (const PropertySet& other) - : properties (other.properties), - fallbackProperties (other.fallbackProperties), - ignoreCaseOfKeys (other.ignoreCaseOfKeys) -{ -} - -PropertySet& PropertySet::operator= (const PropertySet& other) -{ - properties = other.properties; - fallbackProperties = other.fallbackProperties; - ignoreCaseOfKeys = other.ignoreCaseOfKeys; - - propertyChanged(); - return *this; -} - -PropertySet::~PropertySet() -{ -} - -void PropertySet::clear() -{ - const ScopedLock sl (lock); - - if (properties.size() > 0) - { - properties.clear(); - propertyChanged(); - } -} - -String PropertySet::getValue (const String& keyName, - const String& defaultValue) const noexcept -{ - const ScopedLock sl (lock); - - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index]; - - return fallbackProperties != nullptr ? fallbackProperties->getValue (keyName, defaultValue) - : defaultValue; -} - -int PropertySet::getIntValue (const String& keyName, - const int defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index].getIntValue(); - - return fallbackProperties != nullptr ? fallbackProperties->getIntValue (keyName, defaultValue) - : defaultValue; -} - -double PropertySet::getDoubleValue (const String& keyName, - const double defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues()[index].getDoubleValue(); - - return fallbackProperties != nullptr ? fallbackProperties->getDoubleValue (keyName, defaultValue) - : defaultValue; -} - -bool PropertySet::getBoolValue (const String& keyName, - const bool defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index].getIntValue() != 0; - - return fallbackProperties != nullptr ? fallbackProperties->getBoolValue (keyName, defaultValue) - : defaultValue; -} - -XmlElement* PropertySet::getXmlValue (const String& keyName) const -{ - return XmlDocument::parse (getValue (keyName)); -} - -void PropertySet::setValue (const String& keyName, const var& v) -{ - bassert (keyName.isNotEmpty()); // shouldn't use an empty key name! - - if (keyName.isNotEmpty()) - { - const String value (v.toString()); - const ScopedLock sl (lock); - - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index < 0 || properties.getAllValues() [index] != value) - { - properties.set (keyName, value); - propertyChanged(); - } - } -} - -void PropertySet::removeValue (const String& keyName) -{ - if (keyName.isNotEmpty()) - { - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - { - properties.remove (keyName); - propertyChanged(); - } - } -} - -void PropertySet::setValue (const String& keyName, const XmlElement* const xml) -{ - setValue (keyName, xml == nullptr ? var::null - : var (xml->createDocument (String::empty, true))); -} - -bool PropertySet::containsKey (const String& keyName) const noexcept -{ - const ScopedLock sl (lock); - return properties.getAllKeys().contains (keyName, ignoreCaseOfKeys); -} - -void PropertySet::addAllPropertiesFrom (const PropertySet& source) -{ - const ScopedLock sl (source.getLock()); - - for (int i = 0; i < source.properties.size(); ++i) - setValue (source.properties.getAllKeys() [i], - source.properties.getAllValues() [i]); -} - -void PropertySet::setFallbackPropertySet (PropertySet* fallbackProperties_) noexcept -{ - const ScopedLock sl (lock); - fallbackProperties = fallbackProperties_; -} - -XmlElement* PropertySet::createXml (const String& nodeName) const -{ - const ScopedLock sl (lock); - XmlElement* const xml = new XmlElement (nodeName); - - for (int i = 0; i < properties.getAllKeys().size(); ++i) - { - XmlElement* const e = xml->createNewChildElement ("VALUE"); - e->setAttribute ("name", properties.getAllKeys()[i]); - e->setAttribute ("val", properties.getAllValues()[i]); - } - - return xml; -} - -void PropertySet::restoreFromXml (const XmlElement& xml) -{ - const ScopedLock sl (lock); - clear(); - - forEachXmlChildElementWithTagName (xml, e, "VALUE") - { - if (e->hasAttribute ("name") - && e->hasAttribute ("val")) - { - properties.set (e->getStringAttribute ("name"), - e->getStringAttribute ("val")); - } - } - - if (properties.size() > 0) - propertyChanged(); -} - -void PropertySet::propertyChanged() -{ -} diff --git a/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.h b/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.h deleted file mode 100644 index f6513acc35..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_PropertySet.h +++ /dev/null @@ -1,214 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PROPERTYSET_BEASTHEADER -#define BEAST_PROPERTYSET_BEASTHEADER - -#include "../text/beast_StringPairArray.h" -#include "../xml/beast_XmlElement.h" -#include "../containers/beast_Variant.h" - - -//============================================================================== -/** - A set of named property values, which can be strings, integers, floating point, etc. - - Effectively, this just wraps a StringPairArray in an interface that makes it easier - to load and save types other than strings. - - See the PropertiesFile class for a subclass of this, which automatically broadcasts change - messages and saves/loads the list from a file. -*/ -class BEAST_API PropertySet -{ -public: - //============================================================================== - /** Creates an empty PropertySet. - @param ignoreCaseOfKeyNames if true, the names of properties are compared in a - case-insensitive way - */ - PropertySet (bool ignoreCaseOfKeyNames = false); - - /** Creates a copy of another PropertySet. */ - PropertySet (const PropertySet& other); - - /** Copies another PropertySet over this one. */ - PropertySet& operator= (const PropertySet& other); - - /** Destructor. */ - virtual ~PropertySet(); - - //============================================================================== - /** Returns one of the properties as a string. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - String getValue (const String& keyName, - const String& defaultReturnValue = String::empty) const noexcept; - - /** Returns one of the properties as an integer. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - int getIntValue (const String& keyName, - const int defaultReturnValue = 0) const noexcept; - - /** Returns one of the properties as an double. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - double getDoubleValue (const String& keyName, - const double defaultReturnValue = 0.0) const noexcept; - - /** Returns one of the properties as an boolean. - - The result will be true if the string found for this key name can be parsed as a non-zero - integer. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - bool getBoolValue (const String& keyName, - const bool defaultReturnValue = false) const noexcept; - - /** Returns one of the properties as an XML element. - - The result will a new XMLElement object that the caller must delete. If may return 0 if the - key isn't found, or if the entry contains an string that isn't valid XML. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - */ - XmlElement* getXmlValue (const String& keyName) const; - - //============================================================================== - /** Sets a named property. - - @param keyName the name of the property to set. (This mustn't be an empty string) - @param value the new value to set it to - */ - void setValue (const String& keyName, const var& value); - - /** Sets a named property to an XML element. - - @param keyName the name of the property to set. (This mustn't be an empty string) - @param xml the new element to set it to. If this is zero, the value will be set to - an empty string - @see getXmlValue - */ - void setValue (const String& keyName, const XmlElement* xml); - - /** This copies all the values from a source PropertySet to this one. - This won't remove any existing settings, it just adds any that it finds in the source set. - */ - void addAllPropertiesFrom (const PropertySet& source); - - //============================================================================== - /** Deletes a property. - @param keyName the name of the property to delete. (This mustn't be an empty string) - */ - void removeValue (const String& keyName); - - /** Returns true if the properies include the given key. */ - bool containsKey (const String& keyName) const noexcept; - - /** Removes all values. */ - void clear(); - - //============================================================================== - /** Returns the keys/value pair array containing all the properties. */ - StringPairArray& getAllProperties() noexcept { return properties; } - - /** Returns the lock used when reading or writing to this set */ - const CriticalSection& getLock() const noexcept { return lock; } - - //============================================================================== - /** Returns an XML element which encapsulates all the items in this property set. - The string parameter is the tag name that should be used for the node. - @see restoreFromXml - */ - XmlElement* createXml (const String& nodeName) const; - - /** Reloads a set of properties that were previously stored as XML. - The node passed in must have been created by the createXml() method. - @see createXml - */ - void restoreFromXml (const XmlElement& xml); - - //============================================================================== - /** Sets up a second PopertySet that will be used to look up any values that aren't - set in this one. - - If you set this up to be a pointer to a second property set, then whenever one - of the getValue() methods fails to find an entry in this set, it will look up that - value in the fallback set, and if it finds it, it will return that. - - Make sure that you don't delete the fallback set while it's still being used by - another set! To remove the fallback set, just call this method with a null pointer. - - @see getFallbackPropertySet - */ - void setFallbackPropertySet (PropertySet* fallbackProperties) noexcept; - - /** Returns the fallback property set. - @see setFallbackPropertySet - */ - PropertySet* getFallbackPropertySet() const noexcept { return fallbackProperties; } - -protected: - /** Subclasses can override this to be told when one of the properies has been changed. */ - virtual void propertyChanged(); - -private: - StringPairArray properties; - PropertySet* fallbackProperties; - CriticalSection lock; - bool ignoreCaseOfKeys; - - BEAST_LEAK_DETECTOR (PropertySet) -}; - - -#endif // BEAST_PROPERTYSET_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_ReferenceCountedArray.h b/Subtrees/beast/modules/beast_core/containers/beast_ReferenceCountedArray.h deleted file mode 100644 index 9010b78fa8..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_ReferenceCountedArray.h +++ /dev/null @@ -1,855 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_REFERENCECOUNTEDARRAY_BEASTHEADER -#define BEAST_REFERENCECOUNTEDARRAY_BEASTHEADER - -#include "../memory/beast_ReferenceCountedObject.h" -#include "beast_ArrayAllocationBase.h" -#include "beast_ElementComparator.h" -#include "../threads/beast_CriticalSection.h" - - -//============================================================================== -/** - Holds a list of objects derived from ReferenceCountedObject. - - A ReferenceCountedArray holds objects derived from ReferenceCountedObject, - and takes care of incrementing and decrementing their ref counts when they - are added and removed from the array. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, OwnedArray, StringArray -*/ -template -class ReferenceCountedArray -{ -public: - typedef ReferenceCountedObjectPtr ObjectClassPtr; - - //============================================================================== - /** Creates an empty array. - @see ReferenceCountedObject, Array, OwnedArray - */ - ReferenceCountedArray() noexcept - : numUsed (0) - { - } - - /** Creates a copy of another array */ - ReferenceCountedArray (const ReferenceCountedArray& other) noexcept - { - const ScopedLockType lock (other.getLock()); - numUsed = other.size(); - data.setAllocatedSize (numUsed); - memcpy (data.elements, other.getRawDataPointer(), numUsed * sizeof (ObjectClass*)); - - for (int i = numUsed; --i >= 0;) - if (ObjectClass* o = data.elements[i]) - o->incReferenceCount(); - } - - /** Creates a copy of another array */ - template - ReferenceCountedArray (const ReferenceCountedArray& other) noexcept - { - const typename ReferenceCountedArray::ScopedLockType lock (other.getLock()); - numUsed = other.size(); - data.setAllocatedSize (numUsed); - memcpy (data.elements, other.getRawDataPointer(), numUsed * sizeof (ObjectClass*)); - - for (int i = numUsed; --i >= 0;) - if (ObjectClass* o = data.elements[i]) - o->incReferenceCount(); - } - - /** Copies another array into this one. - Any existing objects in this array will first be released. - */ - ReferenceCountedArray& operator= (const ReferenceCountedArray& other) noexcept - { - ReferenceCountedArray otherCopy (other); - swapWithArray (otherCopy); - return *this; - } - - /** Copies another array into this one. - Any existing objects in this array will first be released. - */ - template - ReferenceCountedArray& operator= (const ReferenceCountedArray& other) noexcept - { - ReferenceCountedArray otherCopy (other); - swapWithArray (otherCopy); - return *this; - } - - /** Destructor. - Any objects in the array will be released, and may be deleted if not referenced from elsewhere. - */ - ~ReferenceCountedArray() - { - clear(); - } - - //============================================================================== - /** Removes all objects from the array. - - Any objects in the array that are not referenced from elsewhere will be deleted. - */ - void clear() - { - const ScopedLockType lock (getLock()); - - while (numUsed > 0) - if (ObjectClass* o = data.elements [--numUsed]) - o->decReferenceCount(); - - bassert (numUsed == 0); - data.setAllocatedSize (0); - } - - /** Returns the current number of objects in the array. */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns a pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClassPtr operator[] (const int index) const noexcept - { - return getObjectPointer (index); - } - - /** Returns a pointer to the object at this index in the array, without checking - whether the index is in-range. - - This is a faster and less safe version of operator[] which doesn't check the index passed in, so - it can be used when you're sure the index is always going to be legal. - */ - inline ObjectClassPtr getUnchecked (const int index) const noexcept - { - return getObjectPointerUnchecked (index); - } - - /** Returns a raw pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClass* getObjectPointer (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : nullptr; - } - - /** Returns a raw pointer to the object at this index in the array, without checking - whether the index is in-range. - */ - inline ObjectClass* getObjectPointerUnchecked (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - bassert (isPositiveAndBelow (index, numUsed)); - return data.elements [index]; - } - - /** Returns a pointer to the first object in the array. - - This will return a null pointer if the array's empty. - @see getLast - */ - inline ObjectClassPtr getFirst() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [0] - : static_cast (nullptr); - } - - /** Returns a pointer to the last object in the array. - - This will return a null pointer if the array's empty. - @see getFirst - */ - inline ObjectClassPtr getLast() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [numUsed - 1] - : static_cast (nullptr); - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ObjectClass** getRawDataPointer() const noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** end() const noexcept - { - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of the first occurrence of an object in the array. - - @param objectToLookFor the object to look for - @returns the index at which the object was found, or -1 if it's not found - */ - int indexOf (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass** e = data.elements.getData(); - ObjectClass** const endPointer = e + numUsed; - - while (e != endPointer) - { - if (objectToLookFor == *e) - return static_cast (e - data.elements.getData()); - - ++e; - } - - return -1; - } - - /** Returns true if the array contains a specified object. - - @param objectToLookFor the object to look for - @returns true if the object is in the array - */ - bool contains (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass** e = data.elements.getData(); - ObjectClass** const endPointer = e + numUsed; - - while (e != endPointer) - { - if (objectToLookFor == *e) - return true; - - ++e; - } - - return false; - } - - /** Appends a new object to the end of the array. - - This will increase the new object's reference count. - - @param newObject the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted, addArray - */ - void add (ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = newObject; - - if (newObject != nullptr) - newObject->incReferenceCount(); - } - - /** Inserts a new object into the array at the given index. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - This will increase the new object's reference count. - - @param indexToInsertAt the index at which the new element should be inserted - @param newObject the new object to add to the array - @see add, addSorted, addIfNotAlreadyThere, set - */ - void insert (int indexToInsertAt, - ObjectClass* const newObject) noexcept - { - if (indexToInsertAt >= 0) - { - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - - ObjectClass** const e = data.elements + indexToInsertAt; - const int numToMove = numUsed - indexToInsertAt; - - if (numToMove > 0) - memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove); - - *e = newObject; - - if (newObject != nullptr) - newObject->incReferenceCount(); - - ++numUsed; - } - else - { - add (newObject); - } - } - - /** Appends a new object at the end of the array as long as the array doesn't - already contain it. - - If the array already contains a matching object, nothing will be done. - - @param newObject the new object to add to the array - */ - void addIfNotAlreadyThere (ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - if (! contains (newObject)) - add (newObject); - } - - /** Replaces an object in the array with a different one. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the new object is added to the end of the array. - - The object being added has its reference count increased, and if it's replacing - another object, then that one has its reference count decreased, and may be deleted. - - @param indexToChange the index whose value you want to change - @param newObject the new value to set for this index. - @see add, insert, remove - */ - void set (const int indexToChange, - ObjectClass* const newObject) - { - if (indexToChange >= 0) - { - const ScopedLockType lock (getLock()); - - if (newObject != nullptr) - newObject->incReferenceCount(); - - if (indexToChange < numUsed) - { - if (ObjectClass* o = data.elements [indexToChange]) - o->decReferenceCount(); - - data.elements [indexToChange] = newObject; - } - else - { - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = newObject; - } - } - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - void addArray (const ReferenceCountedArray& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) noexcept - { - const ScopedLockType lock1 (arrayToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - if (numElementsToAdd > 0) - { - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - add (arrayToAddFrom.getUnchecked (startIndex++)); - } - } - } - - /** Inserts a new object into the array assuming that the array is sorted. - - This will use a comparator to find the position at which the new object - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator object to use to compare the elements - see the - sort() method for details about this object's form - @param newObject the new object to insert to the array - @returns the index at which the new object was added - @see add, sort - */ - template - int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - insert (index, newObject); - return index; - } - - /** Inserts or replaces an object in the array, assuming it is sorted. - - This is similar to addSorted, but if a matching element already exists, then it will be - replaced by the new one, rather than the new one being added as well. - */ - template - void addOrReplaceSorted (ElementComparator& comparator, - ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - - if (index > 0 && comparator.compareElements (newObject, data.elements [index - 1]) == 0) - set (index - 1, newObject); // replace an existing object that matches - else - insert (index, newObject); // no match, so insert the new one - } - - /** Finds the index of an object in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param objectToLookFor the object to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, - const ObjectClass* const objectToLookFor) const noexcept - { - (void) comparator; - const ScopedLockType lock (getLock()); - int s = 0, e = numUsed; - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } - - //============================================================================== - /** Removes an object from the array. - - This will remove the object at a given index and move back all the - subsequent objects to close the gap. - - If the index passed in is out-of-range, nothing will happen. - - The object that is removed will have its reference count decreased, - and may be deleted if not referenced from elsewhere. - - @param indexToRemove the index of the element to remove - @see removeObject, removeRange - */ - void remove (const int indexToRemove) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (ObjectClass* o = *e) - o->decReferenceCount(); - - --numUsed; - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes and returns an object from the array. - - This will remove the object at a given index and return it, moving back all - the subsequent objects to close the gap. If the index passed in is out-of-range, - nothing will happen and a null pointer will be returned. - - @param indexToRemove the index of the element to remove - @see remove, removeObject, removeRange - */ - ObjectClassPtr removeAndReturn (const int indexToRemove) - { - ObjectClassPtr removedItem; - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (ObjectClass* o = *e) - { - removedItem = o; - o->decReferenceCount(); - } - - --numUsed; - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - return removedItem; - } - - /** Removes the first occurrence of a specified object from the array. - - If the item isn't found, no action is taken. If it is found, it is - removed and has its reference count decreased. - - @param objectToRemove the object to try to remove - @see remove, removeRange - */ - void removeObject (ObjectClass* const objectToRemove) - { - const ScopedLockType lock (getLock()); - remove (indexOf (objectToRemove)); - } - - /** Removes a range of objects from the array. - - This will remove a set of objects, starting from the given index, - and move any subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - The objects that are removed will have their reference counts decreased, - and may be deleted if not referenced from elsewhere. - - @param startIndex the index of the first object to remove - @param numberToRemove how many objects should be removed - @see remove, removeObject - */ - void removeRange (const int startIndex, - const int numberToRemove) - { - const ScopedLockType lock (getLock()); - - const int start = blimit (0, numUsed, startIndex); - const int endIndex = blimit (0, numUsed, startIndex + numberToRemove); - - if (endIndex > start) - { - int i; - for (i = start; i < endIndex; ++i) - { - if (ObjectClass* o = data.elements[i]) - { - o->decReferenceCount(); - data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) - } - } - - const int rangeSize = endIndex - start; - ObjectClass** e = data.elements + start; - i = numUsed - endIndex; - numUsed -= rangeSize; - - while (--i >= 0) - { - *e = e [rangeSize]; - ++e; - } - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes the last n objects from the array. - - The objects that are removed will have their reference counts decreased, - and may be deleted if not referenced from elsewhere. - - @param howManyToRemove how many objects to remove from the end of the array - @see remove, removeObject, removeRange - */ - void removeLast (int howManyToRemove = 1) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove > numUsed) - howManyToRemove = numUsed; - - while (--howManyToRemove >= 0) - remove (numUsed - 1); - } - - /** Swaps a pair of objects in the array. - - If either of the indexes passed in is out-of-range, nothing will happen, - otherwise the two objects at these positions will be exchanged. - */ - void swap (const int index1, - const int index2) noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the objects to a different position. - - This will move the object to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the object to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this object to end up. If this - is less than zero, it will be moved to the end of the array - */ - void move (const int currentIndex, - int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - ObjectClass* const value = data.elements [currentIndex]; - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex)); - } - - data.elements [newIndex] = value; - } - } - } - - //============================================================================== - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - void swapWithArray (ReferenceCountedArray& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherArray.getLock()); - - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - //============================================================================== - /** Compares this array to another one. - - @returns true only if the other array contains the same objects in the same order - */ - bool operator== (const ReferenceCountedArray& other) const noexcept - { - const ScopedLockType lock2 (other.getLock()); - const ScopedLockType lock1 (getLock()); - - if (numUsed != other.numUsed) - return false; - - for (int i = numUsed; --i >= 0;) - if (data.elements [i] != other.data.elements [i]) - return false; - - return true; - } - - /** Compares this array to another one. - - @see operator== - */ - bool operator!= (const ReferenceCountedArray& other) const noexcept - { - return ! operator== (other); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - - @see sortArray - */ - template - void sort (ElementComparator& comparator, - const bool retainOrderOfEquivalentItems = false) const noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; -}; - - -#endif // BEAST_REFERENCECOUNTEDARRAY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_ScopedValueSetter.h b/Subtrees/beast/modules/beast_core/containers/beast_ScopedValueSetter.h deleted file mode 100644 index 945ee13a5d..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_ScopedValueSetter.h +++ /dev/null @@ -1,95 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SCOPEDVALUESETTER_BEASTHEADER -#define BEAST_SCOPEDVALUESETTER_BEASTHEADER - - -//============================================================================== -/** - Helper class providing an RAII-based mechanism for temporarily setting and - then re-setting a value. - - E.g. @code - int x = 1; - - { - ScopedValueSetter setter (x, 2); - - // x is now 2 - } - - // x is now 1 again - - { - ScopedValueSetter setter (x, 3, 4); - - // x is now 3 - } - - // x is now 4 - @endcode - -*/ -template -class ScopedValueSetter -{ -public: - /** Creates a ScopedValueSetter that will immediately change the specified value to the - given new value, and will then reset it to its original value when this object is deleted. - */ - ScopedValueSetter (ValueType& valueToSet, - ValueType newValue) - : value (valueToSet), - originalValue (valueToSet) - { - valueToSet = newValue; - } - - /** Creates a ScopedValueSetter that will immediately change the specified value to the - given new value, and will then reset it to be valueWhenDeleted when this object is deleted. - */ - ScopedValueSetter (ValueType& valueToSet, - ValueType newValue, - ValueType valueWhenDeleted) - : value (valueToSet), - originalValue (valueWhenDeleted) - { - valueToSet = newValue; - } - - ~ScopedValueSetter() - { - value = originalValue; - } - -private: - //============================================================================== - ValueType& value; - const ValueType originalValue; - - BEAST_DECLARE_NON_COPYABLE (ScopedValueSetter) -}; - - -#endif // BEAST_SCOPEDVALUESETTER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_SortedSet.h b/Subtrees/beast/modules/beast_core/containers/beast_SortedSet.h deleted file mode 100644 index 93b2725a1c..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_SortedSet.h +++ /dev/null @@ -1,494 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SORTEDSET_BEASTHEADER -#define BEAST_SORTEDSET_BEASTHEADER - -#include "beast_ArrayAllocationBase.h" -#include "../threads/beast_CriticalSection.h" - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4512) -#endif - - -//============================================================================== -/** - Holds a set of unique primitive objects, such as ints or doubles. - - A set can only hold one item with a given value, so if for example it's a - set of integers, attempting to add the same integer twice will do nothing - the second time. - - Internally, the list of items is kept sorted (which means that whatever - kind of primitive type is used must support the ==, <, >, <= and >= operators - to determine the order), and searching the set for known values is very fast - because it uses a binary-chop method. - - Note that if you're using a class or struct as the element type, it must be - capable of being copied or moved with a straightforward memcpy, rather than - needing construction and destruction code. - - To make all the set's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, OwnedArray, ReferenceCountedArray, StringArray, CriticalSection -*/ -template -class SortedSet -{ -public: - //============================================================================== - /** Creates an empty set. */ - SortedSet() noexcept - { - } - - /** Creates a copy of another set. - @param other the set to copy - */ - SortedSet (const SortedSet& other) - : data (other.data) - { - } - - /** Destructor. */ - ~SortedSet() noexcept - { - } - - /** Copies another set over this one. - @param other the set to copy - */ - SortedSet& operator= (const SortedSet& other) noexcept - { - data = other.data; - return *this; - } - - //============================================================================== - /** Compares this set to another one. - Two sets are considered equal if they both contain the same set of elements. - @param other the other set to compare with - */ - bool operator== (const SortedSet& other) const noexcept - { - return data == other.data; - } - - /** Compares this set to another one. - Two sets are considered equal if they both contain the same set of elements. - @param other the other set to compare with - */ - bool operator!= (const SortedSet& other) const noexcept - { - return ! operator== (other); - } - - //============================================================================== - /** Removes all elements from the set. - - This will remove all the elements, and free any storage that the set is - using. To clear it without freeing the storage, use the clearQuick() - method instead. - - @see clearQuick - */ - void clear() noexcept - { - data.clear(); - } - - /** Removes all elements from the set without freeing the array's allocated storage. - - @see clear - */ - void clearQuick() noexcept - { - data.clearQuick(); - } - - //============================================================================== - /** Returns the current number of elements in the set. - */ - inline int size() const noexcept - { - return data.size(); - } - - /** Returns one of the elements in the set. - - If the index passed in is beyond the range of valid elements, this - will return zero. - - If you're certain that the index will always be a valid element, you - can call getUnchecked() instead, which is faster. - - @param index the index of the element being requested (0 is the first element in the set) - @see getUnchecked, getFirst, getLast - */ - inline ElementType operator[] (const int index) const noexcept - { - return data [index]; - } - - /** Returns one of the elements in the set, without checking the index passed in. - Unlike the operator[] method, this will try to return an element without - checking that the index is within the bounds of the set, so should only - be used when you're confident that it will always be a valid index. - - @param index the index of the element being requested (0 is the first element in the set) - @see operator[], getFirst, getLast - */ - inline ElementType getUnchecked (const int index) const noexcept - { - return data.getUnchecked (index); - } - - /** Returns a direct reference to one of the elements in the set, without checking the index passed in. - - This is like getUnchecked, but returns a direct reference to the element, so that - you can alter it directly. Obviously this can be dangerous, so only use it when - absolutely necessary. - - @param index the index of the element being requested (0 is the first element in the array) - */ - inline ElementType& getReference (const int index) const noexcept - { - return data.getReference (index); - } - - /** Returns the first element in the set, or 0 if the set is empty. - - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const noexcept - { - return data.getFirst(); - } - - /** Returns the last element in the set, or 0 if the set is empty. - - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const noexcept - { - return data.getLast(); - } - - //============================================================================== - /** Returns a pointer to the first element in the set. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* begin() const noexcept - { - return data.begin(); - } - - /** Returns a pointer to the element which follows the last element in the set. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* end() const noexcept - { - return data.end(); - } - - //============================================================================== - /** Finds the index of the first element which matches the value passed in. - - This will search the set for the given object, and return the index - of its first occurrence. If the object isn't found, the method will return -1. - - @param elementToLookFor the value or object to look for - @returns the index of the object, or -1 if it's not found - */ - int indexOf (const ElementType& elementToLookFor) const noexcept - { - const ScopedLockType lock (data.getLock()); - - int s = 0; - int e = data.size(); - - for (;;) - { - if (s >= e) - return -1; - - if (elementToLookFor == data.getReference (s)) - return s; - - const int halfway = (s + e) / 2; - - if (halfway == s) - return -1; - else if (elementToLookFor < data.getReference (halfway)) - e = halfway; - else - s = halfway; - } - } - - /** Returns true if the set contains at least one occurrence of an object. - - @param elementToLookFor the value or object to look for - @returns true if the item is found - */ - bool contains (const ElementType& elementToLookFor) const noexcept - { - return indexOf (elementToLookFor) >= 0; - } - - //============================================================================== - /** Adds a new element to the set, (as long as it's not already in there). - - Note that if a matching element already exists, the new value will be assigned - to the existing one using operator=, so that if there are any differences between - the objects which were not recognised by the object's operator==, then the - set will always contain a copy of the most recently added one. - - @param newElement the new object to add to the set - @returns true if the value was added, or false if it already existed - @see set, insert, addIfNotAlreadyThere, addSorted, addSet, addArray - */ - bool add (const ElementType& newElement) noexcept - { - const ScopedLockType lock (getLock()); - - int s = 0; - int e = data.size(); - - while (s < e) - { - ElementType& elem = data.getReference (s); - if (newElement == elem) - { - elem = newElement; // force an update in case operator== permits differences. - return false; - } - - const int halfway = (s + e) / 2; - const bool isBeforeHalfway = (newElement < data.getReference (halfway)); - - if (halfway == s) - { - if (! isBeforeHalfway) - ++s; - - break; - } - else if (isBeforeHalfway) - e = halfway; - else - s = halfway; - } - - data.insert (s, newElement); - return true; - } - - /** Adds elements from an array to this set. - - @param elementsToAdd the array of elements to add - @param numElementsToAdd how many elements are in this other array - @see add - */ - void addArray (const ElementType* elementsToAdd, - int numElementsToAdd) noexcept - { - const ScopedLockType lock (getLock()); - - while (--numElementsToAdd >= 0) - add (*elementsToAdd++); - } - - /** Adds elements from another set to this one. - - @param setToAddFrom the set from which to copy the elements - @param startIndex the first element of the other set to start copying from - @param numElementsToAdd how many elements to add from the other set. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addSet (const OtherSetType& setToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (setToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - bassert (this != &setToAddFrom); - - if (this != &setToAddFrom) - { - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > setToAddFrom.size()) - numElementsToAdd = setToAddFrom.size() - startIndex; - - if (numElementsToAdd > 0) - addArray (&setToAddFrom.data.getReference (startIndex), numElementsToAdd); - } - } - } - - //============================================================================== - /** Removes an element from the set. - - This will remove the element at a given index. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @returns the element that has been removed - @see removeValue, removeRange - */ - ElementType remove (const int indexToRemove) noexcept - { - return data.remove (indexToRemove); - } - - /** Removes an item from the set. - - This will remove the given element from the set, if it's there. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeValue (const ElementType valueToRemove) noexcept - { - const ScopedLockType lock (getLock()); - data.remove (indexOf (valueToRemove)); - } - - /** Removes any elements which are also in another set. - - @param otherSet the other set in which to look for elements to remove - @see removeValuesNotIn, remove, removeValue, removeRange - */ - template - void removeValuesIn (const OtherSetType& otherSet) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (otherSet.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this == &otherSet) - { - clear(); - } - else if (otherSet.size() > 0) - { - for (int i = data.size(); --i >= 0;) - if (otherSet.contains (data.getReference (i))) - remove (i); - } - } - - /** Removes any elements which are not found in another set. - - Only elements which occur in this other set will be retained. - - @param otherSet the set in which to look for elements NOT to remove - @see removeValuesIn, remove, removeValue, removeRange - */ - template - void removeValuesNotIn (const OtherSetType& otherSet) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (otherSet.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this != &otherSet) - { - if (otherSet.size() <= 0) - { - clear(); - } - else - { - for (int i = data.size(); --i >= 0;) - if (! otherSet.contains (data.getReference (i))) - remove (i); - } - } - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - void swapWith (SortedSet& otherSet) noexcept - { - data.swapWithArray (otherSet.data); - } - - //============================================================================== - /** Reduces the amount of storage being used by the set. - - Sets typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - data.minimiseStorageOverheads(); - } - - /** Increases the set's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the set won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - data.ensureStorageAllocated (minNumElements); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data.getLock(); } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - -private: - //============================================================================== - Array data; -}; - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -#endif // BEAST_SORTEDSET_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_SparseSet.h b/Subtrees/beast/modules/beast_core/containers/beast_SparseSet.h deleted file mode 100644 index 129c26d6eb..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_SparseSet.h +++ /dev/null @@ -1,296 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SPARSESET_BEASTHEADER -#define BEAST_SPARSESET_BEASTHEADER - -#include "../maths/beast_Range.h" -#include "../threads/beast_CriticalSection.h" - - -//============================================================================== -/** - Holds a set of primitive values, storing them as a set of ranges. - - This container acts like an array, but can efficiently hold large contiguous - ranges of values. It's quite a specialised class, mostly useful for things - like keeping the set of selected rows in a listbox. - - The type used as a template paramter must be an integer type, such as int, short, - int64, etc. -*/ -template -class SparseSet -{ -public: - //============================================================================== - /** Creates a new empty set. */ - SparseSet() - { - } - - /** Creates a copy of another SparseSet. */ - SparseSet (const SparseSet& other) - : values (other.values) - { - } - - //============================================================================== - /** Clears the set. */ - void clear() - { - values.clear(); - } - - /** Checks whether the set is empty. - - This is much quicker than using (size() == 0). - */ - bool isEmpty() const noexcept - { - return values.size() == 0; - } - - /** Returns the number of values in the set. - - Because of the way the data is stored, this method can take longer if there - are a lot of items in the set. Use isEmpty() for a quick test of whether there - are any items. - */ - Type size() const - { - Type total (0); - - for (int i = 0; i < values.size(); i += 2) - total += values.getUnchecked (i + 1) - values.getUnchecked (i); - - return total; - } - - /** Returns one of the values in the set. - - @param index the index of the value to retrieve, in the range 0 to (size() - 1). - @returns the value at this index, or 0 if it's out-of-range - */ - Type operator[] (Type index) const - { - for (int i = 0; i < values.size(); i += 2) - { - const Type start (values.getUnchecked (i)); - const Type len (values.getUnchecked (i + 1) - start); - - if (index < len) - return start + index; - - index -= len; - } - - return Type(); - } - - /** Checks whether a particular value is in the set. */ - bool contains (const Type valueToLookFor) const - { - for (int i = 0; i < values.size(); ++i) - if (valueToLookFor < values.getUnchecked(i)) - return (i & 1) != 0; - - return false; - } - - //============================================================================== - /** Returns the number of contiguous blocks of values. - @see getRange - */ - int getNumRanges() const noexcept - { - return values.size() >> 1; - } - - /** Returns one of the contiguous ranges of values stored. - @param rangeIndex the index of the range to look up, between 0 - and (getNumRanges() - 1) - @see getTotalRange - */ - const Range getRange (const int rangeIndex) const - { - if (isPositiveAndBelow (rangeIndex, getNumRanges())) - return Range (values.getUnchecked (rangeIndex << 1), - values.getUnchecked ((rangeIndex << 1) + 1)); - - return Range(); - } - - /** Returns the range between the lowest and highest values in the set. - @see getRange - */ - Range getTotalRange() const - { - if (values.size() > 0) - { - bassert ((values.size() & 1) == 0); - return Range (values.getUnchecked (0), - values.getUnchecked (values.size() - 1)); - } - - return Range(); - } - - //============================================================================== - /** Adds a range of contiguous values to the set. - e.g. addRange (Range \ (10, 14)) will add (10, 11, 12, 13) to the set. - */ - void addRange (const Range range) - { - bassert (range.getLength() >= 0); - if (range.getLength() > 0) - { - removeRange (range); - - values.addUsingDefaultSort (range.getStart()); - values.addUsingDefaultSort (range.getEnd()); - - simplify(); - } - } - - /** Removes a range of values from the set. - e.g. removeRange (Range\ (10, 14)) will remove (10, 11, 12, 13) from the set. - */ - void removeRange (const Range rangeToRemove) - { - bassert (rangeToRemove.getLength() >= 0); - - if (rangeToRemove.getLength() > 0 - && values.size() > 0 - && rangeToRemove.getStart() < values.getUnchecked (values.size() - 1) - && values.getUnchecked(0) < rangeToRemove.getEnd()) - { - const bool onAtStart = contains (rangeToRemove.getStart() - 1); - const Type lastValue (bmin (rangeToRemove.getEnd(), values.getLast())); - const bool onAtEnd = contains (lastValue); - - for (int i = values.size(); --i >= 0;) - { - if (values.getUnchecked(i) <= lastValue) - { - while (values.getUnchecked(i) >= rangeToRemove.getStart()) - { - values.remove (i); - - if (--i < 0) - break; - } - - break; - } - } - - if (onAtStart) values.addUsingDefaultSort (rangeToRemove.getStart()); - if (onAtEnd) values.addUsingDefaultSort (lastValue); - - simplify(); - } - } - - /** Does an XOR of the values in a given range. */ - void invertRange (const Range range) - { - SparseSet newItems; - newItems.addRange (range); - - for (int i = getNumRanges(); --i >= 0;) - newItems.removeRange (getRange (i)); - - removeRange (range); - - for (int i = newItems.getNumRanges(); --i >= 0;) - addRange (newItems.getRange(i)); - } - - /** Checks whether any part of a given range overlaps any part of this set. */ - bool overlapsRange (const Range range) - { - if (range.getLength() > 0) - { - for (int i = getNumRanges(); --i >= 0;) - { - if (values.getUnchecked ((i << 1) + 1) <= range.getStart()) - return false; - - if (values.getUnchecked (i << 1) < range.getEnd()) - return true; - } - } - - return false; - } - - /** Checks whether the whole of a given range is contained within this one. */ - bool containsRange (const Range range) - { - if (range.getLength() > 0) - { - for (int i = getNumRanges(); --i >= 0;) - { - if (values.getUnchecked ((i << 1) + 1) <= range.getStart()) - return false; - - if (values.getUnchecked (i << 1) <= range.getStart() - && range.getEnd() <= values.getUnchecked ((i << 1) + 1)) - return true; - } - } - - return false; - } - - //============================================================================== - bool operator== (const SparseSet& other) noexcept - { - return values == other.values; - } - - bool operator!= (const SparseSet& other) noexcept - { - return values != other.values; - } - -private: - //============================================================================== - // alternating start/end values of ranges of values that are present. - Array values; - - void simplify() - { - bassert ((values.size() & 1) == 0); - - for (int i = values.size(); --i > 0;) - if (values.getUnchecked(i) == values.getUnchecked (i - 1)) - values.removeRange (--i, 2); - } -}; - - - -#endif // BEAST_SPARSESET_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/containers/beast_Variant.cpp b/Subtrees/beast/modules/beast_core/containers/beast_Variant.cpp deleted file mode 100644 index 4b18140fa6..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_Variant.cpp +++ /dev/null @@ -1,704 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -enum VariantStreamMarkers -{ - varMarker_Int = 1, - varMarker_BoolTrue = 2, - varMarker_BoolFalse = 3, - varMarker_Double = 4, - varMarker_String = 5, - varMarker_Int64 = 6, - varMarker_Array = 7, - varMarker_Binary = 8 -}; - -//============================================================================== -class var::VariantType -{ -public: - VariantType() noexcept {} - virtual ~VariantType() noexcept {} - - virtual int toInt (const ValueUnion&) const noexcept { return 0; } - virtual int64 toInt64 (const ValueUnion&) const noexcept { return 0; } - virtual double toDouble (const ValueUnion&) const noexcept { return 0; } - virtual String toString (const ValueUnion&) const { return String::empty; } - virtual bool toBool (const ValueUnion&) const noexcept { return false; } - virtual ReferenceCountedObject* toObject (const ValueUnion&) const noexcept { return nullptr; } - virtual Array* toArray (const ValueUnion&) const noexcept { return nullptr; } - virtual MemoryBlock* toBinary (const ValueUnion&) const noexcept { return nullptr; } - - virtual bool isVoid() const noexcept { return false; } - virtual bool isInt() const noexcept { return false; } - virtual bool isInt64() const noexcept { return false; } - virtual bool isBool() const noexcept { return false; } - virtual bool isDouble() const noexcept { return false; } - virtual bool isString() const noexcept { return false; } - virtual bool isObject() const noexcept { return false; } - virtual bool isArray() const noexcept { return false; } - virtual bool isBinary() const noexcept { return false; } - virtual bool isMethod() const noexcept { return false; } - - virtual void cleanUp (ValueUnion&) const noexcept {} - virtual void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest = source; } - virtual bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept = 0; - virtual void writeToStream (const ValueUnion& data, OutputStream& output) const = 0; -}; - -//============================================================================== -class var::VariantType_Void : public var::VariantType -{ -public: - VariantType_Void() noexcept {} - static const VariantType_Void instance; - - bool isVoid() const noexcept { return true; } - bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept { return otherType.isVoid(); } - void writeToStream (const ValueUnion&, OutputStream& output) const { output.writeCompressedInt (0); } -}; - -//============================================================================== -class var::VariantType_Int : public var::VariantType -{ -public: - VariantType_Int() noexcept {} - static const VariantType_Int instance; - - int toInt (const ValueUnion& data) const noexcept { return data.intValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return (int64) data.intValue; }; - double toDouble (const ValueUnion& data) const noexcept { return (double) data.intValue; } - String toString (const ValueUnion& data) const { return String (data.intValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.intValue != 0; } - bool isInt() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toInt (otherData) == data.intValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - output.writeCompressedInt (5); - output.writeByte (varMarker_Int); - output.writeInt (data.intValue); - } -}; - -//============================================================================== -class var::VariantType_Int64 : public var::VariantType -{ -public: - VariantType_Int64() noexcept {} - static const VariantType_Int64 instance; - - int toInt (const ValueUnion& data) const noexcept { return (int) data.int64Value; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return data.int64Value; }; - double toDouble (const ValueUnion& data) const noexcept { return (double) data.int64Value; } - String toString (const ValueUnion& data) const { return String (data.int64Value); } - bool toBool (const ValueUnion& data) const noexcept { return data.int64Value != 0; } - bool isInt64() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toInt64 (otherData) == data.int64Value; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - output.writeCompressedInt (9); - output.writeByte (varMarker_Int64); - output.writeInt64 (data.int64Value); - } -}; - -//============================================================================== -class var::VariantType_Double : public var::VariantType -{ -public: - VariantType_Double() noexcept {} - static const VariantType_Double instance; - - int toInt (const ValueUnion& data) const noexcept { return (int) data.doubleValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return (int64) data.doubleValue; }; - double toDouble (const ValueUnion& data) const noexcept { return data.doubleValue; } - String toString (const ValueUnion& data) const { return String (data.doubleValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.doubleValue != 0; } - bool isDouble() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits::epsilon(); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - output.writeCompressedInt (9); - output.writeByte (varMarker_Double); - output.writeDouble (data.doubleValue); - } -}; - -//============================================================================== -class var::VariantType_Bool : public var::VariantType -{ -public: - VariantType_Bool() noexcept {} - static const VariantType_Bool instance; - - int toInt (const ValueUnion& data) const noexcept { return data.boolValue ? 1 : 0; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return data.boolValue ? 1 : 0; }; - double toDouble (const ValueUnion& data) const noexcept { return data.boolValue ? 1.0 : 0.0; } - String toString (const ValueUnion& data) const { return String::charToString (data.boolValue ? (beast_wchar) '1' : (beast_wchar) '0'); } - bool toBool (const ValueUnion& data) const noexcept { return data.boolValue; } - bool isBool() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toBool (otherData) == data.boolValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - output.writeCompressedInt (1); - output.writeByte (data.boolValue ? (char) varMarker_BoolTrue : (char) varMarker_BoolFalse); - } -}; - -//============================================================================== -class var::VariantType_String : public var::VariantType -{ -public: - VariantType_String() noexcept {} - static const VariantType_String instance; - - void cleanUp (ValueUnion& data) const noexcept { getString (data)-> ~String(); } - void createCopy (ValueUnion& dest, const ValueUnion& source) const { new (dest.stringValue) String (*getString (source)); } - - bool isString() const noexcept { return true; } - int toInt (const ValueUnion& data) const noexcept { return getString (data)->getIntValue(); }; - int64 toInt64 (const ValueUnion& data) const noexcept { return getString (data)->getLargeIntValue(); }; - double toDouble (const ValueUnion& data) const noexcept { return getString (data)->getDoubleValue(); } - String toString (const ValueUnion& data) const { return *getString (data); } - bool toBool (const ValueUnion& data) const noexcept { return getString (data)->getIntValue() != 0 - || getString (data)->trim().equalsIgnoreCase ("true") - || getString (data)->trim().equalsIgnoreCase ("yes"); } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toString (otherData) == *getString (data); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - const String* const s = getString (data); - const size_t len = s->getNumBytesAsUTF8() + 1; - HeapBlock temp (len); - s->copyToUTF8 (temp, len); - output.writeCompressedInt ((int) (len + 1)); - output.writeByte (varMarker_String); - output.write (temp, len); - } - -private: - static inline const String* getString (const ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } - static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } -}; - -//============================================================================== -class var::VariantType_Object : public var::VariantType -{ -public: - VariantType_Object() noexcept {} - static const VariantType_Object instance; - - void cleanUp (ValueUnion& data) const noexcept { if (data.objectValue != nullptr) data.objectValue->decReferenceCount(); } - - void createCopy (ValueUnion& dest, const ValueUnion& source) const - { - dest.objectValue = source.objectValue; - if (dest.objectValue != nullptr) - dest.objectValue->incReferenceCount(); - } - - String toString (const ValueUnion& data) const { return "Object 0x" + String::toHexString ((int) (pointer_sized_int) data.objectValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.objectValue != 0; } - ReferenceCountedObject* toObject (const ValueUnion& data) const noexcept { return data.objectValue; } - bool isObject() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toObject (otherData) == data.objectValue; - } - - void writeToStream (const ValueUnion&, OutputStream& output) const - { - bassertfalse; // Can't write an object to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -class var::VariantType_Array : public var::VariantType -{ -public: - VariantType_Array() noexcept {} - static const VariantType_Array instance; - - void cleanUp (ValueUnion& data) const noexcept { delete data.arrayValue; } - void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest.arrayValue = new Array (*(source.arrayValue)); } - - String toString (const ValueUnion&) const { return "[Array]"; } - bool isArray() const noexcept { return true; } - Array* toArray (const ValueUnion& data) const noexcept { return data.arrayValue; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - const Array* const otherArray = otherType.toArray (otherData); - return otherArray != nullptr && *otherArray == *(data.arrayValue); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - MemoryOutputStream buffer (512); - const int numItems = data.arrayValue->size(); - buffer.writeCompressedInt (numItems); - - for (int i = 0; i < numItems; ++i) - data.arrayValue->getReference(i).writeToStream (buffer); - - output.writeCompressedInt (1 + (int) buffer.getDataSize()); - output.writeByte (varMarker_Array); - output << buffer; - } -}; - -//============================================================================== -class var::VariantType_Binary : public var::VariantType -{ -public: - VariantType_Binary() noexcept {} - - static const VariantType_Binary instance; - - void cleanUp (ValueUnion& data) const noexcept { delete data.binaryValue; } - void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest.binaryValue = new MemoryBlock (*source.binaryValue); } - - String toString (const ValueUnion& data) const { return data.binaryValue->toBase64Encoding(); } - bool isBinary() const noexcept { return true; } - MemoryBlock* toBinary (const ValueUnion& data) const noexcept { return data.binaryValue; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - const MemoryBlock* const otherBlock = otherType.toBinary (otherData); - return otherBlock != nullptr && *otherBlock == *data.binaryValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - output.writeCompressedInt (1 + (int) data.binaryValue->getSize()); - output.writeByte (varMarker_Binary); - output << *data.binaryValue; - } -}; - -//============================================================================== -class var::VariantType_Method : public var::VariantType -{ -public: - VariantType_Method() noexcept {} - static const VariantType_Method instance; - - String toString (const ValueUnion&) const { return "Method"; } - bool toBool (const ValueUnion& data) const noexcept { return data.methodValue != nullptr; } - bool isMethod() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.isMethod() && otherData.methodValue == data.methodValue; - } - - void writeToStream (const ValueUnion&, OutputStream& output) const - { - bassertfalse; // Can't write a method to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -const var::VariantType_Void var::VariantType_Void::instance; -const var::VariantType_Int var::VariantType_Int::instance; -const var::VariantType_Int64 var::VariantType_Int64::instance; -const var::VariantType_Bool var::VariantType_Bool::instance; -const var::VariantType_Double var::VariantType_Double::instance; -const var::VariantType_String var::VariantType_String::instance; -const var::VariantType_Object var::VariantType_Object::instance; -const var::VariantType_Array var::VariantType_Array::instance; -const var::VariantType_Binary var::VariantType_Binary::instance; -const var::VariantType_Method var::VariantType_Method::instance; - - -//============================================================================== -var::var() noexcept : type (&VariantType_Void::instance) -{ -} - -var::~var() noexcept -{ - type->cleanUp (value); -} - -const var var::null; - -//============================================================================== -var::var (const var& valueToCopy) : type (valueToCopy.type) -{ - type->createCopy (value, valueToCopy.value); -} - -var::var (const int v) noexcept : type (&VariantType_Int::instance) { value.intValue = v; } -var::var (const int64 v) noexcept : type (&VariantType_Int64::instance) { value.int64Value = v; } -var::var (const bool v) noexcept : type (&VariantType_Bool::instance) { value.boolValue = v; } -var::var (const double v) noexcept : type (&VariantType_Double::instance) { value.doubleValue = v; } -var::var (MethodFunction m) noexcept : type (&VariantType_Method::instance) { value.methodValue = m; } -var::var (const Array& v) : type (&VariantType_Array::instance) { value.arrayValue = new Array (v); } -var::var (const String& v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const char* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const wchar_t* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const void* v, size_t sz) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v, sz); } -var::var (const MemoryBlock& v) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v); } - -var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::instance) -{ - value.objectValue = object; - - if (object != nullptr) - object->incReferenceCount(); -} - - -//============================================================================== -bool var::isVoid() const noexcept { return type->isVoid(); } -bool var::isInt() const noexcept { return type->isInt(); } -bool var::isInt64() const noexcept { return type->isInt64(); } -bool var::isBool() const noexcept { return type->isBool(); } -bool var::isDouble() const noexcept { return type->isDouble(); } -bool var::isString() const noexcept { return type->isString(); } -bool var::isObject() const noexcept { return type->isObject(); } -bool var::isArray() const noexcept { return type->isArray(); } -bool var::isBinaryData() const noexcept { return type->isBinary(); } -bool var::isMethod() const noexcept { return type->isMethod(); } - -var::operator int() const noexcept { return type->toInt (value); } -var::operator int64() const noexcept { return type->toInt64 (value); } -var::operator bool() const noexcept { return type->toBool (value); } -var::operator float() const noexcept { return (float) type->toDouble (value); } -var::operator double() const noexcept { return type->toDouble (value); } -String var::toString() const { return type->toString (value); } -var::operator String() const { return type->toString (value); } -ReferenceCountedObject* var::getObject() const noexcept { return type->toObject (value); } -Array* var::getArray() const noexcept { return type->toArray (value); } -MemoryBlock* var::getBinaryData() const noexcept { return type->toBinary (value); } -DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast (getObject()); } - -//============================================================================== -void var::swapWith (var& other) noexcept -{ - std::swap (type, other.type); - std::swap (value, other.value); -} - -var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; } -var& var::operator= (const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v; return *this; } -var& var::operator= (const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v; return *this; } -var& var::operator= (const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v; return *this; } -var& var::operator= (const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v; return *this; } -var& var::operator= (const char* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const wchar_t* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const String& v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const Array& v) { var v2 (v); swapWith (v2); return *this; } -var& var::operator= (ReferenceCountedObject* v) { var v2 (v); swapWith (v2); return *this; } -var& var::operator= (MethodFunction v) { var v2 (v); swapWith (v2); return *this; } - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -var::var (var&& other) noexcept - : type (other.type), - value (other.value) -{ - other.type = &VariantType_Void::instance; -} - -var& var::operator= (var&& other) noexcept -{ - swapWith (other); - return *this; -} - -var::var (String&& v) : type (&VariantType_String::instance) -{ - new (value.stringValue) String (static_cast (v)); -} - -var::var (MemoryBlock&& v) : type (&VariantType_Binary::instance) -{ - value.binaryValue = new MemoryBlock (static_cast (v)); -} - -var& var::operator= (String&& v) -{ - type->cleanUp (value); - type = &VariantType_String::instance; - new (value.stringValue) String (static_cast (v)); - return *this; -} -#endif - -//============================================================================== -bool var::equals (const var& other) const noexcept -{ - return type->equals (value, other.value, *other.type); -} - -bool var::equalsWithSameType (const var& other) const noexcept -{ - return type == other.type && equals (other); -} - -bool operator== (const var& v1, const var& v2) noexcept { return v1.equals (v2); } -bool operator!= (const var& v1, const var& v2) noexcept { return ! v1.equals (v2); } -bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; } -bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; } -bool operator== (const var& v1, const char* const v2) { return v1.toString() == v2; } -bool operator!= (const var& v1, const char* const v2) { return v1.toString() != v2; } - - -//============================================================================== -var var::operator[] (const Identifier propertyName) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->getProperty (propertyName); - - return var::null; -} - -var var::operator[] (const char* const propertyName) const -{ - return operator[] (Identifier (propertyName)); -} - -var var::getProperty (const Identifier propertyName, const var& defaultReturnValue) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->getProperties().getWithDefault (propertyName, defaultReturnValue); - - return defaultReturnValue; -} - -var var::invoke (const Identifier method, const var* arguments, int numArguments) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->invokeMethod (method, arguments, numArguments); - - return var::null; -} - -var var::invokeMethod (DynamicObject* const target, const var* const arguments, const int numArguments) const -{ - bassert (target != nullptr); - - if (isMethod()) - return (target->*(value.methodValue)) (arguments, numArguments); - - return var::null; -} - -var var::call (const Identifier method) const -{ - return invoke (method, nullptr, 0); -} - -var var::call (const Identifier method, const var& arg1) const -{ - return invoke (method, &arg1, 1); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2) const -{ - var args[] = { arg1, arg2 }; - return invoke (method, args, 2); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3) -{ - var args[] = { arg1, arg2, arg3 }; - return invoke (method, args, 3); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const -{ - var args[] = { arg1, arg2, arg3, arg4 }; - return invoke (method, args, 4); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const -{ - var args[] = { arg1, arg2, arg3, arg4, arg5 }; - return invoke (method, args, 5); -} - -//============================================================================== -int var::size() const -{ - if (const Array* const array = getArray()) - return array->size(); - - return 0; -} - -const var& var::operator[] (int arrayIndex) const -{ - const Array* const array = getArray(); - - // When using this method, the var must actually be an array, and the index - // must be in-range! - bassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size())); - - return array->getReference (arrayIndex); -} - -var& var::operator[] (int arrayIndex) -{ - const Array* const array = getArray(); - - // When using this method, the var must actually be an array, and the index - // must be in-range! - bassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size())); - - return array->getReference (arrayIndex); -} - -Array* var::convertToArray() -{ - Array* array = getArray(); - - if (array == nullptr) - { - const Array tempVar; - var v (tempVar); - array = v.value.arrayValue; - - if (! isVoid()) - array->add (*this); - - swapWith (v); - } - - return array; -} - -void var::append (const var& n) -{ - convertToArray()->add (n); -} - -void var::remove (const int index) -{ - if (Array* const array = getArray()) - array->remove (index); -} - -void var::insert (const int index, const var& n) -{ - convertToArray()->insert (index, n); -} - -void var::resize (const int numArrayElementsWanted) -{ - convertToArray()->resize (numArrayElementsWanted); -} - -int var::indexOf (const var& n) const -{ - if (const Array* const array = getArray()) - return array->indexOf (n); - - return -1; -} - -//============================================================================== -void var::writeToStream (OutputStream& output) const -{ - type->writeToStream (value, output); -} - -var var::readFromStream (InputStream& input) -{ - const int numBytes = input.readCompressedInt(); - - if (numBytes > 0) - { - switch (input.readByte()) - { - case varMarker_Int: return var (input.readInt()); - case varMarker_Int64: return var (input.readInt64()); - case varMarker_BoolTrue: return var (true); - case varMarker_BoolFalse: return var (false); - case varMarker_Double: return var (input.readDouble()); - case varMarker_String: - { - MemoryOutputStream mo; - mo.writeFromInputStream (input, numBytes - 1); - return var (mo.toUTF8()); - } - - case varMarker_Binary: - { - MemoryBlock mb (numBytes - 1); - - if (numBytes > 1) - { - const int numRead = input.read (mb.getData(), numBytes - 1); - mb.setSize (numRead); - } - - return var (mb); - } - - case varMarker_Array: - { - var v; - Array* const destArray = v.convertToArray(); - - for (int i = input.readCompressedInt(); --i >= 0;) - destArray->add (readFromStream (input)); - - return v; - } - - default: - input.skipNextBytes (numBytes - 1); break; - } - } - - return var::null; -} diff --git a/Subtrees/beast/modules/beast_core/containers/beast_Variant.h b/Subtrees/beast/modules/beast_core/containers/beast_Variant.h deleted file mode 100644 index 460d526da5..0000000000 --- a/Subtrees/beast/modules/beast_core/containers/beast_Variant.h +++ /dev/null @@ -1,302 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_VARIANT_BEASTHEADER -#define BEAST_VARIANT_BEASTHEADER - -#include "../text/beast_Identifier.h" -#include "../streams/beast_OutputStream.h" -#include "../streams/beast_InputStream.h" -#include "../containers/beast_Array.h" - -#ifndef DOXYGEN - class ReferenceCountedObject; - class DynamicObject; -#endif - -//============================================================================== -/** - A variant class, that can be used to hold a range of primitive values. - - A var object can hold a range of simple primitive values, strings, or - any kind of ReferenceCountedObject. The var class is intended to act like - the kind of values used in dynamic scripting languages. - - You can save/load var objects either in a small, proprietary binary format - using writeToStream()/readFromStream(), or as JSON by using the JSON class. - - @see JSON, DynamicObject -*/ -class BEAST_API var -{ -public: - //============================================================================== - typedef const var (DynamicObject::*MethodFunction) (const var* arguments, int numArguments); - typedef Identifier identifier; - - //============================================================================== - /** Creates a void variant. */ - var() noexcept; - - /** Destructor. */ - ~var() noexcept; - - /** A static var object that can be used where you need an empty variant object. */ - static const var null; - - var (const var& valueToCopy); - var (int value) noexcept; - var (int64 value) noexcept; - var (bool value) noexcept; - var (double value) noexcept; - var (const char* value); - var (const wchar_t* value); - var (const String& value); - var (const Array& value); - var (ReferenceCountedObject* object); - var (MethodFunction method) noexcept; - var (const void* binaryData, size_t dataSize); - var (const MemoryBlock& binaryData); - - var& operator= (const var& valueToCopy); - var& operator= (int value); - var& operator= (int64 value); - var& operator= (bool value); - var& operator= (double value); - var& operator= (const char* value); - var& operator= (const wchar_t* value); - var& operator= (const String& value); - var& operator= (const Array& value); - var& operator= (ReferenceCountedObject* object); - var& operator= (MethodFunction method); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - var (var&& other) noexcept; - var (String&& value); - var (MemoryBlock&& binaryData); - var& operator= (var&& other) noexcept; - var& operator= (String&& value); - #endif - - void swapWith (var& other) noexcept; - - //============================================================================== - operator int() const noexcept; - operator int64() const noexcept; - operator bool() const noexcept; - operator float() const noexcept; - operator double() const noexcept; - operator String() const; - String toString() const; - - /** If this variant holds an array, this provides access to it. - NOTE: Beware when you use this - the array pointer is only valid for the lifetime - of the variant that returned it, so be very careful not to call this method on temporary - var objects that are the return-value of a function, and which may go out of scope before - you use the array! - */ - Array* getArray() const noexcept; - - /** If this variant holds a memory block, this provides access to it. - NOTE: Beware when you use this - the MemoryBlock pointer is only valid for the lifetime - of the variant that returned it, so be very careful not to call this method on temporary - var objects that are the return-value of a function, and which may go out of scope before - you use the MemoryBlock! - */ - MemoryBlock* getBinaryData() const noexcept; - - ReferenceCountedObject* getObject() const noexcept; - DynamicObject* getDynamicObject() const noexcept; - - //============================================================================== - bool isVoid() const noexcept; - bool isInt() const noexcept; - bool isInt64() const noexcept; - bool isBool() const noexcept; - bool isDouble() const noexcept; - bool isString() const noexcept; - bool isObject() const noexcept; - bool isArray() const noexcept; - bool isBinaryData() const noexcept; - bool isMethod() const noexcept; - - /** Returns true if this var has the same value as the one supplied. - Note that this ignores the type, so a string var "123" and an integer var with the - value 123 are considered to be equal. - @see equalsWithSameType - */ - bool equals (const var& other) const noexcept; - - /** Returns true if this var has the same value and type as the one supplied. - This differs from equals() because e.g. "123" and 123 will be considered different. - @see equals - */ - bool equalsWithSameType (const var& other) const noexcept; - - //============================================================================== - /** If the var is an array, this returns the number of elements. - If the var isn't actually an array, this will return 0. - */ - int size() const; - - /** If the var is an array, this can be used to return one of its elements. - To call this method, you must make sure that the var is actually an array, and - that the index is a valid number. If these conditions aren't met, behaviour is - undefined. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - const var& operator[] (int arrayIndex) const; - - /** If the var is an array, this can be used to return one of its elements. - To call this method, you must make sure that the var is actually an array, and - that the index is a valid number. If these conditions aren't met, behaviour is - undefined. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - var& operator[] (int arrayIndex); - - /** Appends an element to the var, converting it to an array if it isn't already one. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array. The parameter value - will then be appended to it. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void append (const var& valueToAppend); - - /** Inserts an element to the var, converting it to an array if it isn't already one. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array. The parameter value - will then be inserted into it. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void insert (int index, const var& value); - - /** If the var is an array, this removes one of its elements. - If the index is out-of-range or the var isn't an array, nothing will be done. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void remove (int index); - - /** Treating the var as an array, this resizes it to contain the specified number of elements. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array before resizing. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void resize (int numArrayElementsWanted); - - /** If the var is an array, this searches it for the first occurrence of the specified value, - and returns its index. - If the var isn't an array, or if the value isn't found, this returns -1. - */ - int indexOf (const var& value) const; - - //============================================================================== - /** If this variant is an object, this returns one of its properties. */ - var operator[] (const Identifier propertyName) const; - /** If this variant is an object, this returns one of its properties. */ - var operator[] (const char* propertyName) const; - /** If this variant is an object, this returns one of its properties, or a default - fallback value if the property is not set. */ - var getProperty (const Identifier propertyName, const var& defaultReturnValue) const; - - /** If this variant is an object, this invokes one of its methods with no arguments. */ - var call (const Identifier method) const; - /** If this variant is an object, this invokes one of its methods with one argument. */ - var call (const Identifier method, const var& arg1) const; - /** If this variant is an object, this invokes one of its methods with 2 arguments. */ - var call (const Identifier method, const var& arg1, const var& arg2) const; - /** If this variant is an object, this invokes one of its methods with 3 arguments. */ - var call (const Identifier method, const var& arg1, const var& arg2, const var& arg3); - /** If this variant is an object, this invokes one of its methods with 4 arguments. */ - var call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; - /** If this variant is an object, this invokes one of its methods with 5 arguments. */ - var call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; - /** If this variant is an object, this invokes one of its methods with a list of arguments. */ - var invoke (const Identifier method, const var* arguments, int numArguments) const; - - //============================================================================== - /** Writes a binary representation of this value to a stream. - The data can be read back later using readFromStream(). - @see JSON - */ - void writeToStream (OutputStream& output) const; - - /** Reads back a stored binary representation of a value. - The data in the stream must have been written using writeToStream(), or this - will have unpredictable results. - @see JSON - */ - static var readFromStream (InputStream& input); - -private: - //============================================================================== - class VariantType; friend class VariantType; - class VariantType_Void; friend class VariantType_Void; - class VariantType_Int; friend class VariantType_Int; - class VariantType_Int64; friend class VariantType_Int64; - class VariantType_Double; friend class VariantType_Double; - class VariantType_Bool; friend class VariantType_Bool; - class VariantType_String; friend class VariantType_String; - class VariantType_Object; friend class VariantType_Object; - class VariantType_Array; friend class VariantType_Array; - class VariantType_Binary; friend class VariantType_Binary; - class VariantType_Method; friend class VariantType_Method; - - union ValueUnion - { - int intValue; - int64 int64Value; - bool boolValue; - double doubleValue; - char stringValue [sizeof (String)]; - ReferenceCountedObject* objectValue; - Array* arrayValue; - MemoryBlock* binaryValue; - MethodFunction methodValue; - }; - - const VariantType* type; - ValueUnion value; - - Array* convertToArray(); - friend class DynamicObject; - var invokeMethod (DynamicObject*, const var*, int) const; -}; - -/** Compares the values of two var objects, using the var::equals() comparison. */ -bool operator== (const var& v1, const var& v2) noexcept; -/** Compares the values of two var objects, using the var::equals() comparison. */ -bool operator!= (const var& v1, const var& v2) noexcept; -bool operator== (const var& v1, const String& v2); -bool operator!= (const var& v1, const String& v2); -bool operator== (const var& v1, const char* v2); -bool operator!= (const var& v1, const char* v2); - - -#endif // BEAST_VARIANT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.cpp b/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.cpp deleted file mode 100644 index 7d18294125..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.cpp +++ /dev/null @@ -1,154 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -static StringArray parseWildcards (const String& pattern) -{ - StringArray s; - s.addTokens (pattern, ";,", "\"'"); - s.trim(); - s.removeEmptyStrings(); - return s; -} - -static bool fileMatches (const StringArray& wildCards, const String& filename) -{ - for (int i = 0; i < wildCards.size(); ++i) - if (filename.matchesWildcard (wildCards[i], ! File::areFileNamesCaseSensitive())) - return true; - - return false; -} - -DirectoryIterator::DirectoryIterator (const File& directory, bool recursive, - const String& pattern, const int type) - : wildCards (parseWildcards (pattern)), - fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern), - wildCard (pattern), - path (File::addTrailingSeparator (directory.getFullPathName())), - index (-1), - totalNumFiles (-1), - whatToLookFor (type), - isRecursive (recursive), - hasBeenAdvanced (false) -{ - // you have to specify the type of files you're looking for! - bassert ((type & (File::findFiles | File::findDirectories)) != 0); - bassert (type > 0 && type <= 7); -} - -DirectoryIterator::~DirectoryIterator() -{ -} - -bool DirectoryIterator::next() -{ - return next (nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); -} - -bool DirectoryIterator::next (bool* const isDirResult, bool* const isHiddenResult, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - hasBeenAdvanced = true; - - if (subIterator != nullptr) - { - if (subIterator->next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly)) - return true; - - subIterator = nullptr; - } - - String filename; - bool isDirectory, isHidden = false; - - while (fileFinder.next (filename, &isDirectory, - (isHiddenResult != nullptr || (whatToLookFor & File::ignoreHiddenFiles) != 0) ? &isHidden : nullptr, - fileSize, modTime, creationTime, isReadOnly)) - { - ++index; - - if (! filename.containsOnly (".")) - { - bool matches = false; - - if (isDirectory) - { - if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) - subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), - true, wildCard, whatToLookFor); - - matches = (whatToLookFor & File::findDirectories) != 0; - } - else - { - matches = (whatToLookFor & File::findFiles) != 0; - } - - // if recursive, we're not relying on the OS iterator to do the wildcard match, so do it now.. - if (matches && isRecursive) - matches = fileMatches (wildCards, filename); - - if (matches && (whatToLookFor & File::ignoreHiddenFiles) != 0) - matches = ! isHidden; - - if (matches) - { - currentFile = File::createFileWithoutCheckingPath (path + filename); - if (isHiddenResult != nullptr) *isHiddenResult = isHidden; - if (isDirResult != nullptr) *isDirResult = isDirectory; - - return true; - } - - if (subIterator != nullptr) - return next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly); - } - } - - return false; -} - -const File& DirectoryIterator::getFile() const -{ - if (subIterator != nullptr && subIterator->hasBeenAdvanced) - return subIterator->getFile(); - - // You need to call DirectoryIterator::next() before asking it for the file that it found! - bassert (hasBeenAdvanced); - - return currentFile; -} - -float DirectoryIterator::getEstimatedProgress() const -{ - if (totalNumFiles < 0) - totalNumFiles = File (path).getNumberOfChildFiles (File::findFilesAndDirectories); - - if (totalNumFiles <= 0) - return 0.0f; - - const float detailedIndex = (subIterator != nullptr) ? index + subIterator->getEstimatedProgress() - : (float) index; - - return detailedIndex / totalNumFiles; -} diff --git a/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.h b/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.h deleted file mode 100644 index 3ba068a899..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_DirectoryIterator.h +++ /dev/null @@ -1,154 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_DIRECTORYITERATOR_BEASTHEADER -#define BEAST_DIRECTORYITERATOR_BEASTHEADER - -#include "beast_File.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - Searches through a the files in a directory, returning each file that is found. - - A DirectoryIterator will search through a directory and its subdirectories using - a wildcard filepattern match. - - If you may be finding a large number of files, this is better than - using File::findChildFiles() because it doesn't block while it finds them - all, and this is more memory-efficient. - - It can also guess how far it's got using a wildly inaccurate algorithm. -*/ -class BEAST_API DirectoryIterator -{ -public: - //============================================================================== - /** Creates a DirectoryIterator for a given directory. - - After creating one of these, call its next() method to get the - first file - e.g. @code - - DirectoryIterator iter (File ("/animals/mooses"), true, "*.moose"); - - while (iter.next()) - { - File theFileItFound (iter.getFile()); - - ... etc - } - @endcode - - @param directory the directory to search in - @param isRecursive whether all the subdirectories should also be searched - @param wildCard the file pattern to match. This may contain multiple patterns - separated by a semi-colon or comma, e.g. "*.jpg;*.png" - @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying - whether to look for files, directories, or both. - */ - DirectoryIterator (const File& directory, - bool isRecursive, - const String& wildCard = "*", - int whatToLookFor = File::findFiles); - - /** Destructor. */ - ~DirectoryIterator(); - - /** Moves the iterator along to the next file. - - @returns true if a file was found (you can then use getFile() to see what it was) - or - false if there are no more matching files. - */ - bool next(); - - /** Moves the iterator along to the next file, and returns various properties of that file. - - If you need to find out details about the file, it's more efficient to call this method than - to call the normal next() method and then find out the details afterwards. - - All the parameters are optional, so pass null pointers for any items that you're not - interested in. - - @returns true if a file was found (you can then use getFile() to see what it was) - or - false if there are no more matching files. If it returns false, then none of the - parameters will be filled-in. - */ - bool next (bool* isDirectory, - bool* isHidden, - int64* fileSize, - Time* modTime, - Time* creationTime, - bool* isReadOnly); - - /** Returns the file that the iterator is currently pointing at. - - The result of this call is only valid after a call to next() has returned true. - */ - const File& getFile() const; - - /** Returns a guess of how far through the search the iterator has got. - - @returns a value 0.0 to 1.0 to show the progress, although this won't be - very accurate. - */ - float getEstimatedProgress() const; - -private: - //============================================================================== - class NativeIterator - { - public: - NativeIterator (const File& directory, const String& wildCard); - ~NativeIterator(); - - bool next (String& filenameFound, - bool* isDirectory, bool* isHidden, int64* fileSize, - Time* modTime, Time* creationTime, bool* isReadOnly); - - class Pimpl; - - private: - friend class DirectoryIterator; - friend class ScopedPointer; - ScopedPointer pimpl; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator) - }; - - friend class ScopedPointer; - StringArray wildCards; - NativeIterator fileFinder; - String wildCard, path; - int index; - mutable int totalNumFiles; - const int whatToLookFor; - const bool isRecursive; - bool hasBeenAdvanced; - ScopedPointer subIterator; - File currentFile; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryIterator) -}; - -#endif // BEAST_DIRECTORYITERATOR_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_File.cpp b/Subtrees/beast/modules/beast_core/files/beast_File.cpp deleted file mode 100644 index ffa83d7260..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_File.cpp +++ /dev/null @@ -1,1086 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -File::File (const String& fullPathName) - : fullPath (parseAbsolutePath (fullPathName)) -{ -} - -File File::createFileWithoutCheckingPath (const String& path) noexcept -{ - File f; - f.fullPath = path; - return f; -} - -File::File (const File& other) - : fullPath (other.fullPath) -{ -} - -File& File::operator= (const String& newPath) -{ - fullPath = parseAbsolutePath (newPath); - return *this; -} - -File& File::operator= (const File& other) -{ - fullPath = other.fullPath; - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -File::File (File&& other) noexcept - : fullPath (static_cast (other.fullPath)) -{ -} - -File& File::operator= (File&& other) noexcept -{ - fullPath = static_cast (other.fullPath); - return *this; -} -#endif - -const File File::nonexistent; - - -//============================================================================== -String File::parseAbsolutePath (const String& p) -{ - if (p.isEmpty()) - return String::empty; - -#if BEAST_WINDOWS - // Windows.. - String path (p.replaceCharacter ('/', '\\')); - - if (path.startsWithChar (separator)) - { - if (path[1] != separator) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - bassertfalse; - - path = File::getCurrentWorkingDirectory().getFullPathName().substring (0, 2) + path; - } - } - else if (! path.containsChar (':')) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - bassertfalse; - - return File::getCurrentWorkingDirectory().getChildFile (path).getFullPathName(); - } -#else - // Mac or Linux.. - - // Yes, I know it's legal for a unix pathname to contain a backslash, but this assertion is here - // to catch anyone who's trying to run code that was written on Windows with hard-coded path names. - // If that's why you've ended up here, use File::getChildFile() to build your paths instead. - bassert ((! p.containsChar ('\\')) || (p.indexOfChar ('/') >= 0 && p.indexOfChar ('/') < p.indexOfChar ('\\'))); - - String path (p); - - if (path.startsWithChar ('~')) - { - if (path[1] == separator || path[1] == 0) - { - // expand a name of the form "~/abc" - path = File::getSpecialLocation (File::userHomeDirectory).getFullPathName() - + path.substring (1); - } - else - { - // expand a name of type "~dave/abc" - const String userName (path.substring (1).upToFirstOccurrenceOf ("/", false, false)); - - if (struct passwd* const pw = getpwnam (userName.toUTF8())) - path = addTrailingSeparator (pw->pw_dir) + path.fromFirstOccurrenceOf ("/", false, false); - } - } - else if (! path.startsWithChar (separator)) - { - #if BEAST_DEBUG || BEAST_LOG_ASSERTIONS - if (! (path.startsWith ("./") || path.startsWith ("../"))) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - bassertfalse; - - #if BEAST_LOG_ASSERTIONS - Logger::writeToLog ("Illegal absolute path: " + path); - #endif - } - #endif - - return File::getCurrentWorkingDirectory().getChildFile (path).getFullPathName(); - } -#endif - - while (path.endsWithChar (separator) && path != separatorString) // careful not to turn a single "/" into an empty string. - path = path.dropLastCharacters (1); - - return path; -} - -String File::addTrailingSeparator (const String& path) -{ - return path.endsWithChar (separator) ? path - : path + separator; -} - -//============================================================================== -#if BEAST_LINUX - #define NAMES_ARE_CASE_SENSITIVE 1 -#endif - -bool File::areFileNamesCaseSensitive() -{ - #if NAMES_ARE_CASE_SENSITIVE - return true; - #else - return false; - #endif -} - -static int compareFilenames (const String& name1, const String& name2) noexcept -{ - #if NAMES_ARE_CASE_SENSITIVE - return name1.compare (name2); - #else - return name1.compareIgnoreCase (name2); - #endif -} - -bool File::operator== (const File& other) const { return compareFilenames (fullPath, other.fullPath) == 0; } -bool File::operator!= (const File& other) const { return compareFilenames (fullPath, other.fullPath) != 0; } -bool File::operator< (const File& other) const { return compareFilenames (fullPath, other.fullPath) < 0; } -bool File::operator> (const File& other) const { return compareFilenames (fullPath, other.fullPath) > 0; } - -//============================================================================== -bool File::setReadOnly (const bool shouldBeReadOnly, - const bool applyRecursively) const -{ - bool worked = true; - - if (applyRecursively && isDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFilesAndDirectories, false); - - for (int i = subFiles.size(); --i >= 0;) - worked = subFiles.getReference(i).setReadOnly (shouldBeReadOnly, true) && worked; - } - - return setFileReadOnlyInternal (shouldBeReadOnly) && worked; -} - -bool File::deleteRecursively() const -{ - bool worked = true; - - if (isDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFilesAndDirectories, false); - - for (int i = subFiles.size(); --i >= 0;) - worked = subFiles.getReference(i).deleteRecursively() && worked; - } - - return deleteFile() && worked; -} - -bool File::moveFileTo (const File& newFile) const -{ - if (newFile.fullPath == fullPath) - return true; - - if (! exists()) - return false; - - #if ! NAMES_ARE_CASE_SENSITIVE - if (*this != newFile) - #endif - if (! newFile.deleteFile()) - return false; - - return moveInternal (newFile); -} - -bool File::copyFileTo (const File& newFile) const -{ - return (*this == newFile) - || (exists() && newFile.deleteFile() && copyInternal (newFile)); -} - -bool File::copyDirectoryTo (const File& newDirectory) const -{ - if (isDirectory() && newDirectory.createDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFiles, false); - - for (int i = 0; i < subFiles.size(); ++i) - if (! subFiles.getReference(i).copyFileTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName()))) - return false; - - subFiles.clear(); - findChildFiles (subFiles, File::findDirectories, false); - - for (int i = 0; i < subFiles.size(); ++i) - if (! subFiles.getReference(i).copyDirectoryTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName()))) - return false; - - return true; - } - - return false; -} - -//============================================================================== -String File::getPathUpToLastSlash() const -{ - const int lastSlash = fullPath.lastIndexOfChar (separator); - - if (lastSlash > 0) - return fullPath.substring (0, lastSlash); - - if (lastSlash == 0) - return separatorString; - - return fullPath; -} - -File File::getParentDirectory() const -{ - File f; - f.fullPath = getPathUpToLastSlash(); - return f; -} - -//============================================================================== -String File::getFileName() const -{ - return fullPath.substring (fullPath.lastIndexOfChar (separator) + 1); -} - -String File::getFileNameWithoutExtension() const -{ - const int lastSlash = fullPath.lastIndexOfChar (separator) + 1; - const int lastDot = fullPath.lastIndexOfChar ('.'); - - if (lastDot > lastSlash) - return fullPath.substring (lastSlash, lastDot); - - return fullPath.substring (lastSlash); -} - -bool File::isAChildOf (const File& potentialParent) const -{ - if (potentialParent == File::nonexistent) - return false; - - const String ourPath (getPathUpToLastSlash()); - - if (compareFilenames (potentialParent.fullPath, ourPath) == 0) - return true; - - if (potentialParent.fullPath.length() >= ourPath.length()) - return false; - - return getParentDirectory().isAChildOf (potentialParent); -} - -int File::hashCode() const { return fullPath.hashCode(); } -int64 File::hashCode64() const { return fullPath.hashCode64(); } - -//============================================================================== -bool File::isAbsolutePath (const String& path) -{ - return path.startsWithChar (separator) - #if BEAST_WINDOWS - || (path.isNotEmpty() && path[1] == ':'); - #else - || path.startsWithChar ('~'); - #endif -} - -File File::getChildFile (String relativePath) const -{ - if (isAbsolutePath (relativePath)) - return File (relativePath); - - String path (fullPath); - - // It's relative, so remove any ../ or ./ bits at the start.. - if (relativePath[0] == '.') - { - #if BEAST_WINDOWS - relativePath = relativePath.replaceCharacter ('/', '\\'); - #endif - - while (relativePath[0] == '.') - { - const beast_wchar secondChar = relativePath[1]; - - if (secondChar == '.') - { - const beast_wchar thirdChar = relativePath[2]; - - if (thirdChar == 0 || thirdChar == separator) - { - const int lastSlash = path.lastIndexOfChar (separator); - if (lastSlash >= 0) - path = path.substring (0, lastSlash); - - relativePath = relativePath.substring (3); - } - else - { - break; - } - } - else if (secondChar == separator) - { - relativePath = relativePath.substring (2); - } - else - { - break; - } - } - } - - return File (addTrailingSeparator (path) + relativePath); -} - -File File::getSiblingFile (const String& fileName) const -{ - return getParentDirectory().getChildFile (fileName); -} - -//============================================================================== -String File::descriptionOfSizeInBytes (const int64 bytes) -{ - const char* suffix; - double divisor = 0; - - if (bytes == 1) { suffix = " byte"; } - else if (bytes < 1024) { suffix = " bytes"; } - else if (bytes < 1024 * 1024) { suffix = " KB"; divisor = 1024.0; } - else if (bytes < 1024 * 1024 * 1024) { suffix = " MB"; divisor = 1024.0 * 1024.0; } - else { suffix = " GB"; divisor = 1024.0 * 1024.0 * 1024.0; } - - return (divisor > 0 ? String (bytes / divisor, 1) : String (bytes)) + suffix; -} - -//============================================================================== -Result File::create() const -{ - if (exists()) - return Result::ok(); - - const File parentDir (getParentDirectory()); - - if (parentDir == *this) - return Result::fail ("Cannot create parent directory"); - - Result r (parentDir.createDirectory()); - - if (r.wasOk()) - { - FileOutputStream fo (*this, 8); - r = fo.getStatus(); - } - - return r; -} - -Result File::createDirectory() const -{ - if (isDirectory()) - return Result::ok(); - - const File parentDir (getParentDirectory()); - - if (parentDir == *this) - return Result::fail ("Cannot create parent directory"); - - Result r (parentDir.createDirectory()); - - if (r.wasOk()) - r = createDirectoryInternal (fullPath.trimCharactersAtEnd (separatorString)); - - return r; -} - -//============================================================================== -Time File::getLastModificationTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (m); } -Time File::getLastAccessTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (a); } -Time File::getCreationTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (c); } - -bool File::setLastModificationTime (Time t) const { return setFileTimesInternal (t.toMilliseconds(), 0, 0); } -bool File::setLastAccessTime (Time t) const { return setFileTimesInternal (0, t.toMilliseconds(), 0); } -bool File::setCreationTime (Time t) const { return setFileTimesInternal (0, 0, t.toMilliseconds()); } - -//============================================================================== -bool File::loadFileAsData (MemoryBlock& destBlock) const -{ - if (! existsAsFile()) - return false; - - FileInputStream in (*this); - return in.openedOk() && getSize() == in.readIntoMemoryBlock (destBlock); -} - -String File::loadFileAsString() const -{ - if (! existsAsFile()) - return String::empty; - - FileInputStream in (*this); - return in.openedOk() ? in.readEntireStreamAsString() - : String::empty; -} - -void File::readLines (StringArray& destLines) const -{ - destLines.addLines (loadFileAsString()); -} - -//============================================================================== -int File::findChildFiles (Array& results, - const int whatToLookFor, - const bool searchRecursively, - const String& wildCardPattern) const -{ - DirectoryIterator di (*this, searchRecursively, wildCardPattern, whatToLookFor); - - int total = 0; - while (di.next()) - { - results.add (di.getFile()); - ++total; - } - - return total; -} - -int File::getNumberOfChildFiles (const int whatToLookFor, const String& wildCardPattern) const -{ - DirectoryIterator di (*this, false, wildCardPattern, whatToLookFor); - - int total = 0; - while (di.next()) - ++total; - - return total; -} - -bool File::containsSubDirectories() const -{ - if (! isDirectory()) - return false; - - DirectoryIterator di (*this, false, "*", findDirectories); - return di.next(); -} - -//============================================================================== -File File::getNonexistentChildFile (const String& suggestedPrefix, - const String& suffix, - bool putNumbersInBrackets) const -{ - File f (getChildFile (suggestedPrefix + suffix)); - - if (f.exists()) - { - int number = 1; - String prefix (suggestedPrefix); - - // remove any bracketed numbers that may already be on the end.. - if (prefix.trim().endsWithChar (')')) - { - putNumbersInBrackets = true; - - const int openBracks = prefix.lastIndexOfChar ('('); - const int closeBracks = prefix.lastIndexOfChar (')'); - - if (openBracks > 0 - && closeBracks > openBracks - && prefix.substring (openBracks + 1, closeBracks).containsOnly ("0123456789")) - { - number = prefix.substring (openBracks + 1, closeBracks).getIntValue(); - prefix = prefix.substring (0, openBracks); - } - } - - // also use brackets if it ends in a digit. - putNumbersInBrackets = putNumbersInBrackets - || CharacterFunctions::isDigit (prefix.getLastCharacter()); - - do - { - String newName (prefix); - - if (putNumbersInBrackets) - newName << '(' << ++number << ')'; - else - newName << ++number; - - f = getChildFile (newName + suffix); - - } while (f.exists()); - } - - return f; -} - -File File::getNonexistentSibling (const bool putNumbersInBrackets) const -{ - if (! exists()) - return *this; - - return getParentDirectory().getNonexistentChildFile (getFileNameWithoutExtension(), - getFileExtension(), - putNumbersInBrackets); -} - -//============================================================================== -String File::getFileExtension() const -{ - const int indexOfDot = fullPath.lastIndexOfChar ('.'); - - if (indexOfDot > fullPath.lastIndexOfChar (separator)) - return fullPath.substring (indexOfDot); - - return String::empty; -} - -bool File::hasFileExtension (const String& possibleSuffix) const -{ - if (possibleSuffix.isEmpty()) - return fullPath.lastIndexOfChar ('.') <= fullPath.lastIndexOfChar (separator); - - const int semicolon = possibleSuffix.indexOfChar (0, ';'); - - if (semicolon >= 0) - { - return hasFileExtension (possibleSuffix.substring (0, semicolon).trimEnd()) - || hasFileExtension (possibleSuffix.substring (semicolon + 1).trimStart()); - } - else - { - if (fullPath.endsWithIgnoreCase (possibleSuffix)) - { - if (possibleSuffix.startsWithChar ('.')) - return true; - - const int dotPos = fullPath.length() - possibleSuffix.length() - 1; - - if (dotPos >= 0) - return fullPath [dotPos] == '.'; - } - } - - return false; -} - -File File::withFileExtension (const String& newExtension) const -{ - if (fullPath.isEmpty()) - return File::nonexistent; - - String filePart (getFileName()); - - const int i = filePart.lastIndexOfChar ('.'); - if (i >= 0) - filePart = filePart.substring (0, i); - - if (newExtension.isNotEmpty() && ! newExtension.startsWithChar ('.')) - filePart << '.'; - - return getSiblingFile (filePart + newExtension); -} - -//============================================================================== -bool File::startAsProcess (const String& parameters) const -{ - return exists() && Process::openDocument (fullPath, parameters); -} - -//============================================================================== -FileInputStream* File::createInputStream() const -{ - ScopedPointer fin (new FileInputStream (*this)); - - if (fin->openedOk()) - return fin.release(); - - return nullptr; -} - -FileOutputStream* File::createOutputStream (const int bufferSize) const -{ - ScopedPointer out (new FileOutputStream (*this, bufferSize)); - - return out->failedToOpen() ? nullptr - : out.release(); -} - -//============================================================================== -bool File::appendData (const void* const dataToAppend, - const size_t numberOfBytes) const -{ - bassert (((ssize_t) numberOfBytes) >= 0); - - if (numberOfBytes == 0) - return true; - - FileOutputStream out (*this, 8192); - return out.openedOk() && out.write (dataToAppend, numberOfBytes); -} - -bool File::replaceWithData (const void* const dataToWrite, - const size_t numberOfBytes) const -{ - if (numberOfBytes == 0) - return deleteFile(); - - TemporaryFile tempFile (*this, TemporaryFile::useHiddenFile); - tempFile.getFile().appendData (dataToWrite, numberOfBytes); - return tempFile.overwriteTargetFileWithTemporary(); -} - -bool File::appendText (const String& text, - const bool asUnicode, - const bool writeUnicodeHeaderBytes) const -{ - FileOutputStream out (*this); - - if (out.failedToOpen()) - return false; - - out.writeText (text, asUnicode, writeUnicodeHeaderBytes); - return true; -} - -bool File::replaceWithText (const String& textToWrite, - const bool asUnicode, - const bool writeUnicodeHeaderBytes) const -{ - TemporaryFile tempFile (*this, TemporaryFile::useHiddenFile); - tempFile.getFile().appendText (textToWrite, asUnicode, writeUnicodeHeaderBytes); - return tempFile.overwriteTargetFileWithTemporary(); -} - -bool File::hasIdenticalContentTo (const File& other) const -{ - if (other == *this) - return true; - - if (getSize() == other.getSize() && existsAsFile() && other.existsAsFile()) - { - FileInputStream in1 (*this), in2 (other); - - if (in1.openedOk() && in2.openedOk()) - { - const int bufferSize = 4096; - HeapBlock buffer1 (bufferSize), buffer2 (bufferSize); - - for (;;) - { - const int num1 = in1.read (buffer1, bufferSize); - const int num2 = in2.read (buffer2, bufferSize); - - if (num1 != num2) - break; - - if (num1 <= 0) - return true; - - if (memcmp (buffer1, buffer2, (size_t) num1) != 0) - break; - } - } - } - - return false; -} - -//============================================================================== -String File::createLegalPathName (const String& original) -{ - String s (original); - String start; - - if (s[1] == ':') - { - start = s.substring (0, 2); - s = s.substring (2); - } - - return start + s.removeCharacters ("\"#@,;:<>*^|?") - .substring (0, 1024); -} - -String File::createLegalFileName (const String& original) -{ - String s (original.removeCharacters ("\"#@,;:<>*^|?\\/")); - - const int maxLength = 128; // only the length of the filename, not the whole path - const int len = s.length(); - - if (len > maxLength) - { - const int lastDot = s.lastIndexOfChar ('.'); - - if (lastDot > bmax (0, len - 12)) - { - s = s.substring (0, maxLength - (len - lastDot)) - + s.substring (lastDot); - } - else - { - s = s.substring (0, maxLength); - } - } - - return s; -} - -//============================================================================== -static int countNumberOfSeparators (String::CharPointerType s) -{ - int num = 0; - - for (;;) - { - const beast_wchar c = s.getAndAdvance(); - - if (c == 0) - break; - - if (c == File::separator) - ++num; - } - - return num; -} - -String File::getRelativePathFrom (const File& dir) const -{ - String thisPath (fullPath); - - while (thisPath.endsWithChar (separator)) - thisPath = thisPath.dropLastCharacters (1); - - String dirPath (addTrailingSeparator (dir.existsAsFile() ? dir.getParentDirectory().getFullPathName() - : dir.fullPath)); - - int commonBitLength = 0; - String::CharPointerType thisPathAfterCommon (thisPath.getCharPointer()); - String::CharPointerType dirPathAfterCommon (dirPath.getCharPointer()); - - { - String::CharPointerType thisPathIter (thisPath.getCharPointer()); - String::CharPointerType dirPathIter (dirPath.getCharPointer()); - - for (int i = 0;;) - { - const beast_wchar c1 = thisPathIter.getAndAdvance(); - const beast_wchar c2 = dirPathIter.getAndAdvance(); - - #if NAMES_ARE_CASE_SENSITIVE - if (c1 != c2 - #else - if ((c1 != c2 && CharacterFunctions::toLowerCase (c1) != CharacterFunctions::toLowerCase (c2)) - #endif - || c1 == 0) - break; - - ++i; - - if (c1 == separator) - { - thisPathAfterCommon = thisPathIter; - dirPathAfterCommon = dirPathIter; - commonBitLength = i; - } - } - } - - // if the only common bit is the root, then just return the full path.. - if (commonBitLength == 0 || (commonBitLength == 1 && thisPath[1] == separator)) - return fullPath; - - const int numUpDirectoriesNeeded = countNumberOfSeparators (dirPathAfterCommon); - - if (numUpDirectoriesNeeded == 0) - return thisPathAfterCommon; - - #if BEAST_WINDOWS - String s (String::repeatedString ("..\\", numUpDirectoriesNeeded)); - #else - String s (String::repeatedString ("../", numUpDirectoriesNeeded)); - #endif - s.appendCharPointer (thisPathAfterCommon); - return s; -} - -//============================================================================== -File File::createTempFile (const String& fileNameEnding) -{ - const File tempFile (getSpecialLocation (tempDirectory) - .getChildFile ("temp_" + String::toHexString (Random::getSystemRandom().nextInt())) - .withFileExtension (fileNameEnding)); - - if (tempFile.exists()) - return createTempFile (fileNameEnding); - - return tempFile; -} - -//============================================================================== -MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode) - : address (nullptr), range (0, file.getSize()), fileHandle (0) -{ - openInternal (file, mode); -} - -MemoryMappedFile::MemoryMappedFile (const File& file, const Range& fileRange, AccessMode mode) - : address (nullptr), range (fileRange.getIntersectionWith (Range (0, file.getSize()))), fileHandle (0) -{ - openInternal (file, mode); -} - - -//============================================================================== -#if BEAST_UNIT_TESTS - -class FileTests : public UnitTest -{ -public: - FileTests() : UnitTest ("Files") {} - - void runTest() - { - beginTest ("Reading"); - - const File home (File::getSpecialLocation (File::userHomeDirectory)); - const File temp (File::getSpecialLocation (File::tempDirectory)); - - expect (! File::nonexistent.exists()); - expect (home.isDirectory()); - expect (home.exists()); - expect (! home.existsAsFile()); - expect (File::getSpecialLocation (File::userDocumentsDirectory).isDirectory()); - expect (File::getSpecialLocation (File::userApplicationDataDirectory).isDirectory()); - expect (File::getSpecialLocation (File::currentExecutableFile).exists()); - expect (File::getSpecialLocation (File::currentApplicationFile).exists()); - expect (File::getSpecialLocation (File::invokedExecutableFile).exists()); - expect (home.getVolumeTotalSize() > 1024 * 1024); - expect (home.getBytesFreeOnVolume() > 0); - expect (! home.isHidden()); - expect (home.isOnHardDisk()); - expect (! home.isOnCDRomDrive()); - expect (File::getCurrentWorkingDirectory().exists()); - expect (home.setAsCurrentWorkingDirectory()); - expect (File::getCurrentWorkingDirectory() == home); - - { - Array roots; - File::findFileSystemRoots (roots); - expect (roots.size() > 0); - - int numRootsExisting = 0; - for (int i = 0; i < roots.size(); ++i) - if (roots[i].exists()) - ++numRootsExisting; - - // (on windows, some of the drives may not contain media, so as long as at least one is ok..) - expect (numRootsExisting > 0); - } - - beginTest ("Writing"); - - File demoFolder (temp.getChildFile ("Beast UnitTests Temp Folder.folder")); - expect (demoFolder.deleteRecursively()); - expect (demoFolder.createDirectory()); - expect (demoFolder.isDirectory()); - expect (demoFolder.getParentDirectory() == temp); - expect (temp.isDirectory()); - - { - Array files; - temp.findChildFiles (files, File::findFilesAndDirectories, false, "*"); - expect (files.contains (demoFolder)); - } - - { - Array files; - temp.findChildFiles (files, File::findDirectories, true, "*.folder"); - expect (files.contains (demoFolder)); - } - - File tempFile (demoFolder.getNonexistentChildFile ("test", ".txt", false)); - - expect (tempFile.getFileExtension() == ".txt"); - expect (tempFile.hasFileExtension (".txt")); - expect (tempFile.hasFileExtension ("txt")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension (".xyz")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension ("abc;xyz;foo")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension ("xyz;foo")); - expect (! tempFile.withFileExtension ("h").hasFileExtension ("bar;foo;xx")); - expect (tempFile.getSiblingFile ("foo").isAChildOf (temp)); - expect (tempFile.hasWriteAccess()); - - { - FileOutputStream fo (tempFile); - fo.write ("0123456789", 10); - } - - expect (tempFile.exists()); - expect (tempFile.getSize() == 10); - expect (std::abs ((int) (tempFile.getLastModificationTime().toMilliseconds() - Time::getCurrentTime().toMilliseconds())) < 3000); - expectEquals (tempFile.loadFileAsString(), String ("0123456789")); - expect (! demoFolder.containsSubDirectories()); - - expectEquals (tempFile.getRelativePathFrom (demoFolder.getParentDirectory()), demoFolder.getFileName() + File::separatorString + tempFile.getFileName()); - expectEquals (demoFolder.getParentDirectory().getRelativePathFrom (tempFile), ".." + File::separatorString + ".." + File::separatorString + demoFolder.getParentDirectory().getFileName()); - - expect (demoFolder.getNumberOfChildFiles (File::findFiles) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findFilesAndDirectories) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findDirectories) == 0); - demoFolder.getNonexistentChildFile ("tempFolder", "", false).createDirectory(); - expect (demoFolder.getNumberOfChildFiles (File::findDirectories) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findFilesAndDirectories) == 2); - expect (demoFolder.containsSubDirectories()); - - expect (tempFile.hasWriteAccess()); - tempFile.setReadOnly (true); - expect (! tempFile.hasWriteAccess()); - tempFile.setReadOnly (false); - expect (tempFile.hasWriteAccess()); - - Time t (Time::getCurrentTime()); - tempFile.setLastModificationTime (t); - Time t2 = tempFile.getLastModificationTime(); - expect (std::abs ((int) (t2.toMilliseconds() - t.toMilliseconds())) <= 1000); - - { - MemoryBlock mb; - tempFile.loadFileAsData (mb); - expect (mb.getSize() == 10); - expect (mb[0] == '0'); - } - - { - expect (tempFile.getSize() == 10); - FileOutputStream fo (tempFile); - expect (fo.openedOk()); - - expect (fo.setPosition (7)); - expect (fo.truncate().wasOk()); - expect (tempFile.getSize() == 7); - fo.write ("789", 3); - fo.flush(); - expect (tempFile.getSize() == 10); - } - - beginTest ("Memory-mapped files"); - - { - MemoryMappedFile mmf (tempFile, MemoryMappedFile::readOnly); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - expect (memcmp (mmf.getData(), "0123456789", 10) == 0); - } - - { - const File tempFile2 (tempFile.getNonexistentSibling (false)); - expect (tempFile2.create()); - expect (tempFile2.appendData ("xxxxxxxxxx", 10)); - - { - MemoryMappedFile mmf (tempFile2, MemoryMappedFile::readWrite); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - memcpy (mmf.getData(), "abcdefghij", 10); - } - - { - MemoryMappedFile mmf (tempFile2, MemoryMappedFile::readWrite); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - expect (memcmp (mmf.getData(), "abcdefghij", 10) == 0); - } - - expect (tempFile2.deleteFile()); - } - - beginTest ("More writing"); - - expect (tempFile.appendData ("abcdefghij", 10)); - expect (tempFile.getSize() == 20); - expect (tempFile.replaceWithData ("abcdefghij", 10)); - expect (tempFile.getSize() == 10); - - File tempFile2 (tempFile.getNonexistentSibling (false)); - expect (tempFile.copyFileTo (tempFile2)); - expect (tempFile2.exists()); - expect (tempFile2.hasIdenticalContentTo (tempFile)); - expect (tempFile.deleteFile()); - expect (! tempFile.exists()); - expect (tempFile2.moveFileTo (tempFile)); - expect (tempFile.exists()); - expect (! tempFile2.exists()); - - expect (demoFolder.deleteRecursively()); - expect (! demoFolder.exists()); - } -}; - -static FileTests fileUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/files/beast_File.h b/Subtrees/beast/modules/beast_core/files/beast_File.h deleted file mode 100644 index 462aeb58a9..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_File.h +++ /dev/null @@ -1,955 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILE_BEASTHEADER -#define BEAST_FILE_BEASTHEADER - -#include "../containers/beast_Array.h" -#include "../time/beast_Time.h" -#include "../text/beast_StringArray.h" -#include "../memory/beast_MemoryBlock.h" -#include "../memory/beast_ScopedPointer.h" -#include "../misc/beast_Result.h" -class FileInputStream; -class FileOutputStream; - - -//============================================================================== -/** - Represents a local file or directory. - - This class encapsulates the absolute pathname of a file or directory, and - has methods for finding out about the file and changing its properties. - - To read or write to the file, there are methods for returning an input or - output stream. - - @see FileInputStream, FileOutputStream -*/ -class BEAST_API File -{ -public: - //============================================================================== - /** Creates an (invalid) file object. - - The file is initially set to an empty path, so getFullPath() will return - an empty string, and comparing the file to File::nonexistent will return - true. - - You can use its operator= method to point it at a proper file. - */ - File() noexcept {} - - /** Creates a file from an absolute path. - - If the path supplied is a relative path, it is taken to be relative - to the current working directory (see File::getCurrentWorkingDirectory()), - but this isn't a recommended way of creating a file, because you - never know what the CWD is going to be. - - On the Mac/Linux, the path can include "~" notation for referring to - user home directories. - */ - File (const String& path); - - /** Creates a copy of another file object. */ - File (const File& other); - - /** Destructor. */ - ~File() noexcept {} - - /** Sets the file based on an absolute pathname. - - If the path supplied is a relative path, it is taken to be relative - to the current working directory (see File::getCurrentWorkingDirectory()), - but this isn't a recommended way of creating a file, because you - never know what the CWD is going to be. - - On the Mac/Linux, the path can include "~" notation for referring to - user home directories. - */ - File& operator= (const String& newFilePath); - - /** Copies from another file object. */ - File& operator= (const File& otherFile); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - File (File&& otherFile) noexcept; - File& operator= (File&& otherFile) noexcept; - #endif - - //============================================================================== - /** This static constant is used for referring to an 'invalid' file. */ - static const File nonexistent; - - //============================================================================== - /** Checks whether the file actually exists. - - @returns true if the file exists, either as a file or a directory. - @see existsAsFile, isDirectory - */ - bool exists() const; - - /** Checks whether the file exists and is a file rather than a directory. - - @returns true only if this is a real file, false if it's a directory - or doesn't exist - @see exists, isDirectory - */ - bool existsAsFile() const; - - /** Checks whether the file is a directory that exists. - - @returns true only if the file is a directory which actually exists, so - false if it's a file or doesn't exist at all - @see exists, existsAsFile - */ - bool isDirectory() const; - - /** Returns the size of the file in bytes. - - @returns the number of bytes in the file, or 0 if it doesn't exist. - */ - int64 getSize() const; - - /** Utility function to convert a file size in bytes to a neat string description. - - So for example 100 would return "100 bytes", 2000 would return "2 KB", - 2000000 would produce "2 MB", etc. - */ - static String descriptionOfSizeInBytes (int64 bytes); - - //============================================================================== - /** Returns the complete, absolute path of this file. - - This includes the filename and all its parent folders. On Windows it'll - also include the drive letter prefix; on Mac or Linux it'll be a complete - path starting from the root folder. - - If you just want the file's name, you should use getFileName() or - getFileNameWithoutExtension(). - - @see getFileName, getRelativePathFrom - */ - const String& getFullPathName() const noexcept { return fullPath; } - - /** Returns the last section of the pathname. - - Returns just the final part of the path - e.g. if the whole path - is "/moose/fish/foo.txt" this will return "foo.txt". - - For a directory, it returns the final part of the path - e.g. for the - directory "/moose/fish" it'll return "fish". - - If the filename begins with a dot, it'll return the whole filename, e.g. for - "/moose/.fish", it'll return ".fish" - - @see getFullPathName, getFileNameWithoutExtension - */ - String getFileName() const; - - /** Creates a relative path that refers to a file relatively to a given directory. - - e.g. File ("/moose/foo.txt").getRelativePathFrom (File ("/moose/fish/haddock")) - would return "../../foo.txt". - - If it's not possible to navigate from one file to the other, an absolute - path is returned. If the paths are invalid, an empty string may also be - returned. - - @param directoryToBeRelativeTo the directory which the resultant string will - be relative to. If this is actually a file rather than - a directory, its parent directory will be used instead. - If it doesn't exist, it's assumed to be a directory. - @see getChildFile, isAbsolutePath - */ - String getRelativePathFrom (const File& directoryToBeRelativeTo) const; - - //============================================================================== - /** Returns the file's extension. - - Returns the file extension of this file, also including the dot. - - e.g. "/moose/fish/foo.txt" would return ".txt" - - @see hasFileExtension, withFileExtension, getFileNameWithoutExtension - */ - String getFileExtension() const; - - /** Checks whether the file has a given extension. - - @param extensionToTest the extension to look for - it doesn't matter whether or - not this string has a dot at the start, so ".wav" and "wav" - will have the same effect. The comparison used is - case-insensitve. To compare with multiple extensions, this - parameter can contain multiple strings, separated by semi-colons - - so, for example: hasFileExtension (".jpeg;png;gif") would return - true if the file has any of those three extensions. - - @see getFileExtension, withFileExtension, getFileNameWithoutExtension - */ - bool hasFileExtension (const String& extensionToTest) const; - - /** Returns a version of this file with a different file extension. - - e.g. File ("/moose/fish/foo.txt").withFileExtension ("html") returns "/moose/fish/foo.html" - - @param newExtension the new extension, either with or without a dot at the start (this - doesn't make any difference). To get remove a file's extension altogether, - pass an empty string into this function. - - @see getFileName, getFileExtension, hasFileExtension, getFileNameWithoutExtension - */ - File withFileExtension (const String& newExtension) const; - - /** Returns the last part of the filename, without its file extension. - - e.g. for "/moose/fish/foo.txt" this will return "foo". - - @see getFileName, getFileExtension, hasFileExtension, withFileExtension - */ - String getFileNameWithoutExtension() const; - - //============================================================================== - /** Returns a 32-bit hash-code that identifies this file. - - This is based on the filename. Obviously it's possible, although unlikely, that - two files will have the same hash-code. - */ - int hashCode() const; - - /** Returns a 64-bit hash-code that identifies this file. - - This is based on the filename. Obviously it's possible, although unlikely, that - two files will have the same hash-code. - */ - int64 hashCode64() const; - - //============================================================================== - /** Returns a file based on a relative path. - - This will find a child file or directory of the current object. - - e.g. - File ("/moose/fish").getChildFile ("foo.txt") will produce "/moose/fish/foo.txt". - File ("/moose/fish").getChildFile ("../foo.txt") will produce "/moose/foo.txt". - - If the string is actually an absolute path, it will be treated as such, e.g. - File ("/moose/fish").getChildFile ("/foo.txt") will produce "/foo.txt" - - @see getSiblingFile, getParentDirectory, getRelativePathFrom, isAChildOf - */ - File getChildFile (String relativePath) const; - - /** Returns a file which is in the same directory as this one. - - This is equivalent to getParentDirectory().getChildFile (name). - - @see getChildFile, getParentDirectory - */ - File getSiblingFile (const String& siblingFileName) const; - - //============================================================================== - /** Returns the directory that contains this file or directory. - - e.g. for "/moose/fish/foo.txt" this will return "/moose/fish". - */ - File getParentDirectory() const; - - /** Checks whether a file is somewhere inside a directory. - - Returns true if this file is somewhere inside a subdirectory of the directory - that is passed in. Neither file actually has to exist, because the function - just checks the paths for similarities. - - e.g. File ("/moose/fish/foo.txt").isAChildOf ("/moose") is true. - File ("/moose/fish/foo.txt").isAChildOf ("/moose/fish") is also true. - */ - bool isAChildOf (const File& potentialParentDirectory) const; - - //============================================================================== - /** Chooses a filename relative to this one that doesn't already exist. - - If this file is a directory, this will return a child file of this - directory that doesn't exist, by adding numbers to a prefix and suffix until - it finds one that isn't already there. - - If the prefix + the suffix doesn't exist, it won't bother adding a number. - - e.g. File ("/moose/fish").getNonexistentChildFile ("foo", ".txt", true) might - return "/moose/fish/foo(2).txt" if there's already a file called "foo.txt". - - @param prefix the string to use for the filename before the number - @param suffix the string to add to the filename after the number - @param putNumbersInBrackets if true, this will create filenames in the - format "prefix(number)suffix", if false, it will leave the - brackets out. - */ - File getNonexistentChildFile (const String& prefix, - const String& suffix, - bool putNumbersInBrackets = true) const; - - /** Chooses a filename for a sibling file to this one that doesn't already exist. - - If this file doesn't exist, this will just return itself, otherwise it - will return an appropriate sibling that doesn't exist, e.g. if a file - "/moose/fish/foo.txt" exists, this might return "/moose/fish/foo(2).txt". - - @param putNumbersInBrackets whether to add brackets around the numbers that - get appended to the new filename. - */ - File getNonexistentSibling (bool putNumbersInBrackets = true) const; - - //============================================================================== - /** Compares the pathnames for two files. */ - bool operator== (const File& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator!= (const File& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator< (const File& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator> (const File& otherFile) const; - - //============================================================================== - /** Checks whether a file can be created or written to. - - @returns true if it's possible to create and write to this file. If the file - doesn't already exist, this will check its parent directory to - see if writing is allowed. - @see setReadOnly - */ - bool hasWriteAccess() const; - - /** Changes the write-permission of a file or directory. - - @param shouldBeReadOnly whether to add or remove write-permission - @param applyRecursively if the file is a directory and this is true, it will - recurse through all the subfolders changing the permissions - of all files - @returns true if it manages to change the file's permissions. - @see hasWriteAccess - */ - bool setReadOnly (bool shouldBeReadOnly, - bool applyRecursively = false) const; - - /** Returns true if this file is a hidden or system file. - The criteria for deciding whether a file is hidden are platform-dependent. - */ - bool isHidden() const; - - /** If this file is a link, this returns the file that it points to. - If this file isn't actually link, it'll just return itself. - */ - File getLinkedTarget() const; - - //============================================================================== - /** Returns the last modification time of this file. - - @returns the time, or an invalid time if the file doesn't exist. - @see setLastModificationTime, getLastAccessTime, getCreationTime - */ - Time getLastModificationTime() const; - - /** Returns the last time this file was accessed. - - @returns the time, or an invalid time if the file doesn't exist. - @see setLastAccessTime, getLastModificationTime, getCreationTime - */ - Time getLastAccessTime() const; - - /** Returns the time that this file was created. - - @returns the time, or an invalid time if the file doesn't exist. - @see getLastModificationTime, getLastAccessTime - */ - Time getCreationTime() const; - - /** Changes the modification time for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getLastModificationTime, setLastAccessTime, setCreationTime - */ - bool setLastModificationTime (Time newTime) const; - - /** Changes the last-access time for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getLastAccessTime, setLastModificationTime, setCreationTime - */ - bool setLastAccessTime (Time newTime) const; - - /** Changes the creation date for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getCreationTime, setLastModificationTime, setLastAccessTime - */ - bool setCreationTime (Time newTime) const; - - /** If possible, this will try to create a version string for the given file. - - The OS may be able to look at the file and give a version for it - e.g. with - executables, bundles, dlls, etc. If no version is available, this will - return an empty string. - */ - String getVersion() const; - - //============================================================================== - /** Creates an empty file if it doesn't already exist. - - If the file that this object refers to doesn't exist, this will create a file - of zero size. - - If it already exists or is a directory, this method will do nothing. - - @returns true if the file has been created (or if it already existed). - @see createDirectory - */ - Result create() const; - - /** Creates a new directory for this filename. - - This will try to create the file as a directory, and fill also create - any parent directories it needs in order to complete the operation. - - @returns a result to indicate whether the directory was created successfully, or - an error message if it failed. - @see create - */ - Result createDirectory() const; - - /** Deletes a file. - - If this file is actually a directory, it may not be deleted correctly if it - contains files. See deleteRecursively() as a better way of deleting directories. - - @returns true if the file has been successfully deleted (or if it didn't exist to - begin with). - @see deleteRecursively - */ - bool deleteFile() const; - - /** Deletes a file or directory and all its subdirectories. - - If this file is a directory, this will try to delete it and all its subfolders. If - it's just a file, it will just try to delete the file. - - @returns true if the file and all its subfolders have been successfully deleted - (or if it didn't exist to begin with). - @see deleteFile - */ - bool deleteRecursively() const; - - /** Moves this file or folder to the trash. - - @returns true if the operation succeeded. It could fail if the trash is full, or - if the file is write-protected, so you should check the return value - and act appropriately. - */ - bool moveToTrash() const; - - /** Moves or renames a file. - - Tries to move a file to a different location. - If the target file already exists, this will attempt to delete it first, and - will fail if this can't be done. - - Note that the destination file isn't the directory to put it in, it's the actual - filename that you want the new file to have. - - @returns true if the operation succeeds - */ - bool moveFileTo (const File& targetLocation) const; - - /** Copies a file. - - Tries to copy a file to a different location. - If the target file already exists, this will attempt to delete it first, and - will fail if this can't be done. - - @returns true if the operation succeeds - */ - bool copyFileTo (const File& targetLocation) const; - - /** Copies a directory. - - Tries to copy an entire directory, recursively. - - If this file isn't a directory or if any target files can't be created, this - will return false. - - @param newDirectory the directory that this one should be copied to. Note that this - is the name of the actual directory to create, not the directory - into which the new one should be placed, so there must be enough - write privileges to create it if it doesn't exist. Any files inside - it will be overwritten by similarly named ones that are copied. - */ - bool copyDirectoryTo (const File& newDirectory) const; - - //============================================================================== - /** Used in file searching, to specify whether to return files, directories, or both. - */ - enum TypesOfFileToFind - { - findDirectories = 1, /**< Use this flag to indicate that you want to find directories. */ - findFiles = 2, /**< Use this flag to indicate that you want to find files. */ - findFilesAndDirectories = 3, /**< Use this flag to indicate that you want to find both files and directories. */ - ignoreHiddenFiles = 4 /**< Add this flag to avoid returning any hidden files in the results. */ - }; - - /** Searches inside a directory for files matching a wildcard pattern. - - Assuming that this file is a directory, this method will search it - for either files or subdirectories whose names match a filename pattern. - - @param results an array to which File objects will be added for the - files that the search comes up with - @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to - return files, directories, or both. If the ignoreHiddenFiles flag - is also added to this value, hidden files won't be returned - @param searchRecursively if true, all subdirectories will be recursed into to do - an exhaustive search - @param wildCardPattern the filename pattern to search for, e.g. "*.txt" - @returns the number of results that have been found - - @see getNumberOfChildFiles, DirectoryIterator - */ - int findChildFiles (Array& results, - int whatToLookFor, - bool searchRecursively, - const String& wildCardPattern = "*") const; - - /** Searches inside a directory and counts how many files match a wildcard pattern. - - Assuming that this file is a directory, this method will search it - for either files or subdirectories whose names match a filename pattern, - and will return the number of matches found. - - This isn't a recursive call, and will only search this directory, not - its children. - - @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to - count files, directories, or both. If the ignoreHiddenFiles flag - is also added to this value, hidden files won't be counted - @param wildCardPattern the filename pattern to search for, e.g. "*.txt" - @returns the number of matches found - @see findChildFiles, DirectoryIterator - */ - int getNumberOfChildFiles (int whatToLookFor, - const String& wildCardPattern = "*") const; - - /** Returns true if this file is a directory that contains one or more subdirectories. - @see isDirectory, findChildFiles - */ - bool containsSubDirectories() const; - - //============================================================================== - /** Creates a stream to read from this file. - - @returns a stream that will read from this file (initially positioned at the - start of the file), or nullptr if the file can't be opened for some reason - @see createOutputStream, loadFileAsData - */ - FileInputStream* createInputStream() const; - - /** Creates a stream to write to this file. - - If the file exists, the stream that is returned will be positioned ready for - writing at the end of the file, so you might want to use deleteFile() first - to write to an empty file. - - @returns a stream that will write to this file (initially positioned at the - end of the file), or nullptr if the file can't be opened for some reason - @see createInputStream, appendData, appendText - */ - FileOutputStream* createOutputStream (int bufferSize = 0x8000) const; - - //============================================================================== - /** Loads a file's contents into memory as a block of binary data. - - Of course, trying to load a very large file into memory will blow up, so - it's better to check first. - - @param result the data block to which the file's contents should be appended - note - that if the memory block might already contain some data, you - might want to clear it first - @returns true if the file could all be read into memory - */ - bool loadFileAsData (MemoryBlock& result) const; - - /** Reads a file into memory as a string. - - Attempts to load the entire file as a zero-terminated string. - - This makes use of InputStream::readEntireStreamAsString, which can - read either UTF-16 or UTF-8 file formats. - */ - String loadFileAsString() const; - - /** Reads the contents of this file as text and splits it into lines, which are - appended to the given StringArray. - */ - void readLines (StringArray& destLines) const; - - //============================================================================== - /** Appends a block of binary data to the end of the file. - - This will try to write the given buffer to the end of the file. - - @returns false if it can't write to the file for some reason - */ - bool appendData (const void* dataToAppend, - size_t numberOfBytes) const; - - /** Replaces this file's contents with a given block of data. - - This will delete the file and replace it with the given data. - - A nice feature of this method is that it's safe - instead of deleting - the file first and then re-writing it, it creates a new temporary file, - writes the data to that, and then moves the new file to replace the existing - file. This means that if the power gets pulled out or something crashes, - you're a lot less likely to end up with a corrupted or unfinished file.. - - Returns true if the operation succeeds, or false if it fails. - - @see appendText - */ - bool replaceWithData (const void* dataToWrite, - size_t numberOfBytes) const; - - /** Appends a string to the end of the file. - - This will try to append a text string to the file, as either 16-bit unicode - or 8-bit characters in the default system encoding. - - It can also write the 'ff fe' unicode header bytes before the text to indicate - the endianness of the file. - - Any single \\n characters in the string are replaced with \\r\\n before it is written. - - @see replaceWithText - */ - bool appendText (const String& textToAppend, - bool asUnicode = false, - bool writeUnicodeHeaderBytes = false) const; - - /** Replaces this file's contents with a given text string. - - This will delete the file and replace it with the given text. - - A nice feature of this method is that it's safe - instead of deleting - the file first and then re-writing it, it creates a new temporary file, - writes the text to that, and then moves the new file to replace the existing - file. This means that if the power gets pulled out or something crashes, - you're a lot less likely to end up with an empty file.. - - For an explanation of the parameters here, see the appendText() method. - - Returns true if the operation succeeds, or false if it fails. - - @see appendText - */ - bool replaceWithText (const String& textToWrite, - bool asUnicode = false, - bool writeUnicodeHeaderBytes = false) const; - - /** Attempts to scan the contents of this file and compare it to another file, returning - true if this is possible and they match byte-for-byte. - */ - bool hasIdenticalContentTo (const File& other) const; - - //============================================================================== - /** Creates a set of files to represent each file root. - - e.g. on Windows this will create files for "c:\", "d:\" etc according - to which ones are available. On the Mac/Linux, this will probably - just add a single entry for "/". - */ - static void findFileSystemRoots (Array& results); - - /** Finds the name of the drive on which this file lives. - @returns the volume label of the drive, or an empty string if this isn't possible - */ - String getVolumeLabel() const; - - /** Returns the serial number of the volume on which this file lives. - @returns the serial number, or zero if there's a problem doing this - */ - int getVolumeSerialNumber() const; - - /** Returns the number of bytes free on the drive that this file lives on. - - @returns the number of bytes free, or 0 if there's a problem finding this out - @see getVolumeTotalSize - */ - int64 getBytesFreeOnVolume() const; - - /** Returns the total size of the drive that contains this file. - - @returns the total number of bytes that the volume can hold - @see getBytesFreeOnVolume - */ - int64 getVolumeTotalSize() const; - - /** Returns true if this file is on a CD or DVD drive. */ - bool isOnCDRomDrive() const; - - /** Returns true if this file is on a hard disk. - - This will fail if it's a network drive, but will still be true for - removable hard-disks. - */ - bool isOnHardDisk() const; - - /** Returns true if this file is on a removable disk drive. - - This might be a usb-drive, a CD-rom, or maybe a network drive. - */ - bool isOnRemovableDrive() const; - - //============================================================================== - /** Launches the file as a process. - - - if the file is executable, this will run it. - - - if it's a document of some kind, it will launch the document with its - default viewer application. - - - if it's a folder, it will be opened in Explorer, Finder, or equivalent. - - @see revealToUser - */ - bool startAsProcess (const String& parameters = String::empty) const; - - /** Opens Finder, Explorer, or whatever the OS uses, to show the user this file's location. - @see startAsProcess - */ - void revealToUser() const; - - //============================================================================== - /** A set of types of location that can be passed to the getSpecialLocation() method. - */ - enum SpecialLocationType - { - /** The user's home folder. This is the same as using File ("~"). */ - userHomeDirectory, - - /** The user's default documents folder. On Windows, this might be the user's - "My Documents" folder. On the Mac it'll be their "Documents" folder. Linux - doesn't tend to have one of these, so it might just return their home folder. - */ - userDocumentsDirectory, - - /** The folder that contains the user's desktop objects. */ - userDesktopDirectory, - - /** The folder in which applications store their persistent user-specific settings. - On Windows, this might be "\Documents and Settings\username\Application Data". - On the Mac, it might be "~/Library". If you're going to store your settings in here, - always create your own sub-folder to put them in, to avoid making a mess. - */ - userApplicationDataDirectory, - - /** An equivalent of the userApplicationDataDirectory folder that is shared by all users - of the computer, rather than just the current user. - - On the Mac it'll be "/Library", on Windows, it could be something like - "\Documents and Settings\All Users\Application Data". - - Depending on the setup, this folder may be read-only. - */ - commonApplicationDataDirectory, - - /** The folder that should be used for temporary files. - Always delete them when you're finished, to keep the user's computer tidy! - */ - tempDirectory, - - /** Returns this application's executable file. - - If running as a plug-in or DLL, this will (where possible) be the DLL rather than the - host app. - - On the mac this will return the unix binary, not the package folder - see - currentApplicationFile for that. - - See also invokedExecutableFile, which is similar, but if the exe was launched from a - file link, invokedExecutableFile will return the name of the link. - */ - currentExecutableFile, - - /** Returns this application's location. - - If running as a plug-in or DLL, this will (where possible) be the DLL rather than the - host app. - - On the mac this will return the package folder (if it's in one), not the unix binary - that's inside it - compare with currentExecutableFile. - */ - currentApplicationFile, - - /** Returns the file that was invoked to launch this executable. - This may differ from currentExecutableFile if the app was started from e.g. a link - this - will return the name of the link that was used, whereas currentExecutableFile will return - the actual location of the target executable. - */ - invokedExecutableFile, - - /** In a plugin, this will return the path of the host executable. */ - hostApplicationPath, - - /** The directory in which applications normally get installed. - So on windows, this would be something like "c:\program files", on the - Mac "/Applications", or "/usr" on linux. - */ - globalApplicationsDirectory, - - /** The most likely place where a user might store their music files. */ - userMusicDirectory, - - /** The most likely place where a user might store their movie files. */ - userMoviesDirectory, - - /** The most likely place where a user might store their picture files. */ - userPicturesDirectory - }; - - /** Finds the location of a special type of file or directory, such as a home folder or - documents folder. - - @see SpecialLocationType - */ - static File BEAST_CALLTYPE getSpecialLocation (const SpecialLocationType type); - - //============================================================================== - /** Returns a temporary file in the system's temp directory. - This will try to return the name of a non-existent temp file. - To get the temp folder, you can use getSpecialLocation (File::tempDirectory). - */ - static File createTempFile (const String& fileNameEnding); - - - //============================================================================== - /** Returns the current working directory. - @see setAsCurrentWorkingDirectory - */ - static File getCurrentWorkingDirectory(); - - /** Sets the current working directory to be this file. - - For this to work the file must point to a valid directory. - - @returns true if the current directory has been changed. - @see getCurrentWorkingDirectory - */ - bool setAsCurrentWorkingDirectory() const; - - //============================================================================== - /** The system-specific file separator character. - On Windows, this will be '\', on Mac/Linux, it'll be '/' - */ - static const beast_wchar separator; - - /** The system-specific file separator character, as a string. - On Windows, this will be '\', on Mac/Linux, it'll be '/' - */ - static const String separatorString; - - //============================================================================== - /** Removes illegal characters from a filename. - - This will return a copy of the given string after removing characters - that are not allowed in a legal filename, and possibly shortening the - string if it's too long. - - Because this will remove slashes, don't use it on an absolute pathname. - - @see createLegalPathName - */ - static String createLegalFileName (const String& fileNameToFix); - - /** Removes illegal characters from a pathname. - - Similar to createLegalFileName(), but this won't remove slashes, so can - be used on a complete pathname. - - @see createLegalFileName - */ - static String createLegalPathName (const String& pathNameToFix); - - /** Indicates whether filenames are case-sensitive on the current operating system. */ - static bool areFileNamesCaseSensitive(); - - /** Returns true if the string seems to be a fully-specified absolute path. */ - static bool isAbsolutePath (const String& path); - - /** Creates a file that simply contains this string, without doing the sanity-checking - that the normal constructors do. - - Best to avoid this unless you really know what you're doing. - */ - static File createFileWithoutCheckingPath (const String& path) noexcept; - - /** Adds a separator character to the end of a path if it doesn't already have one. */ - static String addTrailingSeparator (const String& path); - - #if BEAST_MAC || BEAST_IOS || DOXYGEN - //============================================================================== - /** OSX ONLY - Finds the OSType of a file from the its resources. */ - OSType getMacOSType() const; - - /** OSX ONLY - Returns true if this file is actually a bundle. */ - bool isBundle() const; - #endif - - #if BEAST_MAC || DOXYGEN - /** OSX ONLY - Adds this file to the OSX dock */ - void addToDock() const; - #endif - - #if BEAST_WINDOWS - /** Windows ONLY - Creates a win32 .LNK shortcut file that links to this file. */ - bool createLink (const String& description, const File& linkFileToCreate) const; - #endif - -private: - //============================================================================== - String fullPath; - - static String parseAbsolutePath (const String&); - String getPathUpToLastSlash() const; - - Result createDirectoryInternal (const String&) const; - bool copyInternal (const File&) const; - bool moveInternal (const File&) const; - bool setFileTimesInternal (int64 m, int64 a, int64 c) const; - void getFileTimesInternal (int64& m, int64& a, int64& c) const; - bool setFileReadOnlyInternal (bool) const; - - BEAST_LEAK_DETECTOR (File) -}; - -#endif // BEAST_FILE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.cpp b/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.cpp deleted file mode 100644 index bceed5ba2f..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -int64 beast_fileSetPosition (void* handle, int64 pos); - -//============================================================================== -FileInputStream::FileInputStream (const File& f) - : file (f), - fileHandle (nullptr), - currentPosition (0), - status (Result::ok()), - needToSeek (true) -{ - openHandle(); -} - -FileInputStream::~FileInputStream() -{ - closeHandle(); -} - -//============================================================================== -int64 FileInputStream::getTotalLength() -{ - return file.getSize(); -} - -int FileInputStream::read (void* buffer, int bytesToRead) -{ - bassert (openedOk()); - bassert (buffer != nullptr && bytesToRead >= 0); - - if (needToSeek) - { - if (beast_fileSetPosition (fileHandle, currentPosition) < 0) - return 0; - - needToSeek = false; - } - - const size_t num = readInternal (buffer, (size_t) bytesToRead); - currentPosition += num; - - return (int) num; -} - -bool FileInputStream::isExhausted() -{ - return currentPosition >= getTotalLength(); -} - -int64 FileInputStream::getPosition() -{ - return currentPosition; -} - -bool FileInputStream::setPosition (int64 pos) -{ - bassert (openedOk()); - - if (pos != currentPosition) - { - pos = blimit ((int64) 0, getTotalLength(), pos); - - needToSeek |= (currentPosition != pos); - currentPosition = pos; - } - - return true; -} diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.h b/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.h deleted file mode 100644 index 72ee64f126..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileInputStream.h +++ /dev/null @@ -1,94 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILEINPUTSTREAM_BEASTHEADER -#define BEAST_FILEINPUTSTREAM_BEASTHEADER - -#include "beast_File.h" -#include "../streams/beast_InputStream.h" - - -//============================================================================== -/** - An input stream that reads from a local file. - - @see InputStream, FileOutputStream, File::createInputStream -*/ -class BEAST_API FileInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a FileInputStream. - - @param fileToRead the file to read from - if the file can't be accessed for some - reason, then the stream will just contain no data - */ - explicit FileInputStream (const File& fileToRead); - - /** Destructor. */ - ~FileInputStream(); - - //============================================================================== - /** Returns the file that this stream is reading from. */ - const File& getFile() const noexcept { return file; } - - /** Returns the status of the file stream. - The result will be ok if the file opened successfully. If an error occurs while - opening or reading from the file, this will contain an error message. - */ - const Result& getStatus() const noexcept { return status; } - - /** Returns true if the stream couldn't be opened for some reason. - @see getResult() - */ - bool failedToOpen() const noexcept { return status.failed(); } - - /** Returns true if the stream opened without problems. - @see getResult() - */ - bool openedOk() const noexcept { return status.wasOk(); } - - - //============================================================================== - int64 getTotalLength(); - int read (void* destBuffer, int maxBytesToRead); - bool isExhausted(); - int64 getPosition(); - bool setPosition (int64 pos); - -private: - //============================================================================== - File file; - void* fileHandle; - int64 currentPosition; - Result status; - bool needToSeek; - - void openHandle(); - void closeHandle(); - size_t readInternal (void* buffer, size_t numBytes); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileInputStream) -}; - -#endif // BEAST_FILEINPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.cpp b/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.cpp deleted file mode 100644 index 368eb9c438..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.cpp +++ /dev/null @@ -1,131 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -int64 beast_fileSetPosition (void* handle, int64 pos); - -//============================================================================== -FileOutputStream::FileOutputStream (const File& f, const int bufferSize_) - : file (f), - fileHandle (nullptr), - status (Result::ok()), - currentPosition (0), - bufferSize (bufferSize_), - bytesInBuffer (0), - buffer ((size_t) bmax (bufferSize_, 16)) -{ - openHandle(); -} - -FileOutputStream::~FileOutputStream() -{ - flushBuffer(); - flushInternal(); - closeHandle(); -} - -int64 FileOutputStream::getPosition() -{ - return currentPosition; -} - -bool FileOutputStream::setPosition (int64 newPosition) -{ - if (newPosition != currentPosition) - { - flushBuffer(); - currentPosition = beast_fileSetPosition (fileHandle, newPosition); - } - - return newPosition == currentPosition; -} - -bool FileOutputStream::flushBuffer() -{ - bool ok = true; - - if (bytesInBuffer > 0) - { - ok = (writeInternal (buffer, bytesInBuffer) == (ssize_t) bytesInBuffer); - bytesInBuffer = 0; - } - - return ok; -} - -void FileOutputStream::flush() -{ - flushBuffer(); - flushInternal(); -} - -bool FileOutputStream::write (const void* const src, const size_t numBytes) -{ - bassert (src != nullptr && ((ssize_t) numBytes) >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - if (! flushBuffer()) - return false; - - if (numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - const ssize_t bytesWritten = writeInternal (src, numBytes); - - if (bytesWritten < 0) - return false; - - currentPosition += bytesWritten; - return bytesWritten == (ssize_t) numBytes; - } - } - - return true; -} - -void FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) -{ - bassert (((ssize_t) numBytes) >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memset (buffer + bytesInBuffer, byte, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - OutputStream::writeRepeatedByte (byte, numBytes); - } -} diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.h b/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.h deleted file mode 100644 index a51d806c51..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileOutputStream.h +++ /dev/null @@ -1,114 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILEOUTPUTSTREAM_BEASTHEADER -#define BEAST_FILEOUTPUTSTREAM_BEASTHEADER - -#include "beast_File.h" -#include "../streams/beast_OutputStream.h" - - -//============================================================================== -/** - An output stream that writes into a local file. - - @see OutputStream, FileInputStream, File::createOutputStream -*/ -class BEAST_API FileOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates a FileOutputStream. - - If the file doesn't exist, it will first be created. If the file can't be - created or opened, the failedToOpen() method will return - true. - - If the file already exists when opened, the stream's write-postion will - be set to the end of the file. To overwrite an existing file, - use File::deleteFile() before opening the stream, or use setPosition(0) - after it's opened (although this won't truncate the file). - - @see TemporaryFile - */ - FileOutputStream (const File& fileToWriteTo, - int bufferSizeToUse = 16384); - - /** Destructor. */ - ~FileOutputStream(); - - //============================================================================== - /** Returns the file that this stream is writing to. - */ - const File& getFile() const { return file; } - - /** Returns the status of the file stream. - The result will be ok if the file opened successfully. If an error occurs while - opening or writing to the file, this will contain an error message. - */ - const Result& getStatus() const noexcept { return status; } - - /** Returns true if the stream couldn't be opened for some reason. - @see getResult() - */ - bool failedToOpen() const noexcept { return status.failed(); } - - /** Returns true if the stream opened without problems. - @see getResult() - */ - bool openedOk() const noexcept { return status.wasOk(); } - - /** Attempts to truncate the file to the current write position. - To truncate a file to a specific size, first use setPosition() to seek to the - appropriate location, and then call this method. - */ - Result truncate(); - - //============================================================================== - void flush(); - int64 getPosition(); - bool setPosition (int64 pos); - bool write (const void* data, size_t numBytes); - void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); - - -private: - //============================================================================== - File file; - void* fileHandle; - Result status; - int64 currentPosition; - size_t bufferSize, bytesInBuffer; - HeapBlock buffer; - - void openHandle(); - void closeHandle(); - void flushInternal(); - bool flushBuffer(); - int64 setPositionInternal (int64); - ssize_t writeInternal (const void*, size_t); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileOutputStream) -}; - -#endif // BEAST_FILEOUTPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.cpp b/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.cpp deleted file mode 100644 index bfef91dd77..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -FileSearchPath::FileSearchPath() -{ -} - -FileSearchPath::FileSearchPath (const String& path) -{ - init (path); -} - -FileSearchPath::FileSearchPath (const FileSearchPath& other) - : directories (other.directories) -{ -} - -FileSearchPath::~FileSearchPath() -{ -} - -FileSearchPath& FileSearchPath::operator= (const String& path) -{ - init (path); - return *this; -} - -void FileSearchPath::init (const String& path) -{ - directories.clear(); - directories.addTokens (path, ";", "\""); - directories.trim(); - directories.removeEmptyStrings(); - - for (int i = directories.size(); --i >= 0;) - directories.set (i, directories[i].unquoted()); -} - -int FileSearchPath::getNumPaths() const -{ - return directories.size(); -} - -File FileSearchPath::operator[] (const int index) const -{ - return File (directories [index]); -} - -String FileSearchPath::toString() const -{ - StringArray directories2 (directories); - for (int i = directories2.size(); --i >= 0;) - if (directories2[i].containsChar (';')) - directories2.set (i, directories2[i].quoted()); - - return directories2.joinIntoString (";"); -} - -void FileSearchPath::add (const File& dir, const int insertIndex) -{ - directories.insert (insertIndex, dir.getFullPathName()); -} - -void FileSearchPath::addIfNotAlreadyThere (const File& dir) -{ - for (int i = 0; i < directories.size(); ++i) - if (File (directories[i]) == dir) - return; - - add (dir); -} - -void FileSearchPath::remove (const int index) -{ - directories.remove (index); -} - -void FileSearchPath::addPath (const FileSearchPath& other) -{ - for (int i = 0; i < other.getNumPaths(); ++i) - addIfNotAlreadyThere (other[i]); -} - -void FileSearchPath::removeRedundantPaths() -{ - for (int i = directories.size(); --i >= 0;) - { - const File d1 (directories[i]); - - for (int j = directories.size(); --j >= 0;) - { - const File d2 (directories[j]); - - if ((i != j) && (d1.isAChildOf (d2) || d1 == d2)) - { - directories.remove (i); - break; - } - } - } -} - -void FileSearchPath::removeNonExistentPaths() -{ - for (int i = directories.size(); --i >= 0;) - if (! File (directories[i]).isDirectory()) - directories.remove (i); -} - -int FileSearchPath::findChildFiles (Array& results, - const int whatToLookFor, - const bool searchRecursively, - const String& wildCardPattern) const -{ - int total = 0; - - for (int i = 0; i < directories.size(); ++i) - total += operator[] (i).findChildFiles (results, - whatToLookFor, - searchRecursively, - wildCardPattern); - - return total; -} - -bool FileSearchPath::isFileInPath (const File& fileToCheck, - const bool checkRecursively) const -{ - for (int i = directories.size(); --i >= 0;) - { - const File d (directories[i]); - - if (checkRecursively) - { - if (fileToCheck.isAChildOf (d)) - return true; - } - else - { - if (fileToCheck.getParentDirectory() == d) - return true; - } - } - - return false; -} diff --git a/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.h b/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.h deleted file mode 100644 index 334b0a94de..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_FileSearchPath.h +++ /dev/null @@ -1,164 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILESEARCHPATH_BEASTHEADER -#define BEAST_FILESEARCHPATH_BEASTHEADER - -#include "beast_File.h" -#include "../text/beast_StringArray.h" - - -//============================================================================== -/** - Encapsulates a set of folders that make up a search path. - - @see File -*/ -class BEAST_API FileSearchPath -{ -public: - //============================================================================== - /** Creates an empty search path. */ - FileSearchPath(); - - /** Creates a search path from a string of pathnames. - - The path can be semicolon- or comma-separated, e.g. - "/foo/bar;/foo/moose;/fish/moose" - - The separate folders are tokenised and added to the search path. - */ - FileSearchPath (const String& path); - - /** Creates a copy of another search path. */ - FileSearchPath (const FileSearchPath& other); - - /** Destructor. */ - ~FileSearchPath(); - - /** Uses a string containing a list of pathnames to re-initialise this list. - - This search path is cleared and the semicolon- or comma-separated folders - in this string are added instead. e.g. "/foo/bar;/foo/moose;/fish/moose" - */ - FileSearchPath& operator= (const String& path); - - //============================================================================== - /** Returns the number of folders in this search path. - - @see operator[] - */ - int getNumPaths() const; - - /** Returns one of the folders in this search path. - - The file returned isn't guaranteed to actually be a valid directory. - - @see getNumPaths - */ - File operator[] (int index) const; - - /** Returns the search path as a semicolon-separated list of directories. */ - String toString() const; - - //============================================================================== - /** Adds a new directory to the search path. - - The new directory is added to the end of the list if the insertIndex parameter is - less than zero, otherwise it is inserted at the given index. - */ - void add (const File& directoryToAdd, - int insertIndex = -1); - - /** Adds a new directory to the search path if it's not already in there. */ - void addIfNotAlreadyThere (const File& directoryToAdd); - - /** Removes a directory from the search path. */ - void remove (int indexToRemove); - - /** Merges another search path into this one. - - This will remove any duplicate directories. - */ - void addPath (const FileSearchPath& other); - - /** Removes any directories that are actually subdirectories of one of the other directories in the search path. - - If the search is intended to be recursive, there's no point having nested folders in the search - path, because they'll just get searched twice and you'll get duplicate results. - - e.g. if the path is "c:\abc\de;c:\abc", this method will simplify it to "c:\abc" - */ - void removeRedundantPaths(); - - /** Removes any directories that don't actually exist. */ - void removeNonExistentPaths(); - - //============================================================================== - /** Searches the path for a wildcard. - - This will search all the directories in the search path in order, adding any - matching files to the results array. - - @param results an array to append the results to - @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying whether to - return files, directories, or both. - @param searchRecursively whether to recursively search the subdirectories too - @param wildCardPattern a pattern to match against the filenames - @returns the number of files added to the array - @see File::findChildFiles - */ - int findChildFiles (Array& results, - int whatToLookFor, - bool searchRecursively, - const String& wildCardPattern = "*") const; - - //============================================================================== - /** Finds out whether a file is inside one of the path's directories. - - This will return true if the specified file is a child of one of the - directories specified by this path. Note that this doesn't actually do any - searching or check that the files exist - it just looks at the pathnames - to work out whether the file would be inside a directory. - - @param fileToCheck the file to look for - @param checkRecursively if true, then this will return true if the file is inside a - subfolder of one of the path's directories (at any depth). If false - it will only return true if the file is actually a direct child - of one of the directories. - @see File::isAChildOf - - */ - bool isFileInPath (const File& fileToCheck, - bool checkRecursively) const; - -private: - //============================================================================== - StringArray directories; - - void init (const String& path); - - BEAST_LEAK_DETECTOR (FileSearchPath) -}; - -#endif // BEAST_FILESEARCHPATH_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_MemoryMappedFile.h b/Subtrees/beast/modules/beast_core/files/beast_MemoryMappedFile.h deleted file mode 100644 index 0c20619b8a..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_MemoryMappedFile.h +++ /dev/null @@ -1,111 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORYMAPPEDFILE_BEASTHEADER -#define BEAST_MEMORYMAPPEDFILE_BEASTHEADER - -#include "beast_File.h" - -//============================================================================== -/** - Maps a file into virtual memory for easy reading and/or writing. -*/ -class BEAST_API MemoryMappedFile -{ -public: - /** The read/write flags used when opening a memory mapped file. */ - enum AccessMode - { - readOnly, /**< Indicates that the memory can only be read. */ - readWrite /**< Indicates that the memory can be read and written to - changes that are - made will be flushed back to disk at the whim of the OS. */ - }; - - /** Opens a file and maps it to an area of virtual memory. - - The file should already exist, and should already be the size that you want to work with - when you call this. If the file is resized after being opened, the behaviour is undefined. - - If the file exists and the operation succeeds, the getData() and getSize() methods will - return the location and size of the data that can be read or written. Note that the entire - file is not read into memory immediately - the OS simply creates a virtual mapping, which - will lazily pull the data into memory when blocks are accessed. - - If the file can't be opened for some reason, the getData() method will return a null pointer. - */ - MemoryMappedFile (const File& file, AccessMode mode); - - /** Opens a section of a file and maps it to an area of virtual memory. - - The file should already exist, and should already be the size that you want to work with - when you call this. If the file is resized after being opened, the behaviour is undefined. - - If the file exists and the operation succeeds, the getData() and getSize() methods will - return the location and size of the data that can be read or written. Note that the entire - file is not read into memory immediately - the OS simply creates a virtual mapping, which - will lazily pull the data into memory when blocks are accessed. - - If the file can't be opened for some reason, the getData() method will return a null pointer. - - NOTE: the start of the actual range used may be rounded-down to a multiple of the OS's page-size, - so do not assume that the mapped memory will begin at exactly the position you requested - always - use getRange() to check the actual range that is being used. - */ - MemoryMappedFile (const File& file, - const Range& fileRange, - AccessMode mode); - - /** Destructor. */ - ~MemoryMappedFile(); - - /** Returns the address at which this file has been mapped, or a null pointer if - the file couldn't be successfully mapped. - */ - void* getData() const noexcept { return address; } - - /** Returns the number of bytes of data that are available for reading or writing. - This will normally be the size of the file. - */ - size_t getSize() const noexcept { return (size_t) range.getLength(); } - - /** Returns the section of the file at which the mapped memory represents. */ - Range getRange() const noexcept { return range; } - -private: - //============================================================================== - void* address; - Range range; - - #if BEAST_WINDOWS - void* fileHandle; - #else - int fileHandle; - #endif - - void openInternal (const File&, AccessMode); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedFile) -}; - - -#endif // BEAST_MEMORYMAPPEDFILE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.cpp b/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.cpp deleted file mode 100644 index 561d2c16cf..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.cpp +++ /dev/null @@ -1,112 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -static File createTempFile (const File& parentDirectory, String name, - const String& suffix, const int optionFlags) -{ - if ((optionFlags & TemporaryFile::useHiddenFile) != 0) - name = "." + name; - - return parentDirectory.getNonexistentChildFile (name, suffix, (optionFlags & TemporaryFile::putNumbersInBrackets) != 0); -} - -TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags) - : temporaryFile (createTempFile (File::getSpecialLocation (File::tempDirectory), - "temp_" + String::toHexString (Random::getSystemRandom().nextInt()), - suffix, optionFlags)) -{ -} - -TemporaryFile::TemporaryFile (const File& target, const int optionFlags) - : temporaryFile (createTempFile (target.getParentDirectory(), - target.getFileNameWithoutExtension() - + "_temp" + String::toHexString (Random::getSystemRandom().nextInt()), - target.getFileExtension(), optionFlags)), - targetFile (target) -{ - // If you use this constructor, you need to give it a valid target file! - bassert (targetFile != File::nonexistent); -} - -TemporaryFile::TemporaryFile (const File& target, const File& temporary) - : temporaryFile (temporary), targetFile (target) -{ -} - -TemporaryFile::~TemporaryFile() -{ - if (! deleteTemporaryFile()) - { - /* Failed to delete our temporary file! The most likely reason for this would be - that you've not closed an output stream that was being used to write to file. - - If you find that something beyond your control is changing permissions on - your temporary files and preventing them from being deleted, you may want to - call TemporaryFile::deleteTemporaryFile() to detect those error cases and - handle them appropriately. - */ - bassertfalse; - } -} - -//============================================================================== -bool TemporaryFile::overwriteTargetFileWithTemporary() const -{ - // This method only works if you created this object with the constructor - // that takes a target file! - bassert (targetFile != File::nonexistent); - - if (temporaryFile.exists()) - { - // Have a few attempts at overwriting the file before giving up.. - for (int i = 5; --i >= 0;) - { - if (temporaryFile.moveFileTo (targetFile)) - return true; - - Thread::sleep (100); - } - } - else - { - // There's no temporary file to use. If your write failed, you should - // probably check, and not bother calling this method. - bassertfalse; - } - - return false; -} - -bool TemporaryFile::deleteTemporaryFile() const -{ - // Have a few attempts at deleting the file before giving up.. - for (int i = 5; --i >= 0;) - { - if (temporaryFile.deleteFile()) - return true; - - Thread::sleep (50); - } - - return false; -} diff --git a/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.h b/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.h deleted file mode 100644 index bdc9a67284..0000000000 --- a/Subtrees/beast/modules/beast_core/files/beast_TemporaryFile.h +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_TEMPORARYFILE_BEASTHEADER -#define BEAST_TEMPORARYFILE_BEASTHEADER - -#include "beast_File.h" - - -//============================================================================== -/** - Manages a temporary file, which will be deleted when this object is deleted. - - This object is intended to be used as a stack based object, using its scope - to make sure the temporary file isn't left lying around. - - For example: - - @code - { - File myTargetFile ("~/myfile.txt"); - - // this will choose a file called something like "~/myfile_temp239348.txt" - // which definitely doesn't exist at the time the constructor is called. - TemporaryFile temp (myTargetFile); - - // create a stream to the temporary file, and write some data to it... - ScopedPointer out (temp.getFile().createOutputStream()); - - if (out != nullptr) - { - out->write ( ...etc ) - out = nullptr; // (deletes the stream) - - // ..now we've finished writing, this will rename the temp file to - // make it replace the target file we specified above. - bool succeeded = temp.overwriteTargetFileWithTemporary(); - } - - // ..and even if something went wrong and our overwrite failed, - // as the TemporaryFile object goes out of scope here, it'll make sure - // that the temp file gets deleted. - } - @endcode - - @see File, FileOutputStream -*/ -class BEAST_API TemporaryFile -{ -public: - //============================================================================== - enum OptionFlags - { - useHiddenFile = 1, /**< Indicates that the temporary file should be hidden - - i.e. its name should start with a dot. */ - putNumbersInBrackets = 2 /**< Indicates that when numbers are appended to make sure - the file is unique, they should go in brackets rather - than just being appended (see File::getNonexistentSibling() )*/ - }; - - //============================================================================== - /** Creates a randomly-named temporary file in the default temp directory. - - @param suffix a file suffix to use for the file - @param optionFlags a combination of the values listed in the OptionFlags enum - The file will not be created until you write to it. And remember that when - this object is deleted, the file will also be deleted! - */ - TemporaryFile (const String& suffix = String::empty, - int optionFlags = 0); - - /** Creates a temporary file in the same directory as a specified file. - - This is useful if you have a file that you want to overwrite, but don't - want to harm the original file if the write operation fails. You can - use this to create a temporary file next to the target file, then - write to the temporary file, and finally use overwriteTargetFileWithTemporary() - to replace the target file with the one you've just written. - - This class won't create any files until you actually write to them. And remember - that when this object is deleted, the temporary file will also be deleted! - - @param targetFile the file that you intend to overwrite - the temporary - file will be created in the same directory as this - @param optionFlags a combination of the values listed in the OptionFlags enum - */ - TemporaryFile (const File& targetFile, - int optionFlags = 0); - - /** Creates a temporary file using an explicit filename. - The other constructors are a better choice than this one, unless for some reason - you need to explicitly specify the temporary file you want to use. - - @param targetFile the file that you intend to overwrite - @param temporaryFile the temporary file to be used - */ - TemporaryFile (const File& targetFile, - const File& temporaryFile); - - /** Destructor. - - When this object is deleted it will make sure that its temporary file is - also deleted! If the operation fails, it'll throw an assertion in debug - mode. - */ - ~TemporaryFile(); - - //============================================================================== - /** Returns the temporary file. */ - const File& getFile() const noexcept { return temporaryFile; } - - /** Returns the target file that was specified in the constructor. */ - const File& getTargetFile() const noexcept { return targetFile; } - - /** Tries to move the temporary file to overwrite the target file that was - specified in the constructor. - - If you used the constructor that specified a target file, this will attempt - to replace that file with the temporary one. - - Before calling this, make sure: - - that you've actually written to the temporary file - - that you've closed any open streams that you were using to write to it - - and that you don't have any streams open to the target file, which would - prevent it being overwritten - - If the file move succeeds, this returns false, and the temporary file will - have disappeared. If it fails, the temporary file will probably still exist, - but will be deleted when this object is destroyed. - */ - bool overwriteTargetFileWithTemporary() const; - - /** Attempts to delete the temporary file, if it exists. - @returns true if the file is successfully deleted (or if it didn't exist). - */ - bool deleteTemporaryFile() const; - - -private: - //============================================================================== - const File temporaryFile, targetFile; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TemporaryFile) -}; - -#endif // BEAST_TEMPORARYFILE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/json/beast_JSON.cpp b/Subtrees/beast/modules/beast_core/json/beast_JSON.cpp deleted file mode 100644 index 268deb8cb5..0000000000 --- a/Subtrees/beast/modules/beast_core/json/beast_JSON.cpp +++ /dev/null @@ -1,645 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class JSONParser -{ -public: - static Result parseObjectOrArray (String::CharPointerType t, var& result) - { - t = t.findEndOfWhitespace(); - - switch (t.getAndAdvance()) - { - case 0: result = var::null; return Result::ok(); - case '{': return parseObject (t, result); - case '[': return parseArray (t, result); - } - - return createFail ("Expected '{' or '['", &t); - } - -private: - static Result parseAny (String::CharPointerType& t, var& result) - { - t = t.findEndOfWhitespace(); - String::CharPointerType t2 (t); - - switch (t2.getAndAdvance()) - { - case '{': t = t2; return parseObject (t, result); - case '[': t = t2; return parseArray (t, result); - case '"': t = t2; return parseString (t, result); - - case '-': - t2 = t2.findEndOfWhitespace(); - if (! CharacterFunctions::isDigit (*t2)) - break; - - t = t2; - return parseNumber (t, result, true); - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return parseNumber (t, result, false); - - case 't': // "true" - if (t2.getAndAdvance() == 'r' && t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'e') - { - t = t2; - result = var (true); - return Result::ok(); - } - break; - - case 'f': // "false" - if (t2.getAndAdvance() == 'a' && t2.getAndAdvance() == 'l' - && t2.getAndAdvance() == 's' && t2.getAndAdvance() == 'e') - { - t = t2; - result = var (false); - return Result::ok(); - } - break; - - case 'n': // "null" - if (t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'l' && t2.getAndAdvance() == 'l') - { - t = t2; - result = var::null; - return Result::ok(); - } - break; - - default: - break; - } - - return createFail ("Syntax error", &t); - } - - static Result createFail (const char* const message, const String::CharPointerType* location = nullptr) - { - String m (message); - if (location != nullptr) - m << ": \"" << String (*location, 20) << '"'; - - return Result::fail (m); - } - - static Result parseNumber (String::CharPointerType& t, var& result, const bool isNegative) - { - String::CharPointerType oldT (t); - - int64 intValue = t.getAndAdvance() - '0'; - bassert (intValue >= 0 && intValue < 10); - - for (;;) - { - String::CharPointerType previousChar (t); - const beast_wchar c = t.getAndAdvance(); - const int digit = ((int) c) - '0'; - - if (isPositiveAndBelow (digit, 10)) - { - intValue = intValue * 10 + digit; - continue; - } - - if (c == 'e' || c == 'E' || c == '.') - { - t = oldT; - const double asDouble = CharacterFunctions::readDoubleValue (t); - result = isNegative ? -asDouble : asDouble; - return Result::ok(); - } - - if (CharacterFunctions::isWhitespace (c) - || c == ',' || c == '}' || c == ']' || c == 0) - { - t = previousChar; - break; - } - - return createFail ("Syntax error in number", &oldT); - } - - const int64 correctedValue = isNegative ? -intValue : intValue; - - if ((intValue >> 31) != 0) - result = correctedValue; - else - result = (int) correctedValue; - - return Result::ok(); - } - - static Result parseObject (String::CharPointerType& t, var& result) - { - DynamicObject* const resultObject = new DynamicObject(); - result = resultObject; - NamedValueSet& resultProperties = resultObject->getProperties(); - - for (;;) - { - t = t.findEndOfWhitespace(); - - String::CharPointerType oldT (t); - const beast_wchar c = t.getAndAdvance(); - - if (c == '}') - break; - - if (c == 0) - return createFail ("Unexpected end-of-input in object declaration"); - - if (c == '"') - { - var propertyNameVar; - Result r (parseString (t, propertyNameVar)); - - if (r.failed()) - return r; - - const String propertyName (propertyNameVar.toString()); - - if (propertyName.isNotEmpty()) - { - t = t.findEndOfWhitespace(); - oldT = t; - - const beast_wchar c2 = t.getAndAdvance(); - if (c2 != ':') - return createFail ("Expected ':', but found", &oldT); - - resultProperties.set (propertyName, var::null); - var* propertyValue = resultProperties.getVarPointer (propertyName); - - Result r2 (parseAny (t, *propertyValue)); - - if (r2.failed()) - return r2; - - t = t.findEndOfWhitespace(); - oldT = t; - - const beast_wchar nextChar = t.getAndAdvance(); - - if (nextChar == ',') - continue; - - if (nextChar == '}') - break; - } - } - - return createFail ("Expected object member declaration, but found", &oldT); - } - - return Result::ok(); - } - - static Result parseArray (String::CharPointerType& t, var& result) - { - result = var (Array()); - Array* const destArray = result.getArray(); - - for (;;) - { - t = t.findEndOfWhitespace(); - - String::CharPointerType oldT (t); - const beast_wchar c = t.getAndAdvance(); - - if (c == ']') - break; - - if (c == 0) - return createFail ("Unexpected end-of-input in array declaration"); - - t = oldT; - destArray->add (var::null); - Result r (parseAny (t, destArray->getReference (destArray->size() - 1))); - - if (r.failed()) - return r; - - t = t.findEndOfWhitespace(); - oldT = t; - - const beast_wchar nextChar = t.getAndAdvance(); - - if (nextChar == ',') - continue; - - if (nextChar == ']') - break; - - return createFail ("Expected object array item, but found", &oldT); - } - - return Result::ok(); - } - - static Result parseString (String::CharPointerType& t, var& result) - { - MemoryOutputStream buffer (256); - - for (;;) - { - beast_wchar c = t.getAndAdvance(); - - if (c == '"') - break; - - if (c == '\\') - { - c = t.getAndAdvance(); - - switch (c) - { - case '"': - case '\\': - case '/': break; - - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - - case 'u': - { - c = 0; - - for (int i = 4; --i >= 0;) - { - const int digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); - if (digitValue < 0) - return createFail ("Syntax error in unicode escape sequence"); - - c = (beast_wchar) ((c << 4) + digitValue); - } - - break; - } - } - } - - if (c == 0) - return createFail ("Unexpected end-of-input in string constant"); - - buffer.appendUTF8Char (c); - } - - result = buffer.toString(); - return Result::ok(); - } -}; - -//============================================================================== -class JSONFormatter -{ -public: - static void write (OutputStream& out, const var& v, - const int indentLevel, const bool allOnOneLine) - { - if (v.isString()) - { - writeString (out, v.toString().getCharPointer()); - } - else if (v.isVoid()) - { - out << "null"; - } - else if (v.isBool()) - { - out << (static_cast (v) ? "true" : "false"); - } - else if (v.isArray()) - { - writeArray (out, *v.getArray(), indentLevel, allOnOneLine); - } - else if (v.isObject()) - { - if (DynamicObject* const object = v.getDynamicObject()) - writeObject (out, *object, indentLevel, allOnOneLine); - else - bassertfalse; // Only DynamicObjects can be converted to JSON! - } - else - { - // Can't convert these other types of object to JSON! - bassert (! (v.isMethod() || v.isBinaryData())); - - out << v.toString(); - } - } - -private: - enum { indentSize = 2 }; - - static void writeEscapedChar (OutputStream& out, const unsigned short value) - { - out << "\\u" << String::toHexString ((int) value).paddedLeft ('0', 4); - } - - static void writeString (OutputStream& out, String::CharPointerType t) - { - out << '"'; - - for (;;) - { - const beast_wchar c (t.getAndAdvance()); - - switch (c) - { - case 0: out << '"'; return; - - case '\"': out << "\\\""; break; - case '\\': out << "\\\\"; break; - case '\b': out << "\\b"; break; - case '\f': out << "\\f"; break; - case '\t': out << "\\t"; break; - case '\r': out << "\\r"; break; - case '\n': out << "\\n"; break; - - default: - if (c >= 32 && c < 127) - { - out << (char) c; - } - else - { - if (CharPointer_UTF16::getBytesRequiredFor (c) > 2) - { - CharPointer_UTF16::CharType chars[2]; - CharPointer_UTF16 utf16 (chars); - utf16.write (c); - - for (int i = 0; i < 2; ++i) - writeEscapedChar (out, (unsigned short) chars[i]); - } - else - { - writeEscapedChar (out, (unsigned short) c); - } - } - - break; - } - } - } - - static void writeSpaces (OutputStream& out, int numSpaces) - { - out.writeRepeatedByte (' ', (size_t) numSpaces); - } - - static void writeArray (OutputStream& out, const Array& array, - const int indentLevel, const bool allOnOneLine) - { - out << '['; - if (! allOnOneLine) - out << newLine; - - for (int i = 0; i < array.size(); ++i) - { - if (! allOnOneLine) - writeSpaces (out, indentLevel + indentSize); - - write (out, array.getReference(i), indentLevel + indentSize, allOnOneLine); - - if (i < array.size() - 1) - { - if (allOnOneLine) - out << ", "; - else - out << ',' << newLine; - } - else if (! allOnOneLine) - out << newLine; - } - - if (! allOnOneLine) - writeSpaces (out, indentLevel); - - out << ']'; - } - - static void writeObject (OutputStream& out, DynamicObject& object, - const int indentLevel, const bool allOnOneLine) - { - NamedValueSet& props = object.getProperties(); - - out << '{'; - if (! allOnOneLine) - out << newLine; - - LinkedListPointer* i = &(props.values); - - for (;;) - { - NamedValueSet::NamedValue* const v = i->get(); - - if (v == nullptr) - break; - - if (! allOnOneLine) - writeSpaces (out, indentLevel + indentSize); - - writeString (out, v->name); - out << ": "; - write (out, v->value, indentLevel + indentSize, allOnOneLine); - - if (v->nextListItem.get() != nullptr) - { - if (allOnOneLine) - out << ", "; - else - out << ',' << newLine; - } - else if (! allOnOneLine) - out << newLine; - - i = &(v->nextListItem); - } - - if (! allOnOneLine) - writeSpaces (out, indentLevel); - - out << '}'; - } -}; - -//============================================================================== -var JSON::parse (const String& text) -{ - var result; - - if (! JSONParser::parseObjectOrArray (text.getCharPointer(), result)) - result = var::null; - - return result; -} - -var JSON::parse (InputStream& input) -{ - return parse (input.readEntireStreamAsString()); -} - -var JSON::parse (const File& file) -{ - return parse (file.loadFileAsString()); -} - -Result JSON::parse (const String& text, var& result) -{ - return JSONParser::parseObjectOrArray (text.getCharPointer(), result); -} - -String JSON::toString (const var& data, const bool allOnOneLine) -{ - MemoryOutputStream mo (1024); - JSONFormatter::write (mo, data, 0, allOnOneLine); - return mo.toString(); -} - -void JSON::writeToStream (OutputStream& output, const var& data, const bool allOnOneLine) -{ - JSONFormatter::write (output, data, 0, allOnOneLine); -} - -//============================================================================== -//============================================================================== -#if BEAST_UNIT_TESTS - -class JSONTests : public UnitTest -{ -public: - JSONTests() : UnitTest ("JSON") {} - - static String createRandomWideCharString (Random& r) - { - beast_wchar buffer[40] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (beast_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (beast_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } - - static String createRandomIdentifier (Random& r) - { - char buffer[30] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - static const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:"; - buffer[i] = chars [r.nextInt (sizeof (chars) - 1)]; - } - - return CharPointer_ASCII (buffer); - } - - static var createRandomVar (Random& r, int depth) - { - switch (r.nextInt (depth > 3 ? 6 : 8)) - { - case 0: return var::null; - case 1: return r.nextInt(); - case 2: return r.nextInt64(); - case 3: return r.nextBool(); - case 4: return r.nextDouble(); - case 5: return createRandomWideCharString (r); - - case 6: - { - var v (createRandomVar (r, depth + 1)); - - for (int i = 1 + r.nextInt (30); --i >= 0;) - v.append (createRandomVar (r, depth + 1)); - - return v; - } - - case 7: - { - DynamicObject* o = new DynamicObject(); - - for (int i = r.nextInt (30); --i >= 0;) - o->setProperty (createRandomIdentifier (r), createRandomVar (r, depth + 1)); - - return o; - } - - default: - return var::null; - } - } - - void runTest() - { - beginTest ("JSON"); - Random r; - r.setSeedRandomly(); - - expect (JSON::parse (String::empty) == var::null); - expect (JSON::parse ("{}").isObject()); - expect (JSON::parse ("[]").isArray()); - expect (JSON::parse ("[ 1234 ]")[0].isInt()); - expect (JSON::parse ("[ 12345678901234 ]")[0].isInt64()); - expect (JSON::parse ("[ 1.123e3 ]")[0].isDouble()); - expect (JSON::parse ("[ -1234]")[0].isInt()); - expect (JSON::parse ("[-12345678901234]")[0].isInt64()); - expect (JSON::parse ("[-1.123e3]")[0].isDouble()); - - for (int i = 100; --i >= 0;) - { - var v; - - if (i > 0) - v = createRandomVar (r, 0); - - const bool oneLine = r.nextBool(); - String asString (JSON::toString (v, oneLine)); - var parsed = JSON::parse ("[" + asString + "]")[0]; - String parsedString (JSON::toString (parsed, oneLine)); - expect (asString.isNotEmpty() && parsedString == asString); - } - } -}; - -static JSONTests JSONUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/json/beast_JSON.h b/Subtrees/beast/modules/beast_core/json/beast_JSON.h deleted file mode 100644 index f1799d434a..0000000000 --- a/Subtrees/beast/modules/beast_core/json/beast_JSON.h +++ /dev/null @@ -1,113 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_JSON_BEASTHEADER -#define BEAST_JSON_BEASTHEADER - -#include "../misc/beast_Result.h" -#include "../containers/beast_Variant.h" -class InputStream; -class OutputStream; -class File; - - -//============================================================================== -/** - Contains static methods for converting JSON-formatted text to and from var objects. - - The var class is structurally compatible with JSON-formatted data, so these - functions allow you to parse JSON into a var object, and to convert a var - object to JSON-formatted text. - - @see var -*/ -class BEAST_API JSON -{ -public: - //============================================================================== - /** Parses a string of JSON-formatted text, and returns a result code containing - any parse errors. - - This will return the parsed structure in the parsedResult parameter, and will - return a Result object to indicate whether parsing was successful, and if not, - it will contain an error message. - - If you're not interested in the error message, you can use one of the other - shortcut parse methods, which simply return a var::null if the parsing fails. - */ - static Result parse (const String& text, var& parsedResult); - - /** Attempts to parse some JSON-formatted text, and returns the result as a var object. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - */ - static var parse (const String& text); - - /** Attempts to parse some JSON-formatted text from a file, and returns the result - as a var object. - - Note that this is just a short-cut for reading the entire file into a string and - parsing the result. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - */ - static var parse (const File& file); - - /** Attempts to parse some JSON-formatted text from a stream, and returns the result - as a var object. - - Note that this is just a short-cut for reading the entire stream into a string and - parsing the result. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - */ - static var parse (InputStream& input); - - //============================================================================== - /** Returns a string which contains a JSON-formatted representation of the var object. - If allOnOneLine is true, the result will be compacted into a single line of text - with no carriage-returns. If false, it will be laid-out in a more human-readable format. - @see writeToStream - */ - static String toString (const var& objectToFormat, - bool allOnOneLine = false); - - /** Writes a JSON-formatted representation of the var object to the given stream. - If allOnOneLine is true, the result will be compacted into a single line of text - with no carriage-returns. If false, it will be laid-out in a more human-readable format. - @see toString - */ - static void writeToStream (OutputStream& output, - const var& objectToFormat, - bool allOnOneLine = false); - -private: - //============================================================================== - JSON(); // This class can't be instantiated - just use its static methods. -}; - - -#endif // BEAST_JSON_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.cpp b/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.cpp deleted file mode 100644 index fa19b3afe8..0000000000 --- a/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.cpp +++ /dev/null @@ -1,129 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -FileLogger::FileLogger (const File& file, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes) - : logFile (file) -{ - if (maxInitialFileSizeBytes >= 0) - trimFileSize (maxInitialFileSizeBytes); - - if (! file.exists()) - file.create(); // (to create the parent directories) - - String welcome; - welcome << newLine - << "**********************************************************" << newLine - << welcomeMessage << newLine - << "Log started: " << Time::getCurrentTime().toString (true, true) << newLine; - - FileLogger::logMessage (welcome); -} - -FileLogger::~FileLogger() {} - -//============================================================================== -void FileLogger::logMessage (const String& message) -{ - const ScopedLock sl (logLock); - DBG (message); - FileOutputStream out (logFile, 256); - out << message << newLine; -} - -void FileLogger::trimFileSize (int64 maxFileSizeBytes) const -{ - if (maxFileSizeBytes <= 0) - { - logFile.deleteFile(); - } - else - { - const int64 fileSize = logFile.getSize(); - - if (fileSize > maxFileSizeBytes) - { - TemporaryFile tempFile (logFile); - - { - FileOutputStream out (tempFile.getFile()); - FileInputStream in (logFile); - - if (! (out.openedOk() && in.openedOk())) - return; - - in.setPosition (fileSize - maxFileSizeBytes); - - for (;;) - { - const char c = in.readByte(); - if (c == 0) - return; - - if (c == '\n' || c == '\r') - { - out << c; - break; - } - } - - out.writeFromInputStream (in, -1); - } - - tempFile.overwriteTargetFileWithTemporary(); - } - } -} - -//============================================================================== -File FileLogger::getSystemLogFileFolder() -{ - #if BEAST_MAC - return File ("~/Library/Logs"); - #else - return File::getSpecialLocation (File::userApplicationDataDirectory); - #endif -} - -FileLogger* FileLogger::createDefaultAppLogger (const String& logFileSubDirectoryName, - const String& logFileName, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes) -{ - return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName) - .getChildFile (logFileName), - welcomeMessage, maxInitialFileSizeBytes); -} - -FileLogger* FileLogger::createDateStampedLogger (const String& logFileSubDirectoryName, - const String& logFileNameRoot, - const String& logFileNameSuffix, - const String& welcomeMessage) -{ - return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName) - .getChildFile (logFileNameRoot + Time::getCurrentTime().formatted ("%Y-%m-%d_%H-%M-%S")) - .withFileExtension (logFileNameSuffix) - .getNonexistentSibling(), - welcomeMessage, 0); -} diff --git a/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.h b/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.h deleted file mode 100644 index be3ae39963..0000000000 --- a/Subtrees/beast/modules/beast_core/logging/beast_FileLogger.h +++ /dev/null @@ -1,134 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILELOGGER_BEASTHEADER -#define BEAST_FILELOGGER_BEASTHEADER - -#include "beast_Logger.h" -#include "../files/beast_File.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - A simple implementation of a Logger that writes to a file. - - @see Logger -*/ -class BEAST_API FileLogger : public Logger -{ -public: - //============================================================================== - /** Creates a FileLogger for a given file. - - @param fileToWriteTo the file that to use - new messages will be appended - to the file. If the file doesn't exist, it will be created, - along with any parent directories that are needed. - @param welcomeMessage when opened, the logger will write a header to the log, along - with the current date and time, and this welcome message - @param maxInitialFileSizeBytes if this is zero or greater, then if the file already exists - but is larger than this number of bytes, then the start of the - file will be truncated to keep the size down. This prevents a log - file getting ridiculously large over time. The file will be truncated - at a new-line boundary. If this value is less than zero, no size limit - will be imposed; if it's zero, the file will always be deleted. Note that - the size is only checked once when this object is created - any logging - that is done later will be appended without any checking - */ - FileLogger (const File& fileToWriteTo, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes = 128 * 1024); - - /** Destructor. */ - ~FileLogger(); - - //============================================================================== - /** Returns the file that this logger is writing to. */ - const File& getLogFile() const noexcept { return logFile; } - - //============================================================================== - /** Helper function to create a log file in the correct place for this platform. - - The method might return nullptr if the file can't be created for some reason. - - @param logFileSubDirectoryName the name of the subdirectory to create inside the logs folder (as - returned by getSystemLogFileFolder). It's best to use something - like the name of your application here. - @param logFileName the name of the file to create, e.g. "MyAppLog.txt". - @param welcomeMessage a message that will be written to the log when it's opened. - @param maxInitialFileSizeBytes (see the FileLogger constructor for more info on this) - */ - static FileLogger* createDefaultAppLogger (const String& logFileSubDirectoryName, - const String& logFileName, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes = 128 * 1024); - - /** Helper function to create a log file in the correct place for this platform. - - The filename used is based on the root and suffix strings provided, along with a - time and date string, meaning that a new, empty log file will be always be created - rather than appending to an exising one. - - The method might return nullptr if the file can't be created for some reason. - - @param logFileSubDirectoryName the name of the subdirectory to create inside the logs folder (as - returned by getSystemLogFileFolder). It's best to use something - like the name of your application here. - @param logFileNameRoot the start of the filename to use, e.g. "MyAppLog_". This will have - a timestamp and the logFileNameSuffix appended to it - @param logFileNameSuffix the file suffix to use, e.g. ".txt" - @param welcomeMessage a message that will be written to the log when it's opened. - */ - static FileLogger* createDateStampedLogger (const String& logFileSubDirectoryName, - const String& logFileNameRoot, - const String& logFileNameSuffix, - const String& welcomeMessage); - - //============================================================================== - /** Returns an OS-specific folder where log-files should be stored. - - On Windows this will return a logger with a path such as: - c:\\Documents and Settings\\username\\Application Data\\[logFileSubDirectoryName]\\[logFileName] - - On the Mac it'll create something like: - ~/Library/Logs/[logFileSubDirectoryName]/[logFileName] - - @see createDefaultAppLogger - */ - static File getSystemLogFileFolder(); - - // (implementation of the Logger virtual method) - void logMessage (const String&); - -private: - //============================================================================== - File logFile; - CriticalSection logLock; - - void trimFileSize (int64 maxFileSizeBytes) const; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileLogger) -}; - - -#endif // BEAST_FILELOGGER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/logging/beast_Logger.cpp b/Subtrees/beast/modules/beast_core/logging/beast_Logger.cpp deleted file mode 100644 index d8ac98e66d..0000000000 --- a/Subtrees/beast/modules/beast_core/logging/beast_Logger.cpp +++ /dev/null @@ -1,58 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Logger::Logger() {} - -Logger::~Logger() -{ - // You're deleting this logger while it's still being used! - // Always call Logger::setCurrentLogger (nullptr) before deleting the active logger. - bassert (currentLogger != this); -} - -Logger* Logger::currentLogger = nullptr; - -void Logger::setCurrentLogger (Logger* const newLogger) noexcept { currentLogger = newLogger; } -Logger* Logger::getCurrentLogger() noexcept { return currentLogger; } - -void Logger::writeToLog (const String& message) -{ - if (currentLogger != nullptr) - currentLogger->logMessage (message); - else - outputDebugString (message); -} - -#if BEAST_LOG_ASSERTIONS || BEAST_DEBUG -void BEAST_API BEAST_CALLTYPE logAssertion (const char* const filename, const int lineNum) noexcept -{ - String m ("BEAST Assertion failure in "); - m << File::createFileWithoutCheckingPath (filename).getFileName() << ':' << lineNum; - - #if BEAST_LOG_ASSERTIONS - Logger::writeToLog (m); - #else - DBG (m); - #endif -} -#endif diff --git a/Subtrees/beast/modules/beast_core/logging/beast_Logger.h b/Subtrees/beast/modules/beast_core/logging/beast_Logger.h deleted file mode 100644 index 203ea209b3..0000000000 --- a/Subtrees/beast/modules/beast_core/logging/beast_Logger.h +++ /dev/null @@ -1,94 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LOGGER_BEASTHEADER -#define BEAST_LOGGER_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** - Acts as an application-wide logging class. - - A subclass of Logger can be created and passed into the Logger::setCurrentLogger - method and this will then be used by all calls to writeToLog. - - The logger class also contains methods for writing messages to the debugger's - output stream. - - @see FileLogger -*/ -class BEAST_API Logger -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~Logger(); - - //============================================================================== - /** Sets the current logging class to use. - - Note that the object passed in will not be owned or deleted by the logger, so - the caller must make sure that it is not deleted while still being used. - A null pointer can be passed-in to disable any logging. - */ - static void BEAST_CALLTYPE setCurrentLogger (Logger* newLogger) noexcept; - - /** Returns the current logger, or nullptr if none has been set. */ - static Logger* getCurrentLogger() noexcept; - - /** Writes a string to the current logger. - - This will pass the string to the logger's logMessage() method if a logger - has been set. - - @see logMessage - */ - static void BEAST_CALLTYPE writeToLog (const String& message); - - - //============================================================================== - /** Writes a message to the standard error stream. - - This can be called directly, or by using the DBG() macro in - beast_PlatformDefs.h (which will avoid calling the method in non-debug builds). - */ - static void BEAST_CALLTYPE outputDebugString (const String& text); - - -protected: - //============================================================================== - Logger(); - - /** This is overloaded by subclasses to implement custom logging behaviour. - @see setCurrentLogger - */ - virtual void logMessage (const String& message) = 0; - -private: - static Logger* currentLogger; -}; - - -#endif // BEAST_LOGGER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.cpp b/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.cpp deleted file mode 100644 index 6da6863b91..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.cpp +++ /dev/null @@ -1,1016 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace -{ - inline size_t bitToIndex (const int bit) noexcept { return (size_t) (bit >> 5); } - inline uint32 bitToMask (const int bit) noexcept { return (uint32) 1 << (bit & 31); } -} - -//============================================================================== -BigInteger::BigInteger() - : numValues (4), - highestBit (-1), - negative (false) -{ - values.calloc (numValues + 1); -} - -BigInteger::BigInteger (const int32 value) - : numValues (4), - highestBit (31), - negative (value < 0) -{ - values.calloc (numValues + 1); - values[0] = (uint32) abs (value); - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (const uint32 value) - : numValues (4), - highestBit (31), - negative (false) -{ - values.calloc (numValues + 1); - values[0] = value; - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (int64 value) - : numValues (4), - highestBit (63), - negative (value < 0) -{ - values.calloc (numValues + 1); - - if (value < 0) - value = -value; - - values[0] = (uint32) value; - values[1] = (uint32) (value >> 32); - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (const BigInteger& other) - : numValues ((size_t) bmax ((size_t) 4, bitToIndex (other.highestBit) + 1)), - highestBit (other.getHighestBit()), - negative (other.negative) -{ - values.malloc (numValues + 1); - memcpy (values, other.values, sizeof (uint32) * (numValues + 1)); -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -BigInteger::BigInteger (BigInteger&& other) noexcept - : values (static_cast &&> (other.values)), - numValues (other.numValues), - highestBit (other.highestBit), - negative (other.negative) -{ -} - -BigInteger& BigInteger::operator= (BigInteger&& other) noexcept -{ - values = static_cast &&> (other.values); - numValues = other.numValues; - highestBit = other.highestBit; - negative = other.negative; - return *this; -} -#endif - -BigInteger::~BigInteger() -{ -} - -void BigInteger::swapWith (BigInteger& other) noexcept -{ - values.swapWith (other.values); - std::swap (numValues, other.numValues); - std::swap (highestBit, other.highestBit); - std::swap (negative, other.negative); -} - -BigInteger& BigInteger::operator= (const BigInteger& other) -{ - if (this != &other) - { - highestBit = other.getHighestBit(); - bassert (other.numValues >= 4); - numValues = (size_t) bmax ((size_t) 4, bitToIndex (highestBit) + 1); - negative = other.negative; - values.malloc (numValues + 1); - memcpy (values, other.values, sizeof (uint32) * (numValues + 1)); - } - - return *this; -} - -void BigInteger::ensureSize (const size_t numVals) -{ - if (numVals + 2 >= numValues) - { - size_t oldSize = numValues; - numValues = ((numVals + 2) * 3) / 2; - values.realloc (numValues + 1); - - while (oldSize < numValues) - values [oldSize++] = 0; - } -} - -//============================================================================== -bool BigInteger::operator[] (const int bit) const noexcept -{ - return bit <= highestBit && bit >= 0 - && ((values [bitToIndex (bit)] & bitToMask (bit)) != 0); -} - -int BigInteger::toInteger() const noexcept -{ - const int n = (int) (values[0] & 0x7fffffff); - return negative ? -n : n; -} - -BigInteger BigInteger::getBitRange (int startBit, int numBits) const -{ - BigInteger r; - numBits = bmin (numBits, getHighestBit() + 1 - startBit); - r.ensureSize ((size_t) bitToIndex (numBits)); - r.highestBit = numBits; - - int i = 0; - while (numBits > 0) - { - r.values[i++] = getBitRangeAsInt (startBit, (int) bmin (32, numBits)); - numBits -= 32; - startBit += 32; - } - - r.highestBit = r.getHighestBit(); - return r; -} - -uint32 BigInteger::getBitRangeAsInt (const int startBit, int numBits) const noexcept -{ - if (numBits > 32) - { - bassertfalse; // use getBitRange() if you need more than 32 bits.. - numBits = 32; - } - - numBits = bmin (numBits, highestBit + 1 - startBit); - - if (numBits <= 0) - return 0; - - const size_t pos = bitToIndex (startBit); - const int offset = startBit & 31; - const int endSpace = 32 - numBits; - - uint32 n = ((uint32) values [pos]) >> offset; - - if (offset > endSpace) - n |= ((uint32) values [pos + 1]) << (32 - offset); - - return n & (((uint32) 0xffffffff) >> endSpace); -} - -void BigInteger::setBitRangeAsInt (const int startBit, int numBits, uint32 valueToSet) -{ - if (numBits > 32) - { - bassertfalse; - numBits = 32; - } - - for (int i = 0; i < numBits; ++i) - { - setBit (startBit + i, (valueToSet & 1) != 0); - valueToSet >>= 1; - } -} - -//============================================================================== -void BigInteger::clear() -{ - if (numValues > 16) - { - numValues = 4; - values.calloc (numValues + 1); - } - else - { - values.clear (numValues + 1); - } - - highestBit = -1; - negative = false; -} - -void BigInteger::setBit (const int bit) -{ - if (bit >= 0) - { - if (bit > highestBit) - { - ensureSize (bitToIndex (bit)); - highestBit = bit; - } - - values [bitToIndex (bit)] |= bitToMask (bit); - } -} - -void BigInteger::setBit (const int bit, const bool shouldBeSet) -{ - if (shouldBeSet) - setBit (bit); - else - clearBit (bit); -} - -void BigInteger::clearBit (const int bit) noexcept -{ - if (bit >= 0 && bit <= highestBit) - values [bitToIndex (bit)] &= ~bitToMask (bit); -} - -void BigInteger::setRange (int startBit, int numBits, const bool shouldBeSet) -{ - while (--numBits >= 0) - setBit (startBit++, shouldBeSet); -} - -void BigInteger::insertBit (const int bit, const bool shouldBeSet) -{ - if (bit >= 0) - shiftBits (1, bit); - - setBit (bit, shouldBeSet); -} - -//============================================================================== -bool BigInteger::isZero() const noexcept -{ - return getHighestBit() < 0; -} - -bool BigInteger::isOne() const noexcept -{ - return getHighestBit() == 0 && ! negative; -} - -bool BigInteger::isNegative() const noexcept -{ - return negative && ! isZero(); -} - -void BigInteger::setNegative (const bool neg) noexcept -{ - negative = neg; -} - -void BigInteger::negate() noexcept -{ - negative = (! negative) && ! isZero(); -} - -#if BEAST_USE_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_BitScanReverse) -#endif - -namespace BitFunctions -{ - inline int countBitsInInt32 (uint32 n) noexcept - { - n -= ((n >> 1) & 0x55555555); - n = (((n >> 2) & 0x33333333) + (n & 0x33333333)); - n = (((n >> 4) + n) & 0x0f0f0f0f); - n += (n >> 8); - n += (n >> 16); - return (int) (n & 0x3f); - } - - inline int highestBitInInt (uint32 n) noexcept - { - bassert (n != 0); // (the built-in functions may not work for n = 0) - - #if BEAST_GCC - return 31 - __builtin_clz (n); - #elif BEAST_USE_INTRINSICS - unsigned long highest; - _BitScanReverse (&highest, n); - return (int) highest; - #else - n |= (n >> 1); - n |= (n >> 2); - n |= (n >> 4); - n |= (n >> 8); - n |= (n >> 16); - return countBitsInInt32 (n >> 1); - #endif - } -} - -int BigInteger::countNumberOfSetBits() const noexcept -{ - int total = 0; - - for (int i = (int) bitToIndex (highestBit) + 1; --i >= 0;) - total += BitFunctions::countBitsInInt32 (values[i]); - - return total; -} - -int BigInteger::getHighestBit() const noexcept -{ - for (int i = (int) bitToIndex (highestBit + 1); i >= 0; --i) - { - const uint32 n = values[i]; - - if (n != 0) - return BitFunctions::highestBitInInt (n) + (i << 5); - } - - return -1; -} - -int BigInteger::findNextSetBit (int i) const noexcept -{ - for (; i <= highestBit; ++i) - if ((values [bitToIndex (i)] & bitToMask (i)) != 0) - return i; - - return -1; -} - -int BigInteger::findNextClearBit (int i) const noexcept -{ - for (; i <= highestBit; ++i) - if ((values [bitToIndex (i)] & bitToMask (i)) == 0) - break; - - return i; -} - -//============================================================================== -BigInteger& BigInteger::operator+= (const BigInteger& other) -{ - if (other.isNegative()) - return operator-= (-other); - - if (isNegative()) - { - if (compareAbsolute (other) < 0) - { - BigInteger temp (*this); - temp.negate(); - *this = other; - operator-= (temp); - } - else - { - negate(); - operator-= (other); - negate(); - } - } - else - { - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - ++highestBit; - - const size_t numInts = bitToIndex (highestBit) + 1; - ensureSize (numInts); - - int64 remainder = 0; - - for (size_t i = 0; i <= numInts; ++i) - { - if (i < numValues) - remainder += values[i]; - - if (i < other.numValues) - remainder += other.values[i]; - - values[i] = (uint32) remainder; - remainder >>= 32; - } - - bassert (remainder == 0); - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator-= (const BigInteger& other) -{ - if (other.isNegative()) - return operator+= (-other); - - if (! isNegative()) - { - if (compareAbsolute (other) < 0) - { - BigInteger temp (other); - swapWith (temp); - operator-= (temp); - negate(); - return *this; - } - } - else - { - negate(); - operator+= (other); - negate(); - return *this; - } - - const size_t numInts = bitToIndex (highestBit) + 1; - const size_t maxOtherInts = bitToIndex (other.highestBit) + 1; - int64 amountToSubtract = 0; - - for (size_t i = 0; i <= numInts; ++i) - { - if (i <= maxOtherInts) - amountToSubtract += (int64) other.values[i]; - - if (values[i] >= amountToSubtract) - { - values[i] = (uint32) (values[i] - amountToSubtract); - amountToSubtract = 0; - } - else - { - const int64 n = ((int64) values[i] + (((int64) 1) << 32)) - amountToSubtract; - values[i] = (uint32) n; - amountToSubtract = 1; - } - } - - return *this; -} - -BigInteger& BigInteger::operator*= (const BigInteger& other) -{ - BigInteger total; - highestBit = getHighestBit(); - const bool wasNegative = isNegative(); - setNegative (false); - - for (int i = 0; i <= highestBit; ++i) - { - if (operator[](i)) - { - BigInteger n (other); - n.setNegative (false); - n <<= i; - total += n; - } - } - - total.setNegative (wasNegative ^ other.isNegative()); - swapWith (total); - return *this; -} - -void BigInteger::divideBy (const BigInteger& divisor, BigInteger& remainder) -{ - bassert (this != &remainder); // (can't handle passing itself in to get the remainder) - - const int divHB = divisor.getHighestBit(); - const int ourHB = getHighestBit(); - - if (divHB < 0 || ourHB < 0) - { - // division by zero - remainder.clear(); - clear(); - } - else - { - const bool wasNegative = isNegative(); - - swapWith (remainder); - remainder.setNegative (false); - clear(); - - BigInteger temp (divisor); - temp.setNegative (false); - - int leftShift = ourHB - divHB; - temp <<= leftShift; - - while (leftShift >= 0) - { - if (remainder.compareAbsolute (temp) >= 0) - { - remainder -= temp; - setBit (leftShift); - } - - if (--leftShift >= 0) - temp >>= 1; - } - - negative = wasNegative ^ divisor.isNegative(); - remainder.setNegative (wasNegative); - } -} - -BigInteger& BigInteger::operator/= (const BigInteger& other) -{ - BigInteger remainder; - divideBy (other, remainder); - return *this; -} - -BigInteger& BigInteger::operator|= (const BigInteger& other) -{ - // this operation doesn't take into account negative values.. - bassert (isNegative() == other.isNegative()); - - if (other.highestBit >= 0) - { - ensureSize (bitToIndex (other.highestBit)); - - int n = (int) bitToIndex (other.highestBit) + 1; - - while (--n >= 0) - values[n] |= other.values[n]; - - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator&= (const BigInteger& other) -{ - // this operation doesn't take into account negative values.. - bassert (isNegative() == other.isNegative()); - - int n = (int) numValues; - - while (n > (int) other.numValues) - values[--n] = 0; - - while (--n >= 0) - values[n] &= other.values[n]; - - if (other.highestBit < highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - return *this; -} - -BigInteger& BigInteger::operator^= (const BigInteger& other) -{ - // this operation will only work with the absolute values - bassert (isNegative() == other.isNegative()); - - if (other.highestBit >= 0) - { - ensureSize (bitToIndex (other.highestBit)); - - int n = (int) bitToIndex (other.highestBit) + 1; - - while (--n >= 0) - values[n] ^= other.values[n]; - - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator%= (const BigInteger& divisor) -{ - BigInteger remainder; - divideBy (divisor, remainder); - swapWith (remainder); - return *this; -} - -BigInteger& BigInteger::operator++() { return operator+= (1); } -BigInteger& BigInteger::operator--() { return operator-= (1); } -BigInteger BigInteger::operator++ (int) { const BigInteger old (*this); operator+= (1); return old; } -BigInteger BigInteger::operator-- (int) { const BigInteger old (*this); operator-= (1); return old; } - -BigInteger BigInteger::operator-() const { BigInteger b (*this); b.negate(); return b; } -BigInteger BigInteger::operator+ (const BigInteger& other) const { BigInteger b (*this); return b += other; } -BigInteger BigInteger::operator- (const BigInteger& other) const { BigInteger b (*this); return b -= other; } -BigInteger BigInteger::operator* (const BigInteger& other) const { BigInteger b (*this); return b *= other; } -BigInteger BigInteger::operator/ (const BigInteger& other) const { BigInteger b (*this); return b /= other; } -BigInteger BigInteger::operator| (const BigInteger& other) const { BigInteger b (*this); return b |= other; } -BigInteger BigInteger::operator& (const BigInteger& other) const { BigInteger b (*this); return b &= other; } -BigInteger BigInteger::operator^ (const BigInteger& other) const { BigInteger b (*this); return b ^= other; } -BigInteger BigInteger::operator% (const BigInteger& other) const { BigInteger b (*this); return b %= other; } -BigInteger BigInteger::operator<< (const int numBits) const { BigInteger b (*this); return b <<= numBits; } -BigInteger BigInteger::operator>> (const int numBits) const { BigInteger b (*this); return b >>= numBits; } -BigInteger& BigInteger::operator<<= (const int numBits) { shiftBits (numBits, 0); return *this; } -BigInteger& BigInteger::operator>>= (const int numBits) { shiftBits (-numBits, 0); return *this; } - -//============================================================================== -int BigInteger::compare (const BigInteger& other) const noexcept -{ - if (isNegative() == other.isNegative()) - { - const int absComp = compareAbsolute (other); - return isNegative() ? -absComp : absComp; - } - else - { - return isNegative() ? -1 : 1; - } -} - -int BigInteger::compareAbsolute (const BigInteger& other) const noexcept -{ - const int h1 = getHighestBit(); - const int h2 = other.getHighestBit(); - - if (h1 > h2) - return 1; - else if (h1 < h2) - return -1; - - for (int i = (int) bitToIndex (h1) + 1; --i >= 0;) - if (values[i] != other.values[i]) - return (values[i] > other.values[i]) ? 1 : -1; - - return 0; -} - -bool BigInteger::operator== (const BigInteger& other) const noexcept { return compare (other) == 0; } -bool BigInteger::operator!= (const BigInteger& other) const noexcept { return compare (other) != 0; } -bool BigInteger::operator< (const BigInteger& other) const noexcept { return compare (other) < 0; } -bool BigInteger::operator<= (const BigInteger& other) const noexcept { return compare (other) <= 0; } -bool BigInteger::operator> (const BigInteger& other) const noexcept { return compare (other) > 0; } -bool BigInteger::operator>= (const BigInteger& other) const noexcept { return compare (other) >= 0; } - -//============================================================================== -void BigInteger::shiftLeft (int bits, const int startBit) -{ - if (startBit > 0) - { - for (int i = highestBit + 1; --i >= startBit;) - setBit (i + bits, operator[] (i)); - - while (--bits >= 0) - clearBit (bits + startBit); - } - else - { - ensureSize (bitToIndex (highestBit + bits) + 1); - - const size_t wordsToMove = bitToIndex (bits); - size_t top = 1 + bitToIndex (highestBit); - highestBit += bits; - - if (wordsToMove > 0) - { - for (int i = (int) top; --i >= 0;) - values [(size_t) i + wordsToMove] = values [i]; - - for (size_t j = 0; j < wordsToMove; ++j) - values [j] = 0; - - bits &= 31; - } - - if (bits != 0) - { - const int invBits = 32 - bits; - - for (size_t i = top + 1 + wordsToMove; --i > wordsToMove;) - values[i] = (values[i] << bits) | (values [i - 1] >> invBits); - - values [wordsToMove] = values [wordsToMove] << bits; - } - - highestBit = getHighestBit(); - } -} - -void BigInteger::shiftRight (int bits, const int startBit) -{ - if (startBit > 0) - { - for (int i = startBit; i <= highestBit; ++i) - setBit (i, operator[] (i + bits)); - - highestBit = getHighestBit(); - } - else - { - if (bits > highestBit) - { - clear(); - } - else - { - const size_t wordsToMove = bitToIndex (bits); - size_t top = 1 + bitToIndex (highestBit) - wordsToMove; - highestBit -= bits; - - if (wordsToMove > 0) - { - size_t i; - for (i = 0; i < top; ++i) - values [i] = values [i + wordsToMove]; - - for (i = 0; i < wordsToMove; ++i) - values [top + i] = 0; - - bits &= 31; - } - - if (bits != 0) - { - const int invBits = 32 - bits; - - --top; - for (size_t i = 0; i < top; ++i) - values[i] = (values[i] >> bits) | (values [i + 1] << invBits); - - values[top] = (values[top] >> bits); - } - - highestBit = getHighestBit(); - } - } -} - -void BigInteger::shiftBits (int bits, const int startBit) -{ - if (highestBit >= 0) - { - if (bits < 0) - shiftRight (-bits, startBit); - else if (bits > 0) - shiftLeft (bits, startBit); - } -} - -//============================================================================== -static BigInteger simpleGCD (BigInteger* m, BigInteger* n) -{ - while (! m->isZero()) - { - if (n->compareAbsolute (*m) > 0) - std::swap (m, n); - - *m -= *n; - } - - return *n; -} - -BigInteger BigInteger::findGreatestCommonDivisor (BigInteger n) const -{ - BigInteger m (*this); - - while (! n.isZero()) - { - if (abs (m.getHighestBit() - n.getHighestBit()) <= 16) - return simpleGCD (&m, &n); - - BigInteger temp2; - m.divideBy (n, temp2); - - m.swapWith (n); - n.swapWith (temp2); - } - - return m; -} - -void BigInteger::exponentModulo (const BigInteger& exponent, const BigInteger& modulus) -{ - BigInteger exp (exponent); - exp %= modulus; - - BigInteger value (1); - swapWith (value); - value %= modulus; - - while (! exp.isZero()) - { - if (exp [0]) - { - operator*= (value); - operator%= (modulus); - } - - value *= value; - value %= modulus; - exp >>= 1; - } -} - -void BigInteger::inverseModulo (const BigInteger& modulus) -{ - if (modulus.isOne() || modulus.isNegative()) - { - clear(); - return; - } - - if (isNegative() || compareAbsolute (modulus) >= 0) - operator%= (modulus); - - if (isOne()) - return; - - if (! (*this)[0]) - { - // not invertible - clear(); - return; - } - - BigInteger a1 (modulus); - BigInteger a2 (*this); - BigInteger b1 (modulus); - BigInteger b2 (1); - - while (! a2.isOne()) - { - BigInteger temp1, multiplier (a1); - multiplier.divideBy (a2, temp1); - - temp1 = a2; - temp1 *= multiplier; - BigInteger temp2 (a1); - temp2 -= temp1; - a1 = a2; - a2 = temp2; - - temp1 = b2; - temp1 *= multiplier; - temp2 = b1; - temp2 -= temp1; - b1 = b2; - b2 = temp2; - } - - while (b2.isNegative()) - b2 += modulus; - - b2 %= modulus; - swapWith (b2); -} - -//============================================================================== -OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const BigInteger& value) -{ - return stream << value.toString (10); -} - -String BigInteger::toString (const int base, const int minimumNumCharacters) const -{ - String s; - BigInteger v (*this); - - if (base == 2 || base == 8 || base == 16) - { - const int bits = (base == 2) ? 1 : (base == 8 ? 3 : 4); - static const char hexDigits[] = "0123456789abcdef"; - - for (;;) - { - const uint32 remainder = v.getBitRangeAsInt (0, bits); - - v >>= bits; - - if (remainder == 0 && v.isZero()) - break; - - s = String::charToString ((beast_wchar) (uint8) hexDigits [remainder]) + s; - } - } - else if (base == 10) - { - const BigInteger ten (10); - BigInteger remainder; - - for (;;) - { - v.divideBy (ten, remainder); - - if (remainder.isZero() && v.isZero()) - break; - - s = String (remainder.getBitRangeAsInt (0, 8)) + s; - } - } - else - { - bassertfalse; // can't do the specified base! - return String::empty; - } - - s = s.paddedLeft ('0', minimumNumCharacters); - - return isNegative() ? "-" + s : s; -} - -void BigInteger::parseString (const String& text, const int base) -{ - clear(); - String::CharPointerType t (text.getCharPointer()); - - if (base == 2 || base == 8 || base == 16) - { - const int bits = (base == 2) ? 1 : (base == 8 ? 3 : 4); - - for (;;) - { - const beast_wchar c = t.getAndAdvance(); - const int digit = CharacterFunctions::getHexDigitValue (c); - - if (((uint32) digit) < (uint32) base) - { - operator<<= (bits); - operator+= (digit); - } - else if (c == 0) - { - break; - } - } - } - else if (base == 10) - { - const BigInteger ten ((uint32) 10); - - for (;;) - { - const beast_wchar c = t.getAndAdvance(); - - if (c >= '0' && c <= '9') - { - operator*= (ten); - operator+= ((int) (c - '0')); - } - else if (c == 0) - { - break; - } - } - } - - setNegative (text.trimStart().startsWithChar ('-')); -} - -MemoryBlock BigInteger::toMemoryBlock() const -{ - const int numBytes = (getHighestBit() + 8) >> 3; - MemoryBlock mb ((size_t) numBytes); - - for (int i = 0; i < numBytes; ++i) - mb[i] = (char) getBitRangeAsInt (i << 3, 8); - - return mb; -} - -void BigInteger::loadFromMemoryBlock (const MemoryBlock& data) -{ - clear(); - - for (int i = (int) data.getSize(); --i >= 0;) - this->setBitRangeAsInt (i << 3, 8, (uint32) data [i]); -} diff --git a/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.h b/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.h deleted file mode 100644 index c5737d8179..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_BigInteger.h +++ /dev/null @@ -1,329 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BIGINTEGER_BEASTHEADER -#define BEAST_BIGINTEGER_BEASTHEADER - -#include "../text/beast_String.h" -#include "../memory/beast_HeapBlock.h" -class MemoryBlock; - - -//============================================================================== -/** - An arbitrarily large integer class. - - A BigInteger can be used in a similar way to a normal integer, but has no size - limit (except for memory and performance constraints). - - Negative values are possible, but the value isn't stored as 2s-complement, so - be careful if you use negative values and look at the values of individual bits. -*/ -class BEAST_API BigInteger -{ -public: - //============================================================================== - /** Creates an empty BigInteger */ - BigInteger(); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 32 bits of the number are initialised with this value. - */ - BigInteger (uint32 value); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 32 bits of the number are initialised with the absolute value - passed in, and its sign is set to reflect the sign of the number. - */ - BigInteger (int32 value); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 64 bits of the number are initialised with the absolute value - passed in, and its sign is set to reflect the sign of the number. - */ - BigInteger (int64 value); - - /** Creates a copy of another BigInteger. */ - BigInteger (const BigInteger& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - BigInteger (BigInteger&& other) noexcept; - BigInteger& operator= (BigInteger&& other) noexcept; - #endif - - /** Destructor. */ - ~BigInteger(); - - //============================================================================== - /** Copies another BigInteger onto this one. */ - BigInteger& operator= (const BigInteger& other); - - /** Swaps the internal contents of this with another object. */ - void swapWith (BigInteger& other) noexcept; - - //============================================================================== - /** Returns the value of a specified bit in the number. - If the index is out-of-range, the result will be false. - */ - bool operator[] (int bit) const noexcept; - - /** Returns true if no bits are set. */ - bool isZero() const noexcept; - - /** Returns true if the value is 1. */ - bool isOne() const noexcept; - - /** Attempts to get the lowest bits of the value as an integer. - If the value is bigger than the integer limits, this will return only the lower bits. - */ - int toInteger() const noexcept; - - //============================================================================== - /** Resets the value to 0. */ - void clear(); - - /** Clears a particular bit in the number. */ - void clearBit (int bitNumber) noexcept; - - /** Sets a specified bit to 1. */ - void setBit (int bitNumber); - - /** Sets or clears a specified bit. */ - void setBit (int bitNumber, bool shouldBeSet); - - /** Sets a range of bits to be either on or off. - - @param startBit the first bit to change - @param numBits the number of bits to change - @param shouldBeSet whether to turn these bits on or off - */ - void setRange (int startBit, int numBits, bool shouldBeSet); - - /** Inserts a bit an a given position, shifting up any bits above it. */ - void insertBit (int bitNumber, bool shouldBeSet); - - /** Returns a range of bits as a new BigInteger. - - e.g. getBitRangeAsInt (0, 64) would return the lowest 64 bits. - @see getBitRangeAsInt - */ - BigInteger getBitRange (int startBit, int numBits) const; - - /** Returns a range of bits as an integer value. - - e.g. getBitRangeAsInt (0, 32) would return the lowest 32 bits. - - Asking for more than 32 bits isn't allowed (obviously) - for that, use - getBitRange(). - */ - uint32 getBitRangeAsInt (int startBit, int numBits) const noexcept; - - /** Sets a range of bits to an integer value. - - Copies the given integer onto a range of bits, starting at startBit, - and using up to numBits of the available bits. - */ - void setBitRangeAsInt (int startBit, int numBits, uint32 valueToSet); - - /** Shifts a section of bits left or right. - - @param howManyBitsLeft how far to move the bits (+ve numbers shift it left, -ve numbers shift it right). - @param startBit the first bit to affect - if this is > 0, only bits above that index will be affected. - */ - void shiftBits (int howManyBitsLeft, int startBit); - - /** Returns the total number of set bits in the value. */ - int countNumberOfSetBits() const noexcept; - - /** Looks for the index of the next set bit after a given starting point. - - This searches from startIndex (inclusive) upwards for the first set bit, - and returns its index. If no set bits are found, it returns -1. - */ - int findNextSetBit (int startIndex) const noexcept; - - /** Looks for the index of the next clear bit after a given starting point. - - This searches from startIndex (inclusive) upwards for the first clear bit, - and returns its index. - */ - int findNextClearBit (int startIndex) const noexcept; - - /** Returns the index of the highest set bit in the number. - If the value is zero, this will return -1. - */ - int getHighestBit() const noexcept; - - //============================================================================== - // All the standard arithmetic ops... - - BigInteger& operator+= (const BigInteger& other); - BigInteger& operator-= (const BigInteger& other); - BigInteger& operator*= (const BigInteger& other); - BigInteger& operator/= (const BigInteger& other); - BigInteger& operator|= (const BigInteger& other); - BigInteger& operator&= (const BigInteger& other); - BigInteger& operator^= (const BigInteger& other); - BigInteger& operator%= (const BigInteger& other); - BigInteger& operator<<= (int numBitsToShift); - BigInteger& operator>>= (int numBitsToShift); - BigInteger& operator++(); - BigInteger& operator--(); - BigInteger operator++ (int); - BigInteger operator-- (int); - - BigInteger operator-() const; - BigInteger operator+ (const BigInteger& other) const; - BigInteger operator- (const BigInteger& other) const; - BigInteger operator* (const BigInteger& other) const; - BigInteger operator/ (const BigInteger& other) const; - BigInteger operator| (const BigInteger& other) const; - BigInteger operator& (const BigInteger& other) const; - BigInteger operator^ (const BigInteger& other) const; - BigInteger operator% (const BigInteger& other) const; - BigInteger operator<< (int numBitsToShift) const; - BigInteger operator>> (int numBitsToShift) const; - - bool operator== (const BigInteger& other) const noexcept; - bool operator!= (const BigInteger& other) const noexcept; - bool operator< (const BigInteger& other) const noexcept; - bool operator<= (const BigInteger& other) const noexcept; - bool operator> (const BigInteger& other) const noexcept; - bool operator>= (const BigInteger& other) const noexcept; - - //============================================================================== - /** Does a signed comparison of two BigIntegers. - - Return values are: - - 0 if the numbers are the same - - < 0 if this number is smaller than the other - - > 0 if this number is bigger than the other - */ - int compare (const BigInteger& other) const noexcept; - - /** Compares the magnitudes of two BigIntegers, ignoring their signs. - - Return values are: - - 0 if the numbers are the same - - < 0 if this number is smaller than the other - - > 0 if this number is bigger than the other - */ - int compareAbsolute (const BigInteger& other) const noexcept; - - /** Divides this value by another one and returns the remainder. - - This number is divided by other, leaving the quotient in this number, - with the remainder being copied to the other BigInteger passed in. - */ - void divideBy (const BigInteger& divisor, BigInteger& remainder); - - /** Returns the largest value that will divide both this value and the one passed-in. - */ - BigInteger findGreatestCommonDivisor (BigInteger other) const; - - /** Performs a combined exponent and modulo operation. - This BigInteger's value becomes (this ^ exponent) % modulus. - */ - void exponentModulo (const BigInteger& exponent, const BigInteger& modulus); - - /** Performs an inverse modulo on the value. - i.e. the result is (this ^ -1) mod (modulus). - */ - void inverseModulo (const BigInteger& modulus); - - //============================================================================== - /** Returns true if the value is less than zero. - @see setNegative, negate - */ - bool isNegative() const noexcept; - - /** Changes the sign of the number to be positive or negative. - @see isNegative, negate - */ - void setNegative (bool shouldBeNegative) noexcept; - - /** Inverts the sign of the number. - @see isNegative, setNegative - */ - void negate() noexcept; - - //============================================================================== - /** Converts the number to a string. - - Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex). - If minimumNumCharacters is greater than 0, the returned string will be - padded with leading zeros to reach at least that length. - */ - String toString (int base, int minimumNumCharacters = 1) const; - - /** Reads the numeric value from a string. - - Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex). - Any invalid characters will be ignored. - */ - void parseString (const String& text, int base); - - //============================================================================== - /** Turns the number into a block of binary data. - - The data is arranged as little-endian, so the first byte of data is the low 8 bits - of the number, and so on. - - @see loadFromMemoryBlock - */ - MemoryBlock toMemoryBlock() const; - - /** Converts a block of raw data into a number. - - The data is arranged as little-endian, so the first byte of data is the low 8 bits - of the number, and so on. - - @see toMemoryBlock - */ - void loadFromMemoryBlock (const MemoryBlock& data); - -private: - //============================================================================== - HeapBlock values; - size_t numValues; - int highestBit; - bool negative; - - void ensureSize (size_t numVals); - void shiftLeft (int bits, int startBit); - void shiftRight (int bits, int startBit); - - BEAST_LEAK_DETECTOR (BigInteger) -}; - -/** Writes a BigInteger to an OutputStream as a UTF8 decimal string. */ -OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const BigInteger& value); - -//============================================================================== -#ifndef DOXYGEN - // For backwards compatibility, BitArray is defined as an alias for BigInteger. - typedef BigInteger BitArray; -#endif - - -#endif // BEAST_BIGINTEGER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/maths/beast_Expression.cpp b/Subtrees/beast/modules/beast_core/maths/beast_Expression.cpp deleted file mode 100644 index d0b1c29403..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_Expression.cpp +++ /dev/null @@ -1,1180 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class Expression::Term : public SingleThreadedReferenceCountedObject -{ -public: - Term() {} - virtual ~Term() {} - - virtual Type getType() const noexcept = 0; - virtual Term* clone() const = 0; - virtual ReferenceCountedObjectPtr resolve (const Scope&, int recursionDepth) = 0; - virtual String toString() const = 0; - virtual double toDouble() const { return 0; } - virtual int getInputIndexFor (const Term*) const { return -1; } - virtual int getOperatorPrecedence() const { return 0; } - virtual int getNumInputs() const { return 0; } - virtual Term* getInput (int) const { return nullptr; } - virtual ReferenceCountedObjectPtr negated(); - - virtual ReferenceCountedObjectPtr createTermToEvaluateInput (const Scope&, const Term* /*inputTerm*/, - double /*overallTarget*/, Term* /*topLevelTerm*/) const - { - bassertfalse; - return ReferenceCountedObjectPtr(); - } - - virtual String getName() const - { - bassertfalse; // You shouldn't call this for an expression that's not actually a function! - return String::empty; - } - - virtual void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int recursionDepth) - { - for (int i = getNumInputs(); --i >= 0;) - getInput (i)->renameSymbol (oldSymbol, newName, scope, recursionDepth); - } - - class SymbolVisitor - { - public: - virtual ~SymbolVisitor() {} - virtual void useSymbol (const Symbol&) = 0; - }; - - virtual void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - for (int i = getNumInputs(); --i >= 0;) - getInput(i)->visitAllSymbols (visitor, scope, recursionDepth); - } - -private: - BEAST_DECLARE_NON_COPYABLE (Term) -}; - - -//============================================================================== -struct Expression::Helpers -{ - typedef ReferenceCountedObjectPtr TermPtr; - - static void checkRecursionDepth (const int depth) - { - if (depth > 256) - throw EvaluationError ("Recursive symbol references"); - } - - friend class Expression::Term; - - //============================================================================== - /** An exception that can be thrown by Expression::evaluate(). */ - class EvaluationError : public std::exception - { - public: - EvaluationError (const String& desc) : description (desc) - { - DBG ("Expression::EvaluationError: " + description); - } - - String description; - }; - - //============================================================================== - class Constant : public Term - { - public: - Constant (const double val, const bool resolutionTarget) - : value (val), isResolutionTarget (resolutionTarget) {} - - Type getType() const noexcept { return constantType; } - Term* clone() const { return new Constant (value, isResolutionTarget); } - TermPtr resolve (const Scope&, int) { return this; } - double toDouble() const { return value; } - TermPtr negated() { return new Constant (-value, isResolutionTarget); } - - String toString() const - { - String s (value); - if (isResolutionTarget) - s = "@" + s; - - return s; - } - - double value; - bool isResolutionTarget; - }; - - //============================================================================== - class BinaryTerm : public Term - { - public: - BinaryTerm (Term* const l, Term* const r) : left (l), right (r) - { - bassert (l != nullptr && r != nullptr); - } - - int getInputIndexFor (const Term* possibleInput) const - { - return possibleInput == left ? 0 : (possibleInput == right ? 1 : -1); - } - - Type getType() const noexcept { return operatorType; } - int getNumInputs() const { return 2; } - Term* getInput (int index) const { return index == 0 ? left.get() : (index == 1 ? right.get() : 0); } - - virtual double performFunction (double left, double right) const = 0; - virtual void writeOperator (String& dest) const = 0; - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - return new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(), - right->resolve (scope, recursionDepth)->toDouble()), false); - } - - String toString() const - { - String s; - - const int ourPrecendence = getOperatorPrecedence(); - if (left->getOperatorPrecedence() > ourPrecendence) - s << '(' << left->toString() << ')'; - else - s = left->toString(); - - writeOperator (s); - - if (right->getOperatorPrecedence() >= ourPrecendence) - s << '(' << right->toString() << ')'; - else - s << right->toString(); - - return s; - } - - protected: - const TermPtr left, right; - - TermPtr createDestinationTerm (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - bassert (input == left || input == right); - if (input != left && input != right) - return TermPtr(); - - const Term* const dest = findDestinationFor (topLevelTerm, this); - - if (dest == nullptr) - return new Constant (overallTarget, false); - - return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm); - } - }; - - //============================================================================== - class SymbolTerm : public Term - { - public: - explicit SymbolTerm (const String& sym) : symbol (sym) {} - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - return scope.getSymbolValue (symbol).term->resolve (scope, recursionDepth + 1); - } - - Type getType() const noexcept { return symbolType; } - Term* clone() const { return new SymbolTerm (symbol); } - String toString() const { return symbol; } - String getName() const { return symbol; } - - void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - visitor.useSymbol (Symbol (scope.getScopeUID(), symbol)); - scope.getSymbolValue (symbol).term->visitAllSymbols (visitor, scope, recursionDepth + 1); - } - - void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int /*recursionDepth*/) - { - if (oldSymbol.symbolName == symbol && scope.getScopeUID() == oldSymbol.scopeUID) - symbol = newName; - } - - String symbol; - }; - - //============================================================================== - class Function : public Term - { - public: - explicit Function (const String& name) : functionName (name) {} - - Function (const String& name, const Array& params) - : functionName (name), parameters (params) - {} - - Type getType() const noexcept { return functionType; } - Term* clone() const { return new Function (functionName, parameters); } - int getNumInputs() const { return parameters.size(); } - Term* getInput (int i) const { return parameters.getReference(i).term; } - String getName() const { return functionName; } - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - double result = 0; - const int numParams = parameters.size(); - if (numParams > 0) - { - HeapBlock params ((size_t) numParams); - for (int i = 0; i < numParams; ++i) - params[i] = parameters.getReference(i).term->resolve (scope, recursionDepth + 1)->toDouble(); - - result = scope.evaluateFunction (functionName, params, numParams); - } - else - { - result = scope.evaluateFunction (functionName, nullptr, 0); - } - - return new Constant (result, false); - } - - int getInputIndexFor (const Term* possibleInput) const - { - for (int i = 0; i < parameters.size(); ++i) - if (parameters.getReference(i).term == possibleInput) - return i; - - return -1; - } - - String toString() const - { - if (parameters.size() == 0) - return functionName + "()"; - - String s (functionName + " ("); - - for (int i = 0; i < parameters.size(); ++i) - { - s << parameters.getReference(i).term->toString(); - - if (i < parameters.size() - 1) - s << ", "; - } - - s << ')'; - return s; - } - - const String functionName; - Array parameters; - }; - - //============================================================================== - class DotOperator : public BinaryTerm - { - public: - DotOperator (SymbolTerm* const l, Term* const r) : BinaryTerm (l, r) {} - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - - EvaluationVisitor visitor (right, recursionDepth + 1); - scope.visitRelativeScope (getSymbol()->symbol, visitor); - return visitor.output; - } - - Term* clone() const { return new DotOperator (getSymbol(), right); } - String getName() const { return "."; } - int getOperatorPrecedence() const { return 1; } - void writeOperator (String& dest) const { dest << '.'; } - double performFunction (double, double) const { return 0.0; } - - void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - visitor.useSymbol (Symbol (scope.getScopeUID(), getSymbol()->symbol)); - - SymbolVisitingVisitor v (right, visitor, recursionDepth + 1); - - try - { - scope.visitRelativeScope (getSymbol()->symbol, v); - } - catch (...) {} - } - - void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - getSymbol()->renameSymbol (oldSymbol, newName, scope, recursionDepth); - - SymbolRenamingVisitor visitor (right, oldSymbol, newName, recursionDepth + 1); - - try - { - scope.visitRelativeScope (getSymbol()->symbol, visitor); - } - catch (...) {} - } - - private: - //============================================================================== - class EvaluationVisitor : public Scope::Visitor - { - public: - EvaluationVisitor (const TermPtr& t, const int recursion) - : input (t), output (t), recursionCount (recursion) {} - - void visit (const Scope& scope) { output = input->resolve (scope, recursionCount); } - - const TermPtr input; - TermPtr output; - const int recursionCount; - - private: - BEAST_DECLARE_NON_COPYABLE (EvaluationVisitor) - }; - - class SymbolVisitingVisitor : public Scope::Visitor - { - public: - SymbolVisitingVisitor (const TermPtr& t, SymbolVisitor& v, const int recursion) - : input (t), visitor (v), recursionCount (recursion) {} - - void visit (const Scope& scope) { input->visitAllSymbols (visitor, scope, recursionCount); } - - private: - const TermPtr input; - SymbolVisitor& visitor; - const int recursionCount; - - BEAST_DECLARE_NON_COPYABLE (SymbolVisitingVisitor) - }; - - class SymbolRenamingVisitor : public Scope::Visitor - { - public: - SymbolRenamingVisitor (const TermPtr& t, const Expression::Symbol& symbol_, const String& newName_, const int recursionCount_) - : input (t), symbol (symbol_), newName (newName_), recursionCount (recursionCount_) {} - - void visit (const Scope& scope) { input->renameSymbol (symbol, newName, scope, recursionCount); } - - private: - const TermPtr input; - const Symbol& symbol; - const String newName; - const int recursionCount; - - BEAST_DECLARE_NON_COPYABLE (SymbolRenamingVisitor) - }; - - SymbolTerm* getSymbol() const { return static_cast (left.get()); } - - BEAST_DECLARE_NON_COPYABLE (DotOperator) - }; - - //============================================================================== - class Negate : public Term - { - public: - explicit Negate (const TermPtr& t) : input (t) - { - bassert (t != nullptr); - } - - Type getType() const noexcept { return operatorType; } - int getInputIndexFor (const Term* possibleInput) const { return possibleInput == input ? 0 : -1; } - int getNumInputs() const { return 1; } - Term* getInput (int index) const { return index == 0 ? input.get() : nullptr; } - Term* clone() const { return new Negate (input->clone()); } - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - return new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false); - } - - String getName() const { return "-"; } - TermPtr negated() { return input; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* t, double overallTarget, Term* topLevelTerm) const - { - (void) t; - bassert (t == input); - - const Term* const dest = findDestinationFor (topLevelTerm, this); - - return new Negate (dest == nullptr ? new Constant (overallTarget, false) - : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm)); - } - - String toString() const - { - if (input->getOperatorPrecedence() > 0) - return "-(" + input->toString() + ")"; - - return "-" + input->toString(); - } - - private: - const TermPtr input; - }; - - //============================================================================== - class Add : public BinaryTerm - { - public: - Add (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Add (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs + rhs; } - int getOperatorPrecedence() const { return 3; } - String getName() const { return "+"; } - void writeOperator (String& dest) const { dest << " + "; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - return new Subtract (newDest, (input == left ? right : left)->clone()); - } - - private: - BEAST_DECLARE_NON_COPYABLE (Add) - }; - - //============================================================================== - class Subtract : public BinaryTerm - { - public: - Subtract (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Subtract (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs - rhs; } - int getOperatorPrecedence() const { return 3; } - String getName() const { return "-"; } - void writeOperator (String& dest) const { dest << " - "; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - if (input == left) - return new Add (newDest, right->clone()); - - return new Subtract (left->clone(), newDest); - } - - private: - BEAST_DECLARE_NON_COPYABLE (Subtract) - }; - - //============================================================================== - class Multiply : public BinaryTerm - { - public: - Multiply (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Multiply (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs * rhs; } - String getName() const { return "*"; } - void writeOperator (String& dest) const { dest << " * "; } - int getOperatorPrecedence() const { return 2; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - return new Divide (newDest, (input == left ? right : left)->clone()); - } - - private: - BEAST_DECLARE_NON_COPYABLE (Multiply) - }; - - //============================================================================== - class Divide : public BinaryTerm - { - public: - Divide (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Divide (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs / rhs; } - String getName() const { return "/"; } - void writeOperator (String& dest) const { dest << " / "; } - int getOperatorPrecedence() const { return 2; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - if (input == left) - return new Multiply (newDest, right->clone()); - - return new Divide (left->clone(), newDest); - } - - private: - BEAST_DECLARE_NON_COPYABLE (Divide) - }; - - //============================================================================== - static Term* findDestinationFor (Term* const topLevel, const Term* const inputTerm) - { - const int inputIndex = topLevel->getInputIndexFor (inputTerm); - if (inputIndex >= 0) - return topLevel; - - for (int i = topLevel->getNumInputs(); --i >= 0;) - { - Term* const t = findDestinationFor (topLevel->getInput (i), inputTerm); - - if (t != nullptr) - return t; - } - - return nullptr; - } - - static Constant* findTermToAdjust (Term* const term, const bool mustBeFlagged) - { - bassert (term != nullptr); - - if (term->getType() == constantType) - { - Constant* const c = static_cast (term); - if (c->isResolutionTarget || ! mustBeFlagged) - return c; - } - - if (term->getType() == functionType) - return nullptr; - - const int numIns = term->getNumInputs(); - - for (int i = 0; i < numIns; ++i) - { - Term* const input = term->getInput (i); - - if (input->getType() == constantType) - { - Constant* const c = static_cast (input); - - if (c->isResolutionTarget || ! mustBeFlagged) - return c; - } - } - - for (int i = 0; i < numIns; ++i) - { - Constant* const c = findTermToAdjust (term->getInput (i), mustBeFlagged); - if (c != nullptr) - return c; - } - - return nullptr; - } - - static bool containsAnySymbols (const Term* const t) - { - if (t->getType() == Expression::symbolType) - return true; - - for (int i = t->getNumInputs(); --i >= 0;) - if (containsAnySymbols (t->getInput (i))) - return true; - - return false; - } - - //============================================================================== - class SymbolCheckVisitor : public Term::SymbolVisitor - { - public: - SymbolCheckVisitor (const Symbol& symbol_) : wasFound (false), symbol (symbol_) {} - void useSymbol (const Symbol& s) { wasFound = wasFound || s == symbol; } - - bool wasFound; - - private: - const Symbol& symbol; - - BEAST_DECLARE_NON_COPYABLE (SymbolCheckVisitor) - }; - - //============================================================================== - class SymbolListVisitor : public Term::SymbolVisitor - { - public: - SymbolListVisitor (Array& list_) : list (list_) {} - void useSymbol (const Symbol& s) { list.addIfNotAlreadyThere (s); } - - private: - Array& list; - - BEAST_DECLARE_NON_COPYABLE (SymbolListVisitor) - }; - - //============================================================================== - class Parser - { - public: - //============================================================================== - Parser (String::CharPointerType& stringToParse) - : text (stringToParse) - { - } - - TermPtr readUpToComma() - { - if (text.isEmpty()) - return new Constant (0.0, false); - - const TermPtr e (readExpression()); - - if (e == nullptr || ((! readOperator (",")) && ! text.isEmpty())) - throw ParseError ("Syntax error: \"" + String (text) + "\""); - - return e; - } - - private: - String::CharPointerType& text; - - //============================================================================== - static inline bool isDecimalDigit (const beast_wchar c) noexcept - { - return c >= '0' && c <= '9'; - } - - bool readChar (const beast_wchar required) noexcept - { - if (*text == required) - { - ++text; - return true; - } - - return false; - } - - bool readOperator (const char* ops, char* const opType = nullptr) noexcept - { - text = text.findEndOfWhitespace(); - - while (*ops != 0) - { - if (readChar ((beast_wchar) (uint8) *ops)) - { - if (opType != nullptr) - *opType = *ops; - - return true; - } - - ++ops; - } - - return false; - } - - bool readIdentifier (String& identifier) noexcept - { - text = text.findEndOfWhitespace(); - String::CharPointerType t (text); - int numChars = 0; - - if (t.isLetter() || *t == '_') - { - ++t; - ++numChars; - - while (t.isLetterOrDigit() || *t == '_') - { - ++t; - ++numChars; - } - } - - if (numChars > 0) - { - identifier = String (text, (size_t) numChars); - text = t; - return true; - } - - return false; - } - - Term* readNumber() noexcept - { - text = text.findEndOfWhitespace(); - String::CharPointerType t (text); - - const bool isResolutionTarget = (*t == '@'); - if (isResolutionTarget) - { - ++t; - t = t.findEndOfWhitespace(); - text = t; - } - - if (*t == '-') - { - ++t; - t = t.findEndOfWhitespace(); - } - - if (isDecimalDigit (*t) || (*t == '.' && isDecimalDigit (t[1]))) - return new Constant (CharacterFunctions::readDoubleValue (text), isResolutionTarget); - - return nullptr; - } - - TermPtr readExpression() - { - TermPtr lhs (readMultiplyOrDivideExpression()); - - char opType; - while (lhs != nullptr && readOperator ("+-", &opType)) - { - TermPtr rhs (readMultiplyOrDivideExpression()); - - if (rhs == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((beast_wchar) (uint8) opType) + "\""); - - if (opType == '+') - lhs = new Add (lhs, rhs); - else - lhs = new Subtract (lhs, rhs); - } - - return lhs; - } - - TermPtr readMultiplyOrDivideExpression() - { - TermPtr lhs (readUnaryExpression()); - - char opType; - while (lhs != nullptr && readOperator ("*/", &opType)) - { - TermPtr rhs (readUnaryExpression()); - - if (rhs == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((beast_wchar) (uint8) opType) + "\""); - - if (opType == '*') - lhs = new Multiply (lhs, rhs); - else - lhs = new Divide (lhs, rhs); - } - - return lhs; - } - - TermPtr readUnaryExpression() - { - char opType; - if (readOperator ("+-", &opType)) - { - TermPtr e (readUnaryExpression()); - - if (e == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((beast_wchar) (uint8) opType) + "\""); - - if (opType == '-') - e = e->negated(); - - return e; - } - - return readPrimaryExpression(); - } - - TermPtr readPrimaryExpression() - { - TermPtr e (readParenthesisedExpression()); - if (e != nullptr) - return e; - - e = readNumber(); - if (e != nullptr) - return e; - - return readSymbolOrFunction(); - } - - TermPtr readSymbolOrFunction() - { - String identifier; - if (readIdentifier (identifier)) - { - if (readOperator ("(")) // method call... - { - Function* const f = new Function (identifier); - ScopedPointer func (f); // (can't use ScopedPointer in MSVC) - - TermPtr param (readExpression()); - - if (param == nullptr) - { - if (readOperator (")")) - return func.release(); - - throw ParseError ("Expected parameters after \"" + identifier + " (\""); - } - - f->parameters.add (Expression (param)); - - while (readOperator (",")) - { - param = readExpression(); - - if (param == nullptr) - throw ParseError ("Expected expression after \",\""); - - f->parameters.add (Expression (param)); - } - - if (readOperator (")")) - return func.release(); - - throw ParseError ("Expected \")\""); - } - - if (readOperator (".")) - { - TermPtr rhs (readSymbolOrFunction()); - - if (rhs == nullptr) - throw ParseError ("Expected symbol or function after \".\""); - - if (identifier == "this") - return rhs; - - return new DotOperator (new SymbolTerm (identifier), rhs); - } - - // just a symbol.. - bassert (identifier.trim() == identifier); - return new SymbolTerm (identifier); - } - - return TermPtr(); - } - - TermPtr readParenthesisedExpression() - { - if (! readOperator ("(")) - return TermPtr(); - - const TermPtr e (readExpression()); - if (e == nullptr || ! readOperator (")")) - return TermPtr(); - - return e; - } - - BEAST_DECLARE_NON_COPYABLE (Parser) - }; -}; - -//============================================================================== -Expression::Expression() - : term (new Expression::Helpers::Constant (0, false)) -{ -} - -Expression::~Expression() -{ -} - -Expression::Expression (Term* const term_) - : term (term_) -{ - bassert (term != nullptr); -} - -Expression::Expression (const double constant) - : term (new Expression::Helpers::Constant (constant, false)) -{ -} - -Expression::Expression (const Expression& other) - : term (other.term) -{ -} - -Expression& Expression::operator= (const Expression& other) -{ - term = other.term; - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -Expression::Expression (Expression&& other) noexcept - : term (static_cast &&> (other.term)) -{ -} - -Expression& Expression::operator= (Expression&& other) noexcept -{ - term = static_cast &&> (other.term); - return *this; -} -#endif - -Expression::Expression (const String& stringToParse) -{ - String::CharPointerType text (stringToParse.getCharPointer()); - Helpers::Parser parser (text); - term = parser.readUpToComma(); -} - -Expression Expression::parse (String::CharPointerType& stringToParse) -{ - Helpers::Parser parser (stringToParse); - return Expression (parser.readUpToComma()); -} - -double Expression::evaluate() const -{ - return evaluate (Expression::Scope()); -} - -double Expression::evaluate (const Expression::Scope& scope) const -{ - try - { - return term->resolve (scope, 0)->toDouble(); - } - catch (Helpers::EvaluationError&) - {} - - return 0; -} - -double Expression::evaluate (const Scope& scope, String& evaluationError) const -{ - try - { - return term->resolve (scope, 0)->toDouble(); - } - catch (Helpers::EvaluationError& e) - { - evaluationError = e.description; - } - - return 0; -} - -Expression Expression::operator+ (const Expression& other) const { return Expression (new Helpers::Add (term, other.term)); } -Expression Expression::operator- (const Expression& other) const { return Expression (new Helpers::Subtract (term, other.term)); } -Expression Expression::operator* (const Expression& other) const { return Expression (new Helpers::Multiply (term, other.term)); } -Expression Expression::operator/ (const Expression& other) const { return Expression (new Helpers::Divide (term, other.term)); } -Expression Expression::operator-() const { return Expression (term->negated()); } -Expression Expression::symbol (const String& symbol) { return Expression (new Helpers::SymbolTerm (symbol)); } - -Expression Expression::function (const String& functionName, const Array& parameters) -{ - return Expression (new Helpers::Function (functionName, parameters)); -} - -Expression Expression::adjustedToGiveNewResult (const double targetValue, const Expression::Scope& scope) const -{ - ScopedPointer newTerm (term->clone()); - - Helpers::Constant* termToAdjust = Helpers::findTermToAdjust (newTerm, true); - - if (termToAdjust == nullptr) - termToAdjust = Helpers::findTermToAdjust (newTerm, false); - - if (termToAdjust == nullptr) - { - newTerm = new Helpers::Add (newTerm.release(), new Helpers::Constant (0, false)); - termToAdjust = Helpers::findTermToAdjust (newTerm, false); - } - - bassert (termToAdjust != nullptr); - - const Term* const parent = Helpers::findDestinationFor (newTerm, termToAdjust); - - if (parent == nullptr) - { - termToAdjust->value = targetValue; - } - else - { - const Helpers::TermPtr reverseTerm (parent->createTermToEvaluateInput (scope, termToAdjust, targetValue, newTerm)); - - if (reverseTerm == nullptr) - return Expression (targetValue); - - termToAdjust->value = reverseTerm->resolve (scope, 0)->toDouble(); - } - - return Expression (newTerm.release()); -} - -Expression Expression::withRenamedSymbol (const Expression::Symbol& oldSymbol, const String& newName, const Scope& scope) const -{ - bassert (newName.toLowerCase().containsOnly ("abcdefghijklmnopqrstuvwxyz0123456789_")); - - if (oldSymbol.symbolName == newName) - return *this; - - Expression e (term->clone()); - e.term->renameSymbol (oldSymbol, newName, scope, 0); - return e; -} - -bool Expression::referencesSymbol (const Expression::Symbol& symbolToCheck, const Scope& scope) const -{ - Helpers::SymbolCheckVisitor visitor (symbolToCheck); - - try - { - term->visitAllSymbols (visitor, scope, 0); - } - catch (Helpers::EvaluationError&) - {} - - return visitor.wasFound; -} - -void Expression::findReferencedSymbols (Array& results, const Scope& scope) const -{ - try - { - Helpers::SymbolListVisitor visitor (results); - term->visitAllSymbols (visitor, scope, 0); - } - catch (Helpers::EvaluationError&) - {} -} - -String Expression::toString() const { return term->toString(); } -bool Expression::usesAnySymbols() const { return Helpers::containsAnySymbols (term); } -Expression::Type Expression::getType() const noexcept { return term->getType(); } -String Expression::getSymbolOrFunction() const { return term->getName(); } -int Expression::getNumInputs() const { return term->getNumInputs(); } -Expression Expression::getInput (int index) const { return Expression (term->getInput (index)); } - -//============================================================================== -ReferenceCountedObjectPtr Expression::Term::negated() -{ - return new Helpers::Negate (this); -} - -//============================================================================== -Expression::ParseError::ParseError (const String& message) - : description (message) -{ - DBG ("Expression::ParseError: " + message); -} - -//============================================================================== -Expression::Symbol::Symbol (const String& scopeUID_, const String& symbolName_) - : scopeUID (scopeUID_), symbolName (symbolName_) -{ -} - -bool Expression::Symbol::operator== (const Symbol& other) const noexcept -{ - return symbolName == other.symbolName && scopeUID == other.scopeUID; -} - -bool Expression::Symbol::operator!= (const Symbol& other) const noexcept -{ - return ! operator== (other); -} - -//============================================================================== -Expression::Scope::Scope() {} -Expression::Scope::~Scope() {} - -Expression Expression::Scope::getSymbolValue (const String& symbol) const -{ - if (symbol.isNotEmpty()) - throw Helpers::EvaluationError ("Unknown symbol: " + symbol); - - return Expression(); -} - -double Expression::Scope::evaluateFunction (const String& functionName, const double* parameters, int numParams) const -{ - if (numParams > 0) - { - if (functionName == "min") - { - double v = parameters[0]; - for (int i = 1; i < numParams; ++i) - v = bmin (v, parameters[i]); - - return v; - } - - if (functionName == "max") - { - double v = parameters[0]; - for (int i = 1; i < numParams; ++i) - v = bmax (v, parameters[i]); - - return v; - } - - if (numParams == 1) - { - if (functionName == "sin") return sin (parameters[0]); - if (functionName == "cos") return cos (parameters[0]); - if (functionName == "tan") return tan (parameters[0]); - if (functionName == "abs") return std::abs (parameters[0]); - } - } - - throw Helpers::EvaluationError ("Unknown function: \"" + functionName + "\""); -} - -void Expression::Scope::visitRelativeScope (const String& scopeName, Visitor&) const -{ - throw Helpers::EvaluationError ("Unknown symbol: " + scopeName); -} - -String Expression::Scope::getScopeUID() const -{ - return String::empty; -} diff --git a/Subtrees/beast/modules/beast_core/maths/beast_Expression.h b/Subtrees/beast/modules/beast_core/maths/beast_Expression.h deleted file mode 100644 index 4147e02605..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_Expression.h +++ /dev/null @@ -1,269 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_EXPRESSION_BEASTHEADER -#define BEAST_EXPRESSION_BEASTHEADER - -#include "../memory/beast_ReferenceCountedObject.h" -#include "../containers/beast_Array.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - A class for dynamically evaluating simple numeric expressions. - - This class can parse a simple C-style string expression involving floating point - numbers, named symbols and functions. The basic arithmetic operations of +, -, *, / - are supported, as well as parentheses, and any alphanumeric identifiers are - assumed to be named symbols which will be resolved when the expression is - evaluated. - - Expressions which use identifiers and functions require a subclass of - Expression::Scope to be supplied when evaluating them, and this object - is expected to be able to resolve the symbol names and perform the functions that - are used. -*/ -class BEAST_API Expression -{ -public: - //============================================================================== - /** Creates a simple expression with a value of 0. */ - Expression(); - - /** Destructor. */ - ~Expression(); - - /** Creates a simple expression with a specified constant value. */ - explicit Expression (double constant); - - /** Creates a copy of an expression. */ - Expression (const Expression& other); - - /** Copies another expression. */ - Expression& operator= (const Expression& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - Expression (Expression&& other) noexcept; - Expression& operator= (Expression&& other) noexcept; - #endif - - /** Creates an expression by parsing a string. - If there's a syntax error in the string, this will throw a ParseError exception. - @throws ParseError - */ - explicit Expression (const String& stringToParse); - - /** Returns a string version of the expression. */ - String toString() const; - - /** Returns an expression which is an addtion operation of two existing expressions. */ - Expression operator+ (const Expression& other) const; - /** Returns an expression which is a subtraction operation of two existing expressions. */ - Expression operator- (const Expression& other) const; - /** Returns an expression which is a multiplication operation of two existing expressions. */ - Expression operator* (const Expression& other) const; - /** Returns an expression which is a division operation of two existing expressions. */ - Expression operator/ (const Expression& other) const; - /** Returns an expression which performs a negation operation on an existing expression. */ - Expression operator-() const; - - /** Returns an Expression which is an identifier reference. */ - static Expression symbol (const String& symbol); - - /** Returns an Expression which is a function call. */ - static Expression function (const String& functionName, const Array& parameters); - - /** Returns an Expression which parses a string from a character pointer, and updates the pointer - to indicate where it finished. - - The pointer is incremented so that on return, it indicates the character that follows - the end of the expression that was parsed. - - If there's a syntax error in the string, this will throw a ParseError exception. - @throws ParseError - */ - static Expression parse (String::CharPointerType& stringToParse); - - //============================================================================== - /** When evaluating an Expression object, this class is used to resolve symbols and - perform functions that the expression uses. - */ - class BEAST_API Scope - { - public: - Scope(); - virtual ~Scope(); - - /** Returns some kind of globally unique ID that identifies this scope. */ - virtual String getScopeUID() const; - - /** Returns the value of a symbol. - If the symbol is unknown, this can throw an Expression::EvaluationError exception. - The member value is set to the part of the symbol that followed the dot, if there is - one, e.g. for "foo.bar", symbol = "foo" and member = "bar". - @throws Expression::EvaluationError - */ - virtual Expression getSymbolValue (const String& symbol) const; - - /** Executes a named function. - If the function name is unknown, this can throw an Expression::EvaluationError exception. - @throws Expression::EvaluationError - */ - virtual double evaluateFunction (const String& functionName, - const double* parameters, int numParameters) const; - - /** Used as a callback by the Scope::visitRelativeScope() method. - You should never create an instance of this class yourself, it's used by the - expression evaluation code. - */ - class Visitor - { - public: - virtual ~Visitor() {} - virtual void visit (const Scope&) = 0; - }; - - /** Creates a Scope object for a named scope, and then calls a visitor - to do some kind of processing with this new scope. - - If the name is valid, this method must create a suitable (temporary) Scope - object to represent it, and must call the Visitor::visit() method with this - new scope. - */ - virtual void visitRelativeScope (const String& scopeName, Visitor& visitor) const; - }; - - /** Evaluates this expression, without using a Scope. - Without a Scope, no symbols can be used, and only basic functions such as sin, cos, tan, - min, max are available. - To find out about any errors during evaluation, use the other version of this method which - takes a String parameter. - */ - double evaluate() const; - - /** Evaluates this expression, providing a scope that should be able to evaluate any symbols - or functions that it uses. - To find out about any errors during evaluation, use the other version of this method which - takes a String parameter. - */ - double evaluate (const Scope& scope) const; - - /** Evaluates this expression, providing a scope that should be able to evaluate any symbols - or functions that it uses. - */ - double evaluate (const Scope& scope, String& evaluationError) const; - - /** Attempts to return an expression which is a copy of this one, but with a constant adjusted - to make the expression resolve to a target value. - - E.g. if the expression is "x + 10" and x is 5, then asking for a target value of 8 will return - the expression "x + 3". Obviously some expressions can't be reversed in this way, in which - case they might just be adjusted by adding a constant to the original expression. - - @throws Expression::EvaluationError - */ - Expression adjustedToGiveNewResult (double targetValue, const Scope& scope) const; - - /** Represents a symbol that is used in an Expression. */ - struct Symbol - { - Symbol (const String& scopeUID, const String& symbolName); - bool operator== (const Symbol&) const noexcept; - bool operator!= (const Symbol&) const noexcept; - - String scopeUID; /**< The unique ID of the Scope that contains this symbol. */ - String symbolName; /**< The name of the symbol. */ - }; - - /** Returns a copy of this expression in which all instances of a given symbol have been renamed. */ - Expression withRenamedSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope) const; - - /** Returns true if this expression makes use of the specified symbol. - If a suitable scope is supplied, the search will dereference and recursively check - all symbols, so that it can be determined whether this expression relies on the given - symbol at any level in its evaluation. If the scope parameter is null, this just checks - whether the expression contains any direct references to the symbol. - - @throws Expression::EvaluationError - */ - bool referencesSymbol (const Symbol& symbol, const Scope& scope) const; - - /** Returns true if this expression contains any symbols. */ - bool usesAnySymbols() const; - - /** Returns a list of all symbols that may be needed to resolve this expression in the given scope. */ - void findReferencedSymbols (Array& results, const Scope& scope) const; - - //============================================================================== - /** An exception that can be thrown by Expression::parse(). */ - class ParseError : public std::exception - { - public: - ParseError (const String& message); - - String description; - }; - - //============================================================================== - /** Expression type. - @see Expression::getType() - */ - enum Type - { - constantType, - functionType, - operatorType, - symbolType - }; - - /** Returns the type of this expression. */ - Type getType() const noexcept; - - /** If this expression is a symbol, function or operator, this returns its identifier. */ - String getSymbolOrFunction() const; - - /** Returns the number of inputs to this expression. - @see getInput - */ - int getNumInputs() const; - - /** Retrieves one of the inputs to this expression. - @see getNumInputs - */ - Expression getInput (int index) const; - -private: - //============================================================================== - class Term; - struct Helpers; - friend class Term; - friend struct Helpers; - friend class ScopedPointer; - friend class ReferenceCountedObjectPtr; - ReferenceCountedObjectPtr term; - - explicit Expression (Term*); -}; - -#endif // BEAST_EXPRESSION_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/maths/beast_MathsFunctions.h b/Subtrees/beast/modules/beast_core/maths/beast_MathsFunctions.h deleted file mode 100644 index 29168654d2..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_MathsFunctions.h +++ /dev/null @@ -1,515 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MATHSFUNCTIONS_BEASTHEADER -#define BEAST_MATHSFUNCTIONS_BEASTHEADER - -//============================================================================== -/* - This file sets up some handy mathematical typdefs and functions. -*/ - -//============================================================================== -// Definitions for the int8, int16, int32, int64 and pointer_sized_int types. - -/** A platform-independent 8-bit signed integer type. */ -typedef signed char int8; -/** A platform-independent 8-bit unsigned integer type. */ -typedef unsigned char uint8; -/** A platform-independent 16-bit signed integer type. */ -typedef signed short int16; -/** A platform-independent 16-bit unsigned integer type. */ -typedef unsigned short uint16; -/** A platform-independent 32-bit signed integer type. */ -typedef signed int int32; -/** A platform-independent 32-bit unsigned integer type. */ -typedef unsigned int uint32; - -#if BEAST_MSVC - /** A platform-independent 64-bit integer type. */ - typedef __int64 int64; - /** A platform-independent 64-bit unsigned integer type. */ - typedef unsigned __int64 uint64; - /** A platform-independent macro for writing 64-bit literals, needed because - different compilers have different syntaxes for this. - - E.g. writing literal64bit (0x1000000000) will translate to 0x1000000000LL for - GCC, or 0x1000000000 for MSVC. - */ - #define literal64bit(longLiteral) ((__int64) longLiteral) -#else - /** A platform-independent 64-bit integer type. */ - typedef long long int64; - /** A platform-independent 64-bit unsigned integer type. */ - typedef unsigned long long uint64; - /** A platform-independent macro for writing 64-bit literals, needed because - different compilers have different syntaxes for this. - - E.g. writing literal64bit (0x1000000000) will translate to 0x1000000000LL for - GCC, or 0x1000000000 for MSVC. - */ - #define literal64bit(longLiteral) (longLiteral##LL) -#endif - - -#if BEAST_64BIT - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef int64 pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef uint64 pointer_sized_uint; -#elif BEAST_MSVC - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef _W64 int pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef _W64 unsigned int pointer_sized_uint; -#else - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef int pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef unsigned int pointer_sized_uint; -#endif - -#if BEAST_MSVC - typedef pointer_sized_int ssize_t; -#endif - -//============================================================================== -// Some indispensible min/max functions - -/** Returns the larger of two values. */ -template -inline Type bmax (const Type a, const Type b) { return (a < b) ? b : a; } - -/** Returns the larger of three values. */ -template -inline Type bmax (const Type a, const Type b, const Type c) { return (a < b) ? ((b < c) ? c : b) : ((a < c) ? c : a); } - -/** Returns the larger of four values. */ -template -inline Type bmax (const Type a, const Type b, const Type c, const Type d) { return bmax (a, bmax (b, c, d)); } - -/** Returns the smaller of two values. */ -template -inline Type bmin (const Type a, const Type b) { return (b < a) ? b : a; } - -/** Returns the smaller of three values. */ -template -inline Type bmin (const Type a, const Type b, const Type c) { return (b < a) ? ((c < b) ? c : b) : ((c < a) ? c : a); } - -/** Returns the smaller of four values. */ -template -inline Type bmin (const Type a, const Type b, const Type c, const Type d) { return bmin (a, bmin (b, c, d)); } - -/** Scans an array of values, returning the minimum value that it contains. */ -template -const Type findMinimum (const Type* data, int numValues) -{ - if (numValues <= 0) - return Type(); - - Type result (*data++); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *data++; - if (v < result) result = v; - } - - return result; -} - -/** Scans an array of values, returning the maximum value that it contains. */ -template -const Type findMaximum (const Type* values, int numValues) -{ - if (numValues <= 0) - return Type(); - - Type result (*values++); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *values++; - if (result < v) result = v; - } - - return result; -} - -/** Scans an array of values, returning the minimum and maximum values that it contains. */ -template -void findMinAndMax (const Type* values, int numValues, Type& lowest, Type& highest) -{ - if (numValues <= 0) - { - lowest = Type(); - highest = Type(); - } - else - { - Type mn (*values++); - Type mx (mn); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *values++; - - if (mx < v) mx = v; - if (v < mn) mn = v; - } - - lowest = mn; - highest = mx; - } -} - - -//============================================================================== -/** Constrains a value to keep it within a given range. - - This will check that the specified value lies between the lower and upper bounds - specified, and if not, will return the nearest value that would be in-range. Effectively, - it's like calling bmax (lowerLimit, bmin (upperLimit, value)). - - Note that it expects that lowerLimit <= upperLimit. If this isn't true, - the results will be unpredictable. - - @param lowerLimit the minimum value to return - @param upperLimit the maximum value to return - @param valueToConstrain the value to try to return - @returns the closest value to valueToConstrain which lies between lowerLimit - and upperLimit (inclusive) - @see jlimit0To, bmin, bmax -*/ -template -inline Type blimit (const Type lowerLimit, - const Type upperLimit, - const Type valueToConstrain) noexcept -{ - bassert (lowerLimit <= upperLimit); // if these are in the wrong order, results are unpredictable.. - - return (valueToConstrain < lowerLimit) ? lowerLimit - : ((upperLimit < valueToConstrain) ? upperLimit - : valueToConstrain); -} - -/** Returns true if a value is at least zero, and also below a specified upper limit. - This is basically a quicker way to write: - @code valueToTest >= 0 && valueToTest < upperLimit - @endcode -*/ -template -inline bool isPositiveAndBelow (Type valueToTest, Type upperLimit) noexcept -{ - bassert (Type() <= upperLimit); // makes no sense to call this if the upper limit is itself below zero.. - return Type() <= valueToTest && valueToTest < upperLimit; -} - -template <> -inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) noexcept -{ - bassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. - return static_cast (valueToTest) < static_cast (upperLimit); -} - -/** Returns true if a value is at least zero, and also less than or equal to a specified upper limit. - This is basically a quicker way to write: - @code valueToTest >= 0 && valueToTest <= upperLimit - @endcode -*/ -template -inline bool isPositiveAndNotGreaterThan (Type valueToTest, Type upperLimit) noexcept -{ - bassert (Type() <= upperLimit); // makes no sense to call this if the upper limit is itself below zero.. - return Type() <= valueToTest && valueToTest <= upperLimit; -} - -template <> -inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) noexcept -{ - bassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. - return static_cast (valueToTest) <= static_cast (upperLimit); -} - -//============================================================================== -/** Handy function to swap two values. */ -template -inline void swapVariables (Type& variable1, Type& variable2) -{ - std::swap (variable1, variable2); -} - -/** Handy function for getting the number of elements in a simple const C array. - E.g. - @code - static int myArray[] = { 1, 2, 3 }; - - int numElements = numElementsInArray (myArray) // returns 3 - @endcode -*/ -template -inline int numElementsInArray (Type (&array)[N]) -{ - (void) array; // (required to avoid a spurious warning in MS compilers) - (void) sizeof (0[array]); // This line should cause an error if you pass an object with a user-defined subscript operator - return N; -} - -//============================================================================== -// Some useful maths functions that aren't always present with all compilers and build settings. - -/** Using beast_hypot is easier than dealing with the different types of hypot function - that are provided by the various platforms and compilers. */ -template -inline Type beast_hypot (Type a, Type b) noexcept -{ - #if BEAST_MSVC - return static_cast (_hypot (a, b)); - #else - return static_cast (hypot (a, b)); - #endif -} - -/** 64-bit abs function. */ -inline int64 abs64 (const int64 n) noexcept -{ - return (n >= 0) ? n : -n; -} - -//============================================================================== -/** A predefined value for Pi, at double-precision. - @see float_Pi -*/ -const double double_Pi = 3.1415926535897932384626433832795; - -/** A predefined value for Pi, at single-precision. - @see double_Pi -*/ -const float float_Pi = 3.14159265358979323846f; - - -//============================================================================== -/** The isfinite() method seems to vary between platforms, so this is a - platform-independent function for it. -*/ -template -inline bool beast_isfinite (FloatingPointType value) -{ - #if BEAST_WINDOWS - return _finite (value); - #elif BEAST_ANDROID - return isfinite (value); - #else - return std::isfinite (value); - #endif -} - -//============================================================================== -#if BEAST_MSVC - #pragma optimize ("t", off) - #ifndef __INTEL_COMPILER - #pragma float_control (precise, on, push) - #endif -#endif - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a float to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. -*/ -template -inline int roundToInt (const FloatType value) noexcept -{ - #ifdef __INTEL_COMPILER - #pragma float_control (precise, on, push) - #endif - - union { int asInt[2]; double asDouble; } n; - n.asDouble = ((double) value) + 6755399441055744.0; - - #if BEAST_BIG_ENDIAN - return n.asInt [1]; - #else - return n.asInt [0]; - #endif -} - -#if BEAST_MSVC - #ifndef __INTEL_COMPILER - #pragma float_control (pop) - #endif - #pragma optimize ("", on) // resets optimisations to the project defaults -#endif - -/** Fast floating-point-to-integer conversion. - - This is a slightly slower and slightly more accurate version of roundDoubleToInt(). It works - fine for values above zero, but negative numbers are rounded the wrong way. -*/ -inline int roundToIntAccurate (const double value) noexcept -{ - #ifdef __INTEL_COMPILER - #pragma float_control (pop) - #endif - - return roundToInt (value + 1.5e-8); -} - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a double to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. For a more accurate conversion, - see roundDoubleToIntAccurate(). -*/ -inline int roundDoubleToInt (const double value) noexcept -{ - return roundToInt (value); -} - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a float to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. -*/ -inline int roundFloatToInt (const float value) noexcept -{ - return roundToInt (value); -} - -//============================================================================== -/** Returns true if the specified integer is a power-of-two. -*/ -template -bool isPowerOfTwo (IntegerType value) -{ - return (value & (value - 1)) == 0; -} - -/** Returns the smallest power-of-two which is equal to or greater than the given integer. -*/ -inline int nextPowerOfTwo (int n) noexcept -{ - --n; - n |= (n >> 1); - n |= (n >> 2); - n |= (n >> 4); - n |= (n >> 8); - n |= (n >> 16); - return n + 1; -} - -/** Performs a modulo operation, but can cope with the dividend being negative. - The divisor must be greater than zero. -*/ -template -IntegerType negativeAwareModulo (IntegerType dividend, const IntegerType divisor) noexcept -{ - bassert (divisor > 0); - dividend %= divisor; - return (dividend < 0) ? (dividend + divisor) : dividend; -} - -//============================================================================== -#if (BEAST_INTEL && BEAST_32BIT) || defined (DOXYGEN) - /** This macro can be applied to a float variable to check whether it contains a denormalised - value, and to normalise it if necessary. - On CPUs that aren't vulnerable to denormalisation problems, this will have no effect. - */ - #define BEAST_UNDENORMALISE(x) x += 1.0f; x -= 1.0f; -#else - #define BEAST_UNDENORMALISE(x) -#endif - -//============================================================================== -/** This namespace contains a few template classes for helping work out class type variations. -*/ -namespace TypeHelpers -{ - #if BEAST_VC8_OR_EARLIER - #define PARAMETER_TYPE(type) const type& - #else - /** The ParameterType struct is used to find the best type to use when passing some kind - of object as a parameter. - - Of course, this is only likely to be useful in certain esoteric template situations. - - Because "typename TypeHelpers::ParameterType::type" is a bit of a mouthful, there's - a PARAMETER_TYPE(SomeClass) macro that you can use to get the same effect. - - E.g. "myFunction (PARAMETER_TYPE (int), PARAMETER_TYPE (MyObject))" - would evaluate to "myfunction (int, const MyObject&)", keeping any primitive types as - pass-by-value, but passing objects as a const reference, to avoid copying. - */ - template struct ParameterType { typedef const Type& type; }; - - #if ! DOXYGEN - template struct ParameterType { typedef Type& type; }; - template struct ParameterType { typedef Type* type; }; - template <> struct ParameterType { typedef char type; }; - template <> struct ParameterType { typedef unsigned char type; }; - template <> struct ParameterType { typedef short type; }; - template <> struct ParameterType { typedef unsigned short type; }; - template <> struct ParameterType { typedef int type; }; - template <> struct ParameterType { typedef unsigned int type; }; - template <> struct ParameterType { typedef long type; }; - template <> struct ParameterType { typedef unsigned long type; }; - template <> struct ParameterType { typedef int64 type; }; - template <> struct ParameterType { typedef uint64 type; }; - template <> struct ParameterType { typedef bool type; }; - template <> struct ParameterType { typedef float type; }; - template <> struct ParameterType { typedef double type; }; - #endif - - /** A helpful macro to simplify the use of the ParameterType template. - @see ParameterType - */ - #define PARAMETER_TYPE(a) typename TypeHelpers::ParameterType::type - #endif - - - /** These templates are designed to take a type, and if it's a double, they return a double - type; for anything else, they return a float type. - */ - template struct SmallestFloatType { typedef float type; }; - template <> struct SmallestFloatType { typedef double type; }; -} - - -//============================================================================== - -#endif // BEAST_MATHSFUNCTIONS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/maths/beast_Random.cpp b/Subtrees/beast/modules/beast_core/maths/beast_Random.cpp deleted file mode 100644 index aec64a81bb..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_Random.cpp +++ /dev/null @@ -1,171 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Random::Random (const int64 seedValue) noexcept - : seed (seedValue) -{ -} - -Random::Random() - : seed (1) -{ - setSeedRandomly(); -} - -Random::~Random() noexcept -{ -} - -void Random::setSeed (const int64 newSeed) noexcept -{ - seed = newSeed; -} - -void Random::combineSeed (const int64 seedValue) noexcept -{ - seed ^= nextInt64() ^ seedValue; -} - -void Random::setSeedRandomly() -{ - static int64 globalSeed = 0; - - combineSeed (globalSeed ^ (int64) (pointer_sized_int) this); - combineSeed (Time::getMillisecondCounter()); - combineSeed (Time::getHighResolutionTicks()); - combineSeed (Time::getHighResolutionTicksPerSecond()); - combineSeed (Time::currentTimeMillis()); - globalSeed ^= seed; -} - -Random& Random::getSystemRandom() noexcept -{ - static Random sysRand; - return sysRand; -} - -//============================================================================== -int Random::nextInt() noexcept -{ - seed = (seed * literal64bit (0x5deece66d) + 11) & literal64bit (0xffffffffffff); - - return (int) (seed >> 16); -} - -int Random::nextInt (const int maxValue) noexcept -{ - bassert (maxValue > 0); - return (int) ((((unsigned int) nextInt()) * (uint64) maxValue) >> 32); -} - -int64 Random::nextInt64() noexcept -{ - return (((int64) nextInt()) << 32) | (int64) (uint64) (uint32) nextInt(); -} - -bool Random::nextBool() noexcept -{ - return (nextInt() & 0x40000000) != 0; -} - -float Random::nextFloat() noexcept -{ - return static_cast (nextInt()) / (float) 0xffffffff; -} - -double Random::nextDouble() noexcept -{ - return static_cast (nextInt()) / (double) 0xffffffff; -} - -BigInteger Random::nextLargeNumber (const BigInteger& maximumValue) -{ - BigInteger n; - - do - { - fillBitsRandomly (n, 0, maximumValue.getHighestBit() + 1); - } - while (n >= maximumValue); - - return n; -} - -void Random::fillBitsRandomly (BigInteger& arrayToChange, int startBit, int numBits) -{ - arrayToChange.setBit (startBit + numBits - 1, true); // to force the array to pre-allocate space - - while ((startBit & 31) != 0 && numBits > 0) - { - arrayToChange.setBit (startBit++, nextBool()); - --numBits; - } - - while (numBits >= 32) - { - arrayToChange.setBitRangeAsInt (startBit, 32, (unsigned int) nextInt()); - startBit += 32; - numBits -= 32; - } - - while (--numBits >= 0) - arrayToChange.setBit (startBit + numBits, nextBool()); -} - -//============================================================================== -#if BEAST_UNIT_TESTS - -class RandomTests : public UnitTest -{ -public: - RandomTests() : UnitTest ("Random") {} - - void runTest() - { - beginTest ("Random"); - - for (int j = 10; --j >= 0;) - { - Random r; - r.setSeedRandomly(); - - for (int i = 20; --i >= 0;) - { - expect (r.nextDouble() >= 0.0 && r.nextDouble() < 1.0); - expect (r.nextFloat() >= 0.0f && r.nextFloat() < 1.0f); - expect (r.nextInt (5) >= 0 && r.nextInt (5) < 5); - expect (r.nextInt (1) == 0); - - int n = r.nextInt (50) + 1; - expect (r.nextInt (n) >= 0 && r.nextInt (n) < n); - - n = r.nextInt (0x7ffffffe) + 1; - expect (r.nextInt (n) >= 0 && r.nextInt (n) < n); - } - } - } -}; - -static RandomTests randomTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/maths/beast_Random.h b/Subtrees/beast/modules/beast_core/maths/beast_Random.h deleted file mode 100644 index cf9ce61613..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_Random.h +++ /dev/null @@ -1,135 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_RANDOM_BEASTHEADER -#define BEAST_RANDOM_BEASTHEADER - -#include "beast_BigInteger.h" - - -//============================================================================== -/** - A random number generator. - - You can create a Random object and use it to generate a sequence of random numbers. -*/ -class BEAST_API Random -{ -public: - //============================================================================== - /** Creates a Random object based on a seed value. - - For a given seed value, the subsequent numbers generated by this object - will be predictable, so a good idea is to set this value based - on the time, e.g. - - new Random (Time::currentTimeMillis()) - */ - explicit Random (int64 seedValue) noexcept; - - /** Creates a Random object using a random seed value. - Internally, this calls setSeedRandomly() to randomise the seed. - */ - Random(); - - /** Destructor. */ - ~Random() noexcept; - - /** Returns the next random 32 bit integer. - - @returns a random integer from the full range 0x80000000 to 0x7fffffff - */ - int nextInt() noexcept; - - /** Returns the next random number, limited to a given range. - The maxValue parameter may not be negative, or zero. - @returns a random integer between 0 (inclusive) and maxValue (exclusive). - */ - int nextInt (int maxValue) noexcept; - - /** Returns the next 64-bit random number. - - @returns a random integer from the full range 0x8000000000000000 to 0x7fffffffffffffff - */ - int64 nextInt64() noexcept; - - /** Returns the next random floating-point number. - - @returns a random value in the range 0 to 1.0 - */ - float nextFloat() noexcept; - - /** Returns the next random floating-point number. - - @returns a random value in the range 0 to 1.0 - */ - double nextDouble() noexcept; - - /** Returns the next random boolean value. - */ - bool nextBool() noexcept; - - /** Returns a BigInteger containing a random number. - - @returns a random value in the range 0 to (maximumValue - 1). - */ - BigInteger nextLargeNumber (const BigInteger& maximumValue); - - /** Sets a range of bits in a BigInteger to random values. */ - void fillBitsRandomly (BigInteger& arrayToChange, int startBit, int numBits); - - //============================================================================== - /** Resets this Random object to a given seed value. */ - void setSeed (int64 newSeed) noexcept; - - /** Merges this object's seed with another value. - This sets the seed to be a value created by combining the current seed and this - new value. - */ - void combineSeed (int64 seedValue) noexcept; - - /** Reseeds this generator using a value generated from various semi-random system - properties like the current time, etc. - - Because this function convolves the time with the last seed value, calling - it repeatedly will increase the randomness of the final result. - */ - void setSeedRandomly(); - - /** The overhead of creating a new Random object is fairly small, but if you want to avoid - it, you can call this method to get a global shared Random object. - - It's not thread-safe though, so threads should use their own Random object, otherwise - you run the risk of your random numbers becoming.. erm.. randomly corrupted.. - */ - static Random& getSystemRandom() noexcept; - -private: - //============================================================================== - int64 seed; - - BEAST_LEAK_DETECTOR (Random) -}; - - -#endif // BEAST_RANDOM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/maths/beast_Range.h b/Subtrees/beast/modules/beast_core/maths/beast_Range.h deleted file mode 100644 index dc3a1f2179..0000000000 --- a/Subtrees/beast/modules/beast_core/maths/beast_Range.h +++ /dev/null @@ -1,259 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_RANGE_BEASTHEADER -#define BEAST_RANGE_BEASTHEADER - - -//============================================================================== -/** A general-purpose range object, that simply represents any linear range with - a start and end point. - - The templated parameter is expected to be a primitive integer or floating point - type, though class types could also be used if they behave in a number-like way. -*/ -template -class Range -{ -public: - //============================================================================== - /** Constructs an empty range. */ - Range() noexcept : start(), end() - { - } - - /** Constructs a range with given start and end values. */ - Range (const ValueType startValue, const ValueType endValue) noexcept - : start (startValue), end (bmax (startValue, endValue)) - { - } - - /** Constructs a copy of another range. */ - Range (const Range& other) noexcept - : start (other.start), end (other.end) - { - } - - /** Copies another range object. */ - Range& operator= (Range other) noexcept - { - start = other.start; - end = other.end; - return *this; - } - - /** Returns the range that lies between two positions (in either order). */ - static Range between (const ValueType position1, const ValueType position2) noexcept - { - return position1 < position2 ? Range (position1, position2) - : Range (position2, position1); - } - - /** Returns a range with the specified start position and a length of zero. */ - static Range emptyRange (const ValueType start) noexcept - { - return Range (start, start); - } - - //============================================================================== - /** Returns the start of the range. */ - inline ValueType getStart() const noexcept { return start; } - - /** Returns the length of the range. */ - inline ValueType getLength() const noexcept { return end - start; } - - /** Returns the end of the range. */ - inline ValueType getEnd() const noexcept { return end; } - - /** Returns true if the range has a length of zero. */ - inline bool isEmpty() const noexcept { return start == end; } - - //============================================================================== - /** Changes the start position of the range, leaving the end position unchanged. - If the new start position is higher than the current end of the range, the end point - will be pushed along to equal it, leaving an empty range at the new position. - */ - void setStart (const ValueType newStart) noexcept - { - start = newStart; - if (end < newStart) - end = newStart; - } - - /** Returns a range with the same end as this one, but a different start. - If the new start position is higher than the current end of the range, the end point - will be pushed along to equal it, returning an empty range at the new position. - */ - Range withStart (const ValueType newStart) const noexcept - { - return Range (newStart, bmax (newStart, end)); - } - - /** Returns a range with the same length as this one, but moved to have the given start position. */ - Range movedToStartAt (const ValueType newStart) const noexcept - { - return Range (newStart, end + (newStart - start)); - } - - /** Changes the end position of the range, leaving the start unchanged. - If the new end position is below the current start of the range, the start point - will be pushed back to equal the new end point. - */ - void setEnd (const ValueType newEnd) noexcept - { - end = newEnd; - if (newEnd < start) - start = newEnd; - } - - /** Returns a range with the same start position as this one, but a different end. - If the new end position is below the current start of the range, the start point - will be pushed back to equal the new end point. - */ - Range withEnd (const ValueType newEnd) const noexcept - { - return Range (bmin (start, newEnd), newEnd); - } - - /** Returns a range with the same length as this one, but moved to have the given end position. */ - Range movedToEndAt (const ValueType newEnd) const noexcept - { - return Range (start + (newEnd - end), newEnd); - } - - /** Changes the length of the range. - Lengths less than zero are treated as zero. - */ - void setLength (const ValueType newLength) noexcept - { - end = start + bmax (ValueType(), newLength); - } - - /** Returns a range with the same start as this one, but a different length. - Lengths less than zero are treated as zero. - */ - Range withLength (const ValueType newLength) const noexcept - { - return Range (start, start + newLength); - } - - //============================================================================== - /** Adds an amount to the start and end of the range. */ - inline Range operator+= (const ValueType amountToAdd) noexcept - { - start += amountToAdd; - end += amountToAdd; - return *this; - } - - /** Subtracts an amount from the start and end of the range. */ - inline Range operator-= (const ValueType amountToSubtract) noexcept - { - start -= amountToSubtract; - end -= amountToSubtract; - return *this; - } - - /** Returns a range that is equal to this one with an amount added to its - start and end. - */ - Range operator+ (const ValueType amountToAdd) const noexcept - { - return Range (start + amountToAdd, end + amountToAdd); - } - - /** Returns a range that is equal to this one with the specified amount - subtracted from its start and end. */ - Range operator- (const ValueType amountToSubtract) const noexcept - { - return Range (start - amountToSubtract, end - amountToSubtract); - } - - bool operator== (Range other) const noexcept { return start == other.start && end == other.end; } - bool operator!= (Range other) const noexcept { return start != other.start || end != other.end; } - - //============================================================================== - /** Returns true if the given position lies inside this range. */ - bool contains (const ValueType position) const noexcept - { - return start <= position && position < end; - } - - /** Returns the nearest value to the one supplied, which lies within the range. */ - ValueType clipValue (const ValueType value) const noexcept - { - return blimit (start, end, value); - } - - /** Returns true if the given range lies entirely inside this range. */ - bool contains (Range other) const noexcept - { - return start <= other.start && end >= other.end; - } - - /** Returns true if the given range intersects this one. */ - bool intersects (Range other) const noexcept - { - return other.start < end && start < other.end; - } - - /** Returns the range that is the intersection of the two ranges, or an empty range - with an undefined start position if they don't overlap. */ - Range getIntersectionWith (Range other) const noexcept - { - return Range (bmax (start, other.start), - bmin (end, other.end)); - } - - /** Returns the smallest range that contains both this one and the other one. */ - Range getUnionWith (Range other) const noexcept - { - return Range (bmin (start, other.start), - bmax (end, other.end)); - } - - /** Returns a given range, after moving it forwards or backwards to fit it - within this range. - - If the supplied range has a greater length than this one, the return value - will be this range. - - Otherwise, if the supplied range is smaller than this one, the return value - will be the new range, shifted forwards or backwards so that it doesn't extend - beyond this one, but keeping its original length. - */ - Range constrainRange (Range rangeToConstrain) const noexcept - { - const ValueType otherLen = rangeToConstrain.getLength(); - return getLength() <= otherLen - ? *this - : rangeToConstrain.movedToStartAt (blimit (start, end - otherLen, rangeToConstrain.getStart())); - } - -private: - //============================================================================== - ValueType start, end; -}; - - -#endif // BEAST_RANGE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_Atomic.h b/Subtrees/beast/modules/beast_core/memory/beast_Atomic.h deleted file mode 100644 index 83d43994b2..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_Atomic.h +++ /dev/null @@ -1,388 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ATOMIC_BEASTHEADER -#define BEAST_ATOMIC_BEASTHEADER - - -//============================================================================== -/** - Simple class to hold a primitive value and perform atomic operations on it. - - The type used must be a 32 or 64 bit primitive, like an int, pointer, etc. - There are methods to perform most of the basic atomic operations. -*/ -template -class Atomic -{ -public: - /** Creates a new value, initialised to zero. */ - inline Atomic() noexcept - : value (0) - { - } - - /** Creates a new value, with a given initial value. */ - inline Atomic (const Type initialValue) noexcept - : value (initialValue) - { - } - - /** Copies another value (atomically). */ - inline Atomic (const Atomic& other) noexcept - : value (other.get()) - { - } - - /** Destructor. */ - inline ~Atomic() noexcept - { - // This class can only be used for types which are 32 or 64 bits in size. - static_bassert (sizeof (Type) == 4 || sizeof (Type) == 8); - } - - /** Atomically reads and returns the current value. */ - Type get() const noexcept; - - /** Copies another value onto this one (atomically). */ - inline Atomic& operator= (const Atomic& other) noexcept { exchange (other.get()); return *this; } - - /** Copies another value onto this one (atomically). */ - inline Atomic& operator= (const Type newValue) noexcept { exchange (newValue); return *this; } - - /** Atomically sets the current value. */ - void set (Type newValue) noexcept { exchange (newValue); } - - /** Atomically sets the current value, returning the value that was replaced. */ - Type exchange (Type value) noexcept; - - /** Atomically adds a number to this value, returning the new value. */ - Type operator+= (Type amountToAdd) noexcept; - - /** Atomically subtracts a number from this value, returning the new value. */ - Type operator-= (Type amountToSubtract) noexcept; - - /** Atomically increments this value, returning the new value. */ - Type operator++() noexcept; - - /** Atomically decrements this value, returning the new value. */ - Type operator--() noexcept; - - /** Atomically compares this value with a target value, and if it is equal, sets - this to be equal to a new value. - - This operation is the atomic equivalent of doing this: - @code - bool compareAndSetBool (Type newValue, Type valueToCompare) - { - if (get() == valueToCompare) - { - set (newValue); - return true; - } - - return false; - } - @endcode - - @returns true if the comparison was true and the value was replaced; false if - the comparison failed and the value was left unchanged. - @see compareAndSetValue - */ - bool compareAndSetBool (Type newValue, Type valueToCompare) noexcept; - - /** Atomically compares this value with a target value, and if it is equal, sets - this to be equal to a new value. - - This operation is the atomic equivalent of doing this: - @code - Type compareAndSetValue (Type newValue, Type valueToCompare) - { - Type oldValue = get(); - if (oldValue == valueToCompare) - set (newValue); - - return oldValue; - } - @endcode - - @returns the old value before it was changed. - @see compareAndSetBool - */ - Type compareAndSetValue (Type newValue, Type valueToCompare) noexcept; - - /** Implements a memory read/write barrier. */ - static void memoryBarrier() noexcept; - - //============================================================================== - #if BEAST_64BIT - BEAST_ALIGN (8) - #else - BEAST_ALIGN (4) - #endif - - /** The raw value that this class operates on. - This is exposed publically in case you need to manipulate it directly - for performance reasons. - */ - volatile Type value; - -private: - static inline Type castFrom32Bit (int32 value) noexcept { return *(Type*) &value; } - static inline Type castFrom64Bit (int64 value) noexcept { return *(Type*) &value; } - static inline int32 castTo32Bit (Type value) noexcept { return *(int32*) &value; } - static inline int64 castTo64Bit (Type value) noexcept { return *(int64*) &value; } - - Type operator++ (int); // better to just use pre-increment with atomics.. - Type operator-- (int); - - /** This templated negate function will negate pointers as well as integers */ - template - inline ValueType negateValue (ValueType n) noexcept - { - return sizeof (ValueType) == 1 ? (ValueType) -(signed char) n - : (sizeof (ValueType) == 2 ? (ValueType) -(short) n - : (sizeof (ValueType) == 4 ? (ValueType) -(int) n - : ((ValueType) -(int64) n))); - } - - /** This templated negate function will negate pointers as well as integers */ - template - inline PointerType* negateValue (PointerType* n) noexcept - { - return reinterpret_cast (-reinterpret_cast (n)); - } -}; - - -//============================================================================== -/* - The following code is in the header so that the atomics can be inlined where possible... -*/ -#if BEAST_IOS || (BEAST_MAC && (BEAST_PPC || BEAST_CLANG || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))) - #define BEAST_ATOMICS_MAC 1 // Older OSX builds using gcc4.1 or earlier - - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - #define BEAST_MAC_ATOMICS_VOLATILE - #else - #define BEAST_MAC_ATOMICS_VOLATILE volatile - #endif - - #if BEAST_PPC || BEAST_IOS - // None of these atomics are available for PPC or for iOS 3.1 or earlier!! - template static Type OSAtomicAdd64Barrier (Type b, BEAST_MAC_ATOMICS_VOLATILE Type* a) noexcept { bassertfalse; return *a += b; } - template static Type OSAtomicIncrement64Barrier (BEAST_MAC_ATOMICS_VOLATILE Type* a) noexcept { bassertfalse; return ++*a; } - template static Type OSAtomicDecrement64Barrier (BEAST_MAC_ATOMICS_VOLATILE Type* a) noexcept { bassertfalse; return --*a; } - template static bool OSAtomicCompareAndSwap64Barrier (Type old, Type newValue, BEAST_MAC_ATOMICS_VOLATILE Type* value) noexcept - { bassertfalse; if (old == *value) { *value = newValue; return true; } return false; } - #define BEAST_64BIT_ATOMICS_UNAVAILABLE 1 - #endif - -//============================================================================== -#elif BEAST_GCC - #define BEAST_ATOMICS_GCC 1 // GCC with intrinsics - - #if BEAST_IOS || BEAST_ANDROID // (64-bit ops will compile but not link on these mobile OSes) - #define BEAST_64BIT_ATOMICS_UNAVAILABLE 1 - #endif - -//============================================================================== -#else - #define BEAST_ATOMICS_WINDOWS 1 // Windows with intrinsics - - #if BEAST_USE_INTRINSICS - #ifndef __INTEL_COMPILER - #pragma intrinsic (_InterlockedExchange, _InterlockedIncrement, _InterlockedDecrement, _InterlockedCompareExchange, \ - _InterlockedCompareExchange64, _InterlockedExchangeAdd, _ReadWriteBarrier) - #endif - #define beast_InterlockedExchange(a, b) _InterlockedExchange(a, b) - #define beast_InterlockedIncrement(a) _InterlockedIncrement(a) - #define beast_InterlockedDecrement(a) _InterlockedDecrement(a) - #define beast_InterlockedExchangeAdd(a, b) _InterlockedExchangeAdd(a, b) - #define beast_InterlockedCompareExchange(a, b, c) _InterlockedCompareExchange(a, b, c) - #define beast_InterlockedCompareExchange64(a, b, c) _InterlockedCompareExchange64(a, b, c) - #define beast_MemoryBarrier _ReadWriteBarrier - #else - long beast_InterlockedExchange (volatile long* a, long b) noexcept; - long beast_InterlockedIncrement (volatile long* a) noexcept; - long beast_InterlockedDecrement (volatile long* a) noexcept; - long beast_InterlockedExchangeAdd (volatile long* a, long b) noexcept; - long beast_InterlockedCompareExchange (volatile long* a, long b, long c) noexcept; - __int64 beast_InterlockedCompareExchange64 (volatile __int64* a, __int64 b, __int64 c) noexcept; - inline void beast_MemoryBarrier() noexcept { long x = 0; beast_InterlockedIncrement (&x); } - #endif - - #if BEAST_64BIT - #ifndef __INTEL_COMPILER - #pragma intrinsic (_InterlockedExchangeAdd64, _InterlockedExchange64, _InterlockedIncrement64, _InterlockedDecrement64) - #endif - #define beast_InterlockedExchangeAdd64(a, b) _InterlockedExchangeAdd64(a, b) - #define beast_InterlockedExchange64(a, b) _InterlockedExchange64(a, b) - #define beast_InterlockedIncrement64(a) _InterlockedIncrement64(a) - #define beast_InterlockedDecrement64(a) _InterlockedDecrement64(a) - #else - // None of these atomics are available in a 32-bit Windows build!! - template static Type beast_InterlockedExchangeAdd64 (volatile Type* a, Type b) noexcept { bassertfalse; Type old = *a; *a += b; return old; } - template static Type beast_InterlockedExchange64 (volatile Type* a, Type b) noexcept { bassertfalse; Type old = *a; *a = b; return old; } - template static Type beast_InterlockedIncrement64 (volatile Type* a) noexcept { bassertfalse; return ++*a; } - template static Type beast_InterlockedDecrement64 (volatile Type* a) noexcept { bassertfalse; return --*a; } - #define BEAST_64BIT_ATOMICS_UNAVAILABLE 1 - #endif -#endif - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4311) // (truncation warning) -#endif - -//============================================================================== -template -inline Type Atomic::get() const noexcept -{ - #if BEAST_ATOMICS_MAC - return sizeof (Type) == 4 ? castFrom32Bit ((int32) OSAtomicAdd32Barrier ((int32_t) 0, (BEAST_MAC_ATOMICS_VOLATILE int32_t*) &value)) - : castFrom64Bit ((int64) OSAtomicAdd64Barrier ((int64_t) 0, (BEAST_MAC_ATOMICS_VOLATILE int64_t*) &value)); - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) beast_InterlockedExchangeAdd ((volatile long*) &value, (long) 0)) - : castFrom64Bit ((int64) beast_InterlockedExchangeAdd64 ((volatile __int64*) &value, (__int64) 0)); - #elif BEAST_ATOMICS_GCC - return sizeof (Type) == 4 ? castFrom32Bit ((int32) __sync_add_and_fetch ((volatile int32*) &value, 0)) - : castFrom64Bit ((int64) __sync_add_and_fetch ((volatile int64*) &value, 0)); - #endif -} - -template -inline Type Atomic::exchange (const Type newValue) noexcept -{ - #if BEAST_ATOMICS_MAC || BEAST_ATOMICS_GCC - Type currentVal = value; - while (! compareAndSetBool (newValue, currentVal)) { currentVal = value; } - return currentVal; - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) beast_InterlockedExchange ((volatile long*) &value, (long) castTo32Bit (newValue))) - : castFrom64Bit ((int64) beast_InterlockedExchange64 ((volatile __int64*) &value, (__int64) castTo64Bit (newValue))); - #endif -} - -template -inline Type Atomic::operator+= (const Type amountToAdd) noexcept -{ - #if BEAST_ATOMICS_MAC - return sizeof (Type) == 4 ? (Type) OSAtomicAdd32Barrier ((int32_t) castTo32Bit (amountToAdd), (BEAST_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicAdd64Barrier ((int64_t) amountToAdd, (BEAST_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) (beast_InterlockedExchangeAdd ((volatile long*) &value, (long) amountToAdd) + (long) amountToAdd) - : (Type) (beast_InterlockedExchangeAdd64 ((volatile __int64*) &value, (__int64) amountToAdd) + (__int64) amountToAdd); - #elif BEAST_ATOMICS_GCC - return (Type) __sync_add_and_fetch (&value, amountToAdd); - #endif -} - -template -inline Type Atomic::operator-= (const Type amountToSubtract) noexcept -{ - return operator+= (negateValue (amountToSubtract)); -} - -template -inline Type Atomic::operator++() noexcept -{ - #if BEAST_ATOMICS_MAC - return sizeof (Type) == 4 ? (Type) OSAtomicIncrement32Barrier ((BEAST_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicIncrement64Barrier ((BEAST_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) beast_InterlockedIncrement ((volatile long*) &value) - : (Type) beast_InterlockedIncrement64 ((volatile __int64*) &value); - #elif BEAST_ATOMICS_GCC - return (Type) __sync_add_and_fetch (&value, 1); - #endif -} - -template -inline Type Atomic::operator--() noexcept -{ - #if BEAST_ATOMICS_MAC - return sizeof (Type) == 4 ? (Type) OSAtomicDecrement32Barrier ((BEAST_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicDecrement64Barrier ((BEAST_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) beast_InterlockedDecrement ((volatile long*) &value) - : (Type) beast_InterlockedDecrement64 ((volatile __int64*) &value); - #elif BEAST_ATOMICS_GCC - return (Type) __sync_add_and_fetch (&value, -1); - #endif -} - -template -inline bool Atomic::compareAndSetBool (const Type newValue, const Type valueToCompare) noexcept -{ - #if BEAST_ATOMICS_MAC - return sizeof (Type) == 4 ? OSAtomicCompareAndSwap32Barrier ((int32_t) castTo32Bit (valueToCompare), (int32_t) castTo32Bit (newValue), (BEAST_MAC_ATOMICS_VOLATILE int32_t*) &value) - : OSAtomicCompareAndSwap64Barrier ((int64_t) castTo64Bit (valueToCompare), (int64_t) castTo64Bit (newValue), (BEAST_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif BEAST_ATOMICS_WINDOWS - return compareAndSetValue (newValue, valueToCompare) == valueToCompare; - #elif BEAST_ATOMICS_GCC - return sizeof (Type) == 4 ? __sync_bool_compare_and_swap ((volatile int32*) &value, castTo32Bit (valueToCompare), castTo32Bit (newValue)) - : __sync_bool_compare_and_swap ((volatile int64*) &value, castTo64Bit (valueToCompare), castTo64Bit (newValue)); - #endif -} - -template -inline Type Atomic::compareAndSetValue (const Type newValue, const Type valueToCompare) noexcept -{ - #if BEAST_ATOMICS_MAC - for (;;) // Annoying workaround for only having a bool CAS operation.. - { - if (compareAndSetBool (newValue, valueToCompare)) - return valueToCompare; - - const Type result = value; - if (result != valueToCompare) - return result; - } - - #elif BEAST_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) beast_InterlockedCompareExchange ((volatile long*) &value, (long) castTo32Bit (newValue), (long) castTo32Bit (valueToCompare))) - : castFrom64Bit ((int64) beast_InterlockedCompareExchange64 ((volatile __int64*) &value, (__int64) castTo64Bit (newValue), (__int64) castTo64Bit (valueToCompare))); - #elif BEAST_ATOMICS_GCC - return sizeof (Type) == 4 ? castFrom32Bit ((int32) __sync_val_compare_and_swap ((volatile int32*) &value, castTo32Bit (valueToCompare), castTo32Bit (newValue))) - : castFrom64Bit ((int64) __sync_val_compare_and_swap ((volatile int64*) &value, castTo64Bit (valueToCompare), castTo64Bit (newValue))); - #endif -} - -template -inline void Atomic::memoryBarrier() noexcept -{ - #if BEAST_ATOMICS_MAC - OSMemoryBarrier(); - #elif BEAST_ATOMICS_GCC - __sync_synchronize(); - #elif BEAST_ATOMICS_WINDOWS - beast_MemoryBarrier(); - #endif -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -#endif // BEAST_ATOMIC_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_ByteOrder.h b/Subtrees/beast/modules/beast_core/memory/beast_ByteOrder.h deleted file mode 100644 index 0d41fe2266..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_ByteOrder.h +++ /dev/null @@ -1,181 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BYTEORDER_BEASTHEADER -#define BEAST_BYTEORDER_BEASTHEADER - - -//============================================================================== -/** Contains static methods for converting the byte order between different - endiannesses. -*/ -class BEAST_API ByteOrder -{ -public: - //============================================================================== - /** Swaps the upper and lower bytes of a 16-bit integer. */ - static uint16 swap (uint16 value); - - /** Reverses the order of the 4 bytes in a 32-bit integer. */ - static uint32 swap (uint32 value); - - /** Reverses the order of the 8 bytes in a 64-bit integer. */ - static uint64 swap (uint64 value); - - //============================================================================== - /** Swaps the byte order of a 16-bit int if the CPU is big-endian */ - static uint16 swapIfBigEndian (uint16 value); - - /** Swaps the byte order of a 32-bit int if the CPU is big-endian */ - static uint32 swapIfBigEndian (uint32 value); - - /** Swaps the byte order of a 64-bit int if the CPU is big-endian */ - static uint64 swapIfBigEndian (uint64 value); - - /** Swaps the byte order of a 16-bit int if the CPU is little-endian */ - static uint16 swapIfLittleEndian (uint16 value); - - /** Swaps the byte order of a 32-bit int if the CPU is little-endian */ - static uint32 swapIfLittleEndian (uint32 value); - - /** Swaps the byte order of a 64-bit int if the CPU is little-endian */ - static uint64 swapIfLittleEndian (uint64 value); - - //============================================================================== - /** Turns 4 bytes into a little-endian integer. */ - static uint32 littleEndianInt (const void* bytes); - - /** Turns 2 bytes into a little-endian integer. */ - static uint16 littleEndianShort (const void* bytes); - - /** Turns 4 bytes into a big-endian integer. */ - static uint32 bigEndianInt (const void* bytes); - - /** Turns 2 bytes into a big-endian integer. */ - static uint16 bigEndianShort (const void* bytes); - - //============================================================================== - /** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int littleEndian24Bit (const char* bytes); - - /** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int bigEndian24Bit (const char* bytes); - - /** Copies a 24-bit number to 3 little-endian bytes. */ - static void littleEndian24BitToChars (int value, char* destBytes); - - /** Copies a 24-bit number to 3 big-endian bytes. */ - static void bigEndian24BitToChars (int value, char* destBytes); - - //============================================================================== - /** Returns true if the current CPU is big-endian. */ - static bool isBigEndian(); - -private: - ByteOrder(); - - BEAST_DECLARE_NON_COPYABLE (ByteOrder) -}; - - -//============================================================================== -#if BEAST_USE_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_byteswap_ulong) -#endif - -inline uint16 ByteOrder::swap (uint16 n) -{ - #if BEAST_USE_INTRINSICSxxx // agh - the MS compiler has an internal error when you try to use this intrinsic! - return static_cast (_byteswap_ushort (n)); - #else - return static_cast ((n << 8) | (n >> 8)); - #endif -} - -inline uint32 ByteOrder::swap (uint32 n) -{ - #if BEAST_MAC || BEAST_IOS - return OSSwapInt32 (n); - #elif BEAST_GCC && BEAST_INTEL && ! BEAST_NO_INLINE_ASM - asm("bswap %%eax" : "=a"(n) : "a"(n)); - return n; - #elif BEAST_USE_INTRINSICS - return _byteswap_ulong (n); - #elif BEAST_MSVC && ! BEAST_NO_INLINE_ASM - __asm { - mov eax, n - bswap eax - mov n, eax - } - return n; - #elif BEAST_ANDROID - return bswap_32 (n); - #else - return (n << 24) | (n >> 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8); - #endif -} - -inline uint64 ByteOrder::swap (uint64 value) -{ - #if BEAST_MAC || BEAST_IOS - return OSSwapInt64 (value); - #elif BEAST_USE_INTRINSICS - return _byteswap_uint64 (value); - #else - return (((int64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32)); - #endif -} - -#if BEAST_LITTLE_ENDIAN - inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) { return v; } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return v; } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return v; } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return swap (v); } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return swap (v); } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return swap (v); } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return *static_cast (bytes); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return *static_cast (bytes); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return swap (*static_cast (bytes)); } - inline bool ByteOrder::isBigEndian() { return false; } -#else - inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) { return swap (v); } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return swap (v); } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return swap (v); } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return v; } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return v; } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return v; } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return *static_cast (bytes); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return *static_cast (bytes); } - inline bool ByteOrder::isBigEndian() { return true; } -#endif - -inline int ByteOrder::littleEndian24Bit (const char* const bytes) { return (((int) bytes[2]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[0]); } -inline int ByteOrder::bigEndian24Bit (const char* const bytes) { return (((int) bytes[0]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[2]); } -inline void ByteOrder::littleEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); } -inline void ByteOrder::bigEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); } - - -#endif // BEAST_BYTEORDER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_HeapBlock.h b/Subtrees/beast/modules/beast_core/memory/beast_HeapBlock.h deleted file mode 100644 index 4badf561c2..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_HeapBlock.h +++ /dev/null @@ -1,303 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_HEAPBLOCK_BEASTHEADER -#define BEAST_HEAPBLOCK_BEASTHEADER - -#ifndef DOXYGEN -namespace HeapBlockHelper -{ - template - struct ThrowOnFail { static void check (void*) {} }; - - template<> - struct ThrowOnFail { static void check (void* data) { if (data == nullptr) throw std::bad_alloc(); } }; -} -#endif - -//============================================================================== -/** - Very simple container class to hold a pointer to some data on the heap. - - When you need to allocate some heap storage for something, always try to use - this class instead of allocating the memory directly using malloc/free. - - A HeapBlock object can be treated in pretty much exactly the same way - as an char*, but as long as you allocate it on the stack or as a class member, - it's almost impossible for it to leak memory. - - It also makes your code much more concise and readable than doing the same thing - using direct allocations, - - E.g. instead of this: - @code - int* temp = (int*) malloc (1024 * sizeof (int)); - memcpy (temp, xyz, 1024 * sizeof (int)); - free (temp); - temp = (int*) calloc (2048 * sizeof (int)); - temp[0] = 1234; - memcpy (foobar, temp, 2048 * sizeof (int)); - free (temp); - @endcode - - ..you could just write this: - @code - HeapBlock temp (1024); - memcpy (temp, xyz, 1024 * sizeof (int)); - temp.calloc (2048); - temp[0] = 1234; - memcpy (foobar, temp, 2048 * sizeof (int)); - @endcode - - The class is extremely lightweight, containing only a pointer to the - data, and exposes malloc/realloc/calloc/free methods that do the same jobs - as their less object-oriented counterparts. Despite adding safety, you probably - won't sacrifice any performance by using this in place of normal pointers. - - The throwOnFailure template parameter can be set to true if you'd like the class - to throw a std::bad_alloc exception when an allocation fails. If this is false, - then a failed allocation will just leave the heapblock with a null pointer (assuming - that the system's malloc() function doesn't throw). - - @see Array, OwnedArray, MemoryBlock -*/ -template -class HeapBlock -{ -public: - //============================================================================== - /** Creates a HeapBlock which is initially just a null pointer. - - After creation, you can resize the array using the malloc(), calloc(), - or realloc() methods. - */ - HeapBlock() noexcept : data (nullptr) - { - } - - /** Creates a HeapBlock containing a number of elements. - - The contents of the block are undefined, as it will have been created by a - malloc call. - - If you want an array of zero values, you can use the calloc() method or the - other constructor that takes an InitialisationState parameter. - */ - explicit HeapBlock (const size_t numElements) - : data (static_cast (std::malloc (numElements * sizeof (ElementType)))) - { - throwOnAllocationFailure(); - } - - /** Creates a HeapBlock containing a number of elements. - - The initialiseToZero parameter determines whether the new memory should be cleared, - or left uninitialised. - */ - HeapBlock (const size_t numElements, const bool initialiseToZero) - : data (static_cast (initialiseToZero - ? std::calloc (numElements, sizeof (ElementType)) - : std::malloc (numElements * sizeof (ElementType)))) - { - throwOnAllocationFailure(); - } - - /** Destructor. - This will free the data, if any has been allocated. - */ - ~HeapBlock() - { - std::free (data); - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - HeapBlock (HeapBlock&& other) noexcept - : data (other.data) - { - other.data = nullptr; - } - - HeapBlock& operator= (HeapBlock&& other) noexcept - { - std::swap (data, other.data); - return *this; - } - #endif - - //============================================================================== - /** Returns a raw pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator ElementType*() const noexcept { return data; } - - /** Returns a raw pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline ElementType* getData() const noexcept { return data; } - - /** Returns a void pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator void*() const noexcept { return static_cast (data); } - - /** Returns a void pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator const void*() const noexcept { return static_cast (data); } - - /** Lets you use indirect calls to the first element in the array. - Obviously this will cause problems if the array hasn't been initialised, because it'll - be referencing a null pointer. - */ - inline ElementType* operator->() const noexcept { return data; } - - /** Returns a reference to one of the data elements. - Obviously there's no bounds-checking here, as this object is just a dumb pointer and - has no idea of the size it currently has allocated. - */ - template - inline ElementType& operator[] (IndexType index) const noexcept { return data [index]; } - - /** Returns a pointer to a data element at an offset from the start of the array. - This is the same as doing pointer arithmetic on the raw pointer itself. - */ - template - inline ElementType* operator+ (IndexType index) const noexcept { return data + index; } - - //============================================================================== - /** Compares the pointer with another pointer. - This can be handy for checking whether this is a null pointer. - */ - inline bool operator== (const ElementType* const otherPointer) const noexcept { return otherPointer == data; } - - /** Compares the pointer with another pointer. - This can be handy for checking whether this is a null pointer. - */ - inline bool operator!= (const ElementType* const otherPointer) const noexcept { return otherPointer != data; } - - //============================================================================== - /** Allocates a specified amount of memory. - - This uses the normal malloc to allocate an amount of memory for this object. - Any previously allocated memory will be freed by this method. - - The number of bytes allocated will be (newNumElements * elementSize). Normally - you wouldn't need to specify the second parameter, but it can be handy if you need - to allocate a size in bytes rather than in terms of the number of elements. - - The data that is allocated will be freed when this object is deleted, or when you - call free() or any of the allocation methods. - */ - void malloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - std::free (data); - data = static_cast (std::malloc (newNumElements * elementSize)); - throwOnAllocationFailure(); - } - - /** Allocates a specified amount of memory and clears it. - This does the same job as the malloc() method, but clears the memory that it allocates. - */ - void calloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - std::free (data); - data = static_cast (std::calloc (newNumElements, elementSize)); - throwOnAllocationFailure(); - } - - /** Allocates a specified amount of memory and optionally clears it. - This does the same job as either malloc() or calloc(), depending on the - initialiseToZero parameter. - */ - void allocate (const size_t newNumElements, bool initialiseToZero) - { - std::free (data); - data = static_cast (initialiseToZero - ? std::calloc (newNumElements, sizeof (ElementType)) - : std::malloc (newNumElements * sizeof (ElementType))); - throwOnAllocationFailure(); - } - - /** Re-allocates a specified amount of memory. - - The semantics of this method are the same as malloc() and calloc(), but it - uses realloc() to keep as much of the existing data as possible. - */ - void realloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - data = static_cast (data == nullptr ? std::malloc (newNumElements * elementSize) - : std::realloc (data, newNumElements * elementSize)); - throwOnAllocationFailure(); - } - - /** Frees any currently-allocated data. - This will free the data and reset this object to be a null pointer. - */ - void free() - { - std::free (data); - data = nullptr; - } - - /** Swaps this object's data with the data of another HeapBlock. - The two objects simply exchange their data pointers. - */ - template - void swapWith (HeapBlock & other) noexcept - { - std::swap (data, other.data); - } - - /** This fills the block with zeros, up to the number of elements specified. - Since the block has no way of knowing its own size, you must make sure that the number of - elements you specify doesn't exceed the allocated size. - */ - void clear (size_t numElements) noexcept - { - zeromem (data, sizeof (ElementType) * numElements); - } - - /** This typedef can be used to get the type of the heapblock's elements. */ - typedef ElementType Type; - -private: - //============================================================================== - ElementType* data; - - void throwOnAllocationFailure() const - { - HeapBlockHelper::ThrowOnFail::check (data); - } - - #if ! (defined (BEAST_DLL) || defined (BEAST_DLL_BUILD)) - BEAST_DECLARE_NON_COPYABLE (HeapBlock) - BEAST_PREVENT_HEAP_ALLOCATION // Creating a 'new HeapBlock' would be missing the point! - #endif -}; - - -#endif // BEAST_HEAPBLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_LeakedObjectDetector.h b/Subtrees/beast/modules/beast_core/memory/beast_LeakedObjectDetector.h deleted file mode 100644 index eaa01b15df..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_LeakedObjectDetector.h +++ /dev/null @@ -1,144 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LEAKEDOBJECTDETECTOR_BEASTHEADER -#define BEAST_LEAKEDOBJECTDETECTOR_BEASTHEADER - -#include "../text/beast_String.h" -#include "beast_Atomic.h" - - -//============================================================================== -/** - Embedding an instance of this class inside another class can be used as a low-overhead - way of detecting leaked instances. - - This class keeps an internal static count of the number of instances that are - active, so that when the app is shutdown and the static destructors are called, - it can check whether there are any left-over instances that may have been leaked. - - To use it, use the BEAST_LEAK_DETECTOR macro as a simple way to put one in your - class declaration. Have a look through the beast codebase for examples, it's used - in most of the classes. -*/ -template -class LeakedObjectDetector -{ -public: - //============================================================================== - LeakedObjectDetector() noexcept { ++(getCounter().numObjects); } - LeakedObjectDetector (const LeakedObjectDetector&) noexcept { ++(getCounter().numObjects); } - - ~LeakedObjectDetector() - { - if (--(getCounter().numObjects) < 0) - { - DBG ("*** Dangling pointer deletion! Class: " << getLeakedObjectClassName()); - - /** If you hit this, then you've managed to delete more instances of this class than you've - created.. That indicates that you're deleting some dangling pointers. - - Note that although this assertion will have been triggered during a destructor, it might - not be this particular deletion that's at fault - the incorrect one may have happened - at an earlier point in the program, and simply not been detected until now. - - Most errors like this are caused by using old-fashioned, non-RAII techniques for - your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, - ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! - */ - bassertfalse; - } - } - -private: - //============================================================================== - class LeakCounter - { - public: - LeakCounter() noexcept {} - - ~LeakCounter() - { - if (numObjects.value > 0) - { - DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << getLeakedObjectClassName()); - - /** If you hit this, then you've leaked one or more objects of the type specified by - the 'OwnerClass' template parameter - the name should have been printed by the line above. - - If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for - your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, - ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! - */ - bassertfalse; - } - } - - Atomic numObjects; - }; - - static const char* getLeakedObjectClassName() - { - return OwnerClass::getLeakedObjectClassName(); - } - - static LeakCounter& getCounter() noexcept - { - static LeakCounter counter; - return counter; - } -}; - -//============================================================================== -#if DOXYGEN || ! defined (BEAST_LEAK_DETECTOR) - #if (DOXYGEN || BEAST_CHECK_MEMORY_LEAKS) - /** This macro lets you embed a leak-detecting object inside a class. - - To use it, simply declare a BEAST_LEAK_DETECTOR(YourClassName) inside a private section - of the class declaration. E.g. - - @code - class MyClass - { - public: - MyClass(); - void blahBlah(); - - private: - BEAST_LEAK_DETECTOR (MyClass) - }; - @endcode - - @see BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR, LeakedObjectDetector - */ - #define BEAST_LEAK_DETECTOR(OwnerClass) \ - friend class beast::LeakedObjectDetector; \ - static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \ - beast::LeakedObjectDetector BEAST_JOIN_MACRO (leakDetector, __LINE__); - #else - #define BEAST_LEAK_DETECTOR(OwnerClass) - #endif -#endif - - -#endif // BEAST_LEAKEDOBJECTDETECTOR_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_Memory.h b/Subtrees/beast/modules/beast_core/memory/beast_Memory.h deleted file mode 100644 index 68def8bd8e..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_Memory.h +++ /dev/null @@ -1,121 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORY_BEASTHEADER -#define BEAST_MEMORY_BEASTHEADER - -//============================================================================== -/** Fills a block of memory with zeros. */ -inline void zeromem (void* memory, size_t numBytes) noexcept { memset (memory, 0, numBytes); } - -/** Overwrites a structure or object with zeros. */ -template -inline void zerostruct (Type& structure) noexcept { memset (&structure, 0, sizeof (structure)); } - -/** Delete an object pointer, and sets the pointer to null. - - Remember that it's not good c++ practice to use delete directly - always try to use a ScopedPointer - or other automatic lifetime-management system rather than resorting to deleting raw pointers! -*/ -template -inline void deleteAndZero (Type& pointer) { delete pointer; pointer = nullptr; } - -/** A handy function which adds a number of bytes to any type of pointer and returns the result. - This can be useful to avoid casting pointers to a char* and back when you want to move them by - a specific number of bytes, -*/ -template -inline Type* addBytesToPointer (Type* pointer, IntegerType bytes) noexcept { return (Type*) (((char*) pointer) + bytes); } - -/** A handy function which returns the difference between any two pointers, in bytes. - The address of the second pointer is subtracted from the first, and the difference in bytes is returned. -*/ -template -inline int getAddressDifference (Type1* pointer1, Type2* pointer2) noexcept { return (int) (((const char*) pointer1) - (const char*) pointer2); } - -/** If a pointer is non-null, this returns a new copy of the object that it points to, or safely returns - nullptr if the pointer is null. -*/ -template -inline Type* createCopyIfNotNull (const Type* pointer) { return pointer != nullptr ? new Type (*pointer) : nullptr; } - -//============================================================================== -#if BEAST_MAC || BEAST_IOS || DOXYGEN - - /** A handy C++ wrapper that creates and deletes an NSAutoreleasePool object using RAII. - You should use the BEAST_AUTORELEASEPOOL macro to create a local auto-release pool on the stack. - */ - class BEAST_API ScopedAutoReleasePool - { - public: - ScopedAutoReleasePool(); - ~ScopedAutoReleasePool(); - - private: - void* pool; - - BEAST_DECLARE_NON_COPYABLE (ScopedAutoReleasePool) - }; - - /** A macro that can be used to easily declare a local ScopedAutoReleasePool - object for RAII-based obj-C autoreleasing. - Because this may use the \@autoreleasepool syntax, you must follow the macro with - a set of braces to mark the scope of the pool. - */ -#if (BEAST_COMPILER_SUPPORTS_ARC && defined (__OBJC__)) || DOXYGEN - #define BEAST_AUTORELEASEPOOL @autoreleasepool -#else - #define BEAST_AUTORELEASEPOOL const beast::ScopedAutoReleasePool BEAST_JOIN_MACRO (autoReleasePool_, __LINE__); -#endif - -#else - #define BEAST_AUTORELEASEPOOL -#endif - -//============================================================================== -/* In a Windows DLL build, we'll expose some malloc/free functions that live inside the DLL, and use these for - allocating all the objects - that way all beast objects in the DLL and in the host will live in the same heap, - avoiding problems when an object is created in one module and passed across to another where it is deleted. - By piggy-backing on the BEAST_LEAK_DETECTOR macro, these allocators can be injected into most beast classes. -*/ -#if BEAST_MSVC && (defined (BEAST_DLL) || defined (BEAST_DLL_BUILD)) && ! (BEAST_DISABLE_DLL_ALLOCATORS || DOXYGEN) - extern BEAST_API void* beastDLL_malloc (size_t); - extern BEAST_API void beastDLL_free (void*); - - #define BEAST_LEAK_DETECTOR(OwnerClass) public:\ - static void* operator new (size_t sz) { return beast::beastDLL_malloc (sz); } \ - static void* operator new (size_t, void* p) { return p; } \ - static void operator delete (void* p) { beast::beastDLL_free (p); } \ - static void operator delete (void*, void*) {} -#endif - -//============================================================================== -/** (Deprecated) This was a Windows-specific way of checking for object leaks - now please - use the BEAST_LEAK_DETECTOR instead. -*/ -#ifndef beast_UseDebuggingNewOperator - #define beast_UseDebuggingNewOperator -#endif - - -#endif // BEAST_MEMORY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.cpp b/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.cpp deleted file mode 100644 index e040dff781..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.cpp +++ /dev/null @@ -1,416 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -MemoryBlock::MemoryBlock() noexcept - : size (0) -{ -} - -MemoryBlock::MemoryBlock (const size_t initialSize, const bool initialiseToZero) -{ - if (initialSize > 0) - { - size = initialSize; - data.allocate (initialSize, initialiseToZero); - } - else - { - size = 0; - } -} - -MemoryBlock::MemoryBlock (const MemoryBlock& other) - : size (other.size) -{ - if (size > 0) - { - bassert (other.data != nullptr); - data.malloc (size); - memcpy (data, other.data, size); - } -} - -MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, const size_t sizeInBytes) - : size (sizeInBytes) -{ - bassert (((ssize_t) sizeInBytes) >= 0); - - if (size > 0) - { - bassert (dataToInitialiseFrom != nullptr); // non-zero size, but a zero pointer passed-in? - - data.malloc (size); - - if (dataToInitialiseFrom != nullptr) - memcpy (data, dataToInitialiseFrom, size); - } -} - -MemoryBlock::~MemoryBlock() noexcept -{ -} - -MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) -{ - if (this != &other) - { - setSize (other.size, false); - memcpy (data, other.data, size); - } - - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -MemoryBlock::MemoryBlock (MemoryBlock&& other) noexcept - : data (static_cast &&> (other.data)), - size (other.size) -{ -} - -MemoryBlock& MemoryBlock::operator= (MemoryBlock&& other) noexcept -{ - data = static_cast &&> (other.data); - size = other.size; - return *this; -} -#endif - - -//============================================================================== -bool MemoryBlock::operator== (const MemoryBlock& other) const noexcept -{ - return matches (other.data, other.size); -} - -bool MemoryBlock::operator!= (const MemoryBlock& other) const noexcept -{ - return ! operator== (other); -} - -bool MemoryBlock::matches (const void* dataToCompare, size_t dataSize) const noexcept -{ - return size == dataSize - && memcmp (data, dataToCompare, size) == 0; -} - -//============================================================================== -// this will resize the block to this size -void MemoryBlock::setSize (const size_t newSize, const bool initialiseToZero) -{ - if (size != newSize) - { - if (newSize <= 0) - { - data.free(); - size = 0; - } - else - { - if (data != nullptr) - { - data.realloc (newSize); - - if (initialiseToZero && (newSize > size)) - zeromem (data + size, newSize - size); - } - else - { - data.allocate (newSize, initialiseToZero); - } - - size = newSize; - } - } -} - -void MemoryBlock::ensureSize (const size_t minimumSize, const bool initialiseToZero) -{ - if (size < minimumSize) - setSize (minimumSize, initialiseToZero); -} - -void MemoryBlock::swapWith (MemoryBlock& other) noexcept -{ - std::swap (size, other.size); - data.swapWith (other.data); -} - -//============================================================================== -void MemoryBlock::fillWith (const uint8 value) noexcept -{ - memset (data, (int) value, size); -} - -void MemoryBlock::append (const void* const srcData, const size_t numBytes) -{ - if (numBytes > 0) - { - bassert (srcData != nullptr); // this must not be null! - const size_t oldSize = size; - setSize (size + numBytes); - memcpy (data + oldSize, srcData, numBytes); - } -} - -void MemoryBlock::replaceWith (const void* const srcData, const size_t numBytes) -{ - if (numBytes > 0) - { - bassert (srcData != nullptr); // this must not be null! - setSize (numBytes); - memcpy (data, srcData, numBytes); - } -} - -void MemoryBlock::insert (const void* const srcData, const size_t numBytes, size_t insertPosition) -{ - if (numBytes > 0) - { - bassert (srcData != nullptr); // this must not be null! - insertPosition = bmin (size, insertPosition); - const size_t trailingDataSize = size - insertPosition; - setSize (size + numBytes, false); - - if (trailingDataSize > 0) - memmove (data + insertPosition + numBytes, - data + insertPosition, - trailingDataSize); - - memcpy (data + insertPosition, srcData, numBytes); - } -} - -void MemoryBlock::removeSection (const size_t startByte, const size_t numBytesToRemove) -{ - if (startByte + numBytesToRemove >= size) - { - setSize (startByte); - } - else if (numBytesToRemove > 0) - { - memmove (data + startByte, - data + startByte + numBytesToRemove, - size - (startByte + numBytesToRemove)); - - setSize (size - numBytesToRemove); - } -} - -void MemoryBlock::copyFrom (const void* const src, int offset, size_t num) noexcept -{ - const char* d = static_cast (src); - - if (offset < 0) - { - d -= offset; - num -= offset; - offset = 0; - } - - if (offset + num > size) - num = size - offset; - - if (num > 0) - memcpy (data + offset, d, num); -} - -void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const noexcept -{ - char* d = static_cast (dst); - - if (offset < 0) - { - zeromem (d, (size_t) -offset); - d -= offset; - - num += offset; - offset = 0; - } - - if (offset + num > size) - { - const size_t newNum = size - offset; - zeromem (d + newNum, num - newNum); - num = newNum; - } - - if (num > 0) - memcpy (d, data + offset, num); -} - -String MemoryBlock::toString() const -{ - return String (CharPointer_UTF8 (data), size); -} - -//============================================================================== -int MemoryBlock::getBitRange (const size_t bitRangeStart, size_t numBits) const noexcept -{ - int res = 0; - - size_t byte = bitRangeStart >> 3; - int offsetInByte = (int) bitRangeStart & 7; - size_t bitsSoFar = 0; - - while (numBits > 0 && (size_t) byte < size) - { - const int bitsThisTime = bmin ((int) numBits, 8 - offsetInByte); - const int mask = (0xff >> (8 - bitsThisTime)) << offsetInByte; - - res |= (((data[byte] & mask) >> offsetInByte) << bitsSoFar); - - bitsSoFar += bitsThisTime; - numBits -= bitsThisTime; - ++byte; - offsetInByte = 0; - } - - return res; -} - -void MemoryBlock::setBitRange (const size_t bitRangeStart, size_t numBits, int bitsToSet) noexcept -{ - size_t byte = bitRangeStart >> 3; - int offsetInByte = (int) bitRangeStart & 7; - unsigned int mask = ~((((unsigned int) 0xffffffff) << (32 - numBits)) >> (32 - numBits)); - - while (numBits > 0 && (size_t) byte < size) - { - const int bitsThisTime = bmin ((int) numBits, 8 - offsetInByte); - - const unsigned int tempMask = (mask << offsetInByte) | ~((((unsigned int) 0xffffffff) >> offsetInByte) << offsetInByte); - const unsigned int tempBits = (unsigned int) bitsToSet << offsetInByte; - - data[byte] = (char) ((data[byte] & tempMask) | tempBits); - - ++byte; - numBits -= bitsThisTime; - bitsToSet >>= bitsThisTime; - mask >>= bitsThisTime; - offsetInByte = 0; - } -} - -//============================================================================== -void MemoryBlock::loadFromHexString (const String& hex) -{ - ensureSize ((size_t) hex.length() >> 1); - char* dest = data; - String::CharPointerType t (hex.getCharPointer()); - - for (;;) - { - int byte = 0; - - for (int loop = 2; --loop >= 0;) - { - byte <<= 4; - - for (;;) - { - const beast_wchar c = t.getAndAdvance(); - - if (c >= '0' && c <= '9') - { - byte |= c - '0'; - break; - } - else if (c >= 'a' && c <= 'z') - { - byte |= c - ('a' - 10); - break; - } - else if (c >= 'A' && c <= 'Z') - { - byte |= c - ('A' - 10); - break; - } - else if (c == 0) - { - setSize (static_cast (dest - data)); - return; - } - } - } - - *dest++ = (char) byte; - } -} - -//============================================================================== -const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; - -String MemoryBlock::toBase64Encoding() const -{ - const size_t numChars = ((size << 3) + 5) / 6; - - String destString ((unsigned int) size); // store the length, followed by a '.', and then the data. - const int initialLen = destString.length(); - destString.preallocateBytes (sizeof (String::CharPointerType::CharType) * (size_t) (initialLen + 2 + numChars)); - - String::CharPointerType d (destString.getCharPointer()); - d += initialLen; - d.write ('.'); - - for (size_t i = 0; i < numChars; ++i) - d.write ((beast_wchar) (uint8) encodingTable [getBitRange (i * 6, 6)]); - - d.writeNull(); - return destString; -} - -bool MemoryBlock::fromBase64Encoding (const String& s) -{ - const int startPos = s.indexOfChar ('.') + 1; - - if (startPos <= 0) - return false; - - const int numBytesNeeded = s.substring (0, startPos - 1).getIntValue(); - - setSize ((size_t) numBytesNeeded, true); - - const int numChars = s.length() - startPos; - - String::CharPointerType srcChars (s.getCharPointer()); - srcChars += startPos; - int pos = 0; - - for (int i = 0; i < numChars; ++i) - { - const char c = (char) srcChars.getAndAdvance(); - - for (int j = 0; j < 64; ++j) - { - if (encodingTable[j] == c) - { - setBitRange ((size_t) pos, 6, j); - pos += 6; - break; - } - } - } - - return true; -} diff --git a/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.h b/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.h deleted file mode 100644 index 54107a4b0f..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_MemoryBlock.h +++ /dev/null @@ -1,255 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORYBLOCK_BEASTHEADER -#define BEAST_MEMORYBLOCK_BEASTHEADER - -#include "../text/beast_String.h" -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** - A class to hold a resizable block of raw data. - -*/ -class BEAST_API MemoryBlock -{ -public: - //============================================================================== - /** Create an uninitialised block with 0 size. */ - MemoryBlock() noexcept; - - /** Creates a memory block with a given initial size. - - @param initialSize the size of block to create - @param initialiseToZero whether to clear the memory or just leave it uninitialised - */ - MemoryBlock (const size_t initialSize, - bool initialiseToZero = false); - - /** Creates a copy of another memory block. */ - MemoryBlock (const MemoryBlock& other); - - /** Creates a memory block using a copy of a block of data. - - @param dataToInitialiseFrom some data to copy into this block - @param sizeInBytes how much space to use - */ - MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes); - - /** Destructor. */ - ~MemoryBlock() noexcept; - - /** Copies another memory block onto this one. - - This block will be resized and copied to exactly match the other one. - */ - MemoryBlock& operator= (const MemoryBlock& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - MemoryBlock (MemoryBlock&& other) noexcept; - MemoryBlock& operator= (MemoryBlock&& other) noexcept; - #endif - - //============================================================================== - /** Compares two memory blocks. - - @returns true only if the two blocks are the same size and have identical contents. - */ - bool operator== (const MemoryBlock& other) const noexcept; - - /** Compares two memory blocks. - - @returns true if the two blocks are different sizes or have different contents. - */ - bool operator!= (const MemoryBlock& other) const noexcept; - - /** Returns true if the data in this MemoryBlock matches the raw bytes passed-in. - */ - bool matches (const void* data, size_t dataSize) const noexcept; - - //============================================================================== - /** Returns a void pointer to the data. - - Note that the pointer returned will probably become invalid when the - block is resized. - */ - void* getData() const noexcept { return data; } - - /** Returns a byte from the memory block. - - This returns a reference, so you can also use it to set a byte. - */ - template - char& operator[] (const Type offset) const noexcept { return data [offset]; } - - - //============================================================================== - /** Returns the block's current allocated size, in bytes. */ - size_t getSize() const noexcept { return size; } - - /** Resizes the memory block. - - This will try to keep as much of the block's current content as it can, - and can optionally be made to clear any new space that gets allocated at - the end of the block. - - @param newSize the new desired size for the block - @param initialiseNewSpaceToZero if the block gets enlarged, this determines - whether to clear the new section or just leave it - uninitialised - @see ensureSize - */ - void setSize (const size_t newSize, - bool initialiseNewSpaceToZero = false); - - /** Increases the block's size only if it's smaller than a given size. - - @param minimumSize if the block is already bigger than this size, no action - will be taken; otherwise it will be increased to this size - @param initialiseNewSpaceToZero if the block gets enlarged, this determines - whether to clear the new section or just leave it - uninitialised - @see setSize - */ - void ensureSize (const size_t minimumSize, - bool initialiseNewSpaceToZero = false); - - //============================================================================== - /** Fills the entire memory block with a repeated byte value. - - This is handy for clearing a block of memory to zero. - */ - void fillWith (uint8 valueToUse) noexcept; - - /** Adds another block of data to the end of this one. - The data pointer must not be null. This block's size will be increased accordingly. - */ - void append (const void* data, size_t numBytes); - - /** Resizes this block to the given size and fills its contents from the supplied buffer. - The data pointer must not be null. - */ - void replaceWith (const void* data, size_t numBytes); - - /** Inserts some data into the block. - The dataToInsert pointer must not be null. This block's size will be increased accordingly. - If the insert position lies outside the valid range of the block, it will be clipped to - within the range before being used. - */ - void insert (const void* dataToInsert, size_t numBytesToInsert, size_t insertPosition); - - /** Chops out a section of the block. - - This will remove a section of the memory block and close the gap around it, - shifting any subsequent data downwards and reducing the size of the block. - - If the range specified goes beyond the size of the block, it will be clipped. - */ - void removeSection (size_t startByte, size_t numBytesToRemove); - - //============================================================================== - /** Copies data into this MemoryBlock from a memory address. - - @param srcData the memory location of the data to copy into this block - @param destinationOffset the offset in this block at which the data being copied should begin - @param numBytes how much to copy in (if this goes beyond the size of the memory block, - it will be clipped so not to do anything nasty) - */ - void copyFrom (const void* srcData, - int destinationOffset, - size_t numBytes) noexcept; - - /** Copies data from this MemoryBlock to a memory address. - - @param destData the memory location to write to - @param sourceOffset the offset within this block from which the copied data will be read - @param numBytes how much to copy (if this extends beyond the limits of the memory block, - zeros will be used for that portion of the data) - */ - void copyTo (void* destData, - int sourceOffset, - size_t numBytes) const noexcept; - - //============================================================================== - /** Exchanges the contents of this and another memory block. - No actual copying is required for this, so it's very fast. - */ - void swapWith (MemoryBlock& other) noexcept; - - //============================================================================== - /** Attempts to parse the contents of the block as a zero-terminated UTF8 string. */ - String toString() const; - - //============================================================================== - /** Parses a string of hexadecimal numbers and writes this data into the memory block. - - The block will be resized to the number of valid bytes read from the string. - Non-hex characters in the string will be ignored. - - @see String::toHexString() - */ - void loadFromHexString (const String& sourceHexString); - - //============================================================================== - /** Sets a number of bits in the memory block, treating it as a long binary sequence. */ - void setBitRange (size_t bitRangeStart, - size_t numBits, - int binaryNumberToApply) noexcept; - - /** Reads a number of bits from the memory block, treating it as one long binary sequence */ - int getBitRange (size_t bitRangeStart, - size_t numBitsToRead) const noexcept; - - //============================================================================== - /** Returns a string of characters that represent the binary contents of this block. - - Uses a 64-bit encoding system to allow binary data to be turned into a string - of simple non-extended characters, e.g. for storage in XML. - - @see fromBase64Encoding - */ - String toBase64Encoding() const; - - /** Takes a string of encoded characters and turns it into binary data. - - The string passed in must have been created by to64BitEncoding(), and this - block will be resized to recreate the original data block. - - @see toBase64Encoding - */ - bool fromBase64Encoding (const String& encodedString); - - -private: - //============================================================================== - HeapBlock data; - size_t size; - static const char* const encodingTable; - - BEAST_LEAK_DETECTOR (MemoryBlock) -}; - - -#endif // BEAST_MEMORYBLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_OptionalScopedPointer.h b/Subtrees/beast/modules/beast_core/memory/beast_OptionalScopedPointer.h deleted file mode 100644 index eb9b45d495..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_OptionalScopedPointer.h +++ /dev/null @@ -1,183 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_OPTIONALSCOPEDPOINTER_BEASTHEADER -#define BEAST_OPTIONALSCOPEDPOINTER_BEASTHEADER - -#include "beast_ScopedPointer.h" - - -//============================================================================== -/** - Holds a pointer to an object which can optionally be deleted when this pointer - goes out of scope. - - This acts in many ways like a ScopedPointer, but allows you to specify whether or - not the object is deleted. - - @see ScopedPointer -*/ -template -class OptionalScopedPointer -{ -public: - //============================================================================== - /** Creates an empty OptionalScopedPointer. */ - OptionalScopedPointer() : shouldDelete (false) {} - - /** Creates an OptionalScopedPointer to point to a given object, and specifying whether - the OptionalScopedPointer will delete it. - - If takeOwnership is true, then the OptionalScopedPointer will act like a ScopedPointer, - deleting the object when it is itself deleted. If this parameter is false, then the - OptionalScopedPointer just holds a normal pointer to the object, and won't delete it. - */ - OptionalScopedPointer (ObjectType* objectToHold, bool takeOwnership) - : object (objectToHold), shouldDelete (takeOwnership) - { - } - - /** Takes ownership of the object that another OptionalScopedPointer holds. - - Like a normal ScopedPointer, the objectToTransferFrom object will become null, - as ownership of the managed object is transferred to this object. - - The flag to indicate whether or not to delete the managed object is also - copied from the source object. - */ - OptionalScopedPointer (OptionalScopedPointer& objectToTransferFrom) - : object (objectToTransferFrom.release()), - shouldDelete (objectToTransferFrom.shouldDelete) - { - } - - /** Takes ownership of the object that another OptionalScopedPointer holds. - - Like a normal ScopedPointer, the objectToTransferFrom object will become null, - as ownership of the managed object is transferred to this object. - - The ownership flag that says whether or not to delete the managed object is also - copied from the source object. - */ - OptionalScopedPointer& operator= (OptionalScopedPointer& objectToTransferFrom) - { - if (object != objectToTransferFrom.object) - { - clear(); - object = objectToTransferFrom.object; - } - - shouldDelete = objectToTransferFrom.shouldDelete; - return *this; - } - - /** The destructor may or may not delete the object that is being held, depending on the - takeOwnership flag that was specified when the object was first passed into an - OptionalScopedPointer constructor. - */ - ~OptionalScopedPointer() - { - clear(); - } - - //============================================================================== - /** Returns the object that this pointer is managing. */ - inline operator ObjectType*() const noexcept { return object; } - - /** Returns the object that this pointer is managing. */ - inline ObjectType* get() const noexcept { return object; } - - /** Returns the object that this pointer is managing. */ - inline ObjectType& operator*() const noexcept { return *object; } - - /** Lets you access methods and properties of the object that this pointer is holding. */ - inline ObjectType* operator->() const noexcept { return object; } - - //============================================================================== - /** Removes the current object from this OptionalScopedPointer without deleting it. - This will return the current object, and set this OptionalScopedPointer to a null pointer. - */ - ObjectType* release() noexcept { return object.release(); } - - /** Resets this pointer to null, possibly deleting the object that it holds, if it has - ownership of it. - */ - void clear() - { - if (! shouldDelete) - object.release(); - } - - /** Makes this OptionalScopedPointer point at a new object, specifying whether the - OptionalScopedPointer will take ownership of the object. - - If takeOwnership is true, then the OptionalScopedPointer will act like a ScopedPointer, - deleting the object when it is itself deleted. If this parameter is false, then the - OptionalScopedPointer just holds a normal pointer to the object, and won't delete it. - */ - void set (ObjectType* newObject, bool takeOwnership) - { - if (object != newObject) - { - clear(); - object = newObject; - } - - shouldDelete = takeOwnership; - } - - /** Makes this OptionalScopedPointer point at a new object, and take ownership of that object. */ - void setOwned (ObjectType* newObject) - { - set (newObject, true); - } - - /** Makes this OptionalScopedPointer point at a new object, but will not take ownership of that object. */ - void setNonOwned (ObjectType* newObject) - { - set (newObject, false); - } - - /** Returns true if the target object will be deleted when this pointer - object is deleted. - */ - bool willDeleteObject() const noexcept { return shouldDelete; } - - //============================================================================== - /** Swaps this object with another OptionalScopedPointer. - The two objects simply exchange their states. - */ - void swapWith (OptionalScopedPointer& other) noexcept - { - object.swapWith (other.object); - std::swap (shouldDelete, other.shouldDelete); - } - -private: - //============================================================================== - ScopedPointer object; - bool shouldDelete; -}; - - -#endif // BEAST_OPTIONALSCOPEDPOINTER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_ReferenceCountedObject.h b/Subtrees/beast/modules/beast_core/memory/beast_ReferenceCountedObject.h deleted file mode 100644 index fe0e02a05c..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_ReferenceCountedObject.h +++ /dev/null @@ -1,395 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER -#define BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER - -#include "beast_Atomic.h" - - -//============================================================================== -/** - Adds reference-counting to an object. - - To add reference-counting to a class, derive it from this class, and - use the ReferenceCountedObjectPtr class to point to it. - - e.g. @code - class MyClass : public ReferenceCountedObject - { - void foo(); - - // This is a neat way of declaring a typedef for a pointer class, - // rather than typing out the full templated name each time.. - typedef ReferenceCountedObjectPtr Ptr; - }; - - MyClass::Ptr p = new MyClass(); - MyClass::Ptr p2 = p; - p = nullptr; - p2->foo(); - @endcode - - Once a new ReferenceCountedObject has been assigned to a pointer, be - careful not to delete the object manually. - - This class uses an Atomic value to hold the reference count, so that it - the pointers can be passed between threads safely. For a faster but non-thread-safe - version, use SingleThreadedReferenceCountedObject instead. - - @see ReferenceCountedObjectPtr, ReferenceCountedArray, SingleThreadedReferenceCountedObject -*/ -class BEAST_API ReferenceCountedObject -{ -public: - //============================================================================== - /** Increments the object's reference count. - - This is done automatically by the smart pointer, but is public just - in case it's needed for nefarious purposes. - */ - inline void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - - If the count gets to zero, the object will be deleted. - */ - inline void decReferenceCount() noexcept - { - bassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Returns the object's current reference count. */ - inline int getReferenceCount() const noexcept { return refCount.get(); } - - -protected: - //============================================================================== - /** Creates the reference-counted object (with an initial ref count of zero). */ - ReferenceCountedObject() - { - } - - /** Destructor. */ - virtual ~ReferenceCountedObject() - { - // it's dangerous to delete an object that's still referenced by something else! - bassert (getReferenceCount() == 0); - } - - /** Resets the reference count to zero without deleting the object. - You should probably never need to use this! - */ - void resetReferenceCount() noexcept - { - refCount = 0; - } - -private: - //============================================================================== - Atomic refCount; - - BEAST_DECLARE_NON_COPYABLE (ReferenceCountedObject) -}; - - -//============================================================================== -/** - Adds reference-counting to an object. - - This is effectively a version of the ReferenceCountedObject class, but which - uses a non-atomic counter, and so is not thread-safe (but which will be more - efficient). - For more details on how to use it, see the ReferenceCountedObject class notes. - - @see ReferenceCountedObject, ReferenceCountedObjectPtr, ReferenceCountedArray -*/ -class BEAST_API SingleThreadedReferenceCountedObject -{ -public: - //============================================================================== - /** Increments the object's reference count. - - This is done automatically by the smart pointer, but is public just - in case it's needed for nefarious purposes. - */ - inline void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - - If the count gets to zero, the object will be deleted. - */ - inline void decReferenceCount() noexcept - { - bassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Returns the object's current reference count. */ - inline int getReferenceCount() const noexcept { return refCount; } - - -protected: - //============================================================================== - /** Creates the reference-counted object (with an initial ref count of zero). */ - SingleThreadedReferenceCountedObject() : refCount (0) {} - - /** Destructor. */ - virtual ~SingleThreadedReferenceCountedObject() - { - // it's dangerous to delete an object that's still referenced by something else! - bassert (getReferenceCount() == 0); - } - -private: - //============================================================================== - int refCount; - - BEAST_DECLARE_NON_COPYABLE (SingleThreadedReferenceCountedObject) -}; - - -//============================================================================== -/** - A smart-pointer class which points to a reference-counted object. - - The template parameter specifies the class of the object you want to point to - the easiest - way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject, - but if you need to, you could roll your own reference-countable class by implementing a pair of - mathods called incReferenceCount() and decReferenceCount(). - - When using this class, you'll probably want to create a typedef to abbreviate the full - templated name - e.g. - @code typedef ReferenceCountedObjectPtr MyClassPtr;@endcode - - @see ReferenceCountedObject, ReferenceCountedObjectArray -*/ -template -class ReferenceCountedObjectPtr -{ -public: - /** The class being referenced by this pointer. */ - typedef ReferenceCountedObjectClass ReferencedType; - - //============================================================================== - /** Creates a pointer to a null object. */ - inline ReferenceCountedObjectPtr() noexcept - : referencedObject (nullptr) - { - } - - /** Creates a pointer to an object. - - This will increment the object's reference-count if it is non-null. - */ - inline ReferenceCountedObjectPtr (ReferenceCountedObjectClass* const refCountedObject) noexcept - : referencedObject (refCountedObject) - { - if (refCountedObject != nullptr) - refCountedObject->incReferenceCount(); - } - - /** Copies another pointer. - This will increment the object's reference-count (if it is non-null). - */ - inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (other.referencedObject) - { - if (referencedObject != nullptr) - referencedObject->incReferenceCount(); - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Takes-over the object from another pointer. */ - inline ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept - : referencedObject (other.referencedObject) - { - other.referencedObject = nullptr; - } - #endif - - /** Copies another pointer. - This will increment the object's reference-count (if it is non-null). - */ - template - inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (static_cast (other.get())) - { - if (referencedObject != nullptr) - referencedObject->incReferenceCount(); - } - - /** Changes this pointer to point at a different object. - - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr& other) - { - return operator= (other.referencedObject); - } - - /** Changes this pointer to point at a different object. - - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - template - ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr& other) - { - return operator= (static_cast (other.get())); - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Takes-over the object from another pointer. */ - ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) - { - std::swap (referencedObject, other.referencedObject); - return *this; - } - #endif - - /** Changes this pointer to point at a different object. - - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectClass* const newObject) - { - if (referencedObject != newObject) - { - if (newObject != nullptr) - newObject->incReferenceCount(); - - ReferenceCountedObjectClass* const oldObject = referencedObject; - referencedObject = newObject; - - if (oldObject != nullptr) - oldObject->decReferenceCount(); - } - - return *this; - } - - /** Destructor. - - This will decrement the object's reference-count, and may delete it if it - gets to zero. - */ - inline ~ReferenceCountedObjectPtr() - { - if (referencedObject != nullptr) - referencedObject->decReferenceCount(); - } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - inline operator ReferenceCountedObjectClass*() const noexcept - { - return referencedObject; - } - - // the -> operator is called on the referenced object - inline ReferenceCountedObjectClass* operator->() const noexcept - { - return referencedObject; - } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - inline ReferenceCountedObjectClass* get() const noexcept - { - return referencedObject; - } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - inline ReferenceCountedObjectClass* getObject() const noexcept - { - return referencedObject; - } - -private: - //============================================================================== - ReferenceCountedObjectClass* referencedObject; -}; - - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, ReferenceCountedObjectClass* const object2) noexcept -{ - return object1.get() == object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.get() == object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 == object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectClass* object2) noexcept -{ - return object1.get() != object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.get() != object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 != object2.get(); -} - - -#endif // BEAST_REFERENCECOUNTEDOBJECT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h b/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h deleted file mode 100644 index f07b7f2929..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_ScopedPointer.h +++ /dev/null @@ -1,248 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SCOPEDPOINTER_BEASTHEADER -#define BEAST_SCOPEDPOINTER_BEASTHEADER - -//============================================================================== -/** - This class holds a pointer which is automatically deleted when this object goes - out of scope. - - Once a pointer has been passed to a ScopedPointer, it will make sure that the pointer - gets deleted when the ScopedPointer is deleted. Using the ScopedPointer on the stack or - as member variables is a good way to use RAII to avoid accidentally leaking dynamically - created objects. - - A ScopedPointer can be used in pretty much the same way that you'd use a normal pointer - to an object. If you use the assignment operator to assign a different object to a - ScopedPointer, the old one will be automatically deleted. - - Important note: The class is designed to hold a pointer to an object, NOT to an array! - It calls delete on its payload, not delete[], so do not give it an array to hold! For - that kind of purpose, you should be using HeapBlock or Array instead. - - A const ScopedPointer is guaranteed not to lose ownership of its object or change the - object to which it points during its lifetime. This means that making a copy of a const - ScopedPointer is impossible, as that would involve the new copy taking ownership from the - old one. - - If you need to get a pointer out of a ScopedPointer without it being deleted, you - can use the release() method. - - Something to note is the main difference between this class and the std::auto_ptr class, - which is that ScopedPointer provides a cast-to-object operator, wheras std::auto_ptr - requires that you always call get() to retrieve the pointer. The advantages of providing - the cast is that you don't need to call get(), so can use the ScopedPointer in pretty much - exactly the same way as a raw pointer. The disadvantage is that the compiler is free to - use the cast in unexpected and sometimes dangerous ways - in particular, it becomes difficult - to return a ScopedPointer as the result of a function. To avoid this causing errors, - ScopedPointer contains an overloaded constructor that should cause a syntax error in these - circumstances, but it does mean that instead of returning a ScopedPointer from a function, - you'd need to return a raw pointer (or use a std::auto_ptr instead). -*/ -template -class ScopedPointer -{ -public: - //============================================================================== - /** Creates a ScopedPointer containing a null pointer. */ - inline ScopedPointer() noexcept : object (nullptr) - { - } - - /** Creates a ScopedPointer that owns the specified object. */ - inline ScopedPointer (ObjectType* const objectToTakePossessionOf) noexcept - : object (objectToTakePossessionOf) - { - } - - /** Creates a ScopedPointer that takes its pointer from another ScopedPointer. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - */ - ScopedPointer (ScopedPointer& objectToTransferFrom) noexcept - : object (objectToTransferFrom.object) - { - objectToTransferFrom.object = nullptr; - } - - /** Destructor. - This will delete the object that this ScopedPointer currently refers to. - */ - inline ~ScopedPointer() { delete object; } - - /** Changes this ScopedPointer to point to a new object. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - - If this ScopedPointer already points to an object, that object - will first be deleted. - */ - ScopedPointer& operator= (ScopedPointer& objectToTransferFrom) - { - if (this != objectToTransferFrom.getAddress()) - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - bassert (object == nullptr || object != objectToTransferFrom.object); - - ObjectType* const oldObject = object; - object = objectToTransferFrom.object; - objectToTransferFrom.object = nullptr; - delete oldObject; - } - - return *this; - } - - /** Changes this ScopedPointer to point to a new object. - - If this ScopedPointer already points to an object, that object - will first be deleted. - - The pointer that you pass in may be a nullptr. - */ - ScopedPointer& operator= (ObjectType* const newObjectToTakePossessionOf) - { - if (object != newObjectToTakePossessionOf) - { - ObjectType* const oldObject = object; - object = newObjectToTakePossessionOf; - delete oldObject; - } - - return *this; - } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - ScopedPointer (ScopedPointer&& other) noexcept - : object (other.object) - { - other.object = nullptr; - } - - ScopedPointer& operator= (ScopedPointer&& other) noexcept - { - object = other.object; - other.object = nullptr; - return *this; - } - #endif - - //============================================================================== - /** Returns the object that this ScopedPointer refers to. */ - inline operator ObjectType*() const noexcept { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType* get() const noexcept { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType& operator*() const noexcept { return *object; } - - /** Lets you access methods and properties of the object that this ScopedPointer refers to. */ - inline ObjectType* operator->() const noexcept { return object; } - - //============================================================================== - /** Removes the current object from this ScopedPointer without deleting it. - This will return the current object, and set the ScopedPointer to a null pointer. - */ - ObjectType* release() noexcept { ObjectType* const o = object; object = nullptr; return o; } - - //============================================================================== - /** Swaps this object with that of another ScopedPointer. - The two objects simply exchange their pointers. - */ - void swapWith (ScopedPointer & other) noexcept - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - bassert (object != other.object || this == other.getAddress()); - - std::swap (object, other.object); - } - - /** If the pointer is non-null, this will attempt to return a new copy of the object that is pointed to. - If the pointer is null, this will safely return a nullptr. - */ - inline ObjectType* createCopy() const { return createCopyIfNotNull (object); } - -private: - //============================================================================== - ObjectType* object; - - // (Required as an alternative to the overloaded & operator). - const ScopedPointer* getAddress() const noexcept { return this; } - - #if ! BEAST_MSVC // (MSVC can't deal with multiple copy constructors) - /* The copy constructors are private to stop people accidentally copying a const ScopedPointer - (the compiler would let you do so by implicitly casting the source to its raw object pointer). - - A side effect of this is that in a compiler that doesn't support C++11, you may hit an - error when you write something like this: - - ScopedPointer m = new MyClass(); // Compile error: copy constructor is private. - - Even though the compiler would normally ignore the assignment here, it can't do so when the - copy constructor is private. It's very easy to fix though - just write it like this: - - ScopedPointer m (new MyClass()); // Compiles OK - - It's probably best to use the latter form when writing your object declarations anyway, as - this is a better representation of the code that you actually want the compiler to produce. - */ - BEAST_DECLARE_NON_COPYABLE (ScopedPointer) - #endif -}; - -//============================================================================== -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator== (const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept -{ - return static_cast (pointer1) == pointer2; -} - -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator!= (const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept -{ - return static_cast (pointer1) != pointer2; -} - -//============================================================================== -#ifndef DOXYGEN -// NB: This is just here to prevent any silly attempts to call deleteAndZero() on a ScopedPointer. -template -void deleteAndZero (ScopedPointer&) { static_bassert (sizeof (Type) == 12345); } -#endif - -#endif // BEAST_SCOPEDPOINTER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_Singleton.h b/Subtrees/beast/modules/beast_core/memory/beast_Singleton.h deleted file mode 100644 index bb039ea32c..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_Singleton.h +++ /dev/null @@ -1,287 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SINGLETON_BEASTHEADER -#define BEAST_SINGLETON_BEASTHEADER - - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - To use this, add the line beast_DeclareSingleton (MyClass, doNotRecreateAfterDeletion) - to the class's definition. - - Then put a macro beast_ImplementSingleton (MyClass) along with the class's - implementation code. - - It's also a very good idea to also add the call clearSingletonInstance() in your class's - destructor, in case it is deleted by other means than deleteInstance() - - Clients can then call the static method MyClass::getInstance() to get a pointer - to the singleton, or MyClass::getInstanceWithoutCreating() which will return 0 if - no instance currently exists. - - e.g. @code - - class MySingleton - { - public: - MySingleton() - { - } - - ~MySingleton() - { - // this ensures that no dangling pointers are left when the - // singleton is deleted. - clearSingletonInstance(); - } - - beast_DeclareSingleton (MySingleton, false) - }; - - beast_ImplementSingleton (MySingleton) - - - // example of usage: - MySingleton* m = MySingleton::getInstance(); // creates the singleton if there isn't already one. - - ... - - MySingleton::deleteInstance(); // safely deletes the singleton (if it's been created). - - @endcode - - If doNotRecreateAfterDeletion = true, it won't allow the object to be created more - than once during the process's lifetime - i.e. after you've created and deleted the - object, getInstance() will refuse to create another one. This can be useful to stop - objects being accidentally re-created during your app's shutdown code. - - If you know that your object will only be created and deleted by a single thread, you - can use the slightly more efficient beast_DeclareSingleton_SingleThreaded() macro instead - of this one. - - @see beast_ImplementSingleton, beast_DeclareSingleton_SingleThreaded -*/ -#define beast_DeclareSingleton(classname, doNotRecreateAfterDeletion) \ -\ - static classname* _singletonInstance; \ - static beast::CriticalSection _singletonLock; \ -\ - static classname* BEAST_CALLTYPE getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - {\ - const beast::ScopedLock sl (_singletonLock); \ -\ - if (_singletonInstance == nullptr) \ - { \ - static bool alreadyInside = false; \ - static bool createdOnceAlready = false; \ -\ - const bool problem = alreadyInside || ((doNotRecreateAfterDeletion) && createdOnceAlready); \ - bassert (! problem); \ - if (! problem) \ - { \ - createdOnceAlready = true; \ - alreadyInside = true; \ - classname* newObject = new classname(); /* (use a stack variable to avoid setting the newObject value before the class has finished its constructor) */ \ - alreadyInside = false; \ -\ - _singletonInstance = newObject; \ - } \ - } \ - } \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* BEAST_CALLTYPE getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void BEAST_CALLTYPE deleteInstance() \ - { \ - const beast::ScopedLock sl (_singletonLock); \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - - -//============================================================================== -/** This is a counterpart to the beast_DeclareSingleton macro. - - After adding the beast_DeclareSingleton to the class definition, this macro has - to be used in the cpp file. -*/ -#define beast_ImplementSingleton(classname) \ -\ - classname* classname::_singletonInstance = nullptr; \ - beast::CriticalSection classname::_singletonLock; - - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - This is exactly the same as beast_DeclareSingleton, but doesn't use a critical - section to make access to it thread-safe. If you know that your object will - only ever be created or deleted by a single thread, then this is a - more efficient version to use. - - If doNotRecreateAfterDeletion = true, it won't allow the object to be created more - than once during the process's lifetime - i.e. after you've created and deleted the - object, getInstance() will refuse to create another one. This can be useful to stop - objects being accidentally re-created during your app's shutdown code. - - See the documentation for beast_DeclareSingleton for more information about - how to use it, the only difference being that you have to use - beast_ImplementSingleton_SingleThreaded instead of beast_ImplementSingleton. - - @see beast_ImplementSingleton_SingleThreaded, beast_DeclareSingleton, beast_DeclareSingleton_SingleThreaded_Minimal -*/ -#define beast_DeclareSingleton_SingleThreaded(classname, doNotRecreateAfterDeletion) \ -\ - static classname* _singletonInstance; \ -\ - static classname* getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - { \ - static bool alreadyInside = false; \ - static bool createdOnceAlready = false; \ -\ - const bool problem = alreadyInside || ((doNotRecreateAfterDeletion) && createdOnceAlready); \ - bassert (! problem); \ - if (! problem) \ - { \ - createdOnceAlready = true; \ - alreadyInside = true; \ - classname* newObject = new classname(); /* (use a stack variable to avoid setting the newObject value before the class has finished its constructor) */ \ - alreadyInside = false; \ -\ - _singletonInstance = newObject; \ - } \ - } \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void deleteInstance() \ - { \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - This is like beast_DeclareSingleton_SingleThreaded, but doesn't do any checking - for recursion or repeated instantiation. It's intended for use as a lightweight - version of a singleton, where you're using it in very straightforward - circumstances and don't need the extra checking. - - Beast use the normal beast_ImplementSingleton_SingleThreaded as the counterpart - to this declaration, as you would with beast_DeclareSingleton_SingleThreaded. - - See the documentation for beast_DeclareSingleton for more information about - how to use it, the only difference being that you have to use - beast_ImplementSingleton_SingleThreaded instead of beast_ImplementSingleton. - - @see beast_ImplementSingleton_SingleThreaded, beast_DeclareSingleton -*/ -#define beast_DeclareSingleton_SingleThreaded_Minimal(classname) \ -\ - static classname* _singletonInstance; \ -\ - static classname* getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - _singletonInstance = new classname(); \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void deleteInstance() \ - { \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - - -//============================================================================== -/** This is a counterpart to the beast_DeclareSingleton_SingleThreaded macro. - - After adding beast_DeclareSingleton_SingleThreaded or beast_DeclareSingleton_SingleThreaded_Minimal - to the class definition, this macro has to be used somewhere in the cpp file. -*/ -#define beast_ImplementSingleton_SingleThreaded(classname) \ -\ - classname* classname::_singletonInstance = nullptr; - - - -#endif // BEAST_SINGLETON_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/memory/beast_WeakReference.h b/Subtrees/beast/modules/beast_core/memory/beast_WeakReference.h deleted file mode 100644 index 192ef1a623..0000000000 --- a/Subtrees/beast/modules/beast_core/memory/beast_WeakReference.h +++ /dev/null @@ -1,209 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_WEAKREFERENCE_BEASTHEADER -#define BEAST_WEAKREFERENCE_BEASTHEADER - -#include "beast_ReferenceCountedObject.h" - - -//============================================================================== -/** - This class acts as a pointer which will automatically become null if the object - to which it points is deleted. - - To accomplish this, the source object needs to cooperate by performing a couple of simple tasks. - It must embed a WeakReference::Master object, which stores a shared pointer object, and must clear - this master pointer in its destructor. - - E.g. - @code - class MyObject - { - public: - MyObject() - { - // If you're planning on using your WeakReferences in a multi-threaded situation, you may choose - // to create a WeakReference to the object here in the constructor, which will pre-initialise the - // embedded object, avoiding an (extremely unlikely) race condition that could occur if multiple - // threads overlap while creating the first WeakReference to it. - } - - ~MyObject() - { - // This will zero all the references - you need to call this in your destructor. - masterReference.clear(); - } - - private: - // You need to embed a variable of this type, with the name "masterReference" inside your object. If the - // variable is not public, you should make your class a friend of WeakReference so that the - // WeakReference class can access it. - WeakReference::Master masterReference; - friend class WeakReference; - }; - - // Here's an example of using a pointer.. - - MyObject* n = new MyObject(); - WeakReference myObjectRef = n; - - MyObject* pointer1 = myObjectRef; // returns a valid pointer to 'n' - delete n; - MyObject* pointer2 = myObjectRef; // returns a null pointer - @endcode - - @see WeakReference::Master -*/ -template -class WeakReference -{ -public: - /** Creates a null SafePointer. */ - inline WeakReference() noexcept {} - - /** Creates a WeakReference that points at the given object. */ - WeakReference (ObjectType* const object) : holder (getRef (object)) {} - - /** Creates a copy of another WeakReference. */ - WeakReference (const WeakReference& other) noexcept : holder (other.holder) {} - - /** Copies another pointer to this one. */ - WeakReference& operator= (const WeakReference& other) { holder = other.holder; return *this; } - - /** Copies another pointer to this one. */ - WeakReference& operator= (ObjectType* const newObject) { holder = getRef (newObject); return *this; } - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - WeakReference (WeakReference&& other) noexcept : holder (static_cast (other.holder)) {} - WeakReference& operator= (WeakReference&& other) noexcept { holder = static_cast (other.holder); return *this; } - #endif - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - ObjectType* get() const noexcept { return holder != nullptr ? holder->get() : nullptr; } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - operator ObjectType*() const noexcept { return get(); } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - ObjectType* operator->() noexcept { return get(); } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - const ObjectType* operator->() const noexcept { return get(); } - - /** This returns true if this reference has been pointing at an object, but that object has - since been deleted. - - If this reference was only ever pointing at a null pointer, this will return false. Using - operator=() to make this refer to a different object will reset this flag to match the status - of the reference from which you're copying. - */ - bool wasObjectDeleted() const noexcept { return holder != nullptr && holder->get() == nullptr; } - - bool operator== (ObjectType* const object) const noexcept { return get() == object; } - bool operator!= (ObjectType* const object) const noexcept { return get() != object; } - - //============================================================================== - /** This class is used internally by the WeakReference class - don't use it directly - in your code! - @see WeakReference - */ - class SharedPointer : public ReferenceCountingType - { - public: - explicit SharedPointer (ObjectType* const obj) noexcept : owner (obj) {} - - inline ObjectType* get() const noexcept { return owner; } - void clearPointer() noexcept { owner = nullptr; } - - private: - ObjectType* volatile owner; - - BEAST_DECLARE_NON_COPYABLE (SharedPointer) - }; - - typedef ReferenceCountedObjectPtr SharedRef; - - //============================================================================== - /** - This class is embedded inside an object to which you want to attach WeakReference pointers. - See the WeakReference class notes for an example of how to use this class. - @see WeakReference - */ - class Master - { - public: - Master() noexcept {} - - ~Master() - { - // You must remember to call clear() in your source object's destructor! See the notes - // for the WeakReference class for an example of how to do this. - bassert (sharedPointer == nullptr || sharedPointer->get() == nullptr); - } - - /** The first call to this method will create an internal object that is shared by all weak - references to the object. - */ - SharedPointer* getSharedPointer (ObjectType* const object) - { - if (sharedPointer == nullptr) - { - sharedPointer = new SharedPointer (object); - } - else - { - // You're trying to create a weak reference to an object that has already been deleted!! - bassert (sharedPointer->get() != nullptr); - } - - return sharedPointer; - } - - /** The object that owns this master pointer should call this before it gets destroyed, - to zero all the references to this object that may be out there. See the WeakReference - class notes for an example of how to do this. - */ - void clear() - { - if (sharedPointer != nullptr) - sharedPointer->clearPointer(); - } - - private: - SharedRef sharedPointer; - - BEAST_DECLARE_NON_COPYABLE (Master) - }; - -private: - SharedRef holder; - - static inline SharedPointer* getRef (ObjectType* const o) - { - return (o != nullptr) ? o->masterReference.getSharedPointer (o) : nullptr; - } -}; - - -#endif // BEAST_WEAKREFERENCE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/misc/beast_Result.cpp b/Subtrees/beast/modules/beast_core/misc/beast_Result.cpp deleted file mode 100644 index a61394f08f..0000000000 --- a/Subtrees/beast/modules/beast_core/misc/beast_Result.cpp +++ /dev/null @@ -1,81 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Result::Result (const String& message) noexcept - : errorMessage (message) -{ -} - -Result::Result (const Result& other) - : errorMessage (other.errorMessage) -{ -} - -Result& Result::operator= (const Result& other) -{ - errorMessage = other.errorMessage; - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -Result::Result (Result&& other) noexcept - : errorMessage (static_cast (other.errorMessage)) -{ -} - -Result& Result::operator= (Result&& other) noexcept -{ - errorMessage = static_cast (other.errorMessage); - return *this; -} -#endif - -bool Result::operator== (const Result& other) const noexcept -{ - return errorMessage == other.errorMessage; -} - -bool Result::operator!= (const Result& other) const noexcept -{ - return errorMessage != other.errorMessage; -} - -Result Result::ok() noexcept -{ - return Result (String::empty); -} - -Result Result::fail (const String& errorMessage) noexcept -{ - return Result (errorMessage.isEmpty() ? "Unknown Error" : errorMessage); -} - -const String& Result::getErrorMessage() const noexcept -{ - return errorMessage; -} - -bool Result::wasOk() const noexcept { return errorMessage.isEmpty(); } -Result::operator bool() const noexcept { return errorMessage.isEmpty(); } -bool Result::failed() const noexcept { return errorMessage.isNotEmpty(); } -bool Result::operator!() const noexcept { return errorMessage.isNotEmpty(); } diff --git a/Subtrees/beast/modules/beast_core/misc/beast_Result.h b/Subtrees/beast/modules/beast_core/misc/beast_Result.h deleted file mode 100644 index 137daa830c..0000000000 --- a/Subtrees/beast/modules/beast_core/misc/beast_Result.h +++ /dev/null @@ -1,119 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_RESULT_BEASTHEADER -#define BEAST_RESULT_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** - Represents the 'success' or 'failure' of an operation, and holds an associated - error message to describe the error when there's a failure. - - E.g. - @code - Result myOperation() - { - if (doSomeKindOfFoobar()) - return Result::ok(); - else - return Result::fail ("foobar didn't work!"); - } - - const Result result (myOperation()); - - if (result.wasOk()) - { - ...it's all good... - } - else - { - warnUserAboutFailure ("The foobar operation failed! Error message was: " - + result.getErrorMessage()); - } - @endcode -*/ -class BEAST_API Result -{ -public: - //============================================================================== - /** Creates and returns a 'successful' result. */ - static Result ok() noexcept; - - /** Creates a 'failure' result. - If you pass a blank error message in here, a default "Unknown Error" message - will be used instead. - */ - static Result fail (const String& errorMessage) noexcept; - - //============================================================================== - /** Returns true if this result indicates a success. */ - bool wasOk() const noexcept; - - /** Returns true if this result indicates a failure. - You can use getErrorMessage() to retrieve the error message associated - with the failure. - */ - bool failed() const noexcept; - - /** Returns true if this result indicates a success. - This is equivalent to calling wasOk(). - */ - operator bool() const noexcept; - - /** Returns true if this result indicates a failure. - This is equivalent to calling failed(). - */ - bool operator!() const noexcept; - - /** Returns the error message that was set when this result was created. - For a successful result, this will be an empty string; - */ - const String& getErrorMessage() const noexcept; - - //============================================================================== - Result (const Result& other); - Result& operator= (const Result& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - Result (Result&& other) noexcept; - Result& operator= (Result&& other) noexcept; - #endif - - bool operator== (const Result& other) const noexcept; - bool operator!= (const Result& other) const noexcept; - -private: - String errorMessage; - - explicit Result (const String&) noexcept; - - // These casts are private to prevent people trying to use the Result object in numeric contexts - operator int() const; - operator void*() const; -}; - - -#endif // BEAST_RESULT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/misc/beast_Uuid.cpp b/Subtrees/beast/modules/beast_core/misc/beast_Uuid.cpp deleted file mode 100644 index 3a947f848c..0000000000 --- a/Subtrees/beast/modules/beast_core/misc/beast_Uuid.cpp +++ /dev/null @@ -1,109 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace -{ - int64 getRandomSeedFromMACAddresses() - { - Array result; - MACAddress::findAllAddresses (result); - - Random r; - for (int i = 0; i < result.size(); ++i) - r.combineSeed (result[i].toInt64()); - - return r.nextInt64(); - } -} - -//============================================================================== -Uuid::Uuid() -{ - // The normal random seeding is pretty good, but we'll throw some MAC addresses - // into the mix too, to make it very very unlikely that two UUIDs will ever be the same.. - - static Random r1 (getRandomSeedFromMACAddresses()); - Random r2; - - for (size_t i = 0; i < sizeof (uuid); ++i) - uuid[i] = (uint8) (r1.nextInt() ^ r2.nextInt()); -} - -Uuid::~Uuid() noexcept {} - -Uuid::Uuid (const Uuid& other) noexcept -{ - memcpy (uuid, other.uuid, sizeof (uuid)); -} - -Uuid& Uuid::operator= (const Uuid& other) noexcept -{ - memcpy (uuid, other.uuid, sizeof (uuid)); - return *this; -} - -bool Uuid::operator== (const Uuid& other) const noexcept { return memcmp (uuid, other.uuid, sizeof (uuid)) == 0; } -bool Uuid::operator!= (const Uuid& other) const noexcept { return ! operator== (other); } - -bool Uuid::isNull() const noexcept -{ - for (size_t i = 0; i < sizeof (uuid); ++i) - if (uuid[i] != 0) - return false; - - return true; -} - -String Uuid::toString() const -{ - return String::toHexString (uuid, sizeof (uuid), 0); -} - -Uuid::Uuid (const String& uuidString) -{ - operator= (uuidString); -} - -Uuid& Uuid::operator= (const String& uuidString) -{ - MemoryBlock mb; - mb.loadFromHexString (uuidString); - mb.ensureSize (sizeof (uuid), true); - mb.copyTo (uuid, 0, sizeof (uuid)); - return *this; -} - -Uuid::Uuid (const uint8* const rawData) -{ - operator= (rawData); -} - -Uuid& Uuid::operator= (const uint8* const rawData) noexcept -{ - if (rawData != nullptr) - memcpy (uuid, rawData, sizeof (uuid)); - else - zeromem (uuid, sizeof (uuid)); - - return *this; -} diff --git a/Subtrees/beast/modules/beast_core/misc/beast_Uuid.h b/Subtrees/beast/modules/beast_core/misc/beast_Uuid.h deleted file mode 100644 index 33f4524c0d..0000000000 --- a/Subtrees/beast/modules/beast_core/misc/beast_Uuid.h +++ /dev/null @@ -1,109 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_UUID_BEASTHEADER -#define BEAST_UUID_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** - A universally unique 128-bit identifier. - - This class generates very random unique numbers based on the system time - and MAC addresses if any are available. It's extremely unlikely that two identical - UUIDs would ever be created by chance. - - The class includes methods for saving the ID as a string or as raw binary data. -*/ -class BEAST_API Uuid -{ -public: - //============================================================================== - /** Creates a new unique ID. */ - Uuid(); - - /** Destructor. */ - ~Uuid() noexcept; - - /** Creates a copy of another UUID. */ - Uuid (const Uuid& other) noexcept; - - /** Copies another UUID. */ - Uuid& operator= (const Uuid& other) noexcept; - - //============================================================================== - /** Returns true if the ID is zero. */ - bool isNull() const noexcept; - - bool operator== (const Uuid& other) const noexcept; - bool operator!= (const Uuid& other) const noexcept; - - //============================================================================== - /** Returns a stringified version of this UUID. - - A Uuid object can later be reconstructed from this string using operator= or - the constructor that takes a string parameter. - - @returns a 32 character hex string. - */ - String toString() const; - - /** Creates an ID from an encoded string version. - @see toString - */ - Uuid (const String& uuidString); - - /** Copies from a stringified UUID. - The string passed in should be one that was created with the toString() method. - */ - Uuid& operator= (const String& uuidString); - - - //============================================================================== - /** Returns a pointer to the internal binary representation of the ID. - - This is an array of 16 bytes. To reconstruct a Uuid from its data, use - the constructor or operator= method that takes an array of uint8s. - */ - const uint8* getRawData() const noexcept { return uuid; } - - /** Creates a UUID from a 16-byte array. - @see getRawData - */ - Uuid (const uint8* rawData); - - /** Sets this UUID from 16-bytes of raw data. */ - Uuid& operator= (const uint8* rawData) noexcept; - - -private: - //============================================================================== - uint8 uuid[16]; - - BEAST_LEAK_DETECTOR (Uuid) -}; - - -#endif // BEAST_UUID_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/misc/beast_WindowsRegistry.h b/Subtrees/beast/modules/beast_core/misc/beast_WindowsRegistry.h deleted file mode 100644 index e1c1f811d8..0000000000 --- a/Subtrees/beast/modules/beast_core/misc/beast_WindowsRegistry.h +++ /dev/null @@ -1,119 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_WINDOWSREGISTRY_BEASTHEADER -#define BEAST_WINDOWSREGISTRY_BEASTHEADER - -#if BEAST_WINDOWS || DOXYGEN - -/** - Contains some static helper functions for manipulating the MS Windows registry - (Only available on Windows, of course!) -*/ -class WindowsRegistry -{ -public: - //============================================================================== - /** Returns a string from the registry. - The path is a string for the entire path of a value in the registry, - e.g. "HKEY_CURRENT_USER\Software\foo\bar" - */ - static String getValue (const String& regValuePath, - const String& defaultValue = String::empty); - - /** Returns a string from the WOW64 registry. - The path is a string for the entire path of a value in the registry, - e.g. "HKEY_CURRENT_USER\Software\foo\bar" - */ - static String getValueWow64 (const String& regValuePath, - const String& defaultValue = String::empty); - - /** Reads a binary block from the registry. - The path is a string for the entire path of a value in the registry, - e.g. "HKEY_CURRENT_USER\Software\foo\bar" - @returns a DWORD indicating the type of the key. - */ - static uint32 getBinaryValue (const String& regValuePath, MemoryBlock& resultData); - - /** Sets a registry value as a string. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool setValue (const String& regValuePath, const String& value); - - /** Sets a registry value as a DWORD. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool setValue (const String& regValuePath, uint32 value); - - /** Sets a registry value as a QWORD. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool setValue (const String& regValuePath, uint64 value); - - /** Sets a registry value as a binary block. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool setValue (const String& regValuePath, const MemoryBlock& value); - - /** Returns true if the given value exists in the registry. */ - static bool valueExists (const String& regValuePath); - - /** Returns true if the given value exists in the registry. */ - static bool valueExistsWow64 (const String& regValuePath); - - /** Deletes a registry value. */ - static void deleteValue (const String& regValuePath); - - /** Deletes a registry key (which is registry-talk for 'folder'). */ - static void deleteKey (const String& regKeyPath); - - /** Creates a file association in the registry. - - This lets you set the executable that should be launched by a given file extension. - @param fileExtension the file extension to associate, including the - initial dot, e.g. ".txt" - @param symbolicDescription a space-free short token to identify the file type - @param fullDescription a human-readable description of the file type - @param targetExecutable the executable that should be launched - @param iconResourceNumber the icon that gets displayed for the file type will be - found by looking up this resource number in the - executable. Pass 0 here to not use an icon - @param registerForCurrentUserOnly if false, this will try to register the association - for all users (you might not have permission to do this - unless running in an installer). If true, it will register the - association in HKEY_CURRENT_USER. - */ - static bool registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - int iconResourceNumber, - bool registerForCurrentUserOnly); - -private: - WindowsRegistry(); - BEAST_DECLARE_NON_COPYABLE (WindowsRegistry) -}; - -#endif -#endif // BEAST_WINDOWSREGISTRY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/native/beast_BasicNativeHeaders.h b/Subtrees/beast/modules/beast_core/native/beast_BasicNativeHeaders.h deleted file mode 100644 index 5af5a11d72..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_BasicNativeHeaders.h +++ /dev/null @@ -1,227 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BASICNATIVEHEADERS_BEASTHEADER -#define BEAST_BASICNATIVEHEADERS_BEASTHEADER - -#include "../system/beast_TargetPlatform.h" -#undef T - -//============================================================================== -#if BEAST_MAC || BEAST_IOS - - #if BEAST_IOS - #import - #import - #import - #import - #include - #else - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName - #import - #import - #undef Point - #undef Component - #include - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - -//============================================================================== -#elif BEAST_WINDOWS - #if BEAST_MSVC - #ifndef _CPPRTTI - #error "Beast requires RTTI!" - #endif - - #ifndef _CPPUNWIND - #error "Beast requires RTTI!" - #endif - - #pragma warning (push) - #pragma warning (disable : 4100 4201 4514 4312 4995) - #endif - - #define STRICT 1 - #define WIN32_LEAN_AND_MEAN 1 - #ifndef _WIN32_WINNT - #if BEAST_MINGW - #define _WIN32_WINNT 0x0501 - #else - #define _WIN32_WINNT 0x0600 - #endif - #endif - #define _UNICODE 1 - #define UNICODE 1 - #ifndef _WIN32_IE - #define _WIN32_IE 0x0400 - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #if BEAST_MINGW - #include - #else - #include - #include - #endif - - #undef PACKED - - #if BEAST_MSVC - #pragma warning (pop) - #pragma warning (4: 4511 4512 4100 /*4365*/) // (enable some warnings that are turned off in VC8) - #endif - - #if BEAST_MSVC && ! BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #pragma comment (lib, "kernel32.lib") - #pragma comment (lib, "user32.lib") - #pragma comment (lib, "wininet.lib") - #pragma comment (lib, "advapi32.lib") - #pragma comment (lib, "ws2_32.lib") - #pragma comment (lib, "version.lib") - #pragma comment (lib, "shlwapi.lib") - #pragma comment (lib, "winmm.lib") - - #ifdef _NATIVE_WCHAR_T_DEFINED - #ifdef _DEBUG - #pragma comment (lib, "comsuppwd.lib") - #else - #pragma comment (lib, "comsuppw.lib") - #endif - #else - #ifdef _DEBUG - #pragma comment (lib, "comsuppd.lib") - #else - #pragma comment (lib, "comsupp.lib") - #endif - #endif - #endif - - /* Used with DynamicLibrary to simplify importing functions from a win32 DLL. - - dll: the DynamicLibrary object - functionName: function to import - localFunctionName: name you want to use to actually call it (must be different) - returnType: the return type - params: list of params (bracketed) - */ - #define BEAST_LOAD_WINAPI_FUNCTION(dll, functionName, localFunctionName, returnType, params) \ - typedef returnType (WINAPI *type##localFunctionName) params; \ - type##localFunctionName localFunctionName = (type##localFunctionName) dll.getFunction (#functionName); - -//============================================================================== -#elif BEAST_LINUX || BEAST_BSD - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #if BEAST_BSD - #include - #include - #include - #else - #include - #include - #include - #include - #endif - -//============================================================================== -#elif BEAST_ANDROID - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#endif - -// Need to clear various moronic redefinitions made by system headers.. -#undef max -#undef min -#undef direct -#undef check - -#endif // BEAST_BASICNATIVEHEADERS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_Files.cpp b/Subtrees/beast/modules/beast_core/native/beast_android_Files.cpp deleted file mode 100644 index ed53676ac8..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_Files.cpp +++ /dev/null @@ -1,236 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -bool File::copyInternal (const File& dest) const -{ - FileInputStream in (*this); - - if (dest.deleteFile()) - { - { - FileOutputStream out (dest); - - if (out.failedToOpen()) - return false; - - if (out.writeFromInputStream (in, -1) == getSize()) - return true; - } - - dest.deleteFile(); - } - - return false; -} - -void File::findFileSystemRoots (Array& destArray) -{ - destArray.add (File ("/")); -} - -//============================================================================== -bool File::isOnCDRomDrive() const -{ - return false; -} - -bool File::isOnHardDisk() const -{ - return true; -} - -bool File::isOnRemovableDrive() const -{ - return false; -} - -bool File::isHidden() const -{ - return getFileName().startsWithChar ('.'); -} - -//============================================================================== -namespace -{ - File beast_readlink (const String& file, const File& defaultFile) - { - const int size = 8192; - HeapBlock buffer; - buffer.malloc (size + 4); - - const size_t numBytes = readlink (file.toUTF8(), buffer, size); - - if (numBytes > 0 && numBytes <= size) - return File (file).getSiblingFile (String::fromUTF8 (buffer, (int) numBytes)); - - return defaultFile; - } -} - -File File::getLinkedTarget() const -{ - return beast_readlink (getFullPathName().toUTF8(), *this); -} - -//============================================================================== -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - case userDocumentsDirectory: - case userMusicDirectory: - case userMoviesDirectory: - case userPicturesDirectory: - case userApplicationDataDirectory: - case userDesktopDirectory: - return File (android.appDataDir); - - case commonApplicationDataDirectory: - return File (android.appDataDir); - - case globalApplicationsDirectory: - return File ("/system/app"); - - case tempDirectory: - //return File (AndroidStatsHelpers::getSystemProperty ("java.io.tmpdir")); - return File (android.appDataDir).getChildFile (".temp"); - - case invokedExecutableFile: - case currentExecutableFile: - case currentApplicationFile: - case hostApplicationPath: - return beast_getExecutableFile(); - - default: - bassertfalse; // unknown type? - break; - } - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - return String::empty; -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - // TODO - - return false; -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - dir (opendir (directory.getFullPathName().toUTF8())) - { - } - - ~Pimpl() - { - if (dir != 0) - closedir (dir); - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - if (dir != 0) - { - const char* wildcardUTF8 = nullptr; - - for (;;) - { - struct dirent* const de = readdir (dir); - - if (de == nullptr) - break; - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, de->d_name, FNM_CASEFOLD) == 0) - { - filenameFound = CharPointer_UTF8 (de->d_name); - - updateStatInfoForFile (parentDir + filenameFound, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != 0) - *isHidden = filenameFound.startsWithChar ('.'); - - return true; - } - } - } - - return false; - } - -private: - String parentDir, wildCard; - DIR* dir; - - BEAST_DECLARE_NON_COPYABLE (Pimpl) -}; - - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -bool Process::openDocument (const String& fileName, const String& parameters) -{ - const LocalRef t (javaString (fileName)); - android.activity.callVoidMethod (BeastAppActivity.launchURL, t.get()); -} - -void File::revealToUser() const -{ -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_JNIHelpers.h b/Subtrees/beast/modules/beast_core/native/beast_android_JNIHelpers.h deleted file mode 100644 index 3681c5c6a4..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_JNIHelpers.h +++ /dev/null @@ -1,402 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_ANDROID_JNIHELPERS_BEASTHEADER -#define BEAST_ANDROID_JNIHELPERS_BEASTHEADER - -#if ! (defined (BEAST_ANDROID_ACTIVITY_CLASSNAME) && defined (BEAST_ANDROID_ACTIVITY_CLASSPATH)) - #error "The BEAST_ANDROID_ACTIVITY_CLASSNAME and BEAST_ANDROID_ACTIVITY_CLASSPATH macros must be set!" -#endif - -//============================================================================== -extern JNIEnv* getEnv() noexcept; - -//============================================================================== -class GlobalRef -{ -public: - inline GlobalRef() noexcept : obj (0) {} - inline explicit GlobalRef (jobject o) : obj (retain (o)) {} - inline GlobalRef (const GlobalRef& other) : obj (retain (other.obj)) {} - ~GlobalRef() { clear(); } - - inline void clear() - { - if (obj != 0) - { - getEnv()->DeleteGlobalRef (obj); - obj = 0; - } - } - - inline GlobalRef& operator= (const GlobalRef& other) - { - jobject newObj = retain (other.obj); - clear(); - obj = newObj; - return *this; - } - - //============================================================================== - inline operator jobject() const noexcept { return obj; } - inline jobject get() const noexcept { return obj; } - - //============================================================================== - #define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \ - returnType call##typeName##Method (jmethodID methodID, ... ) const \ - { \ - va_list args; \ - va_start (args, methodID); \ - returnType result = getEnv()->Call##typeName##MethodV (obj, methodID, args); \ - va_end (args); \ - return result; \ - } - - DECLARE_CALL_TYPE_METHOD (jobject, Object) - DECLARE_CALL_TYPE_METHOD (jboolean, Boolean) - DECLARE_CALL_TYPE_METHOD (jbyte, Byte) - DECLARE_CALL_TYPE_METHOD (jchar, Char) - DECLARE_CALL_TYPE_METHOD (jshort, Short) - DECLARE_CALL_TYPE_METHOD (jint, Int) - DECLARE_CALL_TYPE_METHOD (jlong, Long) - DECLARE_CALL_TYPE_METHOD (jfloat, Float) - DECLARE_CALL_TYPE_METHOD (jdouble, Double) - #undef DECLARE_CALL_TYPE_METHOD - - void callVoidMethod (jmethodID methodID, ... ) const - { - va_list args; - va_start (args, methodID); - getEnv()->CallVoidMethodV (obj, methodID, args); - va_end (args); - } - -private: - //============================================================================== - jobject obj; - - static inline jobject retain (jobject obj) - { - return obj == 0 ? 0 : getEnv()->NewGlobalRef (obj); - } -}; - -//============================================================================== -template -class LocalRef -{ -public: - explicit inline LocalRef (JavaType o) noexcept : obj (o) {} - inline LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} - ~LocalRef() { clear(); } - - void clear() - { - if (obj != 0) - getEnv()->DeleteLocalRef (obj); - } - - LocalRef& operator= (const LocalRef& other) - { - jobject newObj = retain (other.obj); - clear(); - obj = newObj; - return *this; - } - - inline operator JavaType() const noexcept { return obj; } - inline JavaType get() const noexcept { return obj; } - -private: - JavaType obj; - - static JavaType retain (JavaType obj) - { - return obj == 0 ? 0 : (JavaType) getEnv()->NewLocalRef (obj); - } -}; - -//============================================================================== -namespace -{ - String beastString (JNIEnv* env, jstring s) - { - const char* const utf8 = env->GetStringUTFChars (s, nullptr); - CharPointer_UTF8 utf8CP (utf8); - const String result (utf8CP); - env->ReleaseStringUTFChars (s, utf8); - return result; - } - - String beastString (jstring s) - { - return beastString (getEnv(), s); - } - - LocalRef javaString (const String& s) - { - return LocalRef (getEnv()->NewStringUTF (s.toUTF8())); - } - - LocalRef javaStringFromChar (const beast_wchar c) - { - char utf8[8] = { 0 }; - CharPointer_UTF8 (utf8).write (c); - return LocalRef (getEnv()->NewStringUTF (utf8)); - } -} - -//============================================================================== -class JNIClassBase -{ -public: - explicit JNIClassBase (const char* classPath); - virtual ~JNIClassBase(); - - inline operator jclass() const noexcept { return classRef; } - - static void initialiseAllClasses (JNIEnv*); - static void releaseAllClasses (JNIEnv*); - -protected: - virtual void initialiseFields (JNIEnv*) = 0; - - jmethodID resolveMethod (JNIEnv*, const char* methodName, const char* params); - jmethodID resolveStaticMethod (JNIEnv*, const char* methodName, const char* params); - jfieldID resolveField (JNIEnv*, const char* fieldName, const char* signature); - jfieldID resolveStaticField (JNIEnv*, const char* fieldName, const char* signature); - -private: - const char* const classPath; - jclass classRef; - - static Array& getClasses(); - void initialise (JNIEnv*); - void release (JNIEnv*); - - BEAST_DECLARE_NON_COPYABLE (JNIClassBase) -}; - -//============================================================================== -#define CREATE_JNI_METHOD(methodID, stringName, params) methodID = resolveMethod (env, stringName, params); -#define CREATE_JNI_STATICMETHOD(methodID, stringName, params) methodID = resolveStaticMethod (env, stringName, params); -#define CREATE_JNI_FIELD(fieldID, stringName, signature) fieldID = resolveField (env, stringName, signature); -#define CREATE_JNI_STATICFIELD(fieldID, stringName, signature) fieldID = resolveStaticField (env, stringName, signature); -#define DECLARE_JNI_METHOD(methodID, stringName, params) jmethodID methodID; -#define DECLARE_JNI_FIELD(fieldID, stringName, signature) jfieldID fieldID; - -#define DECLARE_JNI_CLASS(CppClassName, javaPath) \ - class CppClassName ## _Class : public JNIClassBase \ - { \ - public: \ - CppClassName ## _Class() : JNIClassBase (javaPath) {} \ - \ - void initialiseFields (JNIEnv* env) \ - { \ - JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD); \ - } \ - \ - JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD); \ - }; \ - static CppClassName ## _Class CppClassName; - - -//============================================================================== -#define BEAST_JNI_CALLBACK(className, methodName, returnType, params) \ - extern "C" __attribute__ ((visibility("default"))) returnType BEAST_JOIN_MACRO (BEAST_JOIN_MACRO (Java_, className), _ ## methodName) params - -//============================================================================== -class AndroidSystem -{ -public: - AndroidSystem(); - - void initialise (JNIEnv*, jobject activity, jstring appFile, jstring appDataDir); - void shutdown (JNIEnv*); - - //============================================================================== - GlobalRef activity; - String appFile, appDataDir; - int screenWidth, screenHeight; -}; - -extern AndroidSystem android; - -//============================================================================== -class ThreadLocalJNIEnvHolder -{ -public: - ThreadLocalJNIEnvHolder() - : jvm (nullptr) - { - zeromem (threads, sizeof (threads)); - zeromem (envs, sizeof (envs)); - } - - void initialise (JNIEnv* env) - { - // NB: the DLL can be left loaded by the JVM, so the same static - // objects can end up being reused by subsequent runs of the app - zeromem (threads, sizeof (threads)); - zeromem (envs, sizeof (envs)); - - env->GetJavaVM (&jvm); - addEnv (env); - } - - JNIEnv* attach() - { - JNIEnv* env = nullptr; - jvm->AttachCurrentThread (&env, nullptr); - - if (env != nullptr) - addEnv (env); - - return env; - } - - void detach() - { - jvm->DetachCurrentThread(); - - const pthread_t thisThread = pthread_self(); - - SpinLock::ScopedLockType sl (addRemoveLock); - for (int i = 0; i < maxThreads; ++i) - if (threads[i] == thisThread) - threads[i] = 0; - } - - JNIEnv* getOrAttach() noexcept - { - JNIEnv* env = get(); - - if (env == nullptr) - env = attach(); - - bassert (env != nullptr); - return env; - } - - JNIEnv* get() const noexcept - { - const pthread_t thisThread = pthread_self(); - - for (int i = 0; i < maxThreads; ++i) - if (threads[i] == thisThread) - return envs[i]; - - return nullptr; - } - - enum { maxThreads = 32 }; - -private: - JavaVM* jvm; - pthread_t threads [maxThreads]; - JNIEnv* envs [maxThreads]; - SpinLock addRemoveLock; - - void addEnv (JNIEnv* env) - { - SpinLock::ScopedLockType sl (addRemoveLock); - - if (get() == nullptr) - { - const pthread_t thisThread = pthread_self(); - - for (int i = 0; i < maxThreads; ++i) - { - if (threads[i] == 0) - { - envs[i] = env; - threads[i] = thisThread; - return; - } - } - } - - bassertfalse; // too many threads! - } -}; - -extern ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (createNewView, "createNewView", "(Z)L" BEAST_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \ - METHOD (deleteView, "deleteView", "(L" BEAST_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \ - METHOD (postMessage, "postMessage", "(J)V") \ - METHOD (finish, "finish", "()V") \ - METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \ - METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \ - METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \ - METHOD (renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \ - STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;ILjava/lang/StringBuffer;)L" BEAST_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ - METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \ - METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ - METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") - -DECLARE_JNI_CLASS (BeastAppActivity, BEAST_ANDROID_ACTIVITY_CLASSPATH); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "(I)V") \ - METHOD (setColor, "setColor", "(I)V") \ - METHOD (setAlpha, "setAlpha", "(I)V") \ - METHOD (setTypeface, "setTypeface", "(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;") \ - METHOD (ascent, "ascent", "()F") \ - METHOD (descent, "descent", "()F") \ - METHOD (setTextSize, "setTextSize", "(F)V") \ - METHOD (getTextWidths, "getTextWidths", "(Ljava/lang/String;[F)I") \ - METHOD (setTextScaleX, "setTextScaleX", "(F)V") \ - METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \ - METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \ - -DECLARE_JNI_CLASS (Paint, "android/graphics/Paint"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "()V") \ - METHOD (setValues, "setValues", "([F)V") \ - -DECLARE_JNI_CLASS (Matrix, "android/graphics/Matrix"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "(IIII)V") \ - FIELD (left, "left", "I") \ - FIELD (right, "right", "I") \ - FIELD (top, "top", "I") \ - FIELD (bottom, "bottom", "I") \ - -DECLARE_JNI_CLASS (RectClass, "android/graphics/Rect"); -#undef JNI_CLASS_MEMBERS - -#endif // BEAST_ANDROID_JNIHELPERS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_Misc.cpp b/Subtrees/beast/modules/beast_core/native/beast_android_Misc.cpp deleted file mode 100644 index d2d236a180..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_Misc.cpp +++ /dev/null @@ -1,27 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void Logger::outputDebugString (const String& text) -{ - __android_log_print (ANDROID_LOG_INFO, "BEAST", text.toUTF8()); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_Network.cpp b/Subtrees/beast/modules/beast_core/native/beast_android_Network.cpp deleted file mode 100644 index 6fdd4f6339..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_Network.cpp +++ /dev/null @@ -1,171 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "()V") \ - METHOD (toString, "toString", "()Ljava/lang/String;") \ - -DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (release, "release", "()V") \ - METHOD (read, "read", "([BI)I") \ - METHOD (getPosition, "getPosition", "()J") \ - METHOD (getTotalLength, "getTotalLength", "()J") \ - METHOD (isExhausted, "isExhausted", "()Z") \ - METHOD (setPosition, "setPosition", "(J)Z") \ - -DECLARE_JNI_CLASS (HTTPStream, BEAST_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream"); -#undef JNI_CLASS_MEMBERS - - -//============================================================================== -void MACAddress::findAllAddresses (Array& result) -{ - // TODO -} - - -bool Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - // TODO - return false; -} - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - //============================================================================== - WebInputStream (String address, bool isPost, const MemoryBlock& postData, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, int timeOutMs, StringPairArray* responseHeaders) - { - if (! address.contains ("://")) - address = "http://" + address; - - JNIEnv* env = getEnv(); - - jbyteArray postDataArray = 0; - - if (postData.getSize() > 0) - { - postDataArray = env->NewByteArray (postData.getSize()); - env->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); - } - - LocalRef responseHeaderBuffer (env->NewObject (StringBuffer, StringBuffer.constructor)); - - stream = GlobalRef (env->CallStaticObjectMethod (BeastAppActivity, - BeastAppActivity.createHTTPStream, - javaString (address).get(), - (jboolean) isPost, - postDataArray, - javaString (headers).get(), - (jint) timeOutMs, - responseHeaderBuffer.get())); - - if (postDataArray != 0) - env->DeleteLocalRef (postDataArray); - - if (stream != 0) - { - StringArray headerLines; - - { - LocalRef headersString ((jstring) env->CallObjectMethod (responseHeaderBuffer.get(), - StringBuffer.toString)); - headerLines.addLines (beastString (env, headersString)); - } - - if (responseHeaders != 0) - { - for (int i = 0; i < headerLines.size(); ++i) - { - const String& header = headerLines[i]; - const String key (header.upToFirstOccurrenceOf (": ", false, false)); - const String value (header.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue ((*responseHeaders) [key]); - - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - } - } - } - - ~WebInputStream() - { - if (stream != 0) - stream.callVoidMethod (HTTPStream.release); - } - - //============================================================================== - bool isExhausted() { return stream != nullptr && stream.callBooleanMethod (HTTPStream.isExhausted); } - int64 getTotalLength() { return stream != nullptr ? stream.callLongMethod (HTTPStream.getTotalLength) : 0; } - int64 getPosition() { return stream != nullptr ? stream.callLongMethod (HTTPStream.getPosition) : 0; } - bool setPosition (int64 wantedPos) { return stream != nullptr && stream.callBooleanMethod (HTTPStream.setPosition, (jlong) wantedPos); } - - int read (void* buffer, int bytesToRead) - { - bassert (buffer != nullptr && bytesToRead >= 0); - - if (stream == nullptr) - return 0; - - JNIEnv* env = getEnv(); - - jbyteArray javaArray = env->NewByteArray (bytesToRead); - - int numBytes = stream.callIntMethod (HTTPStream.read, javaArray, (jint) bytesToRead); - - if (numBytes > 0) - env->GetByteArrayRegion (javaArray, 0, numBytes, static_cast (buffer)); - - env->DeleteLocalRef (javaArray); - return numBytes; - } - - //============================================================================== - GlobalRef stream; - -private: - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->stream != 0 ? wi.release() : nullptr; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_SystemStats.cpp b/Subtrees/beast/modules/beast_core/native/beast_android_SystemStats.cpp deleted file mode 100644 index 1dd9a5bc38..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_SystemStats.cpp +++ /dev/null @@ -1,307 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -JNIClassBase::JNIClassBase (const char* classPath_) - : classPath (classPath_), classRef (0) -{ - getClasses().add (this); -} - -JNIClassBase::~JNIClassBase() -{ - getClasses().removeFirstMatchingValue (this); -} - -Array& JNIClassBase::getClasses() -{ - static Array classes; - return classes; -} - -void JNIClassBase::initialise (JNIEnv* env) -{ - classRef = (jclass) env->NewGlobalRef (env->FindClass (classPath)); - bassert (classRef != 0); - - initialiseFields (env); -} - -void JNIClassBase::release (JNIEnv* env) -{ - env->DeleteGlobalRef (classRef); -} - -void JNIClassBase::initialiseAllClasses (JNIEnv* env) -{ - const Array& classes = getClasses(); - for (int i = classes.size(); --i >= 0;) - classes.getUnchecked(i)->initialise (env); -} - -void JNIClassBase::releaseAllClasses (JNIEnv* env) -{ - const Array& classes = getClasses(); - for (int i = classes.size(); --i >= 0;) - classes.getUnchecked(i)->release (env); -} - -jmethodID JNIClassBase::resolveMethod (JNIEnv* env, const char* methodName, const char* params) -{ - jmethodID m = env->GetMethodID (classRef, methodName, params); - bassert (m != 0); - return m; -} - -jmethodID JNIClassBase::resolveStaticMethod (JNIEnv* env, const char* methodName, const char* params) -{ - jmethodID m = env->GetStaticMethodID (classRef, methodName, params); - bassert (m != 0); - return m; -} - -jfieldID JNIClassBase::resolveField (JNIEnv* env, const char* fieldName, const char* signature) -{ - jfieldID f = env->GetFieldID (classRef, fieldName, signature); - bassert (f != 0); - return f; -} - -jfieldID JNIClassBase::resolveStaticField (JNIEnv* env, const char* fieldName, const char* signature) -{ - jfieldID f = env->GetStaticFieldID (classRef, fieldName, signature); - bassert (f != 0); - return f; -} - -//============================================================================== -ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; - -#if BEAST_DEBUG -static bool systemInitialised = false; -#endif - -JNIEnv* getEnv() noexcept -{ - #if BEAST_DEBUG - if (! systemInitialised) - { - DBG ("*** Call to getEnv() when system not initialised"); - bassertfalse; - exit (0); - } - #endif - - return threadLocalJNIEnvHolder.getOrAttach(); -} - -extern "C" jint JNI_OnLoad (JavaVM*, void*) -{ - return JNI_VERSION_1_2; -} - -//============================================================================== -AndroidSystem::AndroidSystem() : screenWidth (0), screenHeight (0) -{ -} - -void AndroidSystem::initialise (JNIEnv* env, jobject activity_, - jstring appFile_, jstring appDataDir_) -{ - screenWidth = screenHeight = 0; - JNIClassBase::initialiseAllClasses (env); - - threadLocalJNIEnvHolder.initialise (env); - #if BEAST_DEBUG - systemInitialised = true; - #endif - - activity = GlobalRef (activity_); - appFile = beastString (env, appFile_); - appDataDir = beastString (env, appDataDir_); -} - -void AndroidSystem::shutdown (JNIEnv* env) -{ - activity.clear(); - - #if BEAST_DEBUG - systemInitialised = false; - #endif - - JNIClassBase::releaseAllClasses (env); -} - -AndroidSystem android; - -//============================================================================== -namespace AndroidStatsHelpers -{ - //============================================================================== - #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - STATICMETHOD (getProperty, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;") - - DECLARE_JNI_CLASS (SystemClass, "java/lang/System"); - #undef JNI_CLASS_MEMBERS - - //============================================================================== - String getSystemProperty (const String& name) - { - return beastString (LocalRef ((jstring) getEnv()->CallStaticObjectMethod (SystemClass, - SystemClass.getProperty, - javaString (name).get()))); - } - - //============================================================================== - String getLocaleValue (bool isRegion) - { - return beastString (LocalRef ((jstring) getEnv()->CallStaticObjectMethod (BeastAppActivity, - BeastAppActivity.getLocaleValue, - isRegion))); - } -} - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return Android; -} - -String SystemStats::getOperatingSystemName() -{ - return "Android " + AndroidStatsHelpers::getSystemProperty ("os.version"); -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if BEAST_64BIT - return true; - #else - return false; - #endif -} - -String SystemStats::getCpuVendor() -{ - return AndroidStatsHelpers::getSystemProperty ("os.arch"); -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - return 0; // TODO -} - -int SystemStats::getMemorySizeInMegabytes() -{ - #if __ANDROID_API__ >= 9 - struct sysinfo sysi; - - if (sysinfo (&sysi) == 0) - return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); - #endif - - return 0; -} - -int SystemStats::getPageSize() -{ - return sysconf (_SC_PAGESIZE); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - const char* user = getenv ("USER"); - - if (user == 0) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != 0) - user = pw->pw_name; - } - - return CharPointer_UTF8 (user); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String::empty; -} - - -String SystemStats::getUserLanguage() { return AndroidStatsHelpers::getLocaleValue (false); } -String SystemStats::getUserRegion() { return AndroidStatsHelpers::getLocaleValue (true); } -String SystemStats::getDisplayLanguage() { return getUserLanguage(); } - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - // TODO - hasMMX = false; - hasSSE = false; - hasSSE2 = false; - has3DNow = false; - - numCpus = bmax (1, sysconf (_SC_NPROCESSORS_ONLN)); -} - -//============================================================================== -uint32 beast_millisecondsSinceStartup() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return t.tv_sec * 1000 + t.tv_nsec / 1000000; -} - -int64 Time::getHighResolutionTicks() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return (t.tv_sec * (int64) 1000000) + (t.tv_nsec / 1000); -} - -int64 Time::getHighResolutionTicksPerSecond() noexcept -{ - return 1000000; // (microseconds) -} - -double Time::getMillisecondCounterHiRes() noexcept -{ - return getHighResolutionTicks() * 0.001; -} - -bool Time::setSystemTimeToThisTime() const -{ - bassertfalse; - return false; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_android_Threads.cpp b/Subtrees/beast/modules/beast_core/native/beast_android_Threads.cpp deleted file mode 100644 index 821d65f4ba..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_android_Threads.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in beast_posix_SharedCode.h! -*/ - -//============================================================================== -// sets the process to 0=low priority, 1=normal, 2=high, 3=realtime -void Process::setPriority (ProcessPriority prior) -{ - // TODO - - struct sched_param param; - int policy, maxp, minp; - - const int p = (int) prior; - - if (p <= 1) - policy = SCHED_OTHER; - else - policy = SCHED_RR; - - minp = sched_get_priority_min (policy); - maxp = sched_get_priority_max (policy); - - if (p < 2) - param.sched_priority = 0; - else if (p == 2 ) - // Set to middle of lower realtime priority range - param.sched_priority = minp + (maxp - minp) / 4; - else - // Set to middle of higher realtime priority range - param.sched_priority = minp + (3 * (maxp - minp) / 4); - - pthread_setschedparam (pthread_self(), policy, ¶m); -} - -void Process::terminate() -{ - // TODO - exit (0); -} - -BEAST_API bool BEAST_CALLTYPE beast_isRunningUnderDebugger() -{ - return false; -} - -BEAST_API bool BEAST_CALLTYPE Process::isRunningUnderDebugger() -{ - return beast_isRunningUnderDebugger(); -} - -void Process::raisePrivilege() {} -void Process::lowerPrivilege() {} diff --git a/Subtrees/beast/modules/beast_core/native/beast_linux_Files.cpp b/Subtrees/beast/modules/beast_core/native/beast_linux_Files.cpp deleted file mode 100644 index 6487f80fb3..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_linux_Files.cpp +++ /dev/null @@ -1,373 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -enum -{ - U_ISOFS_SUPER_MAGIC = 0x9660, // linux/iso_fs.h - U_MSDOS_SUPER_MAGIC = 0x4d44, // linux/msdos_fs.h - U_NFS_SUPER_MAGIC = 0x6969, // linux/nfs_fs.h - U_SMB_SUPER_MAGIC = 0x517B // linux/smb_fs.h -}; - -//============================================================================== -bool File::copyInternal (const File& dest) const -{ - FileInputStream in (*this); - - if (dest.deleteFile()) - { - { - FileOutputStream out (dest); - - if (out.failedToOpen()) - return false; - - if (out.writeFromInputStream (in, -1) == getSize()) - return true; - } - - dest.deleteFile(); - } - - return false; -} - -void File::findFileSystemRoots (Array& destArray) -{ - destArray.add (File ("/")); -} - -//============================================================================== -bool File::isOnCDRomDrive() const -{ - struct statfs buf; - - return statfs (getFullPathName().toUTF8(), &buf) == 0 - && buf.f_type == (short) U_ISOFS_SUPER_MAGIC; -} - -bool File::isOnHardDisk() const -{ - struct statfs buf; - - if (statfs (getFullPathName().toUTF8(), &buf) == 0) - { - switch (buf.f_type) - { - case U_ISOFS_SUPER_MAGIC: // CD-ROM - case U_MSDOS_SUPER_MAGIC: // Probably floppy (but could be mounted FAT filesystem) - case U_NFS_SUPER_MAGIC: // Network NFS - case U_SMB_SUPER_MAGIC: // Network Samba - return false; - - default: - // Assume anything else is a hard-disk (but note it could - // be a RAM disk. There isn't a good way of determining - // this for sure) - return true; - } - } - - // Assume so if this fails for some reason - return true; -} - -bool File::isOnRemovableDrive() const -{ - bassertfalse; // xxx not implemented for linux! - return false; -} - -bool File::isHidden() const -{ - return getFileName().startsWithChar ('.'); -} - -//============================================================================== -namespace -{ - File beast_readlink (const String& file, const File& defaultFile) - { - const size_t size = 8192; - HeapBlock buffer; - buffer.malloc (size + 4); - - const size_t numBytes = readlink (file.toUTF8(), buffer, size); - - if (numBytes > 0 && numBytes <= size) - return File (file).getSiblingFile (String::fromUTF8 (buffer, (int) numBytes)); - - return defaultFile; - } -} - -File File::getLinkedTarget() const -{ - return beast_readlink (getFullPathName().toUTF8(), *this); -} - -//============================================================================== -static File resolveXDGFolder (const char* const type, const char* const fallbackFolder) -{ - StringArray confLines; - File ("~/.config/user-dirs.dirs").readLines (confLines); - - for (int i = 0; i < confLines.size(); ++i) - { - const String line (confLines[i].trimStart()); - - if (line.startsWith (type)) - { - // eg. resolve XDG_MUSIC_DIR="$HOME/Music" to /home/user/Music - const File f (line.replace ("$HOME", File ("~").getFullPathName()) - .fromFirstOccurrenceOf ("=", false, false) - .trim().unquoted()); - - if (f.isDirectory()) - return f; - } - } - - return File (fallbackFolder); -} - -const char* const* beast_argv = nullptr; -int beast_argc = 0; - -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - { - const char* homeDir = getenv ("HOME"); - - if (homeDir == nullptr) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != nullptr) - homeDir = pw->pw_dir; - } - - return File (CharPointer_UTF8 (homeDir)); - } - - case userDocumentsDirectory: return resolveXDGFolder ("XDG_DOCUMENTS_DIR", "~"); - case userMusicDirectory: return resolveXDGFolder ("XDG_MUSIC_DIR", "~"); - case userMoviesDirectory: return resolveXDGFolder ("XDG_VIDEOS_DIR", "~"); - case userPicturesDirectory: return resolveXDGFolder ("XDG_PICTURES_DIR", "~"); - case userDesktopDirectory: return resolveXDGFolder ("XDG_DESKTOP_DIR", "~/Desktop"); - case userApplicationDataDirectory: return File ("~"); - case commonApplicationDataDirectory: return File ("/var"); - case globalApplicationsDirectory: return File ("/usr"); - - case tempDirectory: - { - File tmp ("/var/tmp"); - - if (! tmp.isDirectory()) - { - tmp = "/tmp"; - - if (! tmp.isDirectory()) - tmp = File::getCurrentWorkingDirectory(); - } - - return tmp; - } - - case invokedExecutableFile: - if (beast_argv != nullptr && beast_argc > 0) - return File (CharPointer_UTF8 (beast_argv[0])); - // deliberate fall-through... - - case currentExecutableFile: - case currentApplicationFile: - return beast_getExecutableFile(); - - case hostApplicationPath: - return beast_readlink ("/proc/self/exe", beast_getExecutableFile()); - - default: - bassertfalse; // unknown type? - break; - } - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - return String::empty; // xxx not yet implemented -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - File trashCan ("~/.Trash"); - - if (! trashCan.isDirectory()) - trashCan = "~/.local/share/Trash/files"; - - if (! trashCan.isDirectory()) - return false; - - return moveFileTo (trashCan.getNonexistentChildFile (getFileNameWithoutExtension(), - getFileExtension())); -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - dir (opendir (directory.getFullPathName().toUTF8())) - { - } - - ~Pimpl() - { - if (dir != nullptr) - closedir (dir); - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - if (dir != nullptr) - { - const char* wildcardUTF8 = nullptr; - - for (;;) - { - struct dirent* const de = readdir (dir); - - if (de == nullptr) - break; - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, de->d_name, FNM_CASEFOLD) == 0) - { - filenameFound = CharPointer_UTF8 (de->d_name); - - updateStatInfoForFile (parentDir + filenameFound, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != nullptr) - *isHidden = filenameFound.startsWithChar ('.'); - - return true; - } - } - } - - return false; - } - -private: - String parentDir, wildCard; - DIR* dir; - - BEAST_DECLARE_NON_COPYABLE (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -static bool isFileExecutable (const String& filename) -{ - beast_statStruct info; - - return beast_stat (filename, info) - && S_ISREG (info.st_mode) - && access (filename.toUTF8(), X_OK) == 0; -} - -bool Process::openDocument (const String& fileName, const String& parameters) -{ - String cmdString (fileName.replace (" ", "\\ ",false)); - cmdString << " " << parameters; - - if (URL::isProbablyAWebsiteURL (fileName) - || cmdString.startsWithIgnoreCase ("file:") - || URL::isProbablyAnEmailAddress (fileName) - || File::createFileWithoutCheckingPath (fileName).isDirectory() - || ! isFileExecutable (fileName)) - { - // create a command that tries to launch a bunch of likely browsers - const char* const browserNames[] = { "xdg-open", "/etc/alternatives/x-www-browser", "firefox", "mozilla", - "google-chrome", "chromium-browser", "opera", "konqueror" }; - StringArray cmdLines; - - for (int i = 0; i < numElementsInArray (browserNames); ++i) - cmdLines.add (String (browserNames[i]) + " " + cmdString.trim().quoted()); - - cmdString = cmdLines.joinIntoString (" || "); - } - - const char* const argv[4] = { "/bin/sh", "-c", cmdString.toUTF8(), 0 }; - - const int cpid = fork(); - - if (cpid == 0) - { - setsid(); - - // Child process - execve (argv[0], (char**) argv, environ); - exit (0); - } - - return cpid >= 0; -} - -void File::revealToUser() const -{ - if (isDirectory()) - startAsProcess(); - else if (getParentDirectory().exists()) - getParentDirectory().startAsProcess(); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_linux_Network.cpp b/Subtrees/beast/modules/beast_core/native/beast_linux_Network.cpp deleted file mode 100644 index 33b8012e7d..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_linux_Network.cpp +++ /dev/null @@ -1,457 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void MACAddress::findAllAddresses (Array& result) -{ - const int s = socket (AF_INET, SOCK_DGRAM, 0); - if (s != -1) - { - char buf [1024]; - struct ifconf ifc; - ifc.ifc_len = sizeof (buf); - ifc.ifc_buf = buf; - ioctl (s, SIOCGIFCONF, &ifc); - - for (unsigned int i = 0; i < ifc.ifc_len / sizeof (struct ifreq); ++i) - { - struct ifreq ifr; - strcpy (ifr.ifr_name, ifc.ifc_req[i].ifr_name); - - if (ioctl (s, SIOCGIFFLAGS, &ifr) == 0 - && (ifr.ifr_flags & IFF_LOOPBACK) == 0 - && ioctl (s, SIOCGIFHWADDR, &ifr) == 0) - { - result.addIfNotAlreadyThere (MACAddress ((const uint8*) ifr.ifr_hwaddr.sa_data)); - } - } - - close (s); - } -} - - -bool Process::openEmailWithAttachments (const String& /* targetEmailAddress */, - const String& /* emailSubject */, - const String& /* bodyText */, - const StringArray& /* filesToAttach */) -{ - bassertfalse; // xxx todo - - return false; -} - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) - : socketHandle (-1), levelsOfRedirection (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - createConnection (progressCallback, progressCallbackContext); - - if (responseHeaders != nullptr && ! isError()) - { - for (int i = 0; i < headerLines.size(); ++i) - { - const String& headersEntry = headerLines[i]; - const String key (headersEntry.upToFirstOccurrenceOf (": ", false, false)); - const String value (headersEntry.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue ((*responseHeaders) [key]); - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - } - } - - ~WebInputStream() - { - closeSocket(); - } - - //============================================================================== - bool isError() const { return socketHandle < 0; } - bool isExhausted() { return finished; } - int64 getPosition() { return position; } - - int64 getTotalLength() - { - //xxx to do - return -1; - } - - int read (void* buffer, int bytesToRead) - { - if (finished || isError()) - return 0; - - fd_set readbits; - FD_ZERO (&readbits); - FD_SET (socketHandle, &readbits); - - struct timeval tv; - tv.tv_sec = bmax (1, timeOutMs / 1000); - tv.tv_usec = 0; - - if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) - return 0; // (timeout) - - const int bytesRead = bmax (0, (int) recv (socketHandle, buffer, bytesToRead, MSG_WAITALL)); - if (bytesRead == 0) - finished = true; - position += bytesRead; - return bytesRead; - } - - bool setPosition (int64 wantedPos) - { - if (isError()) - return false; - - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - closeSocket(); - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - //============================================================================== -private: - int socketHandle, levelsOfRedirection; - StringArray headerLines; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - - void closeSocket() - { - if (socketHandle >= 0) - close (socketHandle); - - socketHandle = -1; - levelsOfRedirection = 0; - } - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) - { - closeSocket(); - - uint32 timeOutTime = Time::getMillisecondCounter(); - - if (timeOutMs == 0) - timeOutTime += 60000; - else if (timeOutMs < 0) - timeOutTime = 0xffffffff; - else - timeOutTime += timeOutMs; - - String hostName, hostPath; - int hostPort; - if (! decomposeURL (address, hostName, hostPath, hostPort)) - return; - - String serverName, proxyName, proxyPath; - int proxyPort = 0; - int port = 0; - - const String proxyURL (getenv ("http_proxy")); - if (proxyURL.startsWithIgnoreCase ("http://")) - { - if (! decomposeURL (proxyURL, proxyName, proxyPath, proxyPort)) - return; - - serverName = proxyName; - port = proxyPort; - } - else - { - serverName = hostName; - port = hostPort; - } - - struct addrinfo hints; - zerostruct (hints); - - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_NUMERICSERV; - - struct addrinfo* result = nullptr; - if (getaddrinfo (serverName.toUTF8(), String (port).toUTF8(), &hints, &result) != 0 || result == 0) - return; - - socketHandle = socket (result->ai_family, result->ai_socktype, 0); - - if (socketHandle == -1) - { - freeaddrinfo (result); - return; - } - - int receiveBufferSize = 16384; - setsockopt (socketHandle, SOL_SOCKET, SO_RCVBUF, (char*) &receiveBufferSize, sizeof (receiveBufferSize)); - setsockopt (socketHandle, SOL_SOCKET, SO_KEEPALIVE, 0, 0); - - #if BEAST_MAC - setsockopt (socketHandle, SOL_SOCKET, SO_NOSIGPIPE, 0, 0); - #endif - - if (connect (socketHandle, result->ai_addr, result->ai_addrlen) == -1) - { - closeSocket(); - freeaddrinfo (result); - return; - } - - freeaddrinfo (result); - - { - const MemoryBlock requestHeader (createRequestHeader (hostName, hostPort, proxyName, proxyPort, - hostPath, address, headers, postData, isPost)); - - if (! sendHeader (socketHandle, requestHeader, timeOutTime, progressCallback, progressCallbackContext)) - { - closeSocket(); - return; - } - } - - String responseHeader (readResponse (socketHandle, timeOutTime)); - - if (responseHeader.isNotEmpty()) - { - headerLines = StringArray::fromLines (responseHeader); - - const int statusCode = responseHeader.fromFirstOccurrenceOf (" ", false, false) - .substring (0, 3).getIntValue(); - - //int contentLength = findHeaderItem (lines, "Content-Length:").getIntValue(); - //bool isChunked = findHeaderItem (lines, "Transfer-Encoding:").equalsIgnoreCase ("chunked"); - - String location (findHeaderItem (headerLines, "Location:")); - - if (statusCode >= 300 && statusCode < 400 && location.isNotEmpty()) - { - if (! location.startsWithIgnoreCase ("http://")) - location = "http://" + location; - - if (++levelsOfRedirection <= 3) - { - address = location; - createConnection (progressCallback, progressCallbackContext); - return; - } - } - else - { - levelsOfRedirection = 0; - return; - } - } - - closeSocket(); - } - - //============================================================================== - static String readResponse (const int socketHandle, const uint32 timeOutTime) - { - int bytesRead = 0, numConsecutiveLFs = 0; - MemoryBlock buffer (1024, true); - - while (numConsecutiveLFs < 2 && bytesRead < 32768 - && Time::getMillisecondCounter() <= timeOutTime) - { - fd_set readbits; - FD_ZERO (&readbits); - FD_SET (socketHandle, &readbits); - - struct timeval tv; - tv.tv_sec = bmax (1, (int) (timeOutTime - Time::getMillisecondCounter()) / 1000); - tv.tv_usec = 0; - - if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) - return String::empty; // (timeout) - - buffer.ensureSize (bytesRead + 8, true); - char* const dest = (char*) buffer.getData() + bytesRead; - - if (recv (socketHandle, dest, 1, 0) == -1) - return String::empty; - - const char lastByte = *dest; - ++bytesRead; - - if (lastByte == '\n') - ++numConsecutiveLFs; - else if (lastByte != '\r') - numConsecutiveLFs = 0; - } - - const String header (CharPointer_UTF8 ((const char*) buffer.getData())); - - if (header.startsWithIgnoreCase ("HTTP/")) - return header.trimEnd(); - - return String::empty; - } - - static void writeValueIfNotPresent (MemoryOutputStream& dest, const String& headers, const String& key, const String& value) - { - if (! headers.containsIgnoreCase (key)) - dest << "\r\n" << key << ' ' << value; - } - - static void writeHost (MemoryOutputStream& dest, const bool isPost, const String& path, const String& host, const int port) - { - dest << (isPost ? "POST " : "GET ") << path << " HTTP/1.0\r\nHost: " << host; - - if (port > 0) - dest << ':' << port; - } - - static MemoryBlock createRequestHeader (const String& hostName, const int hostPort, - const String& proxyName, const int proxyPort, - const String& hostPath, const String& originalURL, - const String& userHeaders, const MemoryBlock& postData, - const bool isPost) - { - MemoryOutputStream header; - - if (proxyName.isEmpty()) - writeHost (header, isPost, hostPath, hostName, hostPort); - else - writeHost (header, isPost, originalURL, proxyName, proxyPort); - - writeValueIfNotPresent (header, userHeaders, "User-Agent:", "BEAST/" BEAST_STRINGIFY(BEAST_MAJOR_VERSION) - "." BEAST_STRINGIFY(BEAST_MINOR_VERSION) - "." BEAST_STRINGIFY(BEAST_BUILDNUMBER)); - writeValueIfNotPresent (header, userHeaders, "Connection:", "Close"); - - if (isPost) - writeValueIfNotPresent (header, userHeaders, "Content-Length:", String ((int) postData.getSize())); - - header << "\r\n" << userHeaders - << "\r\n" << postData; - - return header.getMemoryBlock(); - } - - static bool sendHeader (int socketHandle, const MemoryBlock& requestHeader, const uint32 timeOutTime, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) - { - size_t totalHeaderSent = 0; - - while (totalHeaderSent < requestHeader.getSize()) - { - if (Time::getMillisecondCounter() > timeOutTime) - return false; - - const int numToSend = bmin (1024, (int) (requestHeader.getSize() - totalHeaderSent)); - - if (send (socketHandle, static_cast (requestHeader.getData()) + totalHeaderSent, numToSend, 0) != numToSend) - return false; - - totalHeaderSent += numToSend; - - if (progressCallback != nullptr && ! progressCallback (progressCallbackContext, totalHeaderSent, requestHeader.getSize())) - return false; - } - - return true; - } - - static bool decomposeURL (const String& url, String& host, String& path, int& port) - { - if (! url.startsWithIgnoreCase ("http://")) - return false; - - const int nextSlash = url.indexOfChar (7, '/'); - int nextColon = url.indexOfChar (7, ':'); - if (nextColon > nextSlash && nextSlash > 0) - nextColon = -1; - - if (nextColon >= 0) - { - host = url.substring (7, nextColon); - - if (nextSlash >= 0) - port = url.substring (nextColon + 1, nextSlash).getIntValue(); - else - port = url.substring (nextColon + 1).getIntValue(); - } - else - { - port = 80; - - if (nextSlash >= 0) - host = url.substring (7, nextSlash); - else - host = url.substring (7); - } - - if (nextSlash >= 0) - path = url.substring (nextSlash); - else - path = "/"; - - return true; - } - - static String findHeaderItem (const StringArray& lines, const String& itemName) - { - for (int i = 0; i < lines.size(); ++i) - if (lines[i].startsWithIgnoreCase (itemName)) - return lines[i].substring (itemName.length()).trim(); - - return String::empty; - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_linux_SystemStats.cpp b/Subtrees/beast/modules/beast_core/native/beast_linux_SystemStats.cpp deleted file mode 100644 index 3764f477c4..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_linux_SystemStats.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void Logger::outputDebugString (const String& text) -{ - std::cerr << text << std::endl; -} - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return Linux; -} - -String SystemStats::getOperatingSystemName() -{ - return "Linux"; -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if BEAST_64BIT - return true; - #else - //xxx not sure how to find this out?.. - return false; - #endif -} - -//============================================================================== -namespace LinuxStatsHelpers -{ - String getCpuInfo (const char* const key) - { - StringArray lines; - File ("/proc/cpuinfo").readLines (lines); - - for (int i = lines.size(); --i >= 0;) // (NB - it's important that this runs in reverse order) - if (lines[i].startsWithIgnoreCase (key)) - return lines[i].fromFirstOccurrenceOf (":", false, false).trim(); - - return String::empty; - } -} - -String SystemStats::getCpuVendor() -{ - return LinuxStatsHelpers::getCpuInfo ("vendor_id"); -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - return roundToInt (LinuxStatsHelpers::getCpuInfo ("cpu MHz").getFloatValue()); -} - -int SystemStats::getMemorySizeInMegabytes() -{ - struct sysinfo sysi; - - if (sysinfo (&sysi) == 0) - return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); - - return 0; -} - -int SystemStats::getPageSize() -{ - return sysconf (_SC_PAGESIZE); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - const char* user = getenv ("USER"); - - if (user == nullptr) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != nullptr) - user = pw->pw_name; - } - - return CharPointer_UTF8 (user); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String::empty; -} - -String getLocaleValue (nl_item key) -{ - const char* oldLocale = ::setlocale (LC_ALL, ""); - return String (const_cast (nl_langinfo (key))); - ::setlocale (LC_ALL, oldLocale); -} - -String SystemStats::getUserLanguage() { return getLocaleValue (_NL_IDENTIFICATION_LANGUAGE); } -String SystemStats::getUserRegion() { return getLocaleValue (_NL_IDENTIFICATION_TERRITORY); } -String SystemStats::getDisplayLanguage() { return getUserLanguage(); } - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - const String flags (LinuxStatsHelpers::getCpuInfo ("flags")); - hasMMX = flags.contains ("mmx"); - hasSSE = flags.contains ("sse"); - hasSSE2 = flags.contains ("sse2"); - has3DNow = flags.contains ("3dnow"); - - numCpus = LinuxStatsHelpers::getCpuInfo ("processor").getIntValue() + 1; -} - -//============================================================================== -uint32 beast_millisecondsSinceStartup() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return t.tv_sec * 1000 + t.tv_nsec / 1000000; -} - -int64 Time::getHighResolutionTicks() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return (t.tv_sec * (int64) 1000000) + (t.tv_nsec / 1000); -} - -int64 Time::getHighResolutionTicksPerSecond() noexcept -{ - return 1000000; // (microseconds) -} - -double Time::getMillisecondCounterHiRes() noexcept -{ - return getHighResolutionTicks() * 0.001; -} - -bool Time::setSystemTimeToThisTime() const -{ - timeval t; - t.tv_sec = millisSinceEpoch / 1000; - t.tv_usec = (millisSinceEpoch - t.tv_sec * 1000) * 1000; - - return settimeofday (&t, 0) == 0; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_linux_Threads.cpp b/Subtrees/beast/modules/beast_core/native/beast_linux_Threads.cpp deleted file mode 100644 index 5ce0db5553..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_linux_Threads.cpp +++ /dev/null @@ -1,85 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in beast_posix_SharedCode.h! -*/ - -//============================================================================== -void Process::setPriority (const ProcessPriority prior) -{ - const int policy = (prior <= NormalPriority) ? SCHED_OTHER : SCHED_RR; - const int minp = sched_get_priority_min (policy); - const int maxp = sched_get_priority_max (policy); - - struct sched_param param; - - switch (prior) - { - case LowPriority: - case NormalPriority: param.sched_priority = 0; break; - case HighPriority: param.sched_priority = minp + (maxp - minp) / 4; break; - case RealtimePriority: param.sched_priority = minp + (3 * (maxp - minp) / 4); break; - default: bassertfalse; break; - } - - pthread_setschedparam (pthread_self(), policy, ¶m); -} - -void Process::terminate() -{ - exit (0); -} - -BEAST_API bool BEAST_CALLTYPE beast_isRunningUnderDebugger() -{ - static char testResult = 0; - - if (testResult == 0) - { - testResult = (char) ptrace (PT_TRACE_ME, 0, 0, 0); - - if (testResult >= 0) - { - ptrace (PT_DETACH, 0, (caddr_t) 1, 0); - testResult = 1; - } - } - - return testResult < 0; -} - -BEAST_API bool BEAST_CALLTYPE Process::isRunningUnderDebugger() -{ - return beast_isRunningUnderDebugger(); -} - -static void swapUserAndEffectiveUser() -{ - (void) setreuid (geteuid(), getuid()); - (void) setregid (getegid(), getgid()); -} - -void Process::raisePrivilege() { if (geteuid() != 0 && getuid() == 0) swapUserAndEffectiveUser(); } -void Process::lowerPrivilege() { if (geteuid() == 0 && getuid() != 0) swapUserAndEffectiveUser(); } diff --git a/Subtrees/beast/modules/beast_core/native/beast_mac_Files.mm b/Subtrees/beast/modules/beast_core/native/beast_mac_Files.mm deleted file mode 100644 index 020a06514c..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_mac_Files.mm +++ /dev/null @@ -1,480 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in beast_posix_SharedCode.h! -*/ - -//============================================================================== -bool File::copyInternal (const File& dest) const -{ - BEAST_AUTORELEASEPOOL - { - NSFileManager* fm = [NSFileManager defaultManager]; - - return [fm fileExistsAtPath: beastStringToNS (fullPath)] - #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - && [fm copyItemAtPath: beastStringToNS (fullPath) - toPath: beastStringToNS (dest.getFullPathName()) - error: nil]; - #else - && [fm copyPath: beastStringToNS (fullPath) - toPath: beastStringToNS (dest.getFullPathName()) - handler: nil]; - #endif - } -} - -void File::findFileSystemRoots (Array& destArray) -{ - destArray.add (File ("/")); -} - - -//============================================================================== -namespace FileHelpers -{ - static bool isFileOnDriveType (const File& f, const char* const* types) - { - struct statfs buf; - - if (beast_doStatFS (f, buf)) - { - const String type (buf.f_fstypename); - - while (*types != 0) - if (type.equalsIgnoreCase (*types++)) - return true; - } - - return false; - } - - static bool isHiddenFile (const String& path) - { - #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - BEAST_AUTORELEASEPOOL - { - NSNumber* hidden = nil; - NSError* err = nil; - - return [[NSURL fileURLWithPath: beastStringToNS (path)] - getResourceValue: &hidden forKey: NSURLIsHiddenKey error: &err] - && [hidden boolValue]; - } - #elif BEAST_IOS - return File (path).getFileName().startsWithChar ('.'); - #else - FSRef ref; - LSItemInfoRecord info; - - return FSPathMakeRefWithOptions ((const UInt8*) path.toRawUTF8(), kFSPathMakeRefDoNotFollowLeafSymlink, &ref, 0) == noErr - && LSCopyItemInfoForRef (&ref, kLSRequestBasicFlagsOnly, &info) == noErr - && (info.flags & kLSItemInfoIsInvisible) != 0; - #endif - } - - #if BEAST_IOS - String getIOSSystemLocation (NSSearchPathDirectory type) - { - return nsStringToBeast ([NSSearchPathForDirectoriesInDomains (type, NSUserDomainMask, YES) - objectAtIndex: 0]); - } - #endif - - static bool launchExecutable (const String& pathAndArguments) - { - const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), 0 }; - - const int cpid = fork(); - - if (cpid == 0) - { - // Child process - if (execve (argv[0], (char**) argv, 0) < 0) - exit (0); - } - else - { - if (cpid < 0) - return false; - } - - return true; - } -} - -bool File::isOnCDRomDrive() const -{ - const char* const cdTypes[] = { "cd9660", "cdfs", "cddafs", "udf", 0 }; - - return FileHelpers::isFileOnDriveType (*this, cdTypes); -} - -bool File::isOnHardDisk() const -{ - const char* const nonHDTypes[] = { "nfs", "smbfs", "ramfs", 0 }; - - return ! (isOnCDRomDrive() || FileHelpers::isFileOnDriveType (*this, nonHDTypes)); -} - -bool File::isOnRemovableDrive() const -{ - #if BEAST_IOS - return false; // xxx is this possible? - #else - BEAST_AUTORELEASEPOOL - { - BOOL removable = false; - - [[NSWorkspace sharedWorkspace] - getFileSystemInfoForPath: beastStringToNS (getFullPathName()) - isRemovable: &removable - isWritable: nil - isUnmountable: nil - description: nil - type: nil]; - - return removable; - } - #endif -} - -bool File::isHidden() const -{ - return FileHelpers::isHiddenFile (getFullPathName()); -} - -//============================================================================== -const char* const* beast_argv = nullptr; -int beast_argc = 0; - -File File::getSpecialLocation (const SpecialLocationType type) -{ - BEAST_AUTORELEASEPOOL - { - String resultPath; - - switch (type) - { - case userHomeDirectory: resultPath = nsStringToBeast (NSHomeDirectory()); break; - - #if BEAST_IOS - case userDocumentsDirectory: resultPath = FileHelpers::getIOSSystemLocation (NSDocumentDirectory); break; - case userDesktopDirectory: resultPath = FileHelpers::getIOSSystemLocation (NSDesktopDirectory); break; - - case tempDirectory: - { - File tmp (FileHelpers::getIOSSystemLocation (NSCachesDirectory)); - tmp = tmp.getChildFile (beast_getExecutableFile().getFileNameWithoutExtension()); - tmp.createDirectory(); - return tmp.getFullPathName(); - } - - #else - case userDocumentsDirectory: resultPath = "~/Documents"; break; - case userDesktopDirectory: resultPath = "~/Desktop"; break; - - case tempDirectory: - { - File tmp ("~/Library/Caches/" + beast_getExecutableFile().getFileNameWithoutExtension()); - tmp.createDirectory(); - return tmp.getFullPathName(); - } - #endif - case userMusicDirectory: resultPath = "~/Music"; break; - case userMoviesDirectory: resultPath = "~/Movies"; break; - case userPicturesDirectory: resultPath = "~/Pictures"; break; - case userApplicationDataDirectory: resultPath = "~/Library"; break; - case commonApplicationDataDirectory: resultPath = "/Library"; break; - case globalApplicationsDirectory: resultPath = "/Applications"; break; - - case invokedExecutableFile: - if (beast_argv != nullptr && beast_argc > 0) - return File (CharPointer_UTF8 (beast_argv[0])); - // deliberate fall-through... - - case currentExecutableFile: - return beast_getExecutableFile(); - - case currentApplicationFile: - { - const File exe (beast_getExecutableFile()); - const File parent (exe.getParentDirectory()); - - #if BEAST_IOS - return parent; - #else - return parent.getFullPathName().endsWithIgnoreCase ("Contents/MacOS") - ? parent.getParentDirectory().getParentDirectory() - : exe; - #endif - } - - case hostApplicationPath: - { - unsigned int size = 8192; - HeapBlock buffer; - buffer.calloc (size + 8); - - _NSGetExecutablePath (buffer.getData(), &size); - return String::fromUTF8 (buffer, (int) size); - } - - default: - bassertfalse; // unknown type? - break; - } - - if (resultPath.isNotEmpty()) - return File (resultPath.convertToPrecomposedUnicode()); - } - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - BEAST_AUTORELEASEPOOL - { - if (NSBundle* bundle = [NSBundle bundleWithPath: beastStringToNS (getFullPathName())]) - if (NSDictionary* info = [bundle infoDictionary]) - if (NSString* name = [info valueForKey: nsStringLiteral ("CFBundleShortVersionString")]) - return nsStringToBeast (name); - } - - return String::empty; -} - -//============================================================================== -File File::getLinkedTarget() const -{ - #if BEAST_IOS || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - NSString* dest = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath: beastStringToNS (getFullPathName()) error: nil]; - #else - // (the cast here avoids a deprecation warning) - NSString* dest = [((id) [NSFileManager defaultManager]) pathContentOfSymbolicLinkAtPath: beastStringToNS (getFullPathName())]; - #endif - - if (dest != nil) - return File (nsStringToBeast (dest)); - - return *this; -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - #if BEAST_IOS - return deleteFile(); //xxx is there a trashcan on the iOS? - #else - BEAST_AUTORELEASEPOOL - { - NSString* p = beastStringToNS (getFullPathName()); - - return [[NSWorkspace sharedWorkspace] - performFileOperation: NSWorkspaceRecycleOperation - source: [p stringByDeletingLastPathComponent] - destination: nsEmptyString() - files: [NSArray arrayWithObject: [p lastPathComponent]] - tag: nil ]; - } - #endif -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - enumerator (nil) - { - BEAST_AUTORELEASEPOOL - { - enumerator = [[[NSFileManager defaultManager] enumeratorAtPath: beastStringToNS (directory.getFullPathName())] retain]; - } - } - - ~Pimpl() - { - [enumerator release]; - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - BEAST_AUTORELEASEPOOL - { - const char* wildcardUTF8 = nullptr; - - for (;;) - { - NSString* file; - if (enumerator == nil || (file = [enumerator nextObject]) == nil) - return false; - - [enumerator skipDescendents]; - filenameFound = nsStringToBeast (file); - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, filenameFound.toUTF8(), FNM_CASEFOLD) != 0) - continue; - - const String fullPath (parentDir + filenameFound); - updateStatInfoForFile (fullPath, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != nullptr) - *isHidden = FileHelpers::isHiddenFile (fullPath); - - return true; - } - } - } - -private: - String parentDir, wildCard; - NSDirectoryEnumerator* enumerator; - - BEAST_DECLARE_NON_COPYABLE (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildcard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildcard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -bool Process::openDocument (const String& fileName, const String& parameters) -{ - #if BEAST_IOS - return [[UIApplication sharedApplication] openURL: [NSURL URLWithString: beastStringToNS (fileName)]]; - #else - BEAST_AUTORELEASEPOOL - { - if (parameters.isEmpty()) - { - return [[NSWorkspace sharedWorkspace] openFile: beastStringToNS (fileName)] - || [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: beastStringToNS (fileName)]]; - } - - bool ok = false; - const File file (fileName); - - if (file.isBundle()) - { - NSMutableArray* urls = [NSMutableArray array]; - - StringArray docs; - docs.addTokens (parameters, true); - for (int i = 0; i < docs.size(); ++i) - [urls addObject: beastStringToNS (docs[i])]; - - ok = [[NSWorkspace sharedWorkspace] openURLs: urls - withAppBundleIdentifier: [[NSBundle bundleWithPath: beastStringToNS (fileName)] bundleIdentifier] - options: 0 - additionalEventParamDescriptor: nil - launchIdentifiers: nil]; - } - else if (file.exists()) - { - ok = FileHelpers::launchExecutable ("\"" + fileName + "\" " + parameters); - } - - return ok; - } - #endif -} - -void File::revealToUser() const -{ - #if ! BEAST_IOS - if (exists()) - [[NSWorkspace sharedWorkspace] selectFile: beastStringToNS (getFullPathName()) inFileViewerRootedAtPath: nsEmptyString()]; - else if (getParentDirectory().exists()) - getParentDirectory().revealToUser(); - #endif -} - -//============================================================================== -OSType File::getMacOSType() const -{ - BEAST_AUTORELEASEPOOL - { - #if BEAST_IOS || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - NSDictionary* fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath: beastStringToNS (getFullPathName()) error: nil]; - #else - // (the cast here avoids a deprecation warning) - NSDictionary* fileDict = [((id) [NSFileManager defaultManager]) fileAttributesAtPath: beastStringToNS (getFullPathName()) traverseLink: NO]; - #endif - - return [fileDict fileHFSTypeCode]; - } -} - -bool File::isBundle() const -{ - #if BEAST_IOS - return false; // xxx can't find a sensible way to do this without trying to open the bundle.. - #else - BEAST_AUTORELEASEPOOL - { - return [[NSWorkspace sharedWorkspace] isFilePackageAtPath: beastStringToNS (getFullPathName())]; - } - #endif -} - -#if BEAST_MAC -void File::addToDock() const -{ - // check that it's not already there... - if (! beast_getOutputFromCommand ("defaults read com.apple.dock persistent-apps").containsIgnoreCase (getFullPathName())) - { - beast_runSystemCommand ("defaults write com.apple.dock persistent-apps -array-add \"tile-datafile-data_CFURLString" - + getFullPathName() + "_CFURLStringType0\""); - - beast_runSystemCommand ("osascript -e \"tell application \\\"Dock\\\" to quit\""); - } -} -#endif diff --git a/Subtrees/beast/modules/beast_core/native/beast_mac_Network.mm b/Subtrees/beast/modules/beast_core/native/beast_mac_Network.mm deleted file mode 100644 index 732956180b..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_mac_Network.mm +++ /dev/null @@ -1,427 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void MACAddress::findAllAddresses (Array& result) -{ - ifaddrs* addrs = nullptr; - - if (getifaddrs (&addrs) == 0) - { - for (const ifaddrs* cursor = addrs; cursor != nullptr; cursor = cursor->ifa_next) - { - sockaddr_storage* sto = (sockaddr_storage*) cursor->ifa_addr; - if (sto->ss_family == AF_LINK) - { - const sockaddr_dl* const sadd = (const sockaddr_dl*) cursor->ifa_addr; - - #ifndef IFT_ETHER - #define IFT_ETHER 6 - #endif - - if (sadd->sdl_type == IFT_ETHER) - result.addIfNotAlreadyThere (MACAddress (((const uint8*) sadd->sdl_data) + sadd->sdl_nlen)); - } - } - - freeifaddrs (addrs); - } -} - -//============================================================================== -bool Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - #if BEAST_IOS - //xxx probably need to use MFMailComposeViewController - bassertfalse; - return false; - #else - BEAST_AUTORELEASEPOOL - { - String script; - script << "tell application \"Mail\"\r\n" - "set newMessage to make new outgoing message with properties {subject:\"" - << emailSubject.replace ("\"", "\\\"") - << "\", content:\"" - << bodyText.replace ("\"", "\\\"") - << "\" & return & return}\r\n" - "tell newMessage\r\n" - "set visible to true\r\n" - "set sender to \"sdfsdfsdfewf\"\r\n" - "make new to recipient at end of to recipients with properties {address:\"" - << targetEmailAddress - << "\"}\r\n"; - - for (int i = 0; i < filesToAttach.size(); ++i) - { - script << "tell content\r\n" - "make new attachment with properties {file name:\"" - << filesToAttach[i].replace ("\"", "\\\"") - << "\"} at after the last paragraph\r\n" - "end tell\r\n"; - } - - script << "end tell\r\n" - "end tell\r\n"; - - NSAppleScript* s = [[NSAppleScript alloc] initWithSource: beastStringToNS (script)]; - NSDictionary* error = nil; - const bool ok = [s executeAndReturnError: &error] != nil; - [s release]; - - return ok; - } - #endif -} - -//============================================================================== -class URLConnectionState : public Thread -{ -public: - URLConnectionState (NSURLRequest* req) - : Thread ("http connection"), - contentLength (-1), - delegate (nil), - request ([req retain]), - connection (nil), - data ([[NSMutableData data] retain]), - headers (nil), - initialised (false), - hasFailed (false), - hasFinished (false) - { - static DelegateClass cls; - delegate = [cls.createInstance() init]; - DelegateClass::setState (delegate, this); - } - - ~URLConnectionState() - { - stop(); - [connection release]; - [data release]; - [request release]; - [headers release]; - [delegate release]; - } - - bool start (URL::OpenStreamProgressCallback* callback, void* context) - { - startThread(); - - while (isThreadRunning() && ! initialised) - { - if (callback != nullptr) - callback (context, -1, (int) [[request HTTPBody] length]); - - Thread::sleep (1); - } - - return connection != nil && ! hasFailed; - } - - void stop() - { - [connection cancel]; - stopThread (10000); - } - - int read (char* dest, int numBytes) - { - int numDone = 0; - - while (numBytes > 0) - { - const int available = bmin (numBytes, (int) [data length]); - - if (available > 0) - { - const ScopedLock sl (dataLock); - [data getBytes: dest length: (NSUInteger) available]; - [data replaceBytesInRange: NSMakeRange (0, (NSUInteger) available) withBytes: nil length: 0]; - - numDone += available; - numBytes -= available; - dest += available; - } - else - { - if (hasFailed || hasFinished) - break; - - Thread::sleep (1); - } - } - - return numDone; - } - - void didReceiveResponse (NSURLResponse* response) - { - { - const ScopedLock sl (dataLock); - [data setLength: 0]; - } - - initialised = true; - contentLength = [response expectedContentLength]; - - [headers release]; - headers = nil; - - if ([response isKindOfClass: [NSHTTPURLResponse class]]) - headers = [[((NSHTTPURLResponse*) response) allHeaderFields] retain]; - } - - void didFailWithError (NSError* error) - { - DBG (nsStringToBeast ([error description])); (void) error; - hasFailed = true; - initialised = true; - signalThreadShouldExit(); - } - - void didReceiveData (NSData* newData) - { - const ScopedLock sl (dataLock); - [data appendData: newData]; - initialised = true; - } - - void didSendBodyData (int /*totalBytesWritten*/, int /*totalBytesExpected*/) - { - } - - void finishedLoading() - { - hasFinished = true; - initialised = true; - signalThreadShouldExit(); - } - - void run() - { - connection = [[NSURLConnection alloc] initWithRequest: request - delegate: delegate]; - while (! threadShouldExit()) - { - BEAST_AUTORELEASEPOOL - { - [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; - } - } - } - - int64 contentLength; - CriticalSection dataLock; - NSObject* delegate; - NSURLRequest* request; - NSURLConnection* connection; - NSMutableData* data; - NSDictionary* headers; - bool initialised, hasFailed, hasFinished; - -private: - //============================================================================== - struct DelegateClass : public ObjCClass - { - DelegateClass() : ObjCClass ("BEASTAppDelegate_") - { - addIvar ("state"); - - addMethod (@selector (connection:didReceiveResponse:), didReceiveResponse, "v@:@@"); - addMethod (@selector (connection:didFailWithError:), didFailWithError, "v@:@@"); - addMethod (@selector (connection:didReceiveData:), didReceiveData, "v@:@@"); - addMethod (@selector (connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:totalBytesExpectedToWrite:), - connectionDidSendBodyData, "v@:@iii"); - addMethod (@selector (connectionDidFinishLoading:), connectionDidFinishLoading, "v@:@"); - - registerClass(); - } - - static void setState (id self, URLConnectionState* state) { object_setInstanceVariable (self, "state", state); } - static URLConnectionState* getState (id self) { return getIvar (self, "state"); } - - private: - static void didReceiveResponse (id self, SEL, NSURLConnection*, NSURLResponse* response) - { - getState (self)->didReceiveResponse (response); - } - - static void didFailWithError (id self, SEL, NSURLConnection*, NSError* error) - { - getState (self)->didFailWithError (error); - } - - static void didReceiveData (id self, SEL, NSURLConnection*, NSData* newData) - { - getState (self)->didReceiveData (newData); - } - - static void connectionDidSendBodyData (id self, SEL, NSURLConnection*, NSInteger, NSInteger totalBytesWritten, NSInteger totalBytesExpected) - { - getState (self)->didSendBodyData (totalBytesWritten, totalBytesExpected); - } - - static void connectionDidFinishLoading (id self, SEL, NSURLConnection*) - { - getState (self)->finishedLoading(); - } - }; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (URLConnectionState) -}; - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) - : address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - BEAST_AUTORELEASEPOOL - { - createConnection (progressCallback, progressCallbackContext); - - if (responseHeaders != nullptr && connection != nullptr && connection->headers != nil) - { - NSEnumerator* enumerator = [connection->headers keyEnumerator]; - NSString* key; - - while ((key = [enumerator nextObject]) != nil) - responseHeaders->set (nsStringToBeast (key), - nsStringToBeast ((NSString*) [connection->headers objectForKey: key])); - } - } - } - - //============================================================================== - bool isError() const { return connection == nullptr; } - int64 getTotalLength() { return connection == nullptr ? -1 : connection->contentLength; } - bool isExhausted() { return finished; } - int64 getPosition() { return position; } - - int read (void* buffer, int bytesToRead) - { - bassert (buffer != nullptr && bytesToRead >= 0); - - if (finished || isError()) - return 0; - - BEAST_AUTORELEASEPOOL - { - const int bytesRead = connection->read (static_cast (buffer), bytesToRead); - position += bytesRead; - - if (bytesRead == 0) - finished = true; - - return bytesRead; - } - } - - bool setPosition (int64 wantedPos) - { - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - connection = nullptr; - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - -private: - ScopedPointer connection; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - bassert (connection == nullptr); - - NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: beastStringToNS (address)] - cachePolicy: NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval: timeOutMs <= 0 ? 60.0 : (timeOutMs / 1000.0)]; - - if (req != nil) - { - [req setHTTPMethod: nsStringLiteral (isPost ? "POST" : "GET")]; - //[req setCachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; - - StringArray headerLines; - headerLines.addLines (headers); - headerLines.removeEmptyStrings (true); - - for (int i = 0; i < headerLines.size(); ++i) - { - const String key (headerLines[i].upToFirstOccurrenceOf (":", false, false).trim()); - const String value (headerLines[i].fromFirstOccurrenceOf (":", false, false).trim()); - - if (key.isNotEmpty() && value.isNotEmpty()) - [req addValue: beastStringToNS (value) forHTTPHeaderField: beastStringToNS (key)]; - } - - if (isPost && postData.getSize() > 0) - [req setHTTPBody: [NSData dataWithBytes: postData.getData() - length: postData.getSize()]]; - - connection = new URLConnectionState (req); - - if (! connection->start (progressCallback, progressCallbackContext)) - connection = nullptr; - } - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_mac_Strings.mm b/Subtrees/beast/modules/beast_core/native/beast_mac_Strings.mm deleted file mode 100644 index 4b1cb88678..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_mac_Strings.mm +++ /dev/null @@ -1,91 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -String String::fromCFString (CFStringRef cfString) -{ - if (cfString == 0) - return String::empty; - - CFRange range = { 0, CFStringGetLength (cfString) }; - HeapBlock u ((size_t) range.length + 1); - CFStringGetCharacters (cfString, range, u); - u[range.length] = 0; - - return String (CharPointer_UTF16 ((const CharPointer_UTF16::CharType*) u.getData())); -} - -CFStringRef String::toCFString() const -{ - CharPointer_UTF16 utf16 (toUTF16()); - return CFStringCreateWithCharacters (kCFAllocatorDefault, (const UniChar*) utf16.getAddress(), (CFIndex) utf16.length()); -} - -String String::convertToPrecomposedUnicode() const -{ - #if BEAST_IOS - BEAST_AUTORELEASEPOOL - { - return nsStringToBeast ([beastStringToNS (*this) precomposedStringWithCanonicalMapping]); - } - #else - UnicodeMapping map; - - map.unicodeEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, - kUnicodeNoSubset, - kTextEncodingDefaultFormat); - - map.otherEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, - kUnicodeCanonicalCompVariant, - kTextEncodingDefaultFormat); - - map.mappingVersion = kUnicodeUseLatestMapping; - - UnicodeToTextInfo conversionInfo = 0; - String result; - - if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr) - { - const size_t bytesNeeded = CharPointer_UTF16::getBytesRequiredFor (getCharPointer()); - - HeapBlock tempOut; - tempOut.calloc (bytesNeeded + 4); - - ByteCount bytesRead = 0; - ByteCount outputBufferSize = 0; - - if (ConvertFromUnicodeToText (conversionInfo, - bytesNeeded, (ConstUniCharArrayPtr) toUTF16().getAddress(), - kUnicodeDefaultDirectionMask, - 0, 0, 0, 0, - bytesNeeded, &bytesRead, - &outputBufferSize, tempOut) == noErr) - { - result = String (CharPointer_UTF16 ((CharPointer_UTF16::CharType*) tempOut.getData())); - } - - DisposeUnicodeToTextInfo (&conversionInfo); - } - - return result; - #endif -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_mac_SystemStats.mm b/Subtrees/beast/modules/beast_core/native/beast_mac_SystemStats.mm deleted file mode 100644 index 4834c5fb56..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_mac_SystemStats.mm +++ /dev/null @@ -1,291 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ScopedAutoReleasePool::ScopedAutoReleasePool() -{ - pool = [[NSAutoreleasePool alloc] init]; -} - -ScopedAutoReleasePool::~ScopedAutoReleasePool() -{ - [((NSAutoreleasePool*) pool) release]; -} - -//============================================================================== -void Logger::outputDebugString (const String& text) -{ - // Would prefer to use std::cerr here, but avoiding it for - // the moment, due to clang JIT linkage problems. - fputs (text.toRawUTF8(), stderr); - fputs ("\n", stderr); - fflush (stderr); -} - -//============================================================================== -namespace SystemStatsHelpers -{ - #if BEAST_INTEL && ! BEAST_NO_INLINE_ASM - static void doCPUID (uint32& a, uint32& b, uint32& c, uint32& d, uint32 type) - { - uint32 la = a, lb = b, lc = c, ld = d; - - asm ("mov %%ebx, %%esi \n\t" - "cpuid \n\t" - "xchg %%esi, %%ebx" - : "=a" (la), "=S" (lb), "=c" (lc), "=d" (ld) : "a" (type) - #if BEAST_64BIT - , "b" (lb), "c" (lc), "d" (ld) - #endif - ); - - a = la; b = lb; c = lc; d = ld; - } - #endif -} - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - #if BEAST_INTEL && ! BEAST_NO_INLINE_ASM - uint32 familyModel = 0, extFeatures = 0, features = 0, dummy = 0; - SystemStatsHelpers::doCPUID (familyModel, extFeatures, dummy, features, 1); - - hasMMX = (features & (1u << 23)) != 0; - hasSSE = (features & (1u << 25)) != 0; - hasSSE2 = (features & (1u << 26)) != 0; - has3DNow = (extFeatures & (1u << 31)) != 0; - #else - hasMMX = false; - hasSSE = false; - hasSSE2 = false; - has3DNow = false; - #endif - - #if BEAST_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount]; - #else - numCpus = (int) MPProcessors(); - #endif -} - -#if BEAST_MAC -struct RLimitInitialiser -{ - RLimitInitialiser() - { - rlimit lim; - getrlimit (RLIMIT_NOFILE, &lim); - lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; - setrlimit (RLIMIT_NOFILE, &lim); - } -}; - -static RLimitInitialiser rLimitInitialiser; -#endif - -//============================================================================== -#if ! BEAST_IOS -static String getOSXVersion() -{ - BEAST_AUTORELEASEPOOL - { - NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile: - nsStringLiteral ("/System/Library/CoreServices/SystemVersion.plist")]; - - return nsStringToBeast ([dict objectForKey: nsStringLiteral ("ProductVersion")]); - } -} -#endif - -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - #if BEAST_IOS - return iOS; - #else - StringArray parts; - parts.addTokens (getOSXVersion(), ".", String::empty); - - bassert (parts[0].getIntValue() == 10); - const int major = parts[1].getIntValue(); - bassert (major > 2); - - return (OperatingSystemType) (major + MacOSX_10_4 - 4); - #endif -} - -String SystemStats::getOperatingSystemName() -{ - #if BEAST_IOS - return "iOS " + nsStringToBeast ([[UIDevice currentDevice] systemVersion]); - #else - return "Mac OSX " + getOSXVersion(); - #endif -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if BEAST_IOS - return false; - #elif BEAST_64BIT - return true; - #else - return getOperatingSystemType() >= MacOSX_10_6; - #endif -} - -int SystemStats::getMemorySizeInMegabytes() -{ - uint64 mem = 0; - size_t memSize = sizeof (mem); - int mib[] = { CTL_HW, HW_MEMSIZE }; - sysctl (mib, 2, &mem, &memSize, 0, 0); - return (int) (mem / (1024 * 1024)); -} - -String SystemStats::getCpuVendor() -{ - #if BEAST_INTEL && ! BEAST_NO_INLINE_ASM - uint32 dummy = 0; - uint32 vendor[4] = { 0 }; - - SystemStatsHelpers::doCPUID (dummy, vendor[0], vendor[2], vendor[1], 0); - - return String (reinterpret_cast (vendor), 12); - #else - return String::empty; - #endif -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - uint64 speedHz = 0; - size_t speedSize = sizeof (speedHz); - int mib[] = { CTL_HW, HW_CPU_FREQ }; - sysctl (mib, 2, &speedHz, &speedSize, 0, 0); - - #if BEAST_BIG_ENDIAN - if (speedSize == 4) - speedHz >>= 32; - #endif - - return (int) (speedHz / 1000000); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - return nsStringToBeast (NSUserName()); -} - -String SystemStats::getFullUserName() -{ - return nsStringToBeast (NSFullUserName()); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return String (name).upToLastOccurrenceOf (".local", false, true); - - return String::empty; -} - -static String getLocaleValue (CFStringRef key) -{ - CFLocaleRef cfLocale = CFLocaleCopyCurrent(); - const String result (String::fromCFString ((CFStringRef) CFLocaleGetValue (cfLocale, key))); - CFRelease (cfLocale); - return result; -} - -String SystemStats::getUserLanguage() { return getLocaleValue (kCFLocaleLanguageCode); } -String SystemStats::getUserRegion() { return getLocaleValue (kCFLocaleCountryCode); } - -String SystemStats::getDisplayLanguage() -{ - CFArrayRef cfPrefLangs = CFLocaleCopyPreferredLanguages(); - const String result (String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (cfPrefLangs, 0))); - CFRelease (cfPrefLangs); - return result; -} - -//============================================================================== -class HiResCounterHandler -{ -public: - HiResCounterHandler() - { - mach_timebase_info_data_t timebase; - (void) mach_timebase_info (&timebase); - - if (timebase.numer % 1000000 == 0) - { - numerator = timebase.numer / 1000000; - denominator = timebase.denom; - } - else - { - numerator = timebase.numer; - denominator = timebase.denom * (uint64) 1000000; - } - - highResTimerFrequency = (timebase.denom * (uint64) 1000000000) / timebase.numer; - highResTimerToMillisecRatio = numerator / (double) denominator; - } - - inline uint32 millisecondsSinceStartup() const noexcept - { - return (uint32) ((mach_absolute_time() * numerator) / denominator); - } - - inline double getMillisecondCounterHiRes() const noexcept - { - return mach_absolute_time() * highResTimerToMillisecRatio; - } - - int64 highResTimerFrequency; - -private: - uint64 numerator, denominator; - double highResTimerToMillisecRatio; -}; - -static HiResCounterHandler hiResCounterHandler; - -uint32 beast_millisecondsSinceStartup() noexcept { return hiResCounterHandler.millisecondsSinceStartup(); } -double Time::getMillisecondCounterHiRes() noexcept { return hiResCounterHandler.getMillisecondCounterHiRes(); } -int64 Time::getHighResolutionTicksPerSecond() noexcept { return hiResCounterHandler.highResTimerFrequency; } -int64 Time::getHighResolutionTicks() noexcept { return (int64) mach_absolute_time(); } - -bool Time::setSystemTimeToThisTime() const -{ - bassertfalse; - return false; -} - -//============================================================================== -int SystemStats::getPageSize() -{ - return (int) NSPageSize(); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_mac_Threads.mm b/Subtrees/beast/modules/beast_core/native/beast_mac_Threads.mm deleted file mode 100644 index 17f7a382ba..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_mac_Threads.mm +++ /dev/null @@ -1,86 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in beast_posix_SharedCode.h! -*/ - -//============================================================================== -bool Process::isForegroundProcess() -{ - #if BEAST_MAC - return [NSApp isActive]; - #else - return true; // xxx change this if more than one app is ever possible on iOS! - #endif -} - -void Process::makeForegroundProcess() -{ - #if BEAST_MAC - [NSApp activateIgnoringOtherApps: YES]; - #endif -} - -void Process::raisePrivilege() -{ - bassertfalse; -} - -void Process::lowerPrivilege() -{ - bassertfalse; -} - -void Process::terminate() -{ - exit (0); -} - -void Process::setPriority (ProcessPriority) -{ - // xxx -} - -//============================================================================== -BEAST_API bool BEAST_CALLTYPE beast_isRunningUnderDebugger() -{ - static char testResult = 0; - - if (testResult == 0) - { - struct kinfo_proc info; - int m[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() }; - size_t sz = sizeof (info); - sysctl (m, 4, &info, &sz, 0, 0); - testResult = ((info.kp_proc.p_flag & P_TRACED) != 0) ? 1 : -1; - } - - return testResult > 0; -} - -BEAST_API bool BEAST_CALLTYPE Process::isRunningUnderDebugger() -{ - return beast_isRunningUnderDebugger(); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_osx_ObjCHelpers.h b/Subtrees/beast/modules/beast_core/native/beast_osx_ObjCHelpers.h deleted file mode 100644 index d565e9d845..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_osx_ObjCHelpers.h +++ /dev/null @@ -1,153 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_OSX_OBJCHELPERS_BEASTHEADER -#define BEAST_OSX_OBJCHELPERS_BEASTHEADER - - -/* This file contains a few helper functions that are used internally but which - need to be kept away from the public headers because they use obj-C symbols. -*/ -namespace -{ - //============================================================================== - static inline String nsStringToBeast (NSString* s) - { - return CharPointer_UTF8 ([s UTF8String]); - } - - static inline NSString* beastStringToNS (const String& s) - { - return [NSString stringWithUTF8String: s.toUTF8()]; - } - - static inline NSString* nsStringLiteral (const char* const s) noexcept - { - return [NSString stringWithUTF8String: s]; - } - - static inline NSString* nsEmptyString() noexcept - { - return [NSString string]; - } -} - -//============================================================================== -template -struct NSObjectRetainer -{ - inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; } - inline ~NSObjectRetainer() { [object release]; } - - ObjectType* object; -}; - -//============================================================================== -template -struct ObjCClass -{ - ObjCClass (const char* nameRoot) - : cls (objc_allocateClassPair ([SuperclassType class], getRandomisedName (nameRoot).toUTF8(), 0)) - { - } - - ~ObjCClass() - { - objc_disposeClassPair (cls); - } - - void registerClass() - { - objc_registerClassPair (cls); - } - - SuperclassType* createInstance() const - { - return class_createInstance (cls, 0); - } - - template - void addIvar (const char* name) - { - BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type)); - bassert (b); (void) b; - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* signature) - { - BOOL b = class_addMethod (cls, selector, (IMP) callbackFn, signature); - bassert (b); (void) b; - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2) - { - addMethod (selector, callbackFn, (String (sig1) + sig2).toUTF8()); - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2, const char* sig3) - { - addMethod (selector, callbackFn, (String (sig1) + sig2 + sig3).toUTF8()); - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2, const char* sig3, const char* sig4) - { - addMethod (selector, callbackFn, (String (sig1) + sig2 + sig3 + sig4).toUTF8()); - } - - void addProtocol (Protocol* protocol) - { - BOOL b = class_addProtocol (cls, protocol); - bassert (b); (void) b; - } - - static id sendSuperclassMessage (id self, SEL selector) - { - objc_super s = { self, [SuperclassType class] }; - return objc_msgSendSuper (&s, selector); - } - - template - static Type getIvar (id self, const char* name) - { - void* v = nullptr; - object_getInstanceVariable (self, name, &v); - return static_cast (v); - } - - Class cls; - -private: - static String getRandomisedName (const char* root) - { - return root + String::toHexString (beast::Random::getSystemRandom().nextInt64()); - } - - BEAST_DECLARE_NON_COPYABLE (ObjCClass) -}; - - -#endif // BEAST_OSX_OBJCHELPERS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/native/beast_posix_NamedPipe.cpp b/Subtrees/beast/modules/beast_core/native/beast_posix_NamedPipe.cpp deleted file mode 100644 index ed5a6b1f0a..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_posix_NamedPipe.cpp +++ /dev/null @@ -1,214 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& pipePath, bool createPipe) - : pipeInName (pipePath + "_in"), - pipeOutName (pipePath + "_out"), - pipeIn (-1), pipeOut (-1), - createdPipe (createPipe), - stopReadOperation (false) - { - signal (SIGPIPE, signalHandler); - siginterrupt (SIGPIPE, 1); - } - - ~Pimpl() - { - if (pipeIn != -1) ::close (pipeIn); - if (pipeOut != -1) ::close (pipeOut); - - if (createdPipe) - { - unlink (pipeInName.toUTF8()); - unlink (pipeOutName.toUTF8()); - } - } - - int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds) - { - const uint32 timeoutEnd = getTimeoutEnd (timeOutMilliseconds); - - if (pipeIn == -1) - { - pipeIn = openPipe (createdPipe ? pipeInName : pipeOutName, O_RDWR | O_NONBLOCK, timeoutEnd); - - if (pipeIn == -1) - return -1; - } - - int bytesRead = 0; - - while (bytesRead < maxBytesToRead) - { - const int bytesThisTime = maxBytesToRead - bytesRead; - const int numRead = (int) ::read (pipeIn, destBuffer, (size_t) bytesThisTime); - - if (numRead <= 0) - { - if (errno != EWOULDBLOCK || stopReadOperation || hasExpired (timeoutEnd)) - return -1; - - const int maxWaitingTime = 30; - waitForInput (pipeIn, timeoutEnd == 0 ? maxWaitingTime - : bmin (maxWaitingTime, - (int) (timeoutEnd - Time::getMillisecondCounter()))); - continue; - } - - bytesRead += numRead; - destBuffer += numRead; - } - - return bytesRead; - } - - int write (const char* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) - { - const uint32 timeoutEnd = getTimeoutEnd (timeOutMilliseconds); - - if (pipeOut == -1) - { - pipeOut = openPipe (createdPipe ? pipeOutName : pipeInName, O_WRONLY, timeoutEnd); - - if (pipeOut == -1) - return -1; - } - - int bytesWritten = 0; - - while (bytesWritten < numBytesToWrite && ! hasExpired (timeoutEnd)) - { - const int bytesThisTime = numBytesToWrite - bytesWritten; - const int numWritten = (int) ::write (pipeOut, sourceBuffer, (size_t) bytesThisTime); - - if (numWritten <= 0) - return -1; - - bytesWritten += numWritten; - sourceBuffer += numWritten; - } - - return bytesWritten; - } - - bool createFifos() const - { - return (mkfifo (pipeInName .toUTF8(), 0666) == 0 || errno == EEXIST) - && (mkfifo (pipeOutName.toUTF8(), 0666) == 0 || errno == EEXIST); - } - - const String pipeInName, pipeOutName; - int pipeIn, pipeOut; - - const bool createdPipe; - bool stopReadOperation; - -private: - static void signalHandler (int) {} - - static uint32 getTimeoutEnd (const int timeOutMilliseconds) - { - return timeOutMilliseconds >= 0 ? Time::getMillisecondCounter() + (uint32) timeOutMilliseconds : 0; - } - - static bool hasExpired (const uint32 timeoutEnd) - { - return timeoutEnd != 0 && Time::getMillisecondCounter() >= timeoutEnd; - } - - int openPipe (const String& name, int flags, const uint32 timeoutEnd) - { - for (;;) - { - const int p = ::open (name.toUTF8(), flags); - - if (p != -1 || hasExpired (timeoutEnd) || stopReadOperation) - return p; - - Thread::sleep (2); - } - } - - static void waitForInput (const int handle, const int timeoutMsecs) noexcept - { - struct timeval timeout; - timeout.tv_sec = timeoutMsecs / 1000; - timeout.tv_usec = (timeoutMsecs % 1000) * 1000; - - fd_set rset; - FD_ZERO (&rset); - FD_SET (handle, &rset); - - select (handle + 1, &rset, nullptr, 0, &timeout); - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -void NamedPipe::close() -{ - if (pimpl != nullptr) - { - pimpl->stopReadOperation = true; - - char buffer[1] = { 0 }; - ssize_t done = ::write (pimpl->pipeIn, buffer, 1); - (void) done; - - ScopedWriteLock sl (lock); - pimpl = nullptr; - } -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - #if BEAST_IOS - pimpl = new Pimpl (File::getSpecialLocation (File::tempDirectory) - .getChildFile (File::createLegalFileName (pipeName)).getFullPathName(), createPipe); - #else - pimpl = new Pimpl ("/tmp/" + File::createLegalFileName (pipeName), createPipe); - #endif - - if (createPipe && ! pimpl->createFifos()) - { - pimpl = nullptr; - return false; - } - - return true; -} - -int NamedPipe::read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->read (static_cast (destBuffer), maxBytesToRead, timeOutMilliseconds) : -1; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->write (static_cast (sourceBuffer), numBytesToWrite, timeOutMilliseconds) : -1; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_posix_SharedCode.h b/Subtrees/beast/modules/beast_core/native/beast_posix_SharedCode.h deleted file mode 100644 index 41051e2bf3..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_posix_SharedCode.h +++ /dev/null @@ -1,1256 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -CriticalSection::CriticalSection() noexcept -{ - pthread_mutexattr_t atts; - pthread_mutexattr_init (&atts); - pthread_mutexattr_settype (&atts, PTHREAD_MUTEX_RECURSIVE); - #if ! BEAST_ANDROID - pthread_mutexattr_setprotocol (&atts, PTHREAD_PRIO_INHERIT); - #endif - pthread_mutex_init (&internal, &atts); -} - -CriticalSection::~CriticalSection() noexcept -{ - pthread_mutex_destroy (&internal); -} - -void CriticalSection::enter() const noexcept -{ - pthread_mutex_lock (&internal); -} - -bool CriticalSection::tryEnter() const noexcept -{ - return pthread_mutex_trylock (&internal) == 0; -} - -void CriticalSection::exit() const noexcept -{ - pthread_mutex_unlock (&internal); -} - - -//============================================================================== -WaitableEvent::WaitableEvent (const bool useManualReset) noexcept - : triggered (false), manualReset (useManualReset) -{ - pthread_cond_init (&condition, 0); - - pthread_mutexattr_t atts; - pthread_mutexattr_init (&atts); - #if ! BEAST_ANDROID - pthread_mutexattr_setprotocol (&atts, PTHREAD_PRIO_INHERIT); - #endif - pthread_mutex_init (&mutex, &atts); -} - -WaitableEvent::~WaitableEvent() noexcept -{ - pthread_cond_destroy (&condition); - pthread_mutex_destroy (&mutex); -} - -bool WaitableEvent::wait (const int timeOutMillisecs) const noexcept -{ - pthread_mutex_lock (&mutex); - - if (! triggered) - { - if (timeOutMillisecs < 0) - { - do - { - pthread_cond_wait (&condition, &mutex); - } - while (! triggered); - } - else - { - struct timeval now; - gettimeofday (&now, 0); - - struct timespec time; - time.tv_sec = now.tv_sec + (timeOutMillisecs / 1000); - time.tv_nsec = (now.tv_usec + ((timeOutMillisecs % 1000) * 1000)) * 1000; - - if (time.tv_nsec >= 1000000000) - { - time.tv_nsec -= 1000000000; - time.tv_sec++; - } - - do - { - if (pthread_cond_timedwait (&condition, &mutex, &time) == ETIMEDOUT) - { - pthread_mutex_unlock (&mutex); - return false; - } - } - while (! triggered); - } - } - - if (! manualReset) - triggered = false; - - pthread_mutex_unlock (&mutex); - return true; -} - -void WaitableEvent::signal() const noexcept -{ - pthread_mutex_lock (&mutex); - triggered = true; - pthread_cond_broadcast (&condition); - pthread_mutex_unlock (&mutex); -} - -void WaitableEvent::reset() const noexcept -{ - pthread_mutex_lock (&mutex); - triggered = false; - pthread_mutex_unlock (&mutex); -} - -//============================================================================== -void BEAST_CALLTYPE Thread::sleep (int millisecs) -{ - struct timespec time; - time.tv_sec = millisecs / 1000; - time.tv_nsec = (millisecs % 1000) * 1000000; - nanosleep (&time, nullptr); -} - - -//============================================================================== -const beast_wchar File::separator = '/'; -const String File::separatorString ("/"); - -//============================================================================== -File File::getCurrentWorkingDirectory() -{ - HeapBlock heapBuffer; - - char localBuffer [1024]; - char* cwd = getcwd (localBuffer, sizeof (localBuffer) - 1); - size_t bufferSize = 4096; - - while (cwd == nullptr && errno == ERANGE) - { - heapBuffer.malloc (bufferSize); - cwd = getcwd (heapBuffer, bufferSize - 1); - bufferSize += 1024; - } - - return File (CharPointer_UTF8 (cwd)); -} - -bool File::setAsCurrentWorkingDirectory() const -{ - return chdir (getFullPathName().toUTF8()) == 0; -} - -//============================================================================== -namespace -{ - #if BEAST_LINUX || \ - (BEAST_IOS && ! __DARWIN_ONLY_64_BIT_INO_T) // (this iOS stuff is to avoid a simulator bug) - typedef struct stat64 beast_statStruct; - #define BEAST_STAT stat64 - #else - typedef struct stat beast_statStruct; - #define BEAST_STAT stat - #endif - - bool beast_stat (const String& fileName, beast_statStruct& info) - { - return fileName.isNotEmpty() - && BEAST_STAT (fileName.toUTF8(), &info) == 0; - } - - // if this file doesn't exist, find a parent of it that does.. - bool beast_doStatFS (File f, struct statfs& result) - { - for (int i = 5; --i >= 0;) - { - if (f.exists()) - break; - - f = f.getParentDirectory(); - } - - return statfs (f.getFullPathName().toUTF8(), &result) == 0; - } - - void updateStatInfoForFile (const String& path, bool* const isDir, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - if (isDir != nullptr || fileSize != nullptr || modTime != nullptr || creationTime != nullptr) - { - beast_statStruct info; - const bool statOk = beast_stat (path, info); - - if (isDir != nullptr) *isDir = statOk && ((info.st_mode & S_IFDIR) != 0); - if (fileSize != nullptr) *fileSize = statOk ? info.st_size : 0; - if (modTime != nullptr) *modTime = Time (statOk ? (int64) info.st_mtime * 1000 : 0); - if (creationTime != nullptr) *creationTime = Time (statOk ? (int64) info.st_ctime * 1000 : 0); - } - - if (isReadOnly != nullptr) - *isReadOnly = access (path.toUTF8(), W_OK) != 0; - } - - Result getResultForErrno() - { - return Result::fail (String (strerror (errno))); - } - - Result getResultForReturnValue (int value) - { - return value == -1 ? getResultForErrno() : Result::ok(); - } - - int getFD (void* handle) noexcept { return (int) (pointer_sized_int) handle; } - void* fdToVoidPointer (int fd) noexcept { return (void*) (pointer_sized_int) fd; } -} - -bool File::isDirectory() const -{ - beast_statStruct info; - - return fullPath.isEmpty() - || (beast_stat (fullPath, info) && ((info.st_mode & S_IFDIR) != 0)); -} - -bool File::exists() const -{ - return fullPath.isNotEmpty() - && access (fullPath.toUTF8(), F_OK) == 0; -} - -bool File::existsAsFile() const -{ - return exists() && ! isDirectory(); -} - -int64 File::getSize() const -{ - beast_statStruct info; - return beast_stat (fullPath, info) ? info.st_size : 0; -} - -//============================================================================== -bool File::hasWriteAccess() const -{ - if (exists()) - return access (fullPath.toUTF8(), W_OK) == 0; - - if ((! isDirectory()) && fullPath.containsChar (separator)) - return getParentDirectory().hasWriteAccess(); - - return false; -} - -bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const -{ - beast_statStruct info; - if (! beast_stat (fullPath, info)) - return false; - - info.st_mode &= 0777; // Just permissions - - if (shouldBeReadOnly) - info.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); - else - // Give everybody write permission? - info.st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; - - return chmod (fullPath.toUTF8(), info.st_mode) == 0; -} - -void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const -{ - modificationTime = 0; - accessTime = 0; - creationTime = 0; - - beast_statStruct info; - if (beast_stat (fullPath, info)) - { - modificationTime = (int64) info.st_mtime * 1000; - accessTime = (int64) info.st_atime * 1000; - creationTime = (int64) info.st_ctime * 1000; - } -} - -bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64 /*creationTime*/) const -{ - beast_statStruct info; - - if ((modificationTime != 0 || accessTime != 0) && beast_stat (fullPath, info)) - { - struct utimbuf times; - times.actime = accessTime != 0 ? (time_t) (accessTime / 1000) : info.st_atime; - times.modtime = modificationTime != 0 ? (time_t) (modificationTime / 1000) : info.st_mtime; - - return utime (fullPath.toUTF8(), ×) == 0; - } - - return false; -} - -bool File::deleteFile() const -{ - if (! exists()) - return true; - - if (isDirectory()) - return rmdir (fullPath.toUTF8()) == 0; - - return remove (fullPath.toUTF8()) == 0; -} - -bool File::moveInternal (const File& dest) const -{ - if (rename (fullPath.toUTF8(), dest.getFullPathName().toUTF8()) == 0) - return true; - - if (hasWriteAccess() && copyInternal (dest)) - { - if (deleteFile()) - return true; - - dest.deleteFile(); - } - - return false; -} - -Result File::createDirectoryInternal (const String& fileName) const -{ - return getResultForReturnValue (mkdir (fileName.toUTF8(), 0777)); -} - -//===================================================================== -int64 beast_fileSetPosition (void* handle, int64 pos) -{ - if (handle != 0 && lseek (getFD (handle), pos, SEEK_SET) == pos) - return pos; - - return -1; -} - -void FileInputStream::openHandle() -{ - const int f = open (file.getFullPathName().toUTF8(), O_RDONLY, 00644); - - if (f != -1) - fileHandle = fdToVoidPointer (f); - else - status = getResultForErrno(); -} - -void FileInputStream::closeHandle() -{ - if (fileHandle != 0) - { - close (getFD (fileHandle)); - fileHandle = 0; - } -} - -size_t FileInputStream::readInternal (void* const buffer, const size_t numBytes) -{ - ssize_t result = 0; - - if (fileHandle != 0) - { - result = ::read (getFD (fileHandle), buffer, numBytes); - - if (result < 0) - { - status = getResultForErrno(); - result = 0; - } - } - - return (size_t) result; -} - -//============================================================================== -void FileOutputStream::openHandle() -{ - if (file.exists()) - { - const int f = open (file.getFullPathName().toUTF8(), O_RDWR, 00644); - - if (f != -1) - { - currentPosition = lseek (f, 0, SEEK_END); - - if (currentPosition >= 0) - { - fileHandle = fdToVoidPointer (f); - } - else - { - status = getResultForErrno(); - close (f); - } - } - else - { - status = getResultForErrno(); - } - } - else - { - const int f = open (file.getFullPathName().toUTF8(), O_RDWR + O_CREAT, 00644); - - if (f != -1) - fileHandle = fdToVoidPointer (f); - else - status = getResultForErrno(); - } -} - -void FileOutputStream::closeHandle() -{ - if (fileHandle != 0) - { - close (getFD (fileHandle)); - fileHandle = 0; - } -} - -ssize_t FileOutputStream::writeInternal (const void* const data, const size_t numBytes) -{ - ssize_t result = 0; - - if (fileHandle != 0) - { - result = ::write (getFD (fileHandle), data, numBytes); - - if (result == -1) - status = getResultForErrno(); - } - - return result; -} - -void FileOutputStream::flushInternal() -{ - if (fileHandle != 0) - { - if (fsync (getFD (fileHandle)) == -1) - status = getResultForErrno(); - - #if BEAST_ANDROID - // This stuff tells the OS to asynchronously update the metadata - // that the OS has cached aboud the file - this metadata is used - // when the device is acting as a USB drive, and unless it's explicitly - // refreshed, it'll get out of step with the real file. - const LocalRef t (javaString (file.getFullPathName())); - android.activity.callVoidMethod (BeastAppActivity.scanFile, t.get()); - #endif - } -} - -Result FileOutputStream::truncate() -{ - if (fileHandle == 0) - return status; - - flush(); - return getResultForReturnValue (ftruncate (getFD (fileHandle), (off_t) currentPosition)); -} - -//============================================================================== -String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue) -{ - if (const char* s = ::getenv (name.toUTF8())) - return String::fromUTF8 (s); - - return defaultValue; -} - -//============================================================================== -void MemoryMappedFile::openInternal (const File& file, AccessMode mode) -{ - bassert (mode == readOnly || mode == readWrite); - - if (range.getStart() > 0) - { - const long pageSize = sysconf (_SC_PAGE_SIZE); - range.setStart (range.getStart() - (range.getStart() % pageSize)); - } - - fileHandle = open (file.getFullPathName().toUTF8(), - mode == readWrite ? (O_CREAT + O_RDWR) : O_RDONLY, 00644); - - if (fileHandle != -1) - { - void* m = mmap (0, (size_t) range.getLength(), - mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ, - MAP_SHARED, fileHandle, - (off_t) range.getStart()); - - if (m != MAP_FAILED) - { - address = m; - madvise (m, (size_t) range.getLength(), MADV_SEQUENTIAL); - } - else - { - range = Range(); - } - } -} - -MemoryMappedFile::~MemoryMappedFile() -{ - if (address != nullptr) - munmap (address, (size_t) range.getLength()); - - if (fileHandle != 0) - close (fileHandle); -} - -//============================================================================== -#if BEAST_PROBEASTR_LIVE_BUILD -extern "C" const char* beast_getCurrentExecutablePath(); -#endif - -File beast_getExecutableFile(); -File beast_getExecutableFile() -{ - #if BEAST_PROBEASTR_LIVE_BUILD - return File (beast_getCurrentExecutablePath()); - #elif BEAST_ANDROID - return File (android.appFile); - #else - struct DLAddrReader - { - static String getFilename() - { - Dl_info exeInfo; - dladdr ((void*) beast_getExecutableFile, &exeInfo); - return CharPointer_UTF8 (exeInfo.dli_fname); - } - }; - - static String filename (DLAddrReader::getFilename()); - return File::getCurrentWorkingDirectory().getChildFile (filename); - #endif -} - -//============================================================================== -int64 File::getBytesFreeOnVolume() const -{ - struct statfs buf; - if (beast_doStatFS (*this, buf)) - return (int64) buf.f_bsize * (int64) buf.f_bavail; // Note: this returns space available to non-super user - - return 0; -} - -int64 File::getVolumeTotalSize() const -{ - struct statfs buf; - if (beast_doStatFS (*this, buf)) - return (int64) buf.f_bsize * (int64) buf.f_blocks; - - return 0; -} - -String File::getVolumeLabel() const -{ - #if BEAST_MAC - struct VolAttrBuf - { - u_int32_t length; - attrreference_t mountPointRef; - char mountPointSpace [MAXPATHLEN]; - } attrBuf; - - struct attrlist attrList; - zerostruct (attrList); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - attrList.bitmapcount = ATTR_BIT_MAP_COUNT; - attrList.volattr = ATTR_VOL_INFO | ATTR_VOL_NAME; - - File f (*this); - - for (;;) - { - if (getattrlist (f.getFullPathName().toUTF8(), &attrList, &attrBuf, sizeof (attrBuf), 0) == 0) - return String::fromUTF8 (((const char*) &attrBuf.mountPointRef) + attrBuf.mountPointRef.attr_dataoffset, - (int) attrBuf.mountPointRef.attr_length); - - const File parent (f.getParentDirectory()); - - if (f == parent) - break; - - f = parent; - } - #endif - - return String::empty; -} - -int File::getVolumeSerialNumber() const -{ - int result = 0; -/* int fd = open (getFullPathName().toUTF8(), O_RDONLY | O_NONBLOCK); - - char info [512]; - - #ifndef HDIO_GET_IDENTITY - #define HDIO_GET_IDENTITY 0x030d - #endif - - if (ioctl (fd, HDIO_GET_IDENTITY, info) == 0) - { - DBG (String (info + 20, 20)); - result = String (info + 20, 20).trim().getIntValue(); - } - - close (fd);*/ - return result; -} - -//============================================================================== -void beast_runSystemCommand (const String&); -void beast_runSystemCommand (const String& command) -{ - int result = system (command.toUTF8()); - (void) result; -} - -String beast_getOutputFromCommand (const String&); -String beast_getOutputFromCommand (const String& command) -{ - // slight bodge here, as we just pipe the output into a temp file and read it... - const File tempFile (File::getSpecialLocation (File::tempDirectory) - .getNonexistentChildFile (String::toHexString (Random::getSystemRandom().nextInt()), ".tmp", false)); - - beast_runSystemCommand (command + " > " + tempFile.getFullPathName()); - - String result (tempFile.loadFileAsString()); - tempFile.deleteFile(); - return result; -} - - -//============================================================================== -#if BEAST_IOS -class InterProcessLock::Pimpl -{ -public: - Pimpl (const String&, int) - : handle (1), refCount (1) // On iOS just fake success.. - { - } - - int handle, refCount; -}; - -#else - -class InterProcessLock::Pimpl -{ -public: - Pimpl (const String& lockName, const int timeOutMillisecs) - : handle (0), refCount (1) - { - #if BEAST_MAC - if (! createLockFile (File ("~/Library/Caches/com.beast.locks").getChildFile (lockName), timeOutMillisecs)) - // Fallback if the user's home folder is on a network drive with no ability to lock.. - createLockFile (File ("/tmp/com.beast.locks").getChildFile (lockName), timeOutMillisecs); - - #else - File tempFolder ("/var/tmp"); - if (! tempFolder.isDirectory()) - tempFolder = "/tmp"; - - createLockFile (tempFolder.getChildFile (lockName), timeOutMillisecs); - #endif - } - - ~Pimpl() - { - closeFile(); - } - - bool createLockFile (const File& file, const int timeOutMillisecs) - { - file.create(); - handle = open (file.getFullPathName().toUTF8(), O_RDWR); - - if (handle != 0) - { - struct flock fl; - zerostruct (fl); - - fl.l_whence = SEEK_SET; - fl.l_type = F_WRLCK; - - const int64 endTime = Time::currentTimeMillis() + timeOutMillisecs; - - for (;;) - { - const int result = fcntl (handle, F_SETLK, &fl); - - if (result >= 0) - return true; - - const int error = errno; - - if (error != EINTR) - { - if (error == EBADF || error == ENOTSUP) - return false; - - if (timeOutMillisecs == 0 - || (timeOutMillisecs > 0 && Time::currentTimeMillis() >= endTime)) - break; - - Thread::sleep (10); - } - } - } - - closeFile(); - return true; // only false if there's a file system error. Failure to lock still returns true. - } - - void closeFile() - { - if (handle != 0) - { - struct flock fl; - zerostruct (fl); - - fl.l_whence = SEEK_SET; - fl.l_type = F_UNLCK; - - while (! (fcntl (handle, F_SETLKW, &fl) >= 0 || errno != EINTR)) - {} - - close (handle); - handle = 0; - } - } - - int handle, refCount; -}; -#endif - -InterProcessLock::InterProcessLock (const String& nm) : name (nm) -{ -} - -InterProcessLock::~InterProcessLock() -{ -} - -bool InterProcessLock::enter (const int timeOutMillisecs) -{ - const ScopedLock sl (lock); - - if (pimpl == nullptr) - { - pimpl = new Pimpl (name, timeOutMillisecs); - - if (pimpl->handle == 0) - pimpl = nullptr; - } - else - { - pimpl->refCount++; - } - - return pimpl != nullptr; -} - -void InterProcessLock::exit() -{ - const ScopedLock sl (lock); - - // Trying to release the lock too many times! - bassert (pimpl != nullptr); - - if (pimpl != nullptr && --(pimpl->refCount) == 0) - pimpl = nullptr; -} - -//============================================================================== -void BEAST_API beast_threadEntryPoint (void*); - -extern "C" void* threadEntryProc (void*); -extern "C" void* threadEntryProc (void* userData) -{ - BEAST_AUTORELEASEPOOL - { - #if BEAST_ANDROID - struct AndroidThreadScope - { - AndroidThreadScope() { threadLocalJNIEnvHolder.attach(); } - ~AndroidThreadScope() { threadLocalJNIEnvHolder.detach(); } - }; - - const AndroidThreadScope androidEnv; - #endif - - beast_threadEntryPoint (userData); - } - - return nullptr; -} - -void Thread::launchThread() -{ - threadHandle = 0; - pthread_t handle = 0; - - if (pthread_create (&handle, 0, threadEntryProc, this) == 0) - { - pthread_detach (handle); - threadHandle = (void*) handle; - threadId = (ThreadID) threadHandle; - } -} - -void Thread::closeThreadHandle() -{ - threadId = 0; - threadHandle = 0; -} - -void Thread::killThread() -{ - if (threadHandle != 0) - { - #if BEAST_ANDROID - bassertfalse; // pthread_cancel not available! - #else - pthread_cancel ((pthread_t) threadHandle); - #endif - } -} - -void Thread::setCurrentThreadName (const String& name) -{ - #if BEAST_IOS || (BEAST_MAC && defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - BEAST_AUTORELEASEPOOL - { - [[NSThread currentThread] setName: beastStringToNS (name)]; - } - #elif BEAST_LINUX && (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2012 - pthread_setname_np (pthread_self(), name.toRawUTF8()); - #endif -} - -bool Thread::setThreadPriority (void* handle, int priority) -{ - struct sched_param param; - int policy; - priority = blimit (0, 10, priority); - - if (handle == nullptr) - handle = (void*) pthread_self(); - - if (pthread_getschedparam ((pthread_t) handle, &policy, ¶m) != 0) - return false; - - policy = priority == 0 ? SCHED_OTHER : SCHED_RR; - - const int minPriority = sched_get_priority_min (policy); - const int maxPriority = sched_get_priority_max (policy); - - param.sched_priority = ((maxPriority - minPriority) * priority) / 10 + minPriority; - return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; -} - -Thread::ThreadID Thread::getCurrentThreadId() -{ - return (ThreadID) pthread_self(); -} - -void Thread::yield() -{ - sched_yield(); -} - -//============================================================================== -/* Remove this macro if you're having problems compiling the cpu affinity - calls (the API for these has changed about quite a bit in various Linux - versions, and a lot of distros seem to ship with obsolete versions) -*/ -#if defined (CPU_ISSET) && ! defined (SUPPORT_AFFINITIES) - #define SUPPORT_AFFINITIES 1 -#endif - -void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) -{ - #if SUPPORT_AFFINITIES - cpu_set_t affinity; - CPU_ZERO (&affinity); - - for (int i = 0; i < 32; ++i) - if ((affinityMask & (1 << i)) != 0) - CPU_SET (i, &affinity); - - /* - N.B. If this line causes a compile error, then you've probably not got the latest - version of glibc installed. - - If you don't want to update your copy of glibc and don't care about cpu affinities, - then you can just disable all this stuff by setting the SUPPORT_AFFINITIES macro to 0. - */ - sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinity); - sched_yield(); - - #else - /* affinities aren't supported because either the appropriate header files weren't found, - or the SUPPORT_AFFINITIES macro was turned off - */ - bassertfalse; - (void) affinityMask; - #endif -} - -//============================================================================== -bool DynamicLibrary::open (const String& name) -{ - close(); - handle = dlopen (name.isEmpty() ? nullptr : name.toUTF8().getAddress(), RTLD_LOCAL | RTLD_NOW); - return handle != nullptr; -} - -void DynamicLibrary::close() -{ - if (handle != nullptr) - { - dlclose (handle); - handle = nullptr; - } -} - -void* DynamicLibrary::getFunction (const String& functionName) noexcept -{ - return handle != nullptr ? dlsym (handle, functionName.toUTF8()) : nullptr; -} - - - -//============================================================================== -class ChildProcess::ActiveProcess -{ -public: - ActiveProcess (const StringArray& arguments) - : childPID (0), pipeHandle (0), readHandle (0) - { - int pipeHandles[2] = { 0 }; - - if (pipe (pipeHandles) == 0) - { - const pid_t result = fork(); - - if (result < 0) - { - close (pipeHandles[0]); - close (pipeHandles[1]); - } - else if (result == 0) - { - // we're the child process.. - close (pipeHandles[0]); // close the read handle - dup2 (pipeHandles[1], 1); // turns the pipe into stdout - dup2 (pipeHandles[1], 2); // + stderr - close (pipeHandles[1]); - - Array argv; - for (int i = 0; i < arguments.size(); ++i) - if (arguments[i].isNotEmpty()) - argv.add (arguments[i].toUTF8().getAddress()); - - argv.add (nullptr); - - execvp (argv[0], argv.getRawDataPointer()); - exit (-1); - } - else - { - // we're the parent process.. - childPID = result; - pipeHandle = pipeHandles[0]; - close (pipeHandles[1]); // close the write handle - } - } - } - - ~ActiveProcess() - { - if (readHandle != 0) - fclose (readHandle); - - if (pipeHandle != 0) - close (pipeHandle); - } - - bool isRunning() const - { - if (childPID != 0) - { - int childState; - const int pid = waitpid (childPID, &childState, WNOHANG); - return pid == 0 || ! (WIFEXITED (childState) || WIFSIGNALED (childState)); - } - - return false; - } - - int read (void* const dest, const int numBytes) - { - bassert (dest != nullptr); - - #ifdef fdopen - #error // the zlib headers define this function as NULL! - #endif - - if (readHandle == 0 && childPID != 0) - readHandle = fdopen (pipeHandle, "r"); - - if (readHandle != 0) - return (int) fread (dest, 1, (size_t) numBytes, readHandle); - - return 0; - } - - bool killProcess() const - { - return ::kill (childPID, SIGKILL) == 0; - } - - int childPID; - -private: - int pipeHandle; - FILE* readHandle; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess) -}; - -bool ChildProcess::start (const String& command) -{ - return start (StringArray::fromTokens (command, true)); -} - -bool ChildProcess::start (const StringArray& args) -{ - if (args.size() == 0) - return false; - - activeProcess = new ActiveProcess (args); - - if (activeProcess->childPID == 0) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -bool ChildProcess::isRunning() const -{ - return activeProcess != nullptr && activeProcess->isRunning(); -} - -int ChildProcess::readProcessOutput (void* dest, int numBytes) -{ - return activeProcess != nullptr ? activeProcess->read (dest, numBytes) : 0; -} - -bool ChildProcess::kill() -{ - return activeProcess == nullptr || activeProcess->killProcess(); -} - -//============================================================================== -struct HighResolutionTimer::Pimpl -{ - Pimpl (HighResolutionTimer& t) : owner (t), thread (0), shouldStop (false) - { - } - - ~Pimpl() - { - bassert (thread == 0); - } - - void start (int newPeriod) - { - periodMs = newPeriod; - - if (thread == 0) - { - shouldStop = false; - - if (pthread_create (&thread, nullptr, timerThread, this) == 0) - setThreadToRealtime (thread, newPeriod); - else - bassertfalse; - } - } - - void stop() - { - if (thread != 0) - { - shouldStop = true; - - while (thread != 0 && thread != pthread_self()) - Thread::yield(); - } - } - - HighResolutionTimer& owner; - int volatile periodMs; - -private: - pthread_t thread; - bool volatile shouldStop; - - static void* timerThread (void* param) - { - #if ! BEAST_ANDROID - int dummy; - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &dummy); - #endif - - reinterpret_cast (param)->timerThread(); - return nullptr; - } - - void timerThread() - { - Clock clock (periodMs); - - while (! shouldStop) - { - clock.wait(); - owner.hiResTimerCallback(); - } - - periodMs = 0; - thread = 0; - } - - struct Clock - { - #if BEAST_MAC || BEAST_IOS - Clock (double millis) noexcept - { - mach_timebase_info_data_t timebase; - (void) mach_timebase_info (&timebase); - delta = (((uint64_t) (millis * 1000000.0)) * timebase.numer) / timebase.denom; - time = mach_absolute_time(); - } - - void wait() noexcept - { - time += delta; - mach_wait_until (time); - } - - uint64_t time, delta; - - #elif BEAST_ANDROID - Clock (double millis) noexcept : delta ((uint64) (millis * 1000000)) - { - } - - void wait() noexcept - { - struct timespec t; - t.tv_sec = (time_t) (delta / 1000000000); - t.tv_nsec = (long) (delta % 1000000000); - nanosleep (&t, nullptr); - } - - uint64 delta; - #else - Clock (double millis) noexcept : delta ((uint64) (millis * 1000000)) - { - struct timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - time = 1000000000 * (int64) t.tv_sec + t.tv_nsec; - } - - void wait() noexcept - { - time += delta; - - struct timespec t; - t.tv_sec = (time_t) (time / 1000000000); - t.tv_nsec = (long) (time % 1000000000); - -#if BEAST_BSD - bassertfalse; // unimplemented -#else - clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME, &t, nullptr); -#endif - } - - uint64 time, delta; - #endif - }; - - static bool setThreadToRealtime (pthread_t thread, uint64 periodMs) - { - #if BEAST_MAC || BEAST_IOS - thread_time_constraint_policy_data_t policy; - policy.period = (uint32_t) (periodMs * 1000000); - policy.computation = 50000; - policy.constraint = policy.period; - policy.preemptible = true; - - return thread_policy_set (pthread_mach_thread_np (thread), - THREAD_TIME_CONSTRAINT_POLICY, - (thread_policy_t) &policy, - THREAD_TIME_CONSTRAINT_POLICY_COUNT) == KERN_SUCCESS; - - #else - (void) periodMs; - struct sched_param param; - param.sched_priority = sched_get_priority_max (SCHED_RR); - return pthread_setschedparam (thread, SCHED_RR, ¶m) == 0; - - #endif - } - - BEAST_DECLARE_NON_COPYABLE (Pimpl) -}; diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_ComSmartPtr.h b/Subtrees/beast/modules/beast_core/native/beast_win32_ComSmartPtr.h deleted file mode 100644 index 88b46dc05f..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_ComSmartPtr.h +++ /dev/null @@ -1,165 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_WIN32_COMSMARTPTR_BEASTHEADER -#define BEAST_WIN32_COMSMARTPTR_BEASTHEADER - -#ifndef _MSC_VER -template struct UUIDGetter { static CLSID get() { bassertfalse; return CLSID(); } }; -#define __uuidof(x) UUIDGetter::get() -#endif - -inline GUID uuidFromString (const char* const s) noexcept -{ - unsigned long p0; - unsigned int p1, p2, p3, p4, p5, p6, p7, p8, p9, p10; - - #ifndef _MSC_VER - sscanf - #else - sscanf_s - #endif - (s, "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - &p0, &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10); - - GUID g = { p0, (uint16) p1, (uint16) p2, { (uint8) p3, (uint8) p4, (uint8) p5, (uint8) p6, - (uint8) p7, (uint8) p8, (uint8) p9, (uint8) p10 }}; - return g; -} - -//============================================================================== -/** A simple COM smart pointer. -*/ -template -class ComSmartPtr -{ -public: - ComSmartPtr() throw() : p (0) {} - ComSmartPtr (ComClass* const obj) : p (obj) { if (p) p->AddRef(); } - ComSmartPtr (const ComSmartPtr& other) : p (other.p) { if (p) p->AddRef(); } - ~ComSmartPtr() { release(); } - - operator ComClass*() const throw() { return p; } - ComClass& operator*() const throw() { return *p; } - ComClass* operator->() const throw() { return p; } - - ComSmartPtr& operator= (ComClass* const newP) - { - if (newP != 0) newP->AddRef(); - release(); - p = newP; - return *this; - } - - ComSmartPtr& operator= (const ComSmartPtr& newP) { return operator= (newP.p); } - - // Releases and nullifies this pointer and returns its address - ComClass** resetAndGetPointerAddress() - { - release(); - p = 0; - return &p; - } - - HRESULT CoCreateInstance (REFCLSID classUUID, DWORD dwClsContext = CLSCTX_INPROC_SERVER) - { - HRESULT hr = ::CoCreateInstance (classUUID, 0, dwClsContext, __uuidof (ComClass), (void**) resetAndGetPointerAddress()); - bassert (hr != CO_E_NOTINITIALIZED); // You haven't called CoInitialize for the current thread! - return hr; - } - - template - HRESULT QueryInterface (REFCLSID classUUID, ComSmartPtr& destObject) const - { - if (p == 0) - return E_POINTER; - - return p->QueryInterface (classUUID, (void**) destObject.resetAndGetPointerAddress()); - } - - template - HRESULT QueryInterface (ComSmartPtr& destObject) const - { - return this->QueryInterface (__uuidof (OtherComClass), destObject); - } - -private: - ComClass* p; - - void release() { if (p != 0) p->Release(); } - - ComClass** operator&() throw(); // private to avoid it being used accidentally -}; - -//============================================================================== -#define BEAST_COMRESULT HRESULT __stdcall - -//============================================================================== -template -class ComBaseClassHelperBase : public ComClass -{ -public: - ComBaseClassHelperBase (unsigned int initialRefCount) : refCount (initialRefCount) {} - virtual ~ComBaseClassHelperBase() {} - - ULONG __stdcall AddRef() { return ++refCount; } - ULONG __stdcall Release() { const ULONG r = --refCount; if (r == 0) delete this; return r; } - -protected: - ULONG refCount; - - BEAST_COMRESULT QueryInterface (REFIID refId, void** result) - { - if (refId == IID_IUnknown) - return castToType (result); - - *result = 0; - return E_NOINTERFACE; - } - - template - BEAST_COMRESULT castToType (void** result) - { - this->AddRef(); *result = dynamic_cast (this); return S_OK; - } -}; - -/** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method. -*/ -template -class ComBaseClassHelper : public ComBaseClassHelperBase -{ -public: - ComBaseClassHelper (unsigned int initialRefCount = 1) : ComBaseClassHelperBase (initialRefCount) {} - ~ComBaseClassHelper() {} - - BEAST_COMRESULT QueryInterface (REFIID refId, void** result) - { - if (refId == __uuidof (ComClass)) - return this->template castToType (result); - - return ComBaseClassHelperBase ::QueryInterface (refId, result); - } -}; - -#endif // BEAST_WIN32_COMSMARTPTR_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_Files.cpp b/Subtrees/beast/modules/beast_core/native/beast_win32_Files.cpp deleted file mode 100644 index 56f17582f5..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_Files.cpp +++ /dev/null @@ -1,956 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef INVALID_FILE_ATTRIBUTES - #define INVALID_FILE_ATTRIBUTES ((DWORD) -1) -#endif - -//============================================================================== -namespace WindowsFileHelpers -{ - DWORD getAtts (const String& path) - { - return GetFileAttributes (path.toWideCharPointer()); - } - - int64 fileTimeToTime (const FILETIME* const ft) - { - static_bassert (sizeof (ULARGE_INTEGER) == sizeof (FILETIME)); // tell me if this fails! - - return (int64) ((reinterpret_cast (ft)->QuadPart - literal64bit (116444736000000000)) / 10000); - } - - FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept - { - if (time <= 0) - return nullptr; - - reinterpret_cast (ft)->QuadPart = (ULONGLONG) (time * 10000 + literal64bit (116444736000000000)); - return ft; - } - - String getDriveFromPath (String path) - { - if (path.isNotEmpty() && path[1] == ':' && path[2] == 0) - path << '\\'; - - const size_t numBytes = CharPointer_UTF16::getBytesRequiredFor (path.getCharPointer()) + 4; - HeapBlock pathCopy; - pathCopy.calloc (numBytes, 1); - path.copyToUTF16 (pathCopy, numBytes); - - if (PathStripToRoot (pathCopy)) - path = static_cast (pathCopy); - - return path; - } - - int64 getDiskSpaceInfo (const String& path, const bool total) - { - ULARGE_INTEGER spc, tot, totFree; - - if (GetDiskFreeSpaceEx (getDriveFromPath (path).toWideCharPointer(), &spc, &tot, &totFree)) - return total ? (int64) tot.QuadPart - : (int64) spc.QuadPart; - - return 0; - } - - unsigned int getWindowsDriveType (const String& path) - { - return GetDriveType (getDriveFromPath (path).toWideCharPointer()); - } - - File getSpecialFolderPath (int type) - { - WCHAR path [MAX_PATH + 256]; - - if (SHGetSpecialFolderPath (0, path, type, FALSE)) - return File (String (path)); - - return File::nonexistent; - } - - File getModuleFileName (HINSTANCE moduleHandle) - { - WCHAR dest [MAX_PATH + 256]; - dest[0] = 0; - GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest)); - return File (String (dest)); - } - - Result getResultForLastError() - { - TCHAR messageBuffer [256] = { 0 }; - - FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr); - - return Result::fail (String (messageBuffer)); - } -} - -//============================================================================== -const beast_wchar File::separator = '\\'; -const String File::separatorString ("\\"); - - -//============================================================================== -bool File::exists() const -{ - return fullPath.isNotEmpty() - && WindowsFileHelpers::getAtts (fullPath) != INVALID_FILE_ATTRIBUTES; -} - -bool File::existsAsFile() const -{ - return fullPath.isNotEmpty() - && (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_DIRECTORY) == 0; -} - -bool File::isDirectory() const -{ - const DWORD attr = WindowsFileHelpers::getAtts (fullPath); - return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) && (attr != INVALID_FILE_ATTRIBUTES); -} - -bool File::hasWriteAccess() const -{ - if (exists()) - return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_READONLY) == 0; - - // on windows, it seems that even read-only directories can still be written into, - // so checking the parent directory's permissions would return the wrong result.. - return true; -} - -bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const -{ - const DWORD oldAtts = WindowsFileHelpers::getAtts (fullPath); - - if (oldAtts == INVALID_FILE_ATTRIBUTES) - return false; - - const DWORD newAtts = shouldBeReadOnly ? (oldAtts | FILE_ATTRIBUTE_READONLY) - : (oldAtts & ~FILE_ATTRIBUTE_READONLY); - return newAtts == oldAtts - || SetFileAttributes (fullPath.toWideCharPointer(), newAtts) != FALSE; -} - -bool File::isHidden() const -{ - return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_HIDDEN) != 0; -} - -//============================================================================== -bool File::deleteFile() const -{ - if (! exists()) - return true; - - return isDirectory() ? RemoveDirectory (fullPath.toWideCharPointer()) != 0 - : DeleteFile (fullPath.toWideCharPointer()) != 0; -} - -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - // The string we pass in must be double null terminated.. - const size_t numBytes = CharPointer_UTF16::getBytesRequiredFor (fullPath.getCharPointer()) + 8; - HeapBlock doubleNullTermPath; - doubleNullTermPath.calloc (numBytes, 1); - fullPath.copyToUTF16 (doubleNullTermPath, numBytes); - - SHFILEOPSTRUCT fos = { 0 }; - fos.wFunc = FO_DELETE; - fos.pFrom = doubleNullTermPath; - fos.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMATION - | FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION; - - return SHFileOperation (&fos) == 0; -} - -bool File::copyInternal (const File& dest) const -{ - return CopyFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer(), false) != 0; -} - -bool File::moveInternal (const File& dest) const -{ - return MoveFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer()) != 0; -} - -Result File::createDirectoryInternal (const String& fileName) const -{ - return CreateDirectory (fileName.toWideCharPointer(), 0) ? Result::ok() - : WindowsFileHelpers::getResultForLastError(); -} - -//============================================================================== -int64 beast_fileSetPosition (void* handle, int64 pos) -{ - LARGE_INTEGER li; - li.QuadPart = pos; - li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart, &li.HighPart, FILE_BEGIN); // (returns -1 if it fails) - return li.QuadPart; -} - -void FileInputStream::openHandle() -{ - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); - - if (h != INVALID_HANDLE_VALUE) - fileHandle = (void*) h; - else - status = WindowsFileHelpers::getResultForLastError(); -} - -void FileInputStream::closeHandle() -{ - CloseHandle ((HANDLE) fileHandle); -} - -size_t FileInputStream::readInternal (void* buffer, size_t numBytes) -{ - if (fileHandle != 0) - { - DWORD actualNum = 0; - if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) - status = WindowsFileHelpers::getResultForLastError(); - - return (size_t) actualNum; - } - - return 0; -} - -//============================================================================== -void FileOutputStream::openHandle() -{ - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - - if (h != INVALID_HANDLE_VALUE) - { - LARGE_INTEGER li; - li.QuadPart = 0; - li.LowPart = SetFilePointer (h, 0, &li.HighPart, FILE_END); - - if (li.LowPart != INVALID_SET_FILE_POINTER) - { - fileHandle = (void*) h; - currentPosition = li.QuadPart; - return; - } - } - - status = WindowsFileHelpers::getResultForLastError(); -} - -void FileOutputStream::closeHandle() -{ - CloseHandle ((HANDLE) fileHandle); -} - -ssize_t FileOutputStream::writeInternal (const void* buffer, size_t numBytes) -{ - if (fileHandle != nullptr) - { - DWORD actualNum = 0; - if (! WriteFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) - status = WindowsFileHelpers::getResultForLastError(); - - return (ssize_t) actualNum; - } - - return 0; -} - -void FileOutputStream::flushInternal() -{ - if (fileHandle != nullptr) - if (! FlushFileBuffers ((HANDLE) fileHandle)) - status = WindowsFileHelpers::getResultForLastError(); -} - -Result FileOutputStream::truncate() -{ - if (fileHandle == nullptr) - return status; - - flush(); - return SetEndOfFile ((HANDLE) fileHandle) ? Result::ok() - : WindowsFileHelpers::getResultForLastError(); -} - -//============================================================================== -void MemoryMappedFile::openInternal (const File& file, AccessMode mode) -{ - bassert (mode == readOnly || mode == readWrite); - - if (range.getStart() > 0) - { - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - - range.setStart (range.getStart() - (range.getStart() % systemInfo.dwAllocationGranularity)); - } - - DWORD accessMode = GENERIC_READ, createType = OPEN_EXISTING; - DWORD protect = PAGE_READONLY, access = FILE_MAP_READ; - - if (mode == readWrite) - { - accessMode = GENERIC_READ | GENERIC_WRITE; - createType = OPEN_ALWAYS; - protect = PAGE_READWRITE; - access = FILE_MAP_ALL_ACCESS; - } - - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode, FILE_SHARE_READ, 0, - createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); - - if (h != INVALID_HANDLE_VALUE) - { - fileHandle = (void*) h; - - HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (range.getEnd() >> 32), (DWORD) range.getEnd(), 0); - - if (mappingHandle != 0) - { - address = MapViewOfFile (mappingHandle, access, (DWORD) (range.getStart() >> 32), - (DWORD) range.getStart(), (SIZE_T) range.getLength()); - - if (address == nullptr) - range = Range(); - - CloseHandle (mappingHandle); - } - } -} - -MemoryMappedFile::~MemoryMappedFile() -{ - if (address != nullptr) - UnmapViewOfFile (address); - - if (fileHandle != nullptr) - CloseHandle ((HANDLE) fileHandle); -} - -//============================================================================== -int64 File::getSize() const -{ - WIN32_FILE_ATTRIBUTE_DATA attributes; - - if (GetFileAttributesEx (fullPath.toWideCharPointer(), GetFileExInfoStandard, &attributes)) - return (((int64) attributes.nFileSizeHigh) << 32) | attributes.nFileSizeLow; - - return 0; -} - -void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const -{ - using namespace WindowsFileHelpers; - WIN32_FILE_ATTRIBUTE_DATA attributes; - - if (GetFileAttributesEx (fullPath.toWideCharPointer(), GetFileExInfoStandard, &attributes)) - { - modificationTime = fileTimeToTime (&attributes.ftLastWriteTime); - creationTime = fileTimeToTime (&attributes.ftCreationTime); - accessTime = fileTimeToTime (&attributes.ftLastAccessTime); - } - else - { - creationTime = accessTime = modificationTime = 0; - } -} - -bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64 creationTime) const -{ - using namespace WindowsFileHelpers; - - bool ok = false; - HANDLE h = CreateFile (fullPath.toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - - if (h != INVALID_HANDLE_VALUE) - { - FILETIME m, a, c; - - ok = SetFileTime (h, - timeToFileTime (creationTime, &c), - timeToFileTime (accessTime, &a), - timeToFileTime (modificationTime, &m)) != 0; - - CloseHandle (h); - } - - return ok; -} - -//============================================================================== -void File::findFileSystemRoots (Array& destArray) -{ - TCHAR buffer [2048] = { 0 }; - GetLogicalDriveStrings (2048, buffer); - - const TCHAR* n = buffer; - StringArray roots; - - while (*n != 0) - { - roots.add (String (n)); - - while (*n++ != 0) - {} - } - - roots.sort (true); - - for (int i = 0; i < roots.size(); ++i) - destArray.add (roots [i]); -} - -//============================================================================== -String File::getVolumeLabel() const -{ - TCHAR dest[64]; - if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest, - (DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0)) - dest[0] = 0; - - return dest; -} - -int File::getVolumeSerialNumber() const -{ - TCHAR dest[64]; - DWORD serialNum; - - if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest, - (DWORD) numElementsInArray (dest), &serialNum, 0, 0, 0, 0)) - return 0; - - return (int) serialNum; -} - -int64 File::getBytesFreeOnVolume() const -{ - return WindowsFileHelpers::getDiskSpaceInfo (getFullPathName(), false); -} - -int64 File::getVolumeTotalSize() const -{ - return WindowsFileHelpers::getDiskSpaceInfo (getFullPathName(), true); -} - -//============================================================================== -bool File::isOnCDRomDrive() const -{ - return WindowsFileHelpers::getWindowsDriveType (getFullPathName()) == DRIVE_CDROM; -} - -bool File::isOnHardDisk() const -{ - if (fullPath.isEmpty()) - return false; - - const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName()); - - if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':') - return n != DRIVE_REMOVABLE; - - return n != DRIVE_CDROM && n != DRIVE_REMOTE; -} - -bool File::isOnRemovableDrive() const -{ - if (fullPath.isEmpty()) - return false; - - const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName()); - - return n == DRIVE_CDROM - || n == DRIVE_REMOTE - || n == DRIVE_REMOVABLE - || n == DRIVE_RAMDISK; -} - -//============================================================================== -File BEAST_CALLTYPE File::getSpecialLocation (const SpecialLocationType type) -{ - int csidlType = 0; - - switch (type) - { - case userHomeDirectory: csidlType = CSIDL_PROFILE; break; - case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break; - case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break; - case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break; - case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break; - case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; - case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break; - case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break; - case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break; - - case tempDirectory: - { - WCHAR dest [2048]; - dest[0] = 0; - GetTempPath ((DWORD) numElementsInArray (dest), dest); - return File (String (dest)); - } - - case invokedExecutableFile: - case currentExecutableFile: - case currentApplicationFile: - return WindowsFileHelpers::getModuleFileName ((HINSTANCE) Process::getCurrentModuleInstanceHandle()); - - case hostApplicationPath: - return WindowsFileHelpers::getModuleFileName (0); - - default: - bassertfalse; // unknown type? - return File::nonexistent; - } - - return WindowsFileHelpers::getSpecialFolderPath (csidlType); -} - -//============================================================================== -File File::getCurrentWorkingDirectory() -{ - WCHAR dest [MAX_PATH + 256]; - dest[0] = 0; - GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest); - return File (String (dest)); -} - -bool File::setAsCurrentWorkingDirectory() const -{ - return SetCurrentDirectory (getFullPathName().toWideCharPointer()) != FALSE; -} - -//============================================================================== -String File::getVersion() const -{ - String result; - - DWORD handle = 0; - DWORD bufferSize = GetFileVersionInfoSize (getFullPathName().toWideCharPointer(), &handle); - HeapBlock buffer; - buffer.calloc (bufferSize); - - if (GetFileVersionInfo (getFullPathName().toWideCharPointer(), 0, bufferSize, buffer)) - { - VS_FIXEDFILEINFO* vffi; - UINT len = 0; - - if (VerQueryValue (buffer, (LPTSTR) _T("\\"), (LPVOID*) &vffi, &len)) - { - result << (int) HIWORD (vffi->dwFileVersionMS) << '.' - << (int) LOWORD (vffi->dwFileVersionMS) << '.' - << (int) HIWORD (vffi->dwFileVersionLS) << '.' - << (int) LOWORD (vffi->dwFileVersionLS); - } - } - - return result; -} - -//============================================================================== -File File::getLinkedTarget() const -{ - File result (*this); - String p (getFullPathName()); - - if (! exists()) - p += ".lnk"; - else if (! hasFileExtension (".lnk")) - return result; - - ComSmartPtr shellLink; - ComSmartPtr persistFile; - - if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)) - && SUCCEEDED (shellLink.QueryInterface (persistFile)) - && SUCCEEDED (persistFile->Load (p.toWideCharPointer(), STGM_READ)) - && SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI))) - { - WIN32_FIND_DATA winFindData; - WCHAR resolvedPath [MAX_PATH]; - - if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) - result = File (resolvedPath); - } - - return result; -} - -bool File::createLink (const String& description, const File& linkFileToCreate) const -{ - linkFileToCreate.deleteFile(); - - ComSmartPtr shellLink; - ComSmartPtr persistFile; - - return SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)) - && SUCCEEDED (shellLink->SetPath (getFullPathName().toWideCharPointer())) - && SUCCEEDED (shellLink->SetDescription (description.toWideCharPointer())) - && SUCCEEDED (shellLink.QueryInterface (persistFile)) - && SUCCEEDED (persistFile->Save (linkFileToCreate.getFullPathName().toWideCharPointer(), TRUE)); -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard) - : directoryWithWildCard (File::addTrailingSeparator (directory.getFullPathName()) + wildCard), - handle (INVALID_HANDLE_VALUE) - { - } - - ~Pimpl() - { - if (handle != INVALID_HANDLE_VALUE) - FindClose (handle); - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - using namespace WindowsFileHelpers; - WIN32_FIND_DATA findData; - - if (handle == INVALID_HANDLE_VALUE) - { - handle = FindFirstFile (directoryWithWildCard.toWideCharPointer(), &findData); - - if (handle == INVALID_HANDLE_VALUE) - return false; - } - else - { - if (FindNextFile (handle, &findData) == 0) - return false; - } - - filenameFound = findData.cFileName; - - if (isDir != nullptr) *isDir = ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); - if (isHidden != nullptr) *isHidden = ((findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0); - if (isReadOnly != nullptr) *isReadOnly = ((findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); - if (fileSize != nullptr) *fileSize = findData.nFileSizeLow + (((int64) findData.nFileSizeHigh) << 32); - if (modTime != nullptr) *modTime = Time (fileTimeToTime (&findData.ftLastWriteTime)); - if (creationTime != nullptr) *creationTime = Time (fileTimeToTime (&findData.ftCreationTime)); - - return true; - } - -private: - const String directoryWithWildCard; - HANDLE handle; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -bool Process::openDocument (const String& fileName, const String& parameters) -{ - HINSTANCE hInstance = 0; - - BEAST_TRY - { - hInstance = ShellExecute (0, 0, fileName.toWideCharPointer(), - parameters.toWideCharPointer(), 0, SW_SHOWDEFAULT); - } - BEAST_CATCH_ALL - - return hInstance > (HINSTANCE) 32; -} - -void File::revealToUser() const -{ - DynamicLibrary dll ("Shell32.dll"); - BEAST_LOAD_WINAPI_FUNCTION (dll, ILCreateFromPathW, ilCreateFromPathW, ITEMIDLIST*, (LPCWSTR)) - BEAST_LOAD_WINAPI_FUNCTION (dll, ILFree, ilFree, void, (ITEMIDLIST*)) - BEAST_LOAD_WINAPI_FUNCTION (dll, SHOpenFolderAndSelectItems, shOpenFolderAndSelectItems, HRESULT, (ITEMIDLIST*, UINT, void*, DWORD)) - - if (ilCreateFromPathW != nullptr && shOpenFolderAndSelectItems != nullptr && ilFree != nullptr) - { - if (ITEMIDLIST* const itemIDList = ilCreateFromPathW (fullPath.toWideCharPointer())) - { - shOpenFolderAndSelectItems (itemIDList, 0, nullptr, 0); - ilFree (itemIDList); - } - } -} - -//============================================================================== -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& pipeName, const bool createPipe) - : filename ("\\\\.\\pipe\\" + File::createLegalFileName (pipeName)), - pipeH (INVALID_HANDLE_VALUE), - cancelEvent (CreateEvent (0, FALSE, FALSE, 0)), - connected (false), ownsPipe (createPipe), shouldStop (false) - { - if (createPipe) - pipeH = CreateNamedPipe (filename.toWideCharPointer(), - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, - PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, 0); - } - - ~Pimpl() - { - disconnectPipe(); - - if (pipeH != INVALID_HANDLE_VALUE) - CloseHandle (pipeH); - - CloseHandle (cancelEvent); - } - - bool connect (const int timeOutMs) - { - if (! ownsPipe) - { - if (pipeH != INVALID_HANDLE_VALUE) - return true; - - const Time timeOutEnd (Time::getCurrentTime() + RelativeTime::milliseconds (timeOutMs)); - - for (;;) - { - { - const ScopedLock sl (createFileLock); - - if (pipeH == INVALID_HANDLE_VALUE) - pipeH = CreateFile (filename.toWideCharPointer(), - GENERIC_READ | GENERIC_WRITE, 0, 0, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - } - - if (pipeH != INVALID_HANDLE_VALUE) - return true; - - if (shouldStop || (timeOutMs >= 0 && Time::getCurrentTime() > timeOutEnd)) - return false; - - Thread::sleep (1); - } - } - - if (! connected) - { - OverlappedEvent over; - - if (ConnectNamedPipe (pipeH, &over.over) == 0) - { - switch (GetLastError()) - { - case ERROR_PIPE_CONNECTED: connected = true; break; - case ERROR_IO_PENDING: - case ERROR_PIPE_LISTENING: connected = waitForIO (over, timeOutMs); break; - default: break; - } - } - } - - return connected; - } - - void disconnectPipe() - { - if (ownsPipe && connected) - { - DisconnectNamedPipe (pipeH); - connected = false; - } - } - - int read (void* destBuffer, const int maxBytesToRead, const int timeOutMilliseconds) - { - while (connect (timeOutMilliseconds)) - { - if (maxBytesToRead <= 0) - return 0; - - OverlappedEvent over; - unsigned long numRead; - - if (ReadFile (pipeH, destBuffer, (DWORD) maxBytesToRead, &numRead, &over.over)) - return (int) numRead; - - const DWORD lastError = GetLastError(); - - if (lastError == ERROR_IO_PENDING) - { - if (! waitForIO (over, timeOutMilliseconds)) - return -1; - - if (GetOverlappedResult (pipeH, &over.over, &numRead, FALSE)) - return (int) numRead; - } - - if (ownsPipe && (GetLastError() == ERROR_BROKEN_PIPE || GetLastError() == ERROR_PIPE_NOT_CONNECTED)) - disconnectPipe(); - else - break; - } - - return -1; - } - - int write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) - { - if (connect (timeOutMilliseconds)) - { - if (numBytesToWrite <= 0) - return 0; - - OverlappedEvent over; - unsigned long numWritten; - - if (WriteFile (pipeH, sourceBuffer, (DWORD) numBytesToWrite, &numWritten, &over.over)) - return (int) numWritten; - - if (GetLastError() == ERROR_IO_PENDING) - { - if (! waitForIO (over, timeOutMilliseconds)) - return -1; - - if (GetOverlappedResult (pipeH, &over.over, &numWritten, FALSE)) - return (int) numWritten; - - if (GetLastError() == ERROR_BROKEN_PIPE && ownsPipe) - disconnectPipe(); - } - } - - return -1; - } - - const String filename; - HANDLE pipeH, cancelEvent; - bool connected, ownsPipe, shouldStop; - CriticalSection createFileLock; - -private: - struct OverlappedEvent - { - OverlappedEvent() - { - zerostruct (over); - over.hEvent = CreateEvent (0, TRUE, FALSE, 0); - } - - ~OverlappedEvent() - { - CloseHandle (over.hEvent); - } - - OVERLAPPED over; - }; - - bool waitForIO (OverlappedEvent& over, int timeOutMilliseconds) - { - if (shouldStop) - return false; - - HANDLE handles[] = { over.over.hEvent, cancelEvent }; - DWORD waitResult = WaitForMultipleObjects (2, handles, FALSE, - timeOutMilliseconds >= 0 ? timeOutMilliseconds - : INFINITE); - - if (waitResult == WAIT_OBJECT_0) - return true; - - CancelIo (pipeH); - return false; - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -void NamedPipe::close() -{ - if (pimpl != nullptr) - { - pimpl->shouldStop = true; - SetEvent (pimpl->cancelEvent); - - ScopedWriteLock sl (lock); - pimpl = nullptr; - } -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - pimpl = new Pimpl (pipeName, createPipe); - - if (createPipe && pimpl->pipeH == INVALID_HANDLE_VALUE) - { - pimpl = nullptr; - return false; - } - - return true; -} - -int NamedPipe::read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->read (destBuffer, maxBytesToRead, timeOutMilliseconds) : -1; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->write (sourceBuffer, numBytesToWrite, timeOutMilliseconds) : -1; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_Network.cpp b/Subtrees/beast/modules/beast_core/native/beast_win32_Network.cpp deleted file mode 100644 index 7edad70888..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_Network.cpp +++ /dev/null @@ -1,464 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef INTERNET_FLAG_NEED_FILE - #define INTERNET_FLAG_NEED_FILE 0x00000010 -#endif - -#ifndef INTERNET_OPTION_DISABLE_AUTODIAL - #define INTERNET_OPTION_DISABLE_AUTODIAL 70 -#endif - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) - : connection (0), request (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - createConnection (progressCallback, progressCallbackContext); - - if (responseHeaders != nullptr && ! isError()) - { - DWORD bufferSizeBytes = 4096; - - for (;;) - { - HeapBlock buffer ((size_t) bufferSizeBytes); - - if (HttpQueryInfo (request, HTTP_QUERY_RAW_HEADERS_CRLF, buffer.getData(), &bufferSizeBytes, 0)) - { - StringArray headersArray; - headersArray.addLines (reinterpret_cast (buffer.getData())); - - for (int i = 0; i < headersArray.size(); ++i) - { - const String& header = headersArray[i]; - const String key (header.upToFirstOccurrenceOf (": ", false, false)); - const String value (header.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue ((*responseHeaders) [key]); - - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - - break; - } - - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - break; - } - } - } - - ~WebInputStream() - { - close(); - } - - //============================================================================== - bool isError() const { return request == 0; } - bool isExhausted() { return finished; } - int64 getPosition() { return position; } - - int64 getTotalLength() - { - if (! isError()) - { - DWORD index = 0, result = 0, size = sizeof (result); - - if (HttpQueryInfo (request, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &result, &size, &index)) - return (int64) result; - } - - return -1; - } - - int read (void* buffer, int bytesToRead) - { - bassert (buffer != nullptr && bytesToRead >= 0); - DWORD bytesRead = 0; - - if (! (finished || isError())) - { - InternetReadFile (request, buffer, (DWORD) bytesToRead, &bytesRead); - position += bytesRead; - - if (bytesRead == 0) - finished = true; - } - - return (int) bytesRead; - } - - bool setPosition (int64 wantedPos) - { - if (isError()) - return false; - - if (wantedPos != position) - { - finished = false; - position = (int64) InternetSetFilePointer (request, (LONG) wantedPos, 0, FILE_BEGIN, 0); - - if (position == wantedPos) - return true; - - if (wantedPos < position) - { - close(); - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - -private: - //============================================================================== - HINTERNET connection, request; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - int timeOutMs; - - void close() - { - if (request != 0) - { - InternetCloseHandle (request); - request = 0; - } - - if (connection != 0) - { - InternetCloseHandle (connection); - connection = 0; - } - } - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - static HINTERNET sessionHandle = InternetOpen (_T("beast"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); - - close(); - - if (sessionHandle != 0) - { - // break up the url.. - const int fileNumChars = 65536; - const int serverNumChars = 2048; - const int usernameNumChars = 1024; - const int passwordNumChars = 1024; - HeapBlock file (fileNumChars), server (serverNumChars), - username (usernameNumChars), password (passwordNumChars); - - URL_COMPONENTS uc = { 0 }; - uc.dwStructSize = sizeof (uc); - uc.lpszUrlPath = file; - uc.dwUrlPathLength = fileNumChars; - uc.lpszHostName = server; - uc.dwHostNameLength = serverNumChars; - uc.lpszUserName = username; - uc.dwUserNameLength = usernameNumChars; - uc.lpszPassword = password; - uc.dwPasswordLength = passwordNumChars; - - if (InternetCrackUrl (address.toWideCharPointer(), 0, 0, &uc)) - openConnection (uc, sessionHandle, progressCallback, progressCallbackContext); - } - } - - void openConnection (URL_COMPONENTS& uc, HINTERNET sessionHandle, - URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - int disable = 1; - InternetSetOption (sessionHandle, INTERNET_OPTION_DISABLE_AUTODIAL, &disable, sizeof (disable)); - - if (timeOutMs == 0) - timeOutMs = 30000; - else if (timeOutMs < 0) - timeOutMs = -1; - - applyTimeout (sessionHandle, INTERNET_OPTION_CONNECT_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_RECEIVE_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_SEND_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_DATA_SEND_TIMEOUT); - - const bool isFtp = address.startsWithIgnoreCase ("ftp:"); - - connection = InternetConnect (sessionHandle, uc.lpszHostName, uc.nPort, - uc.lpszUserName, uc.lpszPassword, - isFtp ? (DWORD) INTERNET_SERVICE_FTP - : (DWORD) INTERNET_SERVICE_HTTP, - 0, 0); - if (connection != 0) - { - if (isFtp) - request = FtpOpenFile (connection, uc.lpszUrlPath, GENERIC_READ, - FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_NEED_FILE, 0); - else - openHTTPConnection (uc, progressCallback, progressCallbackContext); - } - } - - void applyTimeout (HINTERNET sessionHandle, const DWORD option) - { - InternetSetOption (sessionHandle, option, &timeOutMs, sizeof (timeOutMs)); - } - - void openHTTPConnection (URL_COMPONENTS& uc, URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - const TCHAR* mimeTypes[] = { _T("*/*"), nullptr }; - - DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES; - - if (address.startsWithIgnoreCase ("https:")) - flags |= INTERNET_FLAG_SECURE; // (this flag only seems necessary if the OS is running IE6 - - // IE7 seems to automatically work out when it's https) - - request = HttpOpenRequest (connection, isPost ? _T("POST") : _T("GET"), - uc.lpszUrlPath, 0, 0, mimeTypes, flags, 0); - - if (request != 0) - { - INTERNET_BUFFERS buffers = { 0 }; - buffers.dwStructSize = sizeof (INTERNET_BUFFERS); - buffers.lpcszHeader = headers.toWideCharPointer(); - buffers.dwHeadersLength = (DWORD) headers.length(); - buffers.dwBufferTotal = (DWORD) postData.getSize(); - - if (HttpSendRequestEx (request, &buffers, 0, HSR_INITIATE, 0)) - { - int bytesSent = 0; - - for (;;) - { - const int bytesToDo = bmin (1024, (int) postData.getSize() - bytesSent); - DWORD bytesDone = 0; - - if (bytesToDo > 0 - && ! InternetWriteFile (request, - static_cast (postData.getData()) + bytesSent, - (DWORD) bytesToDo, &bytesDone)) - { - break; - } - - if (bytesToDo == 0 || (int) bytesDone < bytesToDo) - { - if (HttpEndRequest (request, 0, 0, 0)) - return; - - break; - } - - bytesSent += bytesDone; - - if (progressCallback != nullptr - && ! progressCallback (progressCallbackContext, bytesSent, (int) postData.getSize())) - break; - } - } - } - - close(); - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} - - -//============================================================================== -struct GetAdaptersInfoHelper -{ - bool callGetAdaptersInfo() - { - DynamicLibrary dll ("iphlpapi.dll"); - BEAST_LOAD_WINAPI_FUNCTION (dll, GetAdaptersInfo, getAdaptersInfo, DWORD, (PIP_ADAPTER_INFO, PULONG)) - - if (getAdaptersInfo == nullptr) - return false; - - adapterInfo.malloc (1); - ULONG len = sizeof (IP_ADAPTER_INFO); - - if (getAdaptersInfo (adapterInfo, &len) == ERROR_BUFFER_OVERFLOW) - adapterInfo.malloc (len, 1); - - return getAdaptersInfo (adapterInfo, &len) == NO_ERROR; - } - - HeapBlock adapterInfo; -}; - -namespace MACAddressHelpers -{ - void getViaGetAdaptersInfo (Array& result) - { - GetAdaptersInfoHelper gah; - - if (gah.callGetAdaptersInfo()) - { - for (PIP_ADAPTER_INFO adapter = gah.adapterInfo; adapter != nullptr; adapter = adapter->Next) - if (adapter->AddressLength >= 6) - result.addIfNotAlreadyThere (MACAddress (adapter->Address)); - } - } - - void getViaNetBios (Array& result) - { - DynamicLibrary dll ("netapi32.dll"); - BEAST_LOAD_WINAPI_FUNCTION (dll, Netbios, NetbiosCall, UCHAR, (PNCB)) - - if (NetbiosCall != 0) - { - LANA_ENUM enums = { 0 }; - - { - NCB ncb = { 0 }; - ncb.ncb_command = NCBENUM; - ncb.ncb_buffer = (unsigned char*) &enums; - ncb.ncb_length = sizeof (LANA_ENUM); - NetbiosCall (&ncb); - } - - for (int i = 0; i < enums.length; ++i) - { - NCB ncb2 = { 0 }; - ncb2.ncb_command = NCBRESET; - ncb2.ncb_lana_num = enums.lana[i]; - - if (NetbiosCall (&ncb2) == 0) - { - NCB ncb = { 0 }; - memcpy (ncb.ncb_callname, "* ", NCBNAMSZ); - ncb.ncb_command = NCBASTAT; - ncb.ncb_lana_num = enums.lana[i]; - - struct ASTAT - { - ADAPTER_STATUS adapt; - NAME_BUFFER NameBuff [30]; - }; - - ASTAT astat; - zerostruct (astat); - ncb.ncb_buffer = (unsigned char*) &astat; - ncb.ncb_length = sizeof (ASTAT); - - if (NetbiosCall (&ncb) == 0 && astat.adapt.adapter_type == 0xfe) - result.addIfNotAlreadyThere (MACAddress (astat.adapt.adapter_address)); - } - } - } - } -} - -void MACAddress::findAllAddresses (Array& result) -{ - MACAddressHelpers::getViaGetAdaptersInfo (result); - MACAddressHelpers::getViaNetBios (result); -} - -void IPAddress::findAllAddresses (Array& result) -{ - result.addIfNotAlreadyThere (IPAddress::local()); - - GetAdaptersInfoHelper gah; - - if (gah.callGetAdaptersInfo()) - { - for (PIP_ADAPTER_INFO adapter = gah.adapterInfo; adapter != nullptr; adapter = adapter->Next) - { - IPAddress ip (adapter->IpAddressList.IpAddress.String); - - if (ip != IPAddress::any()) - result.addIfNotAlreadyThere (ip); - } - } -} - -//============================================================================== -bool Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - DynamicLibrary dll ("MAPI32.dll"); - BEAST_LOAD_WINAPI_FUNCTION (dll, MAPISendMail, mapiSendMail, - ULONG, (LHANDLE, ULONG, lpMapiMessage, ::FLAGS, ULONG)) - - if (mapiSendMail == nullptr) - return false; - - MapiMessage message = { 0 }; - message.lpszSubject = (LPSTR) emailSubject.toRawUTF8(); - message.lpszNoteText = (LPSTR) bodyText.toRawUTF8(); - - MapiRecipDesc recip = { 0 }; - recip.ulRecipClass = MAPI_TO; - String targetEmailAddress_ (targetEmailAddress); - if (targetEmailAddress_.isEmpty()) - targetEmailAddress_ = " "; // (Windows Mail can't deal with a blank address) - recip.lpszName = (LPSTR) targetEmailAddress_.toRawUTF8(); - message.nRecipCount = 1; - message.lpRecips = &recip; - - HeapBlock files; - files.calloc ((size_t) filesToAttach.size()); - - message.nFileCount = (ULONG) filesToAttach.size(); - message.lpFiles = files; - - for (int i = 0; i < filesToAttach.size(); ++i) - { - files[i].nPosition = (ULONG) -1; - files[i].lpszPathName = (LPSTR) filesToAttach[i].toRawUTF8(); - } - - return mapiSendMail (0, 0, &message, MAPI_DIALOG | MAPI_LOGON_UI, 0) == SUCCESS_SUCCESS; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_Registry.cpp b/Subtrees/beast/modules/beast_core/native/beast_win32_Registry.cpp deleted file mode 100644 index adc7599c9a..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_Registry.cpp +++ /dev/null @@ -1,216 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -struct RegistryKeyWrapper -{ - RegistryKeyWrapper (String name, const bool createForWriting, const DWORD wow64Flags) - : key (0), wideCharValueName (nullptr) - { - HKEY rootKey = 0; - - if (name.startsWithIgnoreCase ("HKEY_CURRENT_USER\\")) rootKey = HKEY_CURRENT_USER; - else if (name.startsWithIgnoreCase ("HKEY_LOCAL_MACHINE\\")) rootKey = HKEY_LOCAL_MACHINE; - else if (name.startsWithIgnoreCase ("HKEY_CLASSES_ROOT\\")) rootKey = HKEY_CLASSES_ROOT; - - if (rootKey != 0) - { - name = name.substring (name.indexOfChar ('\\') + 1); - - const int lastSlash = name.lastIndexOfChar ('\\'); - valueName = name.substring (lastSlash + 1); - wideCharValueName = valueName.toWideCharPointer(); - - name = name.substring (0, lastSlash); - const wchar_t* const wideCharName = name.toWideCharPointer(); - DWORD result; - - if (createForWriting) - RegCreateKeyEx (rootKey, wideCharName, 0, 0, REG_OPTION_NON_VOLATILE, - KEY_WRITE | KEY_QUERY_VALUE | wow64Flags, 0, &key, &result); - else - RegOpenKeyEx (rootKey, wideCharName, 0, KEY_READ | wow64Flags, &key); - } - } - - ~RegistryKeyWrapper() - { - if (key != 0) - RegCloseKey (key); - } - - static bool setValue (const String& regValuePath, const DWORD type, - const void* data, size_t dataSize) - { - const RegistryKeyWrapper key (regValuePath, true, 0); - - return key.key != 0 - && RegSetValueEx (key.key, key.wideCharValueName, 0, type, - reinterpret_cast (data), - (DWORD) dataSize) == ERROR_SUCCESS; - } - - static uint32 getBinaryValue (const String& regValuePath, MemoryBlock& result, DWORD wow64Flags) - { - const RegistryKeyWrapper key (regValuePath, false, wow64Flags); - - if (key.key != 0) - { - for (unsigned long bufferSize = 1024; ; bufferSize *= 2) - { - result.setSize (bufferSize, false); - DWORD type = REG_NONE; - - const LONG err = RegQueryValueEx (key.key, key.wideCharValueName, 0, &type, - (LPBYTE) result.getData(), &bufferSize); - - if (err == ERROR_SUCCESS) - { - result.setSize (bufferSize, false); - return type; - } - - if (err != ERROR_MORE_DATA) - break; - } - } - - return REG_NONE; - } - - static String getValue (const String& regValuePath, const String& defaultValue, DWORD wow64Flags) - { - MemoryBlock buffer; - switch (getBinaryValue (regValuePath, buffer, wow64Flags)) - { - case REG_SZ: return static_cast (buffer.getData()); - case REG_DWORD: return String ((int) *reinterpret_cast (buffer.getData())); - default: break; - } - - return defaultValue; - } - - static bool valueExists (const String& regValuePath, const DWORD wow64Flags) - { - const RegistryKeyWrapper key (regValuePath, false, wow64Flags); - - if (key.key == 0) - return false; - - unsigned char buffer [512]; - unsigned long bufferSize = sizeof (buffer); - DWORD type = 0; - - const LONG result = RegQueryValueEx (key.key, key.wideCharValueName, - 0, &type, buffer, &bufferSize); - - return result == ERROR_SUCCESS || result == ERROR_MORE_DATA; - } - - HKEY key; - const wchar_t* wideCharValueName; - String valueName; - - BEAST_DECLARE_NON_COPYABLE (RegistryKeyWrapper) -}; - -uint32 WindowsRegistry::getBinaryValue (const String& regValuePath, MemoryBlock& result) -{ - return RegistryKeyWrapper::getBinaryValue (regValuePath, result, 0); -} - -String WindowsRegistry::getValue (const String& regValuePath, const String& defaultValue) -{ - return RegistryKeyWrapper::getValue (regValuePath, defaultValue, 0); -} - -String WindowsRegistry::getValueWow64 (const String& regValuePath, const String& defaultValue) -{ - return RegistryKeyWrapper::getValue (regValuePath, defaultValue, 0x100 /*KEY_WOW64_64KEY*/); -} - -bool WindowsRegistry::valueExistsWow64 (const String& regValuePath) -{ - return RegistryKeyWrapper::valueExists (regValuePath, 0x100 /*KEY_WOW64_64KEY*/); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const String& value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_SZ, value.toWideCharPointer(), - CharPointer_UTF16::getBytesRequiredFor (value.getCharPointer())); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const uint32 value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_DWORD, &value, sizeof (value)); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const uint64 value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_QWORD, &value, sizeof (value)); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const MemoryBlock& value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_BINARY, value.getData(), value.getSize()); -} - -bool WindowsRegistry::valueExists (const String& regValuePath) -{ - return RegistryKeyWrapper::valueExists (regValuePath, 0); -} - -void WindowsRegistry::deleteValue (const String& regValuePath) -{ - const RegistryKeyWrapper key (regValuePath, true, 0); - - if (key.key != 0) - RegDeleteValue (key.key, key.wideCharValueName); -} - -void WindowsRegistry::deleteKey (const String& regKeyPath) -{ - const RegistryKeyWrapper key (regKeyPath, true, 0); - - if (key.key != 0) - RegDeleteKey (key.key, key.wideCharValueName); -} - -bool WindowsRegistry::registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - const int iconResourceNumber, - const bool registerForCurrentUserOnly) -{ - const char* const root = registerForCurrentUserOnly ? "HKEY_CURRENT_USER\\Software\\Classes\\" - : "HKEY_CLASSES_ROOT\\"; - const String key (root + symbolicDescription); - - return setValue (root + fileExtension + "\\", symbolicDescription) - && setValue (key + "\\", fullDescription) - && setValue (key + "\\shell\\open\\command\\", targetExecutable.getFullPathName() + " \"%1\"") - && (iconResourceNumber == 0 - || setValue (key + "\\DefaultIcon\\", - targetExecutable.getFullPathName() + "," + String (-iconResourceNumber))); -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_SystemStats.cpp b/Subtrees/beast/modules/beast_core/native/beast_win32_SystemStats.cpp deleted file mode 100644 index f6568e1bd9..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_SystemStats.cpp +++ /dev/null @@ -1,413 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -void Logger::outputDebugString (const String& text) -{ - OutputDebugString ((text + "\n").toWideCharPointer()); -} - -//============================================================================== -#ifdef BEAST_DLL_BUILD - BEAST_API void* beastDLL_malloc (size_t sz) { return std::malloc (sz); } - BEAST_API void beastDLL_free (void* block) { std::free (block); } -#endif - -//============================================================================== -#if BEAST_USE_INTRINSICS - -// CPU info functions using intrinsics... - -#pragma intrinsic (__cpuid) -#pragma intrinsic (__rdtsc) - -String SystemStats::getCpuVendor() -{ - int info [4]; - __cpuid (info, 0); - - char v [12]; - memcpy (v, info + 1, 4); - memcpy (v + 4, info + 3, 4); - memcpy (v + 8, info + 2, 4); - - return String (v, 12); -} - -#else - -//============================================================================== -// CPU info functions using old fashioned inline asm... - -static void beast_getCpuVendor (char* const v) -{ - int vendor[4] = { 0 }; - - #if ! BEAST_MINGW - __try - #endif - { - #if BEAST_GCC - unsigned int dummy = 0; - __asm__ ("cpuid" : "=a" (dummy), "=b" (vendor[0]), "=c" (vendor[2]),"=d" (vendor[1]) : "a" (0)); - #else - __asm - { - mov eax, 0 - cpuid - mov [vendor], ebx - mov [vendor + 4], edx - mov [vendor + 8], ecx - } - #endif - } - #if ! BEAST_MINGW - __except (EXCEPTION_EXECUTE_HANDLER) - { - } - #endif - - memcpy (v, vendor, 16); -} - -String SystemStats::getCpuVendor() -{ - char v [16]; - beast_getCpuVendor (v); - return String (v, 16); -} -#endif - - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - hasMMX = IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE) != 0; - hasSSE = IsProcessorFeaturePresent (PF_XMMI_INSTRUCTIONS_AVAILABLE) != 0; - hasSSE2 = IsProcessorFeaturePresent (PF_XMMI64_INSTRUCTIONS_AVAILABLE) != 0; - #ifdef PF_AMD3D_INSTRUCTIONS_AVAILABLE - has3DNow = IsProcessorFeaturePresent (PF_AMD3D_INSTRUCTIONS_AVAILABLE) != 0; - #else - has3DNow = IsProcessorFeaturePresent (PF_3DNOW_INSTRUCTIONS_AVAILABLE) != 0; - #endif - - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - numCpus = (int) systemInfo.dwNumberOfProcessors; -} - -#if BEAST_MSVC && BEAST_CHECK_MEMORY_LEAKS -struct DebugFlagsInitialiser -{ - DebugFlagsInitialiser() - { - _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); - } -}; - -static DebugFlagsInitialiser debugFlagsInitialiser; -#endif - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - OSVERSIONINFO info; - info.dwOSVersionInfoSize = sizeof (info); - GetVersionEx (&info); - - if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - if (info.dwMajorVersion == 5) - return (info.dwMinorVersion == 0) ? Win2000 : WinXP; - - if (info.dwMajorVersion == 6) - { - switch (info.dwMinorVersion) - { - case 0: return WinVista; - case 1: return Windows7; - case 2: return Windows8; - - default: - bassertfalse; // new version needs to be added here! - return Windows8; - } - } - } - - bassertfalse; // need to support whatever new version is running! - return UnknownOS; -} - -String SystemStats::getOperatingSystemName() -{ - const char* name = "Unknown OS"; - - switch (getOperatingSystemType()) - { - case Windows7: name = "Windows 7"; break; - case Windows8: name = "Windows 8"; break; - case WinVista: name = "Windows Vista"; break; - case WinXP: name = "Windows XP"; break; - case Win2000: name = "Windows 2000"; break; - default: bassertfalse; break; // !! new type of OS? - } - - return name; -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if BEAST_64BIT - return true; - #else - typedef BOOL (WINAPI* LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - - LPFN_ISWOW64PROCESS fnIsWow64Process - = (LPFN_ISWOW64PROCESS) GetProcAddress (GetModuleHandleA ("kernel32"), "IsWow64Process"); - - BOOL isWow64 = FALSE; - - return fnIsWow64Process != nullptr - && fnIsWow64Process (GetCurrentProcess(), &isWow64) - && isWow64 != FALSE; - #endif -} - -//============================================================================== -int SystemStats::getMemorySizeInMegabytes() -{ - MEMORYSTATUSEX mem; - mem.dwLength = sizeof (mem); - GlobalMemoryStatusEx (&mem); - return (int) (mem.ullTotalPhys / (1024 * 1024)) + 1; -} - -//============================================================================== -String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue) -{ - DWORD len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0); - if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) - return String (defaultValue); - - HeapBlock buffer (len); - len = GetEnvironmentVariableW (name.toWideCharPointer(), buffer, len); - - return String (CharPointer_wchar_t (buffer), - CharPointer_wchar_t (buffer + len)); -} - -//============================================================================== -uint32 beast_millisecondsSinceStartup() noexcept -{ - return (uint32) timeGetTime(); -} - -//============================================================================== -class HiResCounterHandler -{ -public: - HiResCounterHandler() - : hiResTicksOffset (0) - { - const MMRESULT res = timeBeginPeriod (1); - (void) res; - bassert (res == TIMERR_NOERROR); - - LARGE_INTEGER f; - QueryPerformanceFrequency (&f); - hiResTicksPerSecond = f.QuadPart; - hiResTicksScaleFactor = 1000.0 / hiResTicksPerSecond; - } - - inline int64 getHighResolutionTicks() noexcept - { - LARGE_INTEGER ticks; - QueryPerformanceCounter (&ticks); - - const int64 mainCounterAsHiResTicks = (beast_millisecondsSinceStartup() * hiResTicksPerSecond) / 1000; - const int64 newOffset = mainCounterAsHiResTicks - ticks.QuadPart; - - // fix for a very obscure PCI hardware bug that can make the counter - // sometimes jump forwards by a few seconds.. - const int64 offsetDrift = abs64 (newOffset - hiResTicksOffset); - - if (offsetDrift > (hiResTicksPerSecond >> 1)) - hiResTicksOffset = newOffset; - - return ticks.QuadPart + hiResTicksOffset; - } - - inline double getMillisecondCounterHiRes() noexcept - { - return getHighResolutionTicks() * hiResTicksScaleFactor; - } - - int64 hiResTicksPerSecond, hiResTicksOffset; - double hiResTicksScaleFactor; -}; - -static HiResCounterHandler hiResCounterHandler; - -int64 Time::getHighResolutionTicksPerSecond() noexcept { return hiResCounterHandler.hiResTicksPerSecond; } -int64 Time::getHighResolutionTicks() noexcept { return hiResCounterHandler.getHighResolutionTicks(); } -double Time::getMillisecondCounterHiRes() noexcept { return hiResCounterHandler.getMillisecondCounterHiRes(); } - -//============================================================================== -static int64 beast_getClockCycleCounter() noexcept -{ - #if BEAST_USE_INTRINSICS - // MS intrinsics version... - return (int64) __rdtsc(); - - #elif BEAST_GCC - // GNU inline asm version... - unsigned int hi = 0, lo = 0; - - __asm__ __volatile__ ( - "xor %%eax, %%eax \n\ - xor %%edx, %%edx \n\ - rdtsc \n\ - movl %%eax, %[lo] \n\ - movl %%edx, %[hi]" - : - : [hi] "m" (hi), - [lo] "m" (lo) - : "cc", "eax", "ebx", "ecx", "edx", "memory"); - - return (int64) ((((uint64) hi) << 32) | lo); - #else - // MSVC inline asm version... - unsigned int hi = 0, lo = 0; - - __asm - { - xor eax, eax - xor edx, edx - rdtsc - mov lo, eax - mov hi, edx - } - - return (int64) ((((uint64) hi) << 32) | lo); - #endif -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - const int64 cycles = beast_getClockCycleCounter(); - const uint32 millis = Time::getMillisecondCounter(); - int lastResult = 0; - - for (;;) - { - int n = 1000000; - while (--n > 0) {} - - const uint32 millisElapsed = Time::getMillisecondCounter() - millis; - const int64 cyclesNow = beast_getClockCycleCounter(); - - if (millisElapsed > 80) - { - const int newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000); - - if (millisElapsed > 500 || (lastResult == newResult && newResult > 100)) - return newResult; - - lastResult = newResult; - } - } -} - - -//============================================================================== -bool Time::setSystemTimeToThisTime() const -{ - SYSTEMTIME st; - - st.wDayOfWeek = 0; - st.wYear = (WORD) getYear(); - st.wMonth = (WORD) (getMonth() + 1); - st.wDay = (WORD) getDayOfMonth(); - st.wHour = (WORD) getHours(); - st.wMinute = (WORD) getMinutes(); - st.wSecond = (WORD) getSeconds(); - st.wMilliseconds = (WORD) (millisSinceEpoch % 1000); - - // do this twice because of daylight saving conversion problems - the - // first one sets it up, the second one kicks it in. - return SetLocalTime (&st) != 0 - && SetLocalTime (&st) != 0; -} - -int SystemStats::getPageSize() -{ - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - - return (int) systemInfo.dwPageSize; -} - -//============================================================================== -String SystemStats::getLogonName() -{ - TCHAR text [256] = { 0 }; - DWORD len = (DWORD) numElementsInArray (text) - 1; - GetUserName (text, &len); - return String (text, len); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - TCHAR text [MAX_COMPUTERNAME_LENGTH + 1] = { 0 }; - DWORD len = (DWORD) numElementsInArray (text) - 1; - GetComputerName (text, &len); - return String (text, len); -} - -static String getLocaleValue (LCID locale, LCTYPE key, const char* defaultValue) -{ - TCHAR buffer [256] = { 0 }; - if (GetLocaleInfo (locale, key, buffer, 255) > 0) - return buffer; - - return defaultValue; -} - -String SystemStats::getUserLanguage() { return getLocaleValue (LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, "en"); } -String SystemStats::getUserRegion() { return getLocaleValue (LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, "US"); } - -String SystemStats::getDisplayLanguage() -{ - DynamicLibrary dll ("kernel32.dll"); - BEAST_LOAD_WINAPI_FUNCTION (dll, GetUserDefaultUILanguage, getUserDefaultUILanguage, LANGID, (void)) - - if (getUserDefaultUILanguage != nullptr) - return getLocaleValue (MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT), LOCALE_SISO639LANGNAME, "en"); - - return "en"; -} diff --git a/Subtrees/beast/modules/beast_core/native/beast_win32_Threads.cpp b/Subtrees/beast/modules/beast_core/native/beast_win32_Threads.cpp deleted file mode 100644 index 2274bec659..0000000000 --- a/Subtrees/beast/modules/beast_core/native/beast_win32_Threads.cpp +++ /dev/null @@ -1,634 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -HWND beast_messageWindowHandle = 0; // (this is used by other parts of the codebase) - -//============================================================================== -#if ! BEAST_USE_INTRINSICS -// In newer compilers, the inline versions of these are used (in beast_Atomic.h), but in -// older ones we have to actually call the ops as win32 functions.. -long beast_InterlockedExchange (volatile long* a, long b) noexcept { return InterlockedExchange (a, b); } -long beast_InterlockedIncrement (volatile long* a) noexcept { return InterlockedIncrement (a); } -long beast_InterlockedDecrement (volatile long* a) noexcept { return InterlockedDecrement (a); } -long beast_InterlockedExchangeAdd (volatile long* a, long b) noexcept { return InterlockedExchangeAdd (a, b); } -long beast_InterlockedCompareExchange (volatile long* a, long b, long c) noexcept { return InterlockedCompareExchange (a, b, c); } - -__int64 beast_InterlockedCompareExchange64 (volatile __int64* value, __int64 newValue, __int64 valueToCompare) noexcept -{ - bassertfalse; // This operation isn't available in old MS compiler versions! - - __int64 oldValue = *value; - if (oldValue == valueToCompare) - *value = newValue; - - return oldValue; -} - -#endif - -//============================================================================== -CriticalSection::CriticalSection() noexcept -{ - // (just to check the MS haven't changed this structure and broken things...) - #if BEAST_VC7_OR_EARLIER - static_bassert (sizeof (CRITICAL_SECTION) <= 24); - #else - static_bassert (sizeof (CRITICAL_SECTION) <= sizeof (internal)); - #endif - - InitializeCriticalSection ((CRITICAL_SECTION*) internal); -} - -CriticalSection::~CriticalSection() noexcept -{ - DeleteCriticalSection ((CRITICAL_SECTION*) internal); -} - -void CriticalSection::enter() const noexcept -{ - EnterCriticalSection ((CRITICAL_SECTION*) internal); -} - -bool CriticalSection::tryEnter() const noexcept -{ - return TryEnterCriticalSection ((CRITICAL_SECTION*) internal) != FALSE; -} - -void CriticalSection::exit() const noexcept -{ - LeaveCriticalSection ((CRITICAL_SECTION*) internal); -} - -//============================================================================== -WaitableEvent::WaitableEvent (const bool manualReset) noexcept - : internal (CreateEvent (0, manualReset ? TRUE : FALSE, FALSE, 0)) -{ -} - -WaitableEvent::~WaitableEvent() noexcept -{ - CloseHandle (internal); -} - -bool WaitableEvent::wait (const int timeOutMillisecs) const noexcept -{ - return WaitForSingleObject (internal, (DWORD) timeOutMillisecs) == WAIT_OBJECT_0; -} - -void WaitableEvent::signal() const noexcept -{ - SetEvent (internal); -} - -void WaitableEvent::reset() const noexcept -{ - ResetEvent (internal); -} - -//============================================================================== -void BEAST_API beast_threadEntryPoint (void*); - -static unsigned int __stdcall threadEntryProc (void* userData) -{ - if (beast_messageWindowHandle != 0) - AttachThreadInput (GetWindowThreadProcessId (beast_messageWindowHandle, 0), - GetCurrentThreadId(), TRUE); - - beast_threadEntryPoint (userData); - - _endthreadex (0); - return 0; -} - -void Thread::launchThread() -{ - unsigned int newThreadId; - threadHandle = (void*) _beginthreadex (0, 0, &threadEntryProc, this, 0, &newThreadId); - threadId = (ThreadID) newThreadId; -} - -void Thread::closeThreadHandle() -{ - CloseHandle ((HANDLE) threadHandle); - threadId = 0; - threadHandle = 0; -} - -void Thread::killThread() -{ - if (threadHandle != 0) - { - #if BEAST_DEBUG - OutputDebugStringA ("** Warning - Forced thread termination **\n"); - #endif - TerminateThread (threadHandle, 0); - } -} - -void Thread::setCurrentThreadName (const String& name) -{ - #if BEAST_DEBUG && BEAST_MSVC - struct - { - DWORD dwType; - LPCSTR szName; - DWORD dwThreadID; - DWORD dwFlags; - } info; - - info.dwType = 0x1000; - info.szName = name.toUTF8(); - info.dwThreadID = GetCurrentThreadId(); - info.dwFlags = 0; - - __try - { - RaiseException (0x406d1388 /*MS_VC_EXCEPTION*/, 0, sizeof (info) / sizeof (ULONG_PTR), (ULONG_PTR*) &info); - } - __except (EXCEPTION_CONTINUE_EXECUTION) - {} - #else - (void) name; - #endif -} - -Thread::ThreadID Thread::getCurrentThreadId() -{ - return (ThreadID) (pointer_sized_int) GetCurrentThreadId(); -} - -bool Thread::setThreadPriority (void* handle, int priority) -{ - int pri = THREAD_PRIORITY_TIME_CRITICAL; - - if (priority < 1) pri = THREAD_PRIORITY_IDLE; - else if (priority < 2) pri = THREAD_PRIORITY_LOWEST; - else if (priority < 5) pri = THREAD_PRIORITY_BELOW_NORMAL; - else if (priority < 7) pri = THREAD_PRIORITY_NORMAL; - else if (priority < 9) pri = THREAD_PRIORITY_ABOVE_NORMAL; - else if (priority < 10) pri = THREAD_PRIORITY_HIGHEST; - - if (handle == 0) - handle = GetCurrentThread(); - - return SetThreadPriority (handle, pri) != FALSE; -} - -void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) -{ - SetThreadAffinityMask (GetCurrentThread(), affinityMask); -} - -//============================================================================== -struct SleepEvent -{ - SleepEvent() noexcept - : handle (CreateEvent (nullptr, FALSE, FALSE, - #if BEAST_DEBUG - _T("BEAST Sleep Event"))) - #else - nullptr)) - #endif - {} - - ~SleepEvent() noexcept - { - CloseHandle (handle); - handle = 0; - } - - HANDLE handle; -}; - -static SleepEvent sleepEvent; - -void BEAST_CALLTYPE Thread::sleep (const int millisecs) -{ - if (millisecs >= 10 || sleepEvent.handle == 0) - { - Sleep ((DWORD) millisecs); - } - else - { - // unlike Sleep() this is guaranteed to return to the current thread after - // the time expires, so we'll use this for short waits, which are more likely - // to need to be accurate - WaitForSingleObject (sleepEvent.handle, (DWORD) millisecs); - } -} - -void Thread::yield() -{ - Sleep (0); -} - -//============================================================================== -static int lastProcessPriority = -1; - -// called by WindowDriver because Windows does weird things to process priority -// when you swap apps, and this forces an update when the app is brought to the front. -void beast_repeatLastProcessPriority() -{ - if (lastProcessPriority >= 0) // (avoid changing this if it's not been explicitly set by the app..) - { - DWORD p; - - switch (lastProcessPriority) - { - case Process::LowPriority: p = IDLE_PRIORITY_CLASS; break; - case Process::NormalPriority: p = NORMAL_PRIORITY_CLASS; break; - case Process::HighPriority: p = HIGH_PRIORITY_CLASS; break; - case Process::RealtimePriority: p = REALTIME_PRIORITY_CLASS; break; - default: bassertfalse; return; // bad priority value - } - - SetPriorityClass (GetCurrentProcess(), p); - } -} - -void Process::setPriority (ProcessPriority prior) -{ - if (lastProcessPriority != (int) prior) - { - lastProcessPriority = (int) prior; - beast_repeatLastProcessPriority(); - } -} - -BEAST_API bool BEAST_CALLTYPE beast_isRunningUnderDebugger() -{ - return IsDebuggerPresent() != FALSE; -} - -bool BEAST_CALLTYPE Process::isRunningUnderDebugger() -{ - return beast_isRunningUnderDebugger(); -} - -static void* currentModuleHandle = nullptr; - -void* Process::getCurrentModuleInstanceHandle() noexcept -{ - if (currentModuleHandle == nullptr) - currentModuleHandle = GetModuleHandleA (nullptr); - - return currentModuleHandle; -} - -void Process::setCurrentModuleInstanceHandle (void* const newHandle) noexcept -{ - currentModuleHandle = newHandle; -} - -void Process::raisePrivilege() -{ - bassertfalse; // xxx not implemented -} - -void Process::lowerPrivilege() -{ - bassertfalse; // xxx not implemented -} - -void Process::terminate() -{ - #if BEAST_MSVC && BEAST_CHECK_MEMORY_LEAKS - _CrtDumpMemoryLeaks(); - #endif - - // bullet in the head in case there's a problem shutting down.. - ExitProcess (0); -} - -bool beast_isRunningInWine() -{ - HMODULE ntdll = GetModuleHandleA ("ntdll"); - return ntdll != 0 && GetProcAddress (ntdll, "wine_get_version") != nullptr; -} - -//============================================================================== -bool DynamicLibrary::open (const String& name) -{ - close(); - - BEAST_TRY - { - handle = LoadLibrary (name.toWideCharPointer()); - } - BEAST_CATCH_ALL - - return handle != nullptr; -} - -void DynamicLibrary::close() -{ - BEAST_TRY - { - if (handle != nullptr) - { - FreeLibrary ((HMODULE) handle); - handle = nullptr; - } - } - BEAST_CATCH_ALL -} - -void* DynamicLibrary::getFunction (const String& functionName) noexcept -{ - return handle != nullptr ? (void*) GetProcAddress ((HMODULE) handle, functionName.toUTF8()) // (void* cast is required for mingw) - : nullptr; -} - - -//============================================================================== -class InterProcessLock::Pimpl -{ -public: - Pimpl (String name, const int timeOutMillisecs) - : handle (0), refCount (1) - { - name = name.replaceCharacter ('\\', '/'); - handle = CreateMutexW (0, TRUE, ("Global\\" + name).toWideCharPointer()); - - // Not 100% sure why a global mutex sometimes can't be allocated, but if it fails, fall back to - // a local one. (A local one also sometimes fails on other machines so neither type appears to be - // universally reliable) - if (handle == 0) - handle = CreateMutexW (0, TRUE, ("Local\\" + name).toWideCharPointer()); - - if (handle != 0 && GetLastError() == ERROR_ALREADY_EXISTS) - { - if (timeOutMillisecs == 0) - { - close(); - return; - } - - switch (WaitForSingleObject (handle, timeOutMillisecs < 0 ? INFINITE : timeOutMillisecs)) - { - case WAIT_OBJECT_0: - case WAIT_ABANDONED: - break; - - case WAIT_TIMEOUT: - default: - close(); - break; - } - } - } - - ~Pimpl() - { - close(); - } - - void close() - { - if (handle != 0) - { - ReleaseMutex (handle); - CloseHandle (handle); - handle = 0; - } - } - - HANDLE handle; - int refCount; -}; - -InterProcessLock::InterProcessLock (const String& name_) - : name (name_) -{ -} - -InterProcessLock::~InterProcessLock() -{ -} - -bool InterProcessLock::enter (const int timeOutMillisecs) -{ - const ScopedLock sl (lock); - - if (pimpl == nullptr) - { - pimpl = new Pimpl (name, timeOutMillisecs); - - if (pimpl->handle == 0) - pimpl = nullptr; - } - else - { - pimpl->refCount++; - } - - return pimpl != nullptr; -} - -void InterProcessLock::exit() -{ - const ScopedLock sl (lock); - - // Trying to release the lock too many times! - bassert (pimpl != nullptr); - - if (pimpl != nullptr && --(pimpl->refCount) == 0) - pimpl = nullptr; -} - -//============================================================================== -class ChildProcess::ActiveProcess -{ -public: - ActiveProcess (const String& command) - : ok (false), readPipe (0), writePipe (0) - { - SECURITY_ATTRIBUTES securityAtts = { 0 }; - securityAtts.nLength = sizeof (securityAtts); - securityAtts.bInheritHandle = TRUE; - - if (CreatePipe (&readPipe, &writePipe, &securityAtts, 0) - && SetHandleInformation (readPipe, HANDLE_FLAG_INHERIT, 0)) - { - STARTUPINFOW startupInfo = { 0 }; - startupInfo.cb = sizeof (startupInfo); - startupInfo.hStdError = writePipe; - startupInfo.hStdOutput = writePipe; - startupInfo.dwFlags = STARTF_USESTDHANDLES; - - ok = CreateProcess (nullptr, const_cast (command.toWideCharPointer()), - nullptr, nullptr, TRUE, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, - nullptr, nullptr, &startupInfo, &processInfo) != FALSE; - } - } - - ~ActiveProcess() - { - if (ok) - { - CloseHandle (processInfo.hThread); - CloseHandle (processInfo.hProcess); - } - - if (readPipe != 0) - CloseHandle (readPipe); - - if (writePipe != 0) - CloseHandle (writePipe); - } - - bool isRunning() const - { - return WaitForSingleObject (processInfo.hProcess, 0) != WAIT_OBJECT_0; - } - - int read (void* dest, int numNeeded) const - { - int total = 0; - - while (ok && numNeeded > 0) - { - DWORD available = 0; - - if (! PeekNamedPipe ((HANDLE) readPipe, nullptr, 0, nullptr, &available, nullptr)) - break; - - const int numToDo = bmin ((int) available, numNeeded); - - if (available == 0) - { - if (! isRunning()) - break; - - Thread::yield(); - } - else - { - DWORD numRead = 0; - if (! ReadFile ((HANDLE) readPipe, dest, numToDo, &numRead, nullptr)) - break; - - total += numRead; - dest = addBytesToPointer (dest, numRead); - numNeeded -= numRead; - } - } - - return total; - } - - bool killProcess() const - { - return TerminateProcess (processInfo.hProcess, 0) != FALSE; - } - - bool ok; - -private: - HANDLE readPipe, writePipe; - PROCESS_INFORMATION processInfo; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess) -}; - -bool ChildProcess::start (const String& command) -{ - activeProcess = new ActiveProcess (command); - - if (! activeProcess->ok) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -bool ChildProcess::start (const StringArray& args) -{ - return start (args.joinIntoString (" ")); -} - -bool ChildProcess::isRunning() const -{ - return activeProcess != nullptr && activeProcess->isRunning(); -} - -int ChildProcess::readProcessOutput (void* dest, int numBytes) -{ - return activeProcess != nullptr ? activeProcess->read (dest, numBytes) : 0; -} - -bool ChildProcess::kill() -{ - return activeProcess == nullptr || activeProcess->killProcess(); -} - -//============================================================================== -struct HighResolutionTimer::Pimpl -{ - Pimpl (HighResolutionTimer& t) noexcept : owner (t), periodMs (0) - { - } - - ~Pimpl() - { - bassert (periodMs == 0); - } - - void start (int newPeriod) - { - if (newPeriod != periodMs) - { - stop(); - periodMs = newPeriod; - - TIMECAPS tc; - if (timeGetDevCaps (&tc, sizeof (tc)) == TIMERR_NOERROR) - { - const int actualPeriod = blimit ((int) tc.wPeriodMin, (int) tc.wPeriodMax, newPeriod); - - timerID = timeSetEvent (actualPeriod, tc.wPeriodMin, callbackFunction, (DWORD_PTR) this, - TIME_PERIODIC | TIME_CALLBACK_FUNCTION | 0x100 /*TIME_KILL_SYNCHRONOUS*/); - } - } - } - - void stop() - { - periodMs = 0; - timeKillEvent (timerID); - } - - HighResolutionTimer& owner; - int periodMs; - -private: - unsigned int timerID; - - static void __stdcall callbackFunction (UINT, UINT, DWORD_PTR userInfo, DWORD_PTR, DWORD_PTR) - { - if (Pimpl* const timer = reinterpret_cast (userInfo)) - if (timer->periodMs != 0) - timer->owner.hiResTimerCallback(); - } - - BEAST_DECLARE_NON_COPYABLE (Pimpl) -}; diff --git a/Subtrees/beast/modules/beast_core/native/java/BeastAppActivity.java b/Subtrees/beast/modules/beast_core/native/java/BeastAppActivity.java deleted file mode 100644 index 000871b0ee..0000000000 --- a/Subtrees/beast/modules/beast_core/native/java/BeastAppActivity.java +++ /dev/null @@ -1,697 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -package com.beast; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.net.Uri; -import android.os.Bundle; -import android.view.*; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; -import android.graphics.*; -import android.opengl.*; -import android.text.ClipboardManager; -import android.text.InputType; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.net.HttpURLConnection; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; -import android.media.MediaScannerConnection; -import android.media.MediaScannerConnection.MediaScannerConnectionClient; - -//============================================================================== -public final class BeastAppActivity extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("beast_jni"); - } - - @Override - public final void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - - setVolumeControlStream (AudioManager.STREAM_MUSIC); - } - - @Override - protected final void onDestroy() - { - quitApp(); - super.onDestroy(); - } - - @Override - protected final void onPause() - { - if (viewHolder != null) - viewHolder.onPause(); - - suspendApp(); - super.onPause(); - } - - @Override - protected final void onResume() - { - super.onResume(); - - if (viewHolder != null) - viewHolder.onResume(); - - resumeApp(); - } - - @Override - public void onConfigurationChanged (Configuration cfg) - { - super.onConfigurationChanged (cfg); - setContentView (viewHolder); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void suspendApp(); - private native void resumeApp(); - private native void setScreenSize (int screenWidth, int screenHeight); - - //============================================================================== - public native void deliverMessage (long value); - private android.os.Handler messageHandler = new android.os.Handler(); - - public final void postMessage (long value) - { - messageHandler.post (new MessageCallback (value)); - } - - private final class MessageCallback implements Runnable - { - public MessageCallback (long value_) { value = value_; } - public final void run() { deliverMessage (value); } - - private long value; - } - - //============================================================================== - private ViewHolder viewHolder; - - public final ComponentPeerView createNewView (boolean opaque) - { - ComponentPeerView v = new ComponentPeerView (this, opaque); - viewHolder.addView (v); - return v; - } - - public final void deleteView (ComponentPeerView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - final class ViewHolder extends ViewGroup - { - public ViewHolder (Context context) - { - super (context); - setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); - setFocusable (false); - } - - protected final void onLayout (boolean changed, int left, int top, int right, int bottom) - { - setScreenSize (getWidth(), getHeight()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - public final void onPause() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof ComponentPeerView) - ((ComponentPeerView) v).onPause(); - } - } - - public final void onResume() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof ComponentPeerView) - ((ComponentPeerView) v).onResume(); - } - } - - private boolean isFirstResize = true; - } - - public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom) - { - canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE); - } - - //============================================================================== - public final String getClipboardContent() - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - return clipboard.getText().toString(); - } - - public final void setClipboardContent (String newText) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - clipboard.setText (newText); - } - - //============================================================================== - public final void showMessageBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showOkCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showYesNoCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("Yes", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("No", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 2); - } - }) - .setNeutralButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - BeastAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public native void alertDismissed (long callback, int id); - - //============================================================================== - public final class ComponentPeerView extends ViewGroup - implements View.OnFocusChangeListener - { - public ComponentPeerView (Context context, boolean opaque_) - { - super (context); - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - requestFocus(); - } - - //============================================================================== - private native void handlePaint (Canvas canvas); - - @Override - public void draw (Canvas canvas) - { - super.draw (canvas); - handlePaint (canvas); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - - //============================================================================== - private native void handleMouseDown (int index, float x, float y, long time); - private native void handleMouseDrag (int index, float x, float y, long time); - private native void handleMouseUp (int index, float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - int action = event.getAction(); - long time = event.getEventTime(); - - switch (action & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - handleMouseDown (event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - handleMouseUp (event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_MOVE: - { - int n = event.getPointerCount(); - for (int i = 0; i < n; ++i) - handleMouseDrag (event.getPointerId(i), event.getX(i), event.getY(i), time); - - return true; - } - - case MotionEvent.ACTION_POINTER_UP: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseUp (event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - case MotionEvent.ACTION_POINTER_DOWN: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseDown (event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - default: - break; - } - - return false; - } - - //============================================================================== - private native void handleKeyDown (int keycode, int textchar); - private native void handleKeyUp (int keycode, int textchar); - - public void showKeyboard (boolean shouldShow) - { - InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) - { - if (shouldShow) - imm.showSoftInput (this, InputMethodManager.SHOW_FORCED); - else - imm.hideSoftInputFromWindow (getWindowToken(), 0); - } - } - - @Override - public boolean onKeyDown (int keyCode, KeyEvent event) - { - handleKeyDown (keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyUp (int keyCode, KeyEvent event) - { - handleKeyUp (keyCode, event.getUnicodeChar()); - return true; - } - - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 - @Override - public InputConnection onCreateInputConnection (EditorInfo outAttrs) - { - outAttrs.actionLabel = ""; - outAttrs.hintText = ""; - outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; - outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged(); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - for (int i = getChildCount(); --i >= 0;) - requestTransparentRegion (getChildAt (i)); - } - - private native void viewSizeChanged(); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (v == this) - focusChanged (hasFocus); - } - - private native void focusChanged (boolean hasFocus); - - public void setViewName (String newName) {} - - public boolean isVisible() { return getVisibility() == VISIBLE; } - public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); } - - public boolean containsPoint (int x, int y) - { - return true; //xxx needs to check overlapping views - } - - public final void onPause() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof OpenGLView) - ((OpenGLView) v).onPause(); - } - } - - public final void onResume() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof OpenGLView) - ((OpenGLView) v).onResume(); - } - } - - public OpenGLView createGLView() - { - OpenGLView glView = new OpenGLView (getContext()); - addView (glView); - return glView; - } - } - - //============================================================================== - public final class OpenGLView extends GLSurfaceView - implements GLSurfaceView.Renderer - { - OpenGLView (Context context) - { - super (context); - setEGLContextClientVersion (2); - setRenderer (this); - setRenderMode (RENDERMODE_WHEN_DIRTY); - } - - @Override - public void onSurfaceCreated (GL10 unused, EGLConfig config) - { - contextCreated(); - } - - @Override - public void onSurfaceChanged (GL10 unused, int width, int height) - { - contextChangedSize(); - } - - @Override - public void onDrawFrame (GL10 unused) - { - render(); - } - - private native void contextCreated(); - private native void contextChangedSize(); - private native void render(); - } - - //============================================================================== - public final int[] renderGlyph (char glyph, Paint paint, android.graphics.Matrix matrix, Rect bounds) - { - Path p = new Path(); - paint.getTextPath (String.valueOf (glyph), 0, 1, 0.0f, 0.0f, p); - - RectF boundsF = new RectF(); - p.computeBounds (boundsF, true); - matrix.mapRect (boundsF); - - boundsF.roundOut (bounds); - bounds.left--; - bounds.right++; - - final int w = bounds.width(); - final int h = Math.max (1, bounds.height()); - - Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); - - Canvas c = new Canvas (bm); - matrix.postTranslate (-bounds.left, -bounds.top); - c.setMatrix (matrix); - c.drawPath (p, paint); - - final int sizeNeeded = w * h; - if (cachedRenderArray.length < sizeNeeded) - cachedRenderArray = new int [sizeNeeded]; - - bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h); - bm.recycle(); - return cachedRenderArray; - } - - private int[] cachedRenderArray = new int [256]; - - //============================================================================== - public static class HTTPStream - { - public HTTPStream (HttpURLConnection connection_) throws IOException - { - connection = connection_; - inputStream = new BufferedInputStream (connection.getInputStream()); - } - - public final void release() - { - try - { - inputStream.close(); - } - catch (IOException e) - {} - - connection.disconnect(); - } - - public final int read (byte[] buffer, int numBytes) - { - int num = 0; - - try - { - num = inputStream.read (buffer, 0, numBytes); - } - catch (IOException e) - {} - - if (num > 0) - position += num; - - return num; - } - - public final long getPosition() { return position; } - public final long getTotalLength() { return -1; } - public final boolean isExhausted() { return false; } - public final boolean setPosition (long newPos) { return false; } - - private HttpURLConnection connection; - private InputStream inputStream; - private long position; - } - - public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, - java.lang.StringBuffer responseHeaders) - { - try - { - HttpURLConnection connection = (HttpURLConnection) (new URL (address).openConnection()); - - if (connection != null) - { - try - { - if (isPost) - { - connection.setConnectTimeout (timeOutMs); - connection.setDoOutput (true); - connection.setChunkedStreamingMode (0); - - OutputStream out = connection.getOutputStream(); - out.write (postData); - out.flush(); - } - - return new HTTPStream (connection); - } - catch (Throwable e) - { - connection.disconnect(); - } - } - } - catch (Throwable e) - {} - - return null; - } - - public final void launchURL (String url) - { - startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url))); - } - - public static final String getLocaleValue (boolean isRegion) - { - java.util.Locale locale = java.util.Locale.getDefault(); - - return isRegion ? locale.getDisplayCountry (java.util.Locale.US) - : locale.getDisplayLanguage (java.util.Locale.US); - } - - //============================================================================== - private final class SingleMediaScanner implements MediaScannerConnectionClient - { - public SingleMediaScanner (Context context, String filename) - { - file = filename; - msc = new MediaScannerConnection (context, this); - msc.connect(); - } - - @Override - public void onMediaScannerConnected() - { - msc.scanFile (file, null); - } - - @Override - public void onScanCompleted (String path, Uri uri) - { - msc.disconnect(); - } - - private MediaScannerConnection msc; - private String file; - } - - public final void scanFile (String filename) - { - new SingleMediaScanner (this, filename); - } -} diff --git a/Subtrees/beast/modules/beast_core/network/beast_IPAddress.cpp b/Subtrees/beast/modules/beast_core/network/beast_IPAddress.cpp deleted file mode 100644 index 2a15c9315d..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_IPAddress.cpp +++ /dev/null @@ -1,144 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -IPAddress::IPAddress() noexcept -{ - address[0] = 0; address[1] = 0; - address[2] = 0; address[3] = 0; -} - -IPAddress::IPAddress (const uint8 bytes[4]) noexcept -{ - address[0] = bytes[0]; address[1] = bytes[1]; - address[2] = bytes[2]; address[3] = bytes[3]; -} - -IPAddress::IPAddress (uint8 a0, uint8 a1, uint8 a2, uint8 a3) noexcept -{ - address[0] = a0; address[1] = a1; - address[2] = a2; address[3] = a3; -} - -IPAddress::IPAddress (uint32 n) noexcept -{ - address[0] = (n >> 24); - address[1] = (n >> 16) & 255; - address[2] = (n >> 8) & 255; - address[3] = (n & 255); -} - -IPAddress::IPAddress (const String& adr) -{ - StringArray tokens; - tokens.addTokens (adr, ".", String::empty); - - for (int i = 0; i < 4; ++i) - address[i] = (uint8) tokens[i].getIntValue(); -} - -String IPAddress::toString() const -{ - String s ((int) address[0]); - - for (int i = 1; i < 4; ++i) - s << '.' << (int) address[i]; - - return s; -} - -IPAddress IPAddress::any() noexcept { return IPAddress(); } -IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); } -IPAddress IPAddress::local() noexcept { return IPAddress (127, 0, 0, 1); } - -bool IPAddress::operator== (const IPAddress& other) const noexcept -{ - return address[0] == other.address[0] - && address[1] == other.address[1] - && address[2] == other.address[2] - && address[3] == other.address[3]; -} - -bool IPAddress::operator!= (const IPAddress& other) const noexcept -{ - return ! operator== (other); -} - -#if ! BEAST_WINDOWS -static void addAddress (const sockaddr_in* addr_in, Array& result) -{ - in_addr_t addr = addr_in->sin_addr.s_addr; - - if (addr != INADDR_NONE) - result.addIfNotAlreadyThere (IPAddress (ntohl (addr))); -} - -static void findIPAddresses (int sock, Array& result) -{ - ifconf cfg; - HeapBlock buffer; - size_t bufferSize = 1024; - - do - { - bufferSize *= 2; - buffer.calloc (bufferSize); - - cfg.ifc_len = bufferSize; - cfg.ifc_buf = buffer; - - if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL) - return; - - } while (bufferSize < cfg.ifc_len + 2 * (IFNAMSIZ + sizeof (struct sockaddr_in6))); - - #if BEAST_MAC || BEAST_IOS - while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in))) - { - if (cfg.ifc_req->ifr_addr.sa_family == AF_INET) // Skip non-internet addresses - addAddress ((const sockaddr_in*) &cfg.ifc_req->ifr_addr, result); - - cfg.ifc_len -= IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - } - #else - for (int i = 0; i < cfg.ifc_len / sizeof (struct ifreq); ++i) - { - const ifreq& item = cfg.ifc_req[i]; - - if (item.ifr_addr.sa_family == AF_INET) - addAddress ((const sockaddr_in*) &item.ifr_addr, result); - } - #endif -} - -void IPAddress::findAllAddresses (Array& result) -{ - const int sock = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control - - if (sock >= 0) - { - findIPAddresses (sock, result); - ::close (sock); - } -} -#endif diff --git a/Subtrees/beast/modules/beast_core/network/beast_IPAddress.h b/Subtrees/beast/modules/beast_core/network/beast_IPAddress.h deleted file mode 100644 index 9232365d33..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_IPAddress.h +++ /dev/null @@ -1,77 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_IPADDRESS_BEASTHEADER -#define BEAST_IPADDRESS_BEASTHEADER - - -//============================================================================== -/** - An IPV4 address. -*/ -class BEAST_API IPAddress -{ -public: - //============================================================================== - /** Populates a list of all the IP addresses that this machine is using. */ - static void findAllAddresses (Array& results); - - //============================================================================== - /** Creates a null address (0.0.0.0). */ - IPAddress() noexcept; - - /** Creates an address from 4 bytes. */ - explicit IPAddress (const uint8 bytes[4]) noexcept; - - /** Creates an address from 4 bytes. */ - IPAddress (uint8 address1, uint8 address2, uint8 address3, uint8 address4) noexcept; - - /** Creates an address from a packed 32-bit integer, where the MSB is - the first number in the address, and the LSB is the last. - */ - explicit IPAddress (uint32 asNativeEndian32Bit) noexcept; - - /** Parses a string IP address of the form "a.b.c.d". */ - explicit IPAddress (const String& address); - - /** Returns a dot-separated string in the form "1.2.3.4" */ - String toString() const; - - /** Returns an address meaning "any" (0.0.0.0) */ - static IPAddress any() noexcept; - - /** Returns an address meaning "broadcast" (255.255.255.255) */ - static IPAddress broadcast() noexcept; - - /** Returns an address meaning "localhost" (127.0.0.1) */ - static IPAddress local() noexcept; - - bool operator== (const IPAddress& other) const noexcept; - bool operator!= (const IPAddress& other) const noexcept; - - /** The elements of the IP address. */ - uint8 address[4]; -}; - - -#endif // BEAST_IPADDRESS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/network/beast_MACAddress.cpp b/Subtrees/beast/modules/beast_core/network/beast_MACAddress.cpp deleted file mode 100644 index d9de043f76..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_MACAddress.cpp +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -MACAddress::MACAddress() -{ - zeromem (address, sizeof (address)); -} - -MACAddress::MACAddress (const MACAddress& other) -{ - memcpy (address, other.address, sizeof (address)); -} - -MACAddress& MACAddress::operator= (const MACAddress& other) -{ - memcpy (address, other.address, sizeof (address)); - return *this; -} - -MACAddress::MACAddress (const uint8 bytes[6]) -{ - memcpy (address, bytes, sizeof (address)); -} - -String MACAddress::toString() const -{ - String s; - - for (size_t i = 0; i < sizeof (address); ++i) - { - s << String::toHexString ((int) address[i]).paddedLeft ('0', 2); - - if (i < sizeof (address) - 1) - s << '-'; - } - - return s; -} - -int64 MACAddress::toInt64() const noexcept -{ - int64 n = 0; - - for (int i = (int) sizeof (address); --i >= 0;) - n = (n << 8) | address[i]; - - return n; -} - -bool MACAddress::isNull() const noexcept { return toInt64() == 0; } - -bool MACAddress::operator== (const MACAddress& other) const noexcept { return memcmp (address, other.address, sizeof (address)) == 0; } -bool MACAddress::operator!= (const MACAddress& other) const noexcept { return ! operator== (other); } diff --git a/Subtrees/beast/modules/beast_core/network/beast_MACAddress.h b/Subtrees/beast/modules/beast_core/network/beast_MACAddress.h deleted file mode 100644 index 6f9fb945f2..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_MACAddress.h +++ /dev/null @@ -1,84 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MACADDRESS_BEASTHEADER -#define BEAST_MACADDRESS_BEASTHEADER - -#include "../containers/beast_Array.h" - - -//============================================================================== -/** - A wrapper for a streaming (TCP) socket. - - This allows low-level use of sockets; for an easier-to-use messaging layer on top of - sockets, you could also try the InterprocessConnection class. - - @see DatagramSocket, InterprocessConnection, InterprocessConnectionServer -*/ -class BEAST_API MACAddress -{ -public: - //============================================================================== - /** Populates a list of the MAC addresses of all the available network cards. */ - static void findAllAddresses (Array& results); - - //============================================================================== - /** Creates a null address (00-00-00-00-00-00). */ - MACAddress(); - - /** Creates a copy of another address. */ - MACAddress (const MACAddress& other); - - /** Creates a copy of another address. */ - MACAddress& operator= (const MACAddress& other); - - /** Creates an address from 6 bytes. */ - explicit MACAddress (const uint8 bytes[6]); - - /** Returns a pointer to the 6 bytes that make up this address. */ - const uint8* getBytes() const noexcept { return address; } - - /** Returns a dash-separated string in the form "11-22-33-44-55-66" */ - String toString() const; - - /** Returns the address in the lower 6 bytes of an int64. - - This uses a little-endian arrangement, with the first byte of the address being - stored in the least-significant byte of the result value. - */ - int64 toInt64() const noexcept; - - /** Returns true if this address is null (00-00-00-00-00-00). */ - bool isNull() const noexcept; - - bool operator== (const MACAddress& other) const noexcept; - bool operator!= (const MACAddress& other) const noexcept; - - //============================================================================== -private: - uint8 address[6]; -}; - - -#endif // BEAST_MACADDRESS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.cpp b/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.cpp deleted file mode 100644 index c46cae3b7d..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.cpp +++ /dev/null @@ -1,61 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -NamedPipe::NamedPipe() -{ -} - -NamedPipe::~NamedPipe() -{ - close(); -} - -bool NamedPipe::openExisting (const String& pipeName) -{ - close(); - - ScopedWriteLock sl (lock); - currentPipeName = pipeName; - return openInternal (pipeName, false); -} - -bool NamedPipe::isOpen() const -{ - return pimpl != nullptr; -} - -bool NamedPipe::createNewPipe (const String& pipeName) -{ - close(); - - ScopedWriteLock sl (lock); - currentPipeName = pipeName; - return openInternal (pipeName, true); -} - -String NamedPipe::getName() const -{ - return currentPipeName; -} - -// other methods for this class are implemented in the platform-specific files diff --git a/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.h b/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.h deleted file mode 100644 index ae9c24c5ff..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_NamedPipe.h +++ /dev/null @@ -1,100 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_NAMEDPIPE_BEASTHEADER -#define BEAST_NAMEDPIPE_BEASTHEADER - -#include "../threads/beast_ReadWriteLock.h" - -//============================================================================== -/** - A cross-process pipe that can have data written to and read from it. - - Two processes can use NamedPipe objects to exchange blocks of data. - - @see InterprocessConnection -*/ -class BEAST_API NamedPipe -{ -public: - //============================================================================== - /** Creates a NamedPipe. */ - NamedPipe(); - - /** Destructor. */ - ~NamedPipe(); - - //============================================================================== - /** Tries to open a pipe that already exists. - Returns true if it succeeds. - */ - bool openExisting (const String& pipeName); - - /** Tries to create a new pipe. - Returns true if it succeeds. - */ - bool createNewPipe (const String& pipeName); - - /** Closes the pipe, if it's open. */ - void close(); - - /** True if the pipe is currently open. */ - bool isOpen() const; - - /** Returns the last name that was used to try to open this pipe. */ - String getName() const; - - //============================================================================== - /** Reads data from the pipe. - - This will block until another thread has written enough data into the pipe to fill - the number of bytes specified, or until another thread calls the cancelPendingReads() - method. - - If the operation fails, it returns -1, otherwise, it will return the number of - bytes read. - - If timeOutMilliseconds is less than zero, it will wait indefinitely, otherwise - this is a maximum timeout for reading from the pipe. - */ - int read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds); - - /** Writes some data to the pipe. - @returns the number of bytes written, or -1 on failure. - */ - int write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds); - -private: - //============================================================================== - BEAST_PUBLIC_IN_DLL_BUILD (class Pimpl) - ScopedPointer pimpl; - String currentPipeName; - ReadWriteLock lock; - - bool openInternal (const String& pipeName, const bool createPipe); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NamedPipe) -}; - - -#endif // BEAST_NAMEDPIPE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/network/beast_Socket.cpp b/Subtrees/beast/modules/beast_core/network/beast_Socket.cpp deleted file mode 100644 index 30013e06a0..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_Socket.cpp +++ /dev/null @@ -1,585 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable : 4127 4389 4018) -#endif - -#ifndef AI_NUMERICSERV // (missing in older Mac SDKs) - #define AI_NUMERICSERV 0x1000 -#endif - -#if BEAST_WINDOWS - typedef int beast_socklen_t; - typedef SOCKET SocketHandle; -#else - typedef socklen_t beast_socklen_t; - typedef int SocketHandle; -#endif - -//============================================================================== -namespace SocketHelpers -{ - static void initSockets() - { - #if BEAST_WINDOWS - static bool socketsStarted = false; - - if (! socketsStarted) - { - socketsStarted = true; - - WSADATA wsaData; - const WORD wVersionRequested = MAKEWORD (1, 1); - WSAStartup (wVersionRequested, &wsaData); - } - #endif - } - - static bool resetSocketOptions (const SocketHandle handle, const bool isDatagram, const bool allowBroadcast) noexcept - { - const int sndBufSize = 65536; - const int rcvBufSize = 65536; - const int one = 1; - - return handle > 0 - && setsockopt (handle, SOL_SOCKET, SO_RCVBUF, (const char*) &rcvBufSize, sizeof (rcvBufSize)) == 0 - && setsockopt (handle, SOL_SOCKET, SO_SNDBUF, (const char*) &sndBufSize, sizeof (sndBufSize)) == 0 - && (isDatagram ? ((! allowBroadcast) || setsockopt (handle, SOL_SOCKET, SO_BROADCAST, (const char*) &one, sizeof (one)) == 0) - : (setsockopt (handle, IPPROTO_TCP, TCP_NODELAY, (const char*) &one, sizeof (one)) == 0)); - } - - static bool bindSocketToPort (const SocketHandle handle, const int port) noexcept - { - if (handle <= 0 || port <= 0) - return false; - - struct sockaddr_in servTmpAddr; - zerostruct (servTmpAddr); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - servTmpAddr.sin_family = PF_INET; - servTmpAddr.sin_addr.s_addr = htonl (INADDR_ANY); - servTmpAddr.sin_port = htons ((uint16) port); - - return bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) >= 0; - } - - static int readSocket (const SocketHandle handle, - void* const destBuffer, const int maxBytesToRead, - bool volatile& connected, - const bool blockUntilSpecifiedAmountHasArrived) noexcept - { - int bytesRead = 0; - - while (bytesRead < maxBytesToRead) - { - int bytesThisTime; - - #if BEAST_WINDOWS - bytesThisTime = recv (handle, static_cast (destBuffer) + bytesRead, maxBytesToRead - bytesRead, 0); - #else - while ((bytesThisTime = (int) ::read (handle, addBytesToPointer (destBuffer, bytesRead), (size_t) (maxBytesToRead - bytesRead))) < 0 - && errno == EINTR - && connected) - { - } - #endif - - if (bytesThisTime <= 0 || ! connected) - { - if (bytesRead == 0) - bytesRead = -1; - - break; - } - - bytesRead += bytesThisTime; - - if (! blockUntilSpecifiedAmountHasArrived) - break; - } - - return bytesRead; - } - - static int waitForReadiness (const SocketHandle handle, const bool forReading, const int timeoutMsecs) noexcept - { - struct timeval timeout; - struct timeval* timeoutp; - - if (timeoutMsecs >= 0) - { - timeout.tv_sec = timeoutMsecs / 1000; - timeout.tv_usec = (timeoutMsecs % 1000) * 1000; - timeoutp = &timeout; - } - else - { - timeoutp = 0; - } - - fd_set rset, wset; - FD_ZERO (&rset); - FD_SET (handle, &rset); - FD_ZERO (&wset); - FD_SET (handle, &wset); - - fd_set* const prset = forReading ? &rset : nullptr; - fd_set* const pwset = forReading ? nullptr : &wset; - - #if BEAST_WINDOWS - if (select ((int) handle + 1, prset, pwset, 0, timeoutp) < 0) - return -1; - #else - { - int result; - while ((result = select (handle + 1, prset, pwset, 0, timeoutp)) < 0 - && errno == EINTR) - { - } - - if (result < 0) - return -1; - } - #endif - - { - int opt; - beast_socklen_t len = sizeof (opt); - - if (getsockopt (handle, SOL_SOCKET, SO_ERROR, (char*) &opt, &len) < 0 - || opt != 0) - return -1; - } - - return FD_ISSET (handle, forReading ? &rset : &wset) ? 1 : 0; - } - - static bool setSocketBlockingState (const SocketHandle handle, const bool shouldBlock) noexcept - { - #if BEAST_WINDOWS - u_long nonBlocking = shouldBlock ? 0 : (u_long) 1; - return ioctlsocket (handle, FIONBIO, &nonBlocking) == 0; - #else - int socketFlags = fcntl (handle, F_GETFL, 0); - - if (socketFlags == -1) - return false; - - if (shouldBlock) - socketFlags &= ~O_NONBLOCK; - else - socketFlags |= O_NONBLOCK; - - return fcntl (handle, F_SETFL, socketFlags) == 0; - #endif - } - - static bool connectSocket (int volatile& handle, - const bool isDatagram, - struct addrinfo** const serverAddress, - const String& hostName, - const int portNumber, - const int timeOutMillisecs) noexcept - { - struct addrinfo hints; - zerostruct (hints); - - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = isDatagram ? SOCK_DGRAM : SOCK_STREAM; - hints.ai_flags = AI_NUMERICSERV; - - struct addrinfo* info = nullptr; - if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) != 0 - || info == nullptr) - return false; - - if (handle < 0) - handle = (int) socket (info->ai_family, info->ai_socktype, 0); - - if (handle < 0) - { - freeaddrinfo (info); - return false; - } - - if (isDatagram) - { - if (*serverAddress != nullptr) - freeaddrinfo (*serverAddress); - - *serverAddress = info; - return true; - } - - setSocketBlockingState (handle, false); - const int result = ::connect (handle, info->ai_addr, (socklen_t) info->ai_addrlen); - freeaddrinfo (info); - - if (result < 0) - { - #if BEAST_WINDOWS - if (result == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) - #else - if (errno == EINPROGRESS) - #endif - { - if (waitForReadiness (handle, false, timeOutMillisecs) != 1) - { - setSocketBlockingState (handle, true); - return false; - } - } - } - - setSocketBlockingState (handle, true); - resetSocketOptions (handle, false, false); - - return true; - } -} - -//============================================================================== -StreamingSocket::StreamingSocket() - : portNumber (0), - handle (-1), - connected (false), - isListener (false) -{ - SocketHelpers::initSockets(); -} - -StreamingSocket::StreamingSocket (const String& hostName_, - const int portNumber_, - const int handle_) - : hostName (hostName_), - portNumber (portNumber_), - handle (handle_), - connected (true), - isListener (false) -{ - SocketHelpers::initSockets(); - SocketHelpers::resetSocketOptions (handle_, false, false); -} - -StreamingSocket::~StreamingSocket() -{ - close(); -} - -//============================================================================== -int StreamingSocket::read (void* destBuffer, const int maxBytesToRead, const bool blockUntilSpecifiedAmountHasArrived) -{ - return (connected && ! isListener) ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, connected, blockUntilSpecifiedAmountHasArrived) - : -1; -} - -int StreamingSocket::write (const void* sourceBuffer, const int numBytesToWrite) -{ - if (isListener || ! connected) - return -1; - - #if BEAST_WINDOWS - return send (handle, (const char*) sourceBuffer, numBytesToWrite, 0); - #else - int result; - - while ((result = (int) ::write (handle, sourceBuffer, (size_t) numBytesToWrite)) < 0 - && errno == EINTR) - { - } - - return result; - #endif -} - -//============================================================================== -int StreamingSocket::waitUntilReady (const bool readyForReading, - const int timeoutMsecs) const -{ - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) - : -1; -} - -//============================================================================== -bool StreamingSocket::bindToPort (const int port) -{ - return SocketHelpers::bindSocketToPort (handle, port); -} - -bool StreamingSocket::connect (const String& remoteHostName, - const int remotePortNumber, - const int timeOutMillisecs) -{ - if (isListener) - { - bassertfalse; // a listener socket can't connect to another one! - return false; - } - - if (connected) - close(); - - hostName = remoteHostName; - portNumber = remotePortNumber; - isListener = false; - - connected = SocketHelpers::connectSocket (handle, false, nullptr, remoteHostName, - remotePortNumber, timeOutMillisecs); - - if (! (connected && SocketHelpers::resetSocketOptions (handle, false, false))) - { - close(); - return false; - } - - return true; -} - -void StreamingSocket::close() -{ - #if BEAST_WINDOWS - if (handle != SOCKET_ERROR || connected) - closesocket (handle); - - connected = false; - #else - if (connected) - { - connected = false; - - if (isListener) - { - // need to do this to interrupt the accept() function.. - StreamingSocket temp; - temp.connect ("localhost", portNumber, 1000); - } - } - - if (handle != -1) - ::close (handle); - #endif - - hostName = String::empty; - portNumber = 0; - handle = -1; - isListener = false; -} - -//============================================================================== -bool StreamingSocket::createListener (const int newPortNumber, const String& localHostName) -{ - if (connected) - close(); - - hostName = "listener"; - portNumber = newPortNumber; - isListener = true; - - struct sockaddr_in servTmpAddr; - zerostruct (servTmpAddr); - - servTmpAddr.sin_family = PF_INET; - servTmpAddr.sin_addr.s_addr = htonl (INADDR_ANY); - - if (localHostName.isNotEmpty()) - servTmpAddr.sin_addr.s_addr = ::inet_addr (localHostName.toUTF8()); - - servTmpAddr.sin_port = htons ((uint16) portNumber); - - handle = (int) socket (AF_INET, SOCK_STREAM, 0); - - if (handle < 0) - return false; - - const int reuse = 1; - setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse)); - - if (bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) < 0 - || listen (handle, SOMAXCONN) < 0) - { - close(); - return false; - } - - connected = true; - return true; -} - -StreamingSocket* StreamingSocket::waitForNextConnection() const -{ - bassert (isListener || ! connected); // to call this method, you first have to use createListener() to - // prepare this socket as a listener. - - if (connected && isListener) - { - struct sockaddr_storage address; - beast_socklen_t len = sizeof (address); - const int newSocket = (int) accept (handle, (struct sockaddr*) &address, &len); - - if (newSocket >= 0 && connected) - return new StreamingSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), - portNumber, newSocket); - } - - return nullptr; -} - -bool StreamingSocket::isLocal() const noexcept -{ - return hostName == "127.0.0.1"; -} - - -//============================================================================== -//============================================================================== -DatagramSocket::DatagramSocket (const int localPortNumber, const bool allowBroadcast_) - : portNumber (0), - handle (-1), - connected (true), - allowBroadcast (allowBroadcast_), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - handle = (int) socket (AF_INET, SOCK_DGRAM, 0); - bindToPort (localPortNumber); -} - -DatagramSocket::DatagramSocket (const String& hostName_, const int portNumber_, - const int handle_, const int localPortNumber) - : hostName (hostName_), - portNumber (portNumber_), - handle (handle_), - connected (true), - allowBroadcast (false), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - SocketHelpers::resetSocketOptions (handle_, true, allowBroadcast); - bindToPort (localPortNumber); -} - -DatagramSocket::~DatagramSocket() -{ - close(); - - if (serverAddress != nullptr) - freeaddrinfo (static_cast (serverAddress)); -} - -void DatagramSocket::close() -{ - #if BEAST_WINDOWS - closesocket (handle); - connected = false; - #else - connected = false; - ::close (handle); - #endif - - hostName = String::empty; - portNumber = 0; - handle = -1; -} - -bool DatagramSocket::bindToPort (const int port) -{ - return SocketHelpers::bindSocketToPort (handle, port); -} - -bool DatagramSocket::connect (const String& remoteHostName, - const int remotePortNumber, - const int timeOutMillisecs) -{ - if (connected) - close(); - - hostName = remoteHostName; - portNumber = remotePortNumber; - - connected = SocketHelpers::connectSocket (handle, true, (struct addrinfo**) &serverAddress, - remoteHostName, remotePortNumber, - timeOutMillisecs); - - if (! (connected && SocketHelpers::resetSocketOptions (handle, true, allowBroadcast))) - { - close(); - return false; - } - - return true; -} - -DatagramSocket* DatagramSocket::waitForNextConnection() const -{ - while (waitUntilReady (true, -1) == 1) - { - struct sockaddr_storage address; - beast_socklen_t len = sizeof (address); - char buf[1]; - - if (recvfrom (handle, buf, 0, 0, (struct sockaddr*) &address, &len) > 0) - return new DatagramSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), - ntohs (((struct sockaddr_in*) &address)->sin_port), - -1, -1); - } - - return nullptr; -} - -//============================================================================== -int DatagramSocket::waitUntilReady (const bool readyForReading, - const int timeoutMsecs) const -{ - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) - : -1; -} - -int DatagramSocket::read (void* destBuffer, const int maxBytesToRead, const bool blockUntilSpecifiedAmountHasArrived) -{ - return connected ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, connected, blockUntilSpecifiedAmountHasArrived) - : -1; -} - -int DatagramSocket::write (const void* sourceBuffer, const int numBytesToWrite) -{ - // You need to call connect() first to set the server address.. - bassert (serverAddress != nullptr && connected); - - return connected ? (int) sendto (handle, (const char*) sourceBuffer, - (size_t) numBytesToWrite, 0, - static_cast (serverAddress)->ai_addr, - (beast_socklen_t) static_cast (serverAddress)->ai_addrlen) - : -1; -} - -bool DatagramSocket::isLocal() const noexcept -{ - return hostName == "127.0.0.1"; -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif diff --git a/Subtrees/beast/modules/beast_core/network/beast_Socket.h b/Subtrees/beast/modules/beast_core/network/beast_Socket.h deleted file mode 100644 index 91db75fe83..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_Socket.h +++ /dev/null @@ -1,302 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SOCKET_BEASTHEADER -#define BEAST_SOCKET_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** - A wrapper for a streaming (TCP) socket. - - This allows low-level use of sockets; for an easier-to-use messaging layer on top of - sockets, you could also try the InterprocessConnection class. - - @see DatagramSocket, InterprocessConnection, InterprocessConnectionServer -*/ -class BEAST_API StreamingSocket -{ -public: - //============================================================================== - /** Creates an uninitialised socket. - - To connect it, use the connect() method, after which you can read() or write() - to it. - - To wait for other sockets to connect to this one, the createListener() method - enters "listener" mode, and can be used to spawn new sockets for each connection - that comes along. - */ - StreamingSocket(); - - /** Destructor. */ - ~StreamingSocket(); - - //============================================================================== - /** Binds the socket to the specified local port. - - @returns true on success; false may indicate that another socket is already bound - on the same port - */ - bool bindToPort (int localPortNumber); - - /** Tries to connect the socket to hostname:port. - - If timeOutMillisecs is 0, then this method will block until the operating system - rejects the connection (which could take a long time). - - @returns true if it succeeds. - @see isConnected - */ - bool connect (const String& remoteHostname, - int remotePortNumber, - int timeOutMillisecs = 3000); - - /** True if the socket is currently connected. */ - bool isConnected() const noexcept { return connected; } - - /** Closes the connection. */ - void close(); - - /** Returns the name of the currently connected host. */ - const String& getHostName() const noexcept { return hostName; } - - /** Returns the port number that's currently open. */ - int getPort() const noexcept { return portNumber; } - - /** True if the socket is connected to this machine rather than over the network. */ - bool isLocal() const noexcept; - - /** Returns the OS's socket handle that's currently open. */ - int getRawSocketHandle() const noexcept { return handle; } - - //============================================================================== - /** Waits until the socket is ready for reading or writing. - - If readyForReading is true, it will wait until the socket is ready for - reading; if false, it will wait until it's ready for writing. - - If the timeout is < 0, it will wait forever, or else will give up after - the specified time. - - If the socket is ready on return, this returns 1. If it times-out before - the socket becomes ready, it returns 0. If an error occurs, it returns -1. - */ - int waitUntilReady (bool readyForReading, - int timeoutMsecs) const; - - /** Reads bytes from the socket. - - If blockUntilSpecifiedAmountHasArrived is true, the method will block until - maxBytesToRead bytes have been read, (or until an error occurs). If this - flag is false, the method will return as much data as is currently available - without blocking. - - @returns the number of bytes read, or -1 if there was an error. - @see waitUntilReady - */ - int read (void* destBuffer, int maxBytesToRead, - bool blockUntilSpecifiedAmountHasArrived); - - /** Writes bytes to the socket from a buffer. - - Note that this method will block unless you have checked the socket is ready - for writing before calling it (see the waitUntilReady() method). - - @returns the number of bytes written, or -1 if there was an error. - */ - int write (const void* sourceBuffer, int numBytesToWrite); - - //============================================================================== - /** Puts this socket into "listener" mode. - - When in this mode, your thread can call waitForNextConnection() repeatedly, - which will spawn new sockets for each new connection, so that these can - be handled in parallel by other threads. - - @param portNumber the port number to listen on - @param localHostName the interface address to listen on - pass an empty - string to listen on all addresses - @returns true if it manages to open the socket successfully. - - @see waitForNextConnection - */ - bool createListener (int portNumber, const String& localHostName = String::empty); - - /** When in "listener" mode, this waits for a connection and spawns it as a new - socket. - - The object that gets returned will be owned by the caller. - - This method can only be called after using createListener(). - - @see createListener - */ - StreamingSocket* waitForNextConnection() const; - -private: - //============================================================================== - String hostName; - int volatile portNumber, handle; - bool connected, isListener; - - StreamingSocket (const String& hostname, int portNumber, int handle); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StreamingSocket) -}; - - -//============================================================================== -/** - A wrapper for a datagram (UDP) socket. - - This allows low-level use of sockets; for an easier-to-use messaging layer on top of - sockets, you could also try the InterprocessConnection class. - - @see StreamingSocket, InterprocessConnection, InterprocessConnectionServer -*/ -class BEAST_API DatagramSocket -{ -public: - //============================================================================== - /** - Creates an (uninitialised) datagram socket. - - The localPortNumber is the port on which to bind this socket. If this value is 0, - the port number is assigned by the operating system. - - To use the socket for sending, call the connect() method. This will not immediately - make a connection, but will save the destination you've provided. After this, you can - call read() or write(). - - If enableBroadcasting is true, the socket will be allowed to send broadcast messages - (may require extra privileges on linux) - - To wait for other sockets to connect to this one, call waitForNextConnection(). - */ - DatagramSocket (int localPortNumber, - bool enableBroadcasting = false); - - /** Destructor. */ - ~DatagramSocket(); - - //============================================================================== - /** Binds the socket to the specified local port. - - @returns true on success; false may indicate that another socket is already bound - on the same port - */ - bool bindToPort (int localPortNumber); - - /** Tries to connect the socket to hostname:port. - - If timeOutMillisecs is 0, then this method will block until the operating system - rejects the connection (which could take a long time). - - @returns true if it succeeds. - @see isConnected - */ - bool connect (const String& remoteHostname, - int remotePortNumber, - int timeOutMillisecs = 3000); - - /** True if the socket is currently connected. */ - bool isConnected() const noexcept { return connected; } - - /** Closes the connection. */ - void close(); - - /** Returns the name of the currently connected host. */ - const String& getHostName() const noexcept { return hostName; } - - /** Returns the port number that's currently open. */ - int getPort() const noexcept { return portNumber; } - - /** True if the socket is connected to this machine rather than over the network. */ - bool isLocal() const noexcept; - - /** Returns the OS's socket handle that's currently open. */ - int getRawSocketHandle() const noexcept { return handle; } - - //============================================================================== - /** Waits until the socket is ready for reading or writing. - - If readyForReading is true, it will wait until the socket is ready for - reading; if false, it will wait until it's ready for writing. - - If the timeout is < 0, it will wait forever, or else will give up after - the specified time. - - If the socket is ready on return, this returns 1. If it times-out before - the socket becomes ready, it returns 0. If an error occurs, it returns -1. - */ - int waitUntilReady (bool readyForReading, - int timeoutMsecs) const; - - /** Reads bytes from the socket. - - If blockUntilSpecifiedAmountHasArrived is true, the method will block until - maxBytesToRead bytes have been read, (or until an error occurs). If this - flag is false, the method will return as much data as is currently available - without blocking. - - @returns the number of bytes read, or -1 if there was an error. - @see waitUntilReady - */ - int read (void* destBuffer, int maxBytesToRead, - bool blockUntilSpecifiedAmountHasArrived); - - /** Writes bytes to the socket from a buffer. - - Note that this method will block unless you have checked the socket is ready - for writing before calling it (see the waitUntilReady() method). - - @returns the number of bytes written, or -1 if there was an error. - */ - int write (const void* sourceBuffer, int numBytesToWrite); - - //============================================================================== - /** This waits for incoming data to be sent, and returns a socket that can be used - to read it. - - The object that gets returned is owned by the caller, and can't be used for - sending, but can be used to read the data. - */ - DatagramSocket* waitForNextConnection() const; - -private: - //============================================================================== - String hostName; - int volatile portNumber, handle; - bool connected, allowBroadcast; - void* serverAddress; - - DatagramSocket (const String& hostname, int portNumber, int handle, int localPortNumber); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DatagramSocket) -}; - - -#endif // BEAST_SOCKET_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/network/beast_URL.cpp b/Subtrees/beast/modules/beast_core/network/beast_URL.cpp deleted file mode 100644 index 8e71c6db9e..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_URL.cpp +++ /dev/null @@ -1,468 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -URL::URL() -{ -} - -URL::URL (const String& url_) - : url (url_) -{ - int i = url.indexOfChar ('?'); - - if (i >= 0) - { - do - { - const int nextAmp = url.indexOfChar (i + 1, '&'); - const int equalsPos = url.indexOfChar (i + 1, '='); - - if (equalsPos > i + 1) - { - if (nextAmp < 0) - { - addParameter (removeEscapeChars (url.substring (i + 1, equalsPos)), - removeEscapeChars (url.substring (equalsPos + 1))); - } - else if (nextAmp > 0 && equalsPos < nextAmp) - { - addParameter (removeEscapeChars (url.substring (i + 1, equalsPos)), - removeEscapeChars (url.substring (equalsPos + 1, nextAmp))); - } - } - - i = nextAmp; - } - while (i >= 0); - - url = url.upToFirstOccurrenceOf ("?", false, false); - } -} - -URL::URL (const URL& other) - : url (other.url), - postData (other.postData), - parameterNames (other.parameterNames), - parameterValues (other.parameterValues), - filesToUpload (other.filesToUpload), - mimeTypes (other.mimeTypes) -{ -} - -URL& URL::operator= (const URL& other) -{ - url = other.url; - postData = other.postData; - parameterNames = other.parameterNames; - parameterValues = other.parameterValues; - filesToUpload = other.filesToUpload; - mimeTypes = other.mimeTypes; - - return *this; -} - -bool URL::operator== (const URL& other) const -{ - return url == other.url - && postData == other.postData - && parameterNames == other.parameterNames - && parameterValues == other.parameterValues - && filesToUpload == other.filesToUpload - && mimeTypes == other.mimeTypes; -} - -bool URL::operator!= (const URL& other) const -{ - return ! operator== (other); -} - -URL::~URL() -{ -} - -namespace URLHelpers -{ - static String getMangledParameters (const URL& url) - { - bassert (url.getParameterNames().size() == url.getParameterValues().size()); - String p; - - for (int i = 0; i < url.getParameterNames().size(); ++i) - { - if (i > 0) - p << '&'; - - p << URL::addEscapeChars (url.getParameterNames()[i], true) - << '=' - << URL::addEscapeChars (url.getParameterValues()[i], true); - } - - return p; - } - - static int findEndOfScheme (const String& url) - { - int i = 0; - - while (CharacterFunctions::isLetterOrDigit (url[i]) - || url[i] == '+' || url[i] == '-' || url[i] == '.') - ++i; - - return url[i] == ':' ? i + 1 : 0; - } - - static int findStartOfNetLocation (const String& url) - { - int start = findEndOfScheme (url); - while (url[start] == '/') - ++start; - - return start; - } - - static int findStartOfPath (const String& url) - { - return url.indexOfChar (findStartOfNetLocation (url), '/') + 1; - } - - static void createHeadersAndPostData (const URL& url, String& headers, MemoryBlock& postData) - { - MemoryOutputStream data (postData, false); - - if (url.getFilesToUpload().size() > 0) - { - // need to upload some files, so do it as multi-part... - const String boundary (String::toHexString (Random::getSystemRandom().nextInt64())); - - headers << "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n"; - - data << "--" << boundary; - - for (int i = 0; i < url.getParameterNames().size(); ++i) - { - data << "\r\nContent-Disposition: form-data; name=\"" - << url.getParameterNames() [i] - << "\"\r\n\r\n" - << url.getParameterValues() [i] - << "\r\n--" - << boundary; - } - - for (int i = 0; i < url.getFilesToUpload().size(); ++i) - { - const File file (url.getFilesToUpload().getAllValues() [i]); - const String paramName (url.getFilesToUpload().getAllKeys() [i]); - - data << "\r\nContent-Disposition: form-data; name=\"" << paramName - << "\"; filename=\"" << file.getFileName() << "\"\r\n"; - - const String mimeType (url.getMimeTypesOfUploadFiles() - .getValue (paramName, String::empty)); - - if (mimeType.isNotEmpty()) - data << "Content-Type: " << mimeType << "\r\n"; - - data << "Content-Transfer-Encoding: binary\r\n\r\n" - << file << "\r\n--" << boundary; - } - - data << "--\r\n"; - } - else - { - data << getMangledParameters (url) - << url.getPostData(); - - // just a short text attachment, so use simple url encoding.. - headers << "Content-Type: application/x-www-form-urlencoded\r\nContent-length: " - << (int) data.getDataSize() << "\r\n"; - } - } - - static void concatenatePaths (String& path, const String& suffix) - { - if (! path.endsWithChar ('/')) - path << '/'; - - if (suffix.startsWithChar ('/')) - path += suffix.substring (1); - else - path += suffix; - } -} - -void URL::addParameter (const String& name, const String& value) -{ - parameterNames.add (name); - parameterValues.add (value); -} - -String URL::toString (const bool includeGetParameters) const -{ - if (includeGetParameters && parameterNames.size() > 0) - return url + "?" + URLHelpers::getMangledParameters (*this); - - return url; -} - -bool URL::isWellFormed() const -{ - //xxx TODO - return url.isNotEmpty(); -} - -String URL::getDomain() const -{ - const int start = URLHelpers::findStartOfNetLocation (url); - const int end1 = url.indexOfChar (start, '/'); - const int end2 = url.indexOfChar (start, ':'); - - const int end = (end1 < 0 && end2 < 0) ? std::numeric_limits::max() - : ((end1 < 0 || end2 < 0) ? bmax (end1, end2) - : bmin (end1, end2)); - return url.substring (start, end); -} - -String URL::getSubPath() const -{ - const int startOfPath = URLHelpers::findStartOfPath (url); - - return startOfPath <= 0 ? String::empty - : url.substring (startOfPath); -} - -String URL::getScheme() const -{ - return url.substring (0, URLHelpers::findEndOfScheme (url) - 1); -} - -int URL::getPort() const -{ - const int colonPos = url.indexOfChar (URLHelpers::findStartOfNetLocation (url), ':'); - - return colonPos > 0 ? url.substring (colonPos + 1).getIntValue() : 0; -} - -URL URL::withNewSubPath (const String& newPath) const -{ - const int startOfPath = URLHelpers::findStartOfPath (url); - - URL u (*this); - - if (startOfPath > 0) - u.url = url.substring (0, startOfPath); - - URLHelpers::concatenatePaths (u.url, newPath); - return u; -} - -URL URL::getChildURL (const String& subPath) const -{ - URL u (*this); - URLHelpers::concatenatePaths (u.url, subPath); - return u; -} - -//============================================================================== -bool URL::isProbablyAWebsiteURL (const String& possibleURL) -{ - const char* validProtocols[] = { "http:", "ftp:", "https:" }; - - for (int i = 0; i < numElementsInArray (validProtocols); ++i) - if (possibleURL.startsWithIgnoreCase (validProtocols[i])) - return true; - - if (possibleURL.containsChar ('@') - || possibleURL.containsChar (' ')) - return false; - - const String topLevelDomain (possibleURL.upToFirstOccurrenceOf ("/", false, false) - .fromLastOccurrenceOf (".", false, false)); - - return topLevelDomain.isNotEmpty() && topLevelDomain.length() <= 3; -} - -bool URL::isProbablyAnEmailAddress (const String& possibleEmailAddress) -{ - const int atSign = possibleEmailAddress.indexOfChar ('@'); - - return atSign > 0 - && possibleEmailAddress.lastIndexOfChar ('.') > (atSign + 1) - && (! possibleEmailAddress.endsWithChar ('.')); -} - -//============================================================================== -InputStream* URL::createInputStream (const bool usePostCommand, - OpenStreamProgressCallback* const progressCallback, - void* const progressCallbackContext, - const String& extraHeaders, - const int timeOutMs, - StringPairArray* const responseHeaders) const -{ - String headers; - MemoryBlock headersAndPostData; - - if (usePostCommand) - URLHelpers::createHeadersAndPostData (*this, headers, headersAndPostData); - - headers += extraHeaders; - - if (! headers.endsWithChar ('\n')) - headers << "\r\n"; - - return createNativeStream (toString (! usePostCommand), usePostCommand, headersAndPostData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders); -} - -//============================================================================== -bool URL::readEntireBinaryStream (MemoryBlock& destData, - const bool usePostCommand) const -{ - const ScopedPointer in (createInputStream (usePostCommand)); - - if (in != nullptr) - { - in->readIntoMemoryBlock (destData); - return true; - } - - return false; -} - -String URL::readEntireTextStream (const bool usePostCommand) const -{ - const ScopedPointer in (createInputStream (usePostCommand)); - - if (in != nullptr) - return in->readEntireStreamAsString(); - - return String::empty; -} - -XmlElement* URL::readEntireXmlStream (const bool usePostCommand) const -{ - return XmlDocument::parse (readEntireTextStream (usePostCommand)); -} - -//============================================================================== -URL URL::withParameter (const String& parameterName, - const String& parameterValue) const -{ - URL u (*this); - u.addParameter (parameterName, parameterValue); - return u; -} - -URL URL::withFileToUpload (const String& parameterName, - const File& fileToUpload, - const String& mimeType) const -{ - bassert (mimeType.isNotEmpty()); // You need to supply a mime type! - - URL u (*this); - u.filesToUpload.set (parameterName, fileToUpload.getFullPathName()); - u.mimeTypes.set (parameterName, mimeType); - return u; -} - -URL URL::withPOSTData (const String& postData_) const -{ - URL u (*this); - u.postData = postData_; - return u; -} - -const StringPairArray& URL::getFilesToUpload() const -{ - return filesToUpload; -} - -const StringPairArray& URL::getMimeTypesOfUploadFiles() const -{ - return mimeTypes; -} - -//============================================================================== -String URL::removeEscapeChars (const String& s) -{ - String result (s.replaceCharacter ('+', ' ')); - - if (! result.containsChar ('%')) - return result; - - // We need to operate on the string as raw UTF8 chars, and then recombine them into unicode - // after all the replacements have been made, so that multi-byte chars are handled. - Array utf8 (result.toRawUTF8(), (int) result.getNumBytesAsUTF8()); - - for (int i = 0; i < utf8.size(); ++i) - { - if (utf8.getUnchecked(i) == '%') - { - const int hexDigit1 = CharacterFunctions::getHexDigitValue ((beast_wchar) (uint8) utf8 [i + 1]); - const int hexDigit2 = CharacterFunctions::getHexDigitValue ((beast_wchar) (uint8) utf8 [i + 2]); - - if (hexDigit1 >= 0 && hexDigit2 >= 0) - { - utf8.set (i, (char) ((hexDigit1 << 4) + hexDigit2)); - utf8.removeRange (i + 1, 2); - } - } - } - - return String::fromUTF8 (utf8.getRawDataPointer(), utf8.size()); -} - -String URL::addEscapeChars (const String& s, const bool isParameter) -{ - const CharPointer_UTF8 legalChars (isParameter ? "_-.*!'()" - : ",$_-.*!'()"); - - Array utf8 (s.toRawUTF8(), (int) s.getNumBytesAsUTF8()); - - for (int i = 0; i < utf8.size(); ++i) - { - const char c = utf8.getUnchecked(i); - - if (! (CharacterFunctions::isLetterOrDigit (c) - || legalChars.indexOf ((beast_wchar) c) >= 0)) - { - utf8.set (i, '%'); - utf8.insert (++i, "0123456789abcdef" [((uint8) c) >> 4]); - utf8.insert (++i, "0123456789abcdef" [c & 15]); - } - } - - return String::fromUTF8 (utf8.getRawDataPointer(), utf8.size()); -} - -//============================================================================== -bool URL::launchInDefaultBrowser() const -{ - String u (toString (true)); - - if (u.containsChar ('@') && ! u.containsChar (':')) - u = "mailto:" + u; - - return Process::openDocument (u, String::empty); -} diff --git a/Subtrees/beast/modules/beast_core/network/beast_URL.h b/Subtrees/beast/modules/beast_core/network/beast_URL.h deleted file mode 100644 index dd6963341f..0000000000 --- a/Subtrees/beast/modules/beast_core/network/beast_URL.h +++ /dev/null @@ -1,345 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_URL_BEASTHEADER -#define BEAST_URL_BEASTHEADER - -#include "../text/beast_StringPairArray.h" -#include "../files/beast_File.h" -class InputStream; -class XmlElement; - - -//============================================================================== -/** - Represents a URL and has a bunch of useful functions to manipulate it. - - This class can be used to launch URLs in browsers, and also to create - InputStreams that can read from remote http or ftp sources. -*/ -class BEAST_API URL -{ -public: - //============================================================================== - /** Creates an empty URL. */ - URL(); - - /** Creates a URL from a string. */ - URL (const String& url); - - /** Creates a copy of another URL. */ - URL (const URL& other); - - /** Destructor. */ - ~URL(); - - /** Copies this URL from another one. */ - URL& operator= (const URL& other); - - /** Compares two URLs. - All aspects of the URLs must be identical for them to match, including any parameters, - upload files, etc. - */ - bool operator== (const URL&) const; - bool operator!= (const URL&) const; - - //============================================================================== - /** Returns a string version of the URL. - - If includeGetParameters is true and any parameters have been set with the - withParameter() method, then the string will have these appended on the - end and url-encoded. - */ - String toString (bool includeGetParameters) const; - - /** True if it seems to be valid. */ - bool isWellFormed() const; - - /** Returns just the domain part of the URL. - - E.g. for "http://www.xyz.com/foobar", this will return "www.xyz.com". - */ - String getDomain() const; - - /** Returns the path part of the URL. - - E.g. for "http://www.xyz.com/foo/bar?x=1", this will return "foo/bar". - */ - String getSubPath() const; - - /** Returns the scheme of the URL. - - E.g. for "http://www.xyz.com/foobar", this will return "http". (It won't - include the colon). - */ - String getScheme() const; - - /** Attempts to read a port number from the URL. - @returns the port number, or 0 if none is explicitly specified. - */ - int getPort() const; - - /** Returns a new version of this URL that uses a different sub-path. - - E.g. if the URL is "http://www.xyz.com/foo?x=1" and you call this with - "bar", it'll return "http://www.xyz.com/bar?x=1". - */ - URL withNewSubPath (const String& newPath) const; - - /** Returns a new URL that refers to a sub-path relative to this one. - - E.g. if the URL is "http://www.xyz.com/foo" and you call this with - "bar", it'll return "http://www.xyz.com/foo/bar". Note that there's no way for - this method to know whether the original URL is a file or directory, so it's - up to you to make sure it's a directory. It also won't attempt to be smart about - the content of the childPath string, so if this string is an absolute URL, it'll - still just get bolted onto the end of the path. - - @see File::getChildFile - */ - URL getChildURL (const String& subPath) const; - - //============================================================================== - /** Returns a copy of this URL, with a GET or POST parameter added to the end. - - Any control characters in the value will be encoded. - - e.g. calling "withParameter ("amount", "some fish") for the url "www.fish.com" - would produce a new url whose toString(true) method would return - "www.fish.com?amount=some+fish". - - @see getParameterNames, getParameterValues - */ - URL withParameter (const String& parameterName, - const String& parameterValue) const; - - /** Returns a copy of this URl, with a file-upload type parameter added to it. - - When performing a POST where one of your parameters is a binary file, this - lets you specify the file. - - Note that the filename is stored, but the file itself won't actually be read - until this URL is later used to create a network input stream. - */ - URL withFileToUpload (const String& parameterName, - const File& fileToUpload, - const String& mimeType) const; - - /** Returns an array of the names of all the URL's parameters. - - E.g. for the url "www.fish.com?type=haddock&amount=some+fish", this array would - contain two items: "type" and "amount". - - You can call getParameterValues() to get the corresponding value of each - parameter. Note that the list can contain multiple parameters with the same name. - - @see getParameterValues, withParameter - */ - const StringArray& getParameterNames() const noexcept { return parameterNames; } - - /** Returns an array of the values of all the URL's parameters. - - E.g. for the url "www.fish.com?type=haddock&amount=some+fish", this array would - contain two items: "haddock" and "some fish". - - The values returned will have been cleaned up to remove any escape characters. - - You can call getParameterNames() to get the corresponding name of each - parameter. Note that the list can contain multiple parameters with the same name. - - @see getParameterNames, withParameter - */ - const StringArray& getParameterValues() const noexcept { return parameterValues; } - - /** Returns the set of files that should be uploaded as part of a POST operation. - - This is the set of files that were added to the URL with the withFileToUpload() - method. - */ - const StringPairArray& getFilesToUpload() const; - - /** Returns the set of mime types associated with each of the upload files. - */ - const StringPairArray& getMimeTypesOfUploadFiles() const; - - /** Returns a copy of this URL, with a block of data to send as the POST data. - - If you're setting the POST data, be careful not to have any parameters set - as well, otherwise it'll all get thrown in together, and might not have the - desired effect. - - If the URL already contains some POST data, this will replace it, rather - than being appended to it. - - This data will only be used if you specify a post operation when you call - createInputStream(). - */ - URL withPOSTData (const String& postData) const; - - /** Returns the data that was set using withPOSTData(). */ - const String& getPostData() const noexcept { return postData; } - - //============================================================================== - /** Tries to launch the system's default browser to open the URL. - - Returns true if this seems to have worked. - */ - bool launchInDefaultBrowser() const; - - //============================================================================== - /** Takes a guess as to whether a string might be a valid website address. - - This isn't foolproof! - */ - static bool isProbablyAWebsiteURL (const String& possibleURL); - - /** Takes a guess as to whether a string might be a valid email address. - - This isn't foolproof! - */ - static bool isProbablyAnEmailAddress (const String& possibleEmailAddress); - - //============================================================================== - /** This callback function can be used by the createInputStream() method. - - It allows your app to receive progress updates during a lengthy POST operation. If you - want to continue the operation, this should return true, or false to abort. - */ - typedef bool (OpenStreamProgressCallback) (void* context, int bytesSent, int totalBytes); - - /** Attempts to open a stream that can read from this URL. - - @param usePostCommand if true, it will try to do use a http 'POST' to pass - the paramters, otherwise it'll encode them into the - URL and do a 'GET'. - @param progressCallback if this is non-zero, it lets you supply a callback function - to keep track of the operation's progress. This can be useful - for lengthy POST operations, so that you can provide user feedback. - @param progressCallbackContext if a callback is specified, this value will be passed to - the function - @param extraHeaders if not empty, this string is appended onto the headers that - are used for the request. It must therefore be a valid set of HTML - header directives, separated by newlines. - @param connectionTimeOutMs if 0, this will use whatever default setting the OS chooses. If - a negative number, it will be infinite. Otherwise it specifies a - time in milliseconds. - @param responseHeaders if this is non-zero, all the (key, value) pairs received as headers - in the response will be stored in this array - @returns an input stream that the caller must delete, or a null pointer if there was an - error trying to open it. - */ - InputStream* createInputStream (bool usePostCommand, - OpenStreamProgressCallback* progressCallback = nullptr, - void* progressCallbackContext = nullptr, - const String& extraHeaders = String::empty, - int connectionTimeOutMs = 0, - StringPairArray* responseHeaders = nullptr) const; - - - //============================================================================== - /** Tries to download the entire contents of this URL into a binary data block. - - If it succeeds, this will return true and append the data it read onto the end - of the memory block. - - @param destData the memory block to append the new data to - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - @see readEntireTextStream, readEntireXmlStream - */ - bool readEntireBinaryStream (MemoryBlock& destData, - bool usePostCommand = false) const; - - /** Tries to download the entire contents of this URL as a string. - - If it fails, this will return an empty string, otherwise it will return the - contents of the downloaded file. If you need to distinguish between a read - operation that fails and one that returns an empty string, you'll need to use - a different method, such as readEntireBinaryStream(). - - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - @see readEntireBinaryStream, readEntireXmlStream - */ - String readEntireTextStream (bool usePostCommand = false) const; - - /** Tries to download the entire contents of this URL and parse it as XML. - - If it fails, or if the text that it reads can't be parsed as XML, this will - return 0. - - When it returns a valid XmlElement object, the caller is responsibile for deleting - this object when no longer needed. - - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - - @see readEntireBinaryStream, readEntireTextStream - */ - XmlElement* readEntireXmlStream (bool usePostCommand = false) const; - - //============================================================================== - /** Adds escape sequences to a string to encode any characters that aren't - legal in a URL. - - E.g. any spaces will be replaced with "%20". - - This is the opposite of removeEscapeChars(). - - If isParameter is true, it means that the string is going to be used - as a parameter, so it also encodes '$' and ',' (which would otherwise - be legal in a URL. - - @see removeEscapeChars - */ - static String addEscapeChars (const String& stringToAddEscapeCharsTo, - bool isParameter); - - /** Replaces any escape character sequences in a string with their original - character codes. - - E.g. any instances of "%20" will be replaced by a space. - - This is the opposite of addEscapeChars(). - - @see addEscapeChars - */ - static String removeEscapeChars (const String& stringToRemoveEscapeCharsFrom); - -private: - //============================================================================== - String url, postData; - StringArray parameterNames, parameterValues; - StringPairArray filesToUpload, mimeTypes; - - void addParameter (const String&, const String&); - - static InputStream* createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext, const String& headers, - const int timeOutMs, StringPairArray* responseHeaders); - BEAST_LEAK_DETECTOR (URL) -}; - - -#endif // BEAST_URL_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.cpp deleted file mode 100644 index 8fcb738681..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.cpp +++ /dev/null @@ -1,193 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace -{ - int calcBufferStreamBufferSize (int requestedSize, InputStream* const source) noexcept - { - // You need to supply a real stream when creating a BufferedInputStream - bassert (source != nullptr); - - requestedSize = bmax (256, requestedSize); - - const int64 sourceSize = source->getTotalLength(); - if (sourceSize >= 0 && sourceSize < requestedSize) - requestedSize = bmax (32, (int) sourceSize); - - return requestedSize; - } -} - -//============================================================================== -BufferedInputStream::BufferedInputStream (InputStream* const sourceStream, const int bufferSize_, - const bool deleteSourceWhenDestroyed) - : source (sourceStream, deleteSourceWhenDestroyed), - bufferSize (calcBufferStreamBufferSize (bufferSize_, sourceStream)), - position (sourceStream->getPosition()), - lastReadPos (0), - bufferStart (position), - bufferOverlap (128) -{ - buffer.malloc ((size_t) bufferSize); -} - -BufferedInputStream::BufferedInputStream (InputStream& sourceStream, const int bufferSize_) - : source (&sourceStream, false), - bufferSize (calcBufferStreamBufferSize (bufferSize_, &sourceStream)), - position (sourceStream.getPosition()), - lastReadPos (0), - bufferStart (position), - bufferOverlap (128) -{ - buffer.malloc ((size_t) bufferSize); -} - -BufferedInputStream::~BufferedInputStream() -{ -} - -//============================================================================== -int64 BufferedInputStream::getTotalLength() -{ - return source->getTotalLength(); -} - -int64 BufferedInputStream::getPosition() -{ - return position; -} - -bool BufferedInputStream::setPosition (int64 newPosition) -{ - position = bmax ((int64) 0, newPosition); - return true; -} - -bool BufferedInputStream::isExhausted() -{ - return position >= lastReadPos && source->isExhausted(); -} - -void BufferedInputStream::ensureBuffered() -{ - const int64 bufferEndOverlap = lastReadPos - bufferOverlap; - - if (position < bufferStart || position >= bufferEndOverlap) - { - int bytesRead; - - if (position < lastReadPos - && position >= bufferEndOverlap - && position >= bufferStart) - { - const int bytesToKeep = (int) (lastReadPos - position); - memmove (buffer, buffer + (int) (position - bufferStart), (size_t) bytesToKeep); - - bufferStart = position; - - bytesRead = source->read (buffer + bytesToKeep, - (int) (bufferSize - bytesToKeep)); - - lastReadPos += bytesRead; - bytesRead += bytesToKeep; - } - else - { - bufferStart = position; - source->setPosition (bufferStart); - bytesRead = source->read (buffer, bufferSize); - lastReadPos = bufferStart + bytesRead; - } - - while (bytesRead < bufferSize) - buffer [bytesRead++] = 0; - } -} - -int BufferedInputStream::read (void* destBuffer, int maxBytesToRead) -{ - bassert (destBuffer != nullptr && maxBytesToRead >= 0); - - if (position >= bufferStart - && position + maxBytesToRead <= lastReadPos) - { - memcpy (destBuffer, buffer + (int) (position - bufferStart), (size_t) maxBytesToRead); - position += maxBytesToRead; - - return maxBytesToRead; - } - else - { - if (position < bufferStart || position >= lastReadPos) - ensureBuffered(); - - int bytesRead = 0; - - while (maxBytesToRead > 0) - { - const int bytesAvailable = bmin (maxBytesToRead, (int) (lastReadPos - position)); - - if (bytesAvailable > 0) - { - memcpy (destBuffer, buffer + (int) (position - bufferStart), (size_t) bytesAvailable); - maxBytesToRead -= bytesAvailable; - bytesRead += bytesAvailable; - position += bytesAvailable; - destBuffer = static_cast (destBuffer) + bytesAvailable; - } - - const int64 oldLastReadPos = lastReadPos; - ensureBuffered(); - - if (oldLastReadPos == lastReadPos) - break; // if ensureBuffered() failed to read any more data, bail out - - if (isExhausted()) - break; - } - - return bytesRead; - } -} - -String BufferedInputStream::readString() -{ - if (position >= bufferStart - && position < lastReadPos) - { - const int maxChars = (int) (lastReadPos - position); - - const char* const src = buffer + (int) (position - bufferStart); - - for (int i = 0; i < maxChars; ++i) - { - if (src[i] == 0) - { - position += i + 1; - return String::fromUTF8 (src, i); - } - } - } - - return InputStream::readString(); -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.h b/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.h deleted file mode 100644 index 54ef9668e1..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_BufferedInputStream.h +++ /dev/null @@ -1,91 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_BUFFEREDINPUTSTREAM_BEASTHEADER -#define BEAST_BUFFEREDINPUTSTREAM_BEASTHEADER - -#include "beast_InputStream.h" -#include "../memory/beast_OptionalScopedPointer.h" -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** Wraps another input stream, and reads from it using an intermediate buffer - - If you're using an input stream such as a file input stream, and making lots of - small read accesses to it, it's probably sensible to wrap it in one of these, - so that the source stream gets accessed in larger chunk sizes, meaning less - work for the underlying stream. -*/ -class BEAST_API BufferedInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a BufferedInputStream from an input source. - - @param sourceStream the source stream to read from - @param bufferSize the size of reservoir to use to buffer the source - @param deleteSourceWhenDestroyed whether the sourceStream that is passed in should be - deleted by this object when it is itself deleted. - */ - BufferedInputStream (InputStream* sourceStream, - int bufferSize, - bool deleteSourceWhenDestroyed); - - /** Creates a BufferedInputStream from an input source. - - @param sourceStream the source stream to read from - the source stream must not - be deleted until this object has been destroyed. - @param bufferSize the size of reservoir to use to buffer the source - */ - BufferedInputStream (InputStream& sourceStream, int bufferSize); - - /** Destructor. - - This may also delete the source stream, if that option was chosen when the - buffered stream was created. - */ - ~BufferedInputStream(); - - - //============================================================================== - int64 getTotalLength(); - int64 getPosition(); - bool setPosition (int64 newPosition); - int read (void* destBuffer, int maxBytesToRead); - String readString(); - bool isExhausted(); - - -private: - //============================================================================== - OptionalScopedPointer source; - int bufferSize; - int64 position, lastReadPos, bufferStart, bufferOverlap; - HeapBlock buffer; - void ensureBuffered(); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferedInputStream) -}; - -#endif // BEAST_BUFFEREDINPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.cpp b/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.cpp deleted file mode 100644 index a2f677dcd5..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -FileInputSource::FileInputSource (const File& f, bool useFileTimeInHash) - : file (f), useFileTimeInHashGeneration (useFileTimeInHash) -{ -} - -FileInputSource::~FileInputSource() -{ -} - -InputStream* FileInputSource::createInputStream() -{ - return file.createInputStream(); -} - -InputStream* FileInputSource::createInputStreamFor (const String& relatedItemPath) -{ - return file.getSiblingFile (relatedItemPath).createInputStream(); -} - -int64 FileInputSource::hashCode() const -{ - int64 h = file.hashCode(); - - if (useFileTimeInHashGeneration) - h ^= file.getLastModificationTime().toMilliseconds(); - - return h; -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.h b/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.h deleted file mode 100644 index 8726144f42..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_FileInputSource.h +++ /dev/null @@ -1,64 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_FILEINPUTSOURCE_BEASTHEADER -#define BEAST_FILEINPUTSOURCE_BEASTHEADER - -#include "beast_InputSource.h" -#include "../files/beast_File.h" - - -//============================================================================== -/** - A type of InputSource that represents a normal file. - - @see InputSource -*/ -class BEAST_API FileInputSource : public InputSource -{ -public: - //============================================================================== - /** Creates a FileInputSource for a file. - If the useFileTimeInHashGeneration parameter is true, then this object's - hashCode() method will incorporate the file time into its hash code; if - false, only the file name will be used for the hash. - */ - FileInputSource (const File& file, bool useFileTimeInHashGeneration = false); - - /** Destructor. */ - ~FileInputSource(); - - InputStream* createInputStream(); - InputStream* createInputStreamFor (const String& relatedItemPath); - int64 hashCode() const; - -private: - //============================================================================== - const File file; - bool useFileTimeInHashGeneration; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileInputSource) -}; - - -#endif // BEAST_FILEINPUTSOURCE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_InputSource.h b/Subtrees/beast/modules/beast_core/streams/beast_InputSource.h deleted file mode 100644 index cd47a678c1..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_InputSource.h +++ /dev/null @@ -1,74 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_INPUTSOURCE_BEASTHEADER -#define BEAST_INPUTSOURCE_BEASTHEADER - -#include "beast_InputStream.h" - -//============================================================================== -/** - A lightweight object that can create a stream to read some kind of resource. - - This may be used to refer to a file, or some other kind of source, allowing a - caller to create an input stream that can read from it when required. - - @see FileInputSource -*/ -class BEAST_API InputSource -{ -public: - //============================================================================== - InputSource() noexcept {} - - /** Destructor. */ - virtual ~InputSource() {} - - //============================================================================== - /** Returns a new InputStream to read this item. - - @returns an inputstream that the caller will delete, or nullptr if - the filename isn't found. - */ - virtual InputStream* createInputStream() = 0; - - /** Returns a new InputStream to read an item, relative. - - @param relatedItemPath the relative pathname of the resource that is required - @returns an inputstream that the caller will delete, or nullptr if - the item isn't found. - */ - virtual InputStream* createInputStreamFor (const String& relatedItemPath) = 0; - - /** Returns a hash code that uniquely represents this item. - */ - virtual int64 hashCode() const = 0; - - -private: - //============================================================================== - BEAST_LEAK_DETECTOR (InputSource) -}; - - -#endif // BEAST_INPUTSOURCE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_InputStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_InputStream.cpp deleted file mode 100644 index ebefef3171..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_InputStream.cpp +++ /dev/null @@ -1,231 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -int64 InputStream::getNumBytesRemaining() -{ - int64 len = getTotalLength(); - - if (len >= 0) - len -= getPosition(); - - return len; -} - -char InputStream::readByte() -{ - char temp = 0; - read (&temp, 1); - return temp; -} - -bool InputStream::readBool() -{ - return readByte() != 0; -} - -short InputStream::readShort() -{ - char temp[2]; - - if (read (temp, 2) == 2) - return (short) ByteOrder::littleEndianShort (temp); - - return 0; -} - -short InputStream::readShortBigEndian() -{ - char temp[2]; - - if (read (temp, 2) == 2) - return (short) ByteOrder::bigEndianShort (temp); - - return 0; -} - -int InputStream::readInt() -{ - char temp[4]; - - if (read (temp, 4) == 4) - return (int) ByteOrder::littleEndianInt (temp); - - return 0; -} - -int InputStream::readIntBigEndian() -{ - char temp[4]; - - if (read (temp, 4) == 4) - return (int) ByteOrder::bigEndianInt (temp); - - return 0; -} - -int InputStream::readCompressedInt() -{ - const uint8 sizeByte = (uint8) readByte(); - if (sizeByte == 0) - return 0; - - const int numBytes = (sizeByte & 0x7f); - if (numBytes > 4) - { - bassertfalse; // trying to read corrupt data - this method must only be used - // to read data that was written by OutputStream::writeCompressedInt() - return 0; - } - - char bytes[4] = { 0, 0, 0, 0 }; - if (read (bytes, numBytes) != numBytes) - return 0; - - const int num = (int) ByteOrder::littleEndianInt (bytes); - return (sizeByte >> 7) ? -num : num; -} - -int64 InputStream::readInt64() -{ - union { uint8 asBytes[8]; uint64 asInt64; } n; - - if (read (n.asBytes, 8) == 8) - return (int64) ByteOrder::swapIfBigEndian (n.asInt64); - - return 0; -} - -int64 InputStream::readInt64BigEndian() -{ - union { uint8 asBytes[8]; uint64 asInt64; } n; - - if (read (n.asBytes, 8) == 8) - return (int64) ByteOrder::swapIfLittleEndian (n.asInt64); - - return 0; -} - -float InputStream::readFloat() -{ - // the union below relies on these types being the same size... - static_bassert (sizeof (int32) == sizeof (float)); - union { int32 asInt; float asFloat; } n; - n.asInt = (int32) readInt(); - return n.asFloat; -} - -float InputStream::readFloatBigEndian() -{ - union { int32 asInt; float asFloat; } n; - n.asInt = (int32) readIntBigEndian(); - return n.asFloat; -} - -double InputStream::readDouble() -{ - union { int64 asInt; double asDouble; } n; - n.asInt = readInt64(); - return n.asDouble; -} - -double InputStream::readDoubleBigEndian() -{ - union { int64 asInt; double asDouble; } n; - n.asInt = readInt64BigEndian(); - return n.asDouble; -} - -String InputStream::readString() -{ - MemoryBlock buffer (256); - char* data = static_cast (buffer.getData()); - size_t i = 0; - - while ((data[i] = readByte()) != 0) - { - if (++i >= buffer.getSize()) - { - buffer.setSize (buffer.getSize() + 512); - data = static_cast (buffer.getData()); - } - } - - return String::fromUTF8 (data, (int) i); -} - -String InputStream::readNextLine() -{ - MemoryBlock buffer (256); - char* data = static_cast (buffer.getData()); - size_t i = 0; - - while ((data[i] = readByte()) != 0) - { - if (data[i] == '\n') - break; - - if (data[i] == '\r') - { - const int64 lastPos = getPosition(); - - if (readByte() != '\n') - setPosition (lastPos); - - break; - } - - if (++i >= buffer.getSize()) - { - buffer.setSize (buffer.getSize() + 512); - data = static_cast (buffer.getData()); - } - } - - return String::fromUTF8 (data, (int) i); -} - -int InputStream::readIntoMemoryBlock (MemoryBlock& block, ssize_t numBytes) -{ - MemoryOutputStream mo (block, true); - return mo.writeFromInputStream (*this, numBytes); -} - -String InputStream::readEntireStreamAsString() -{ - MemoryOutputStream mo; - mo << *this; - return mo.toString(); -} - -//============================================================================== -void InputStream::skipNextBytes (int64 numBytesToSkip) -{ - if (numBytesToSkip > 0) - { - const int skipBufferSize = (int) bmin (numBytesToSkip, (int64) 16384); - HeapBlock temp ((size_t) skipBufferSize); - - while (numBytesToSkip > 0 && ! isExhausted()) - numBytesToSkip -= read (temp, (int) bmin (numBytesToSkip, (int64) skipBufferSize)); - } -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_InputStream.h b/Subtrees/beast/modules/beast_core/streams/beast_InputStream.h deleted file mode 100644 index d90bb5c599..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_InputStream.h +++ /dev/null @@ -1,293 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_INPUTSTREAM_BEASTHEADER -#define BEAST_INPUTSTREAM_BEASTHEADER - -#include "../text/beast_String.h" -class MemoryBlock; - - -//============================================================================== -/** The base class for streams that read data. - - Input and output streams are used throughout the library - subclasses can override - some or all of the virtual functions to implement their behaviour. - - @see OutputStream, MemoryInputStream, BufferedInputStream, FileInputStream -*/ -class BEAST_API InputStream -{ -public: - /** Destructor. */ - virtual ~InputStream() {} - - //============================================================================== - /** Returns the total number of bytes available for reading in this stream. - - Note that this is the number of bytes available from the start of the - stream, not from the current position. - - If the size of the stream isn't actually known, this will return -1. - - @see getNumBytesRemaining - */ - virtual int64 getTotalLength() = 0; - - /** Returns the number of bytes available for reading, or a negative value if - the remaining length is not known. - @see getTotalLength - */ - int64 getNumBytesRemaining(); - - /** Returns true if the stream has no more data to read. */ - virtual bool isExhausted() = 0; - - //============================================================================== - /** Reads some data from the stream into a memory buffer. - - This is the only read method that subclasses actually need to implement, as the - InputStream base class implements the other read methods in terms of this one (although - it's often more efficient for subclasses to implement them directly). - - @param destBuffer the destination buffer for the data. This must not be null. - @param maxBytesToRead the maximum number of bytes to read - make sure the - memory block passed in is big enough to contain this - many bytes. This value must not be negative. - - @returns the actual number of bytes that were read, which may be less than - maxBytesToRead if the stream is exhausted before it gets that far - */ - virtual int read (void* destBuffer, int maxBytesToRead) = 0; - - /** Reads a byte from the stream. - - If the stream is exhausted, this will return zero. - - @see OutputStream::writeByte - */ - virtual char readByte(); - - /** Reads a boolean from the stream. - - The bool is encoded as a single byte - 1 for true, 0 for false. - - If the stream is exhausted, this will return false. - - @see OutputStream::writeBool - */ - virtual bool readBool(); - - /** Reads two bytes from the stream as a little-endian 16-bit value. - - If the next two bytes read are byte1 and byte2, this returns - (byte1 | (byte2 << 8)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeShort, readShortBigEndian - */ - virtual short readShort(); - - /** Reads two bytes from the stream as a little-endian 16-bit value. - - If the next two bytes read are byte1 and byte2, this returns - (byte2 | (byte1 << 8)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeShortBigEndian, readShort - */ - virtual short readShortBigEndian(); - - /** Reads four bytes from the stream as a little-endian 32-bit value. - - If the next four bytes are byte1 to byte4, this returns - (byte1 | (byte2 << 8) | (byte3 << 16) | (byte4 << 24)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt, readIntBigEndian - */ - virtual int readInt(); - - /** Reads four bytes from the stream as a big-endian 32-bit value. - - If the next four bytes are byte1 to byte4, this returns - (byte4 | (byte3 << 8) | (byte2 << 16) | (byte1 << 24)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeIntBigEndian, readInt - */ - virtual int readIntBigEndian(); - - /** Reads eight bytes from the stream as a little-endian 64-bit value. - - If the next eight bytes are byte1 to byte8, this returns - (byte1 | (byte2 << 8) | (byte3 << 16) | (byte4 << 24) | (byte5 << 32) | (byte6 << 40) | (byte7 << 48) | (byte8 << 56)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt64, readInt64BigEndian - */ - virtual int64 readInt64(); - - /** Reads eight bytes from the stream as a big-endian 64-bit value. - - If the next eight bytes are byte1 to byte8, this returns - (byte8 | (byte7 << 8) | (byte6 << 16) | (byte5 << 24) | (byte4 << 32) | (byte3 << 40) | (byte2 << 48) | (byte1 << 56)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt64BigEndian, readInt64 - */ - virtual int64 readInt64BigEndian(); - - /** Reads four bytes as a 32-bit floating point value. - - The raw 32-bit encoding of the float is read from the stream as a little-endian int. - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeFloat, readDouble - */ - virtual float readFloat(); - - /** Reads four bytes as a 32-bit floating point value. - - The raw 32-bit encoding of the float is read from the stream as a big-endian int. - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeFloatBigEndian, readDoubleBigEndian - */ - virtual float readFloatBigEndian(); - - /** Reads eight bytes as a 64-bit floating point value. - - The raw 64-bit encoding of the double is read from the stream as a little-endian int64. - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeDouble, readFloat - */ - virtual double readDouble(); - - /** Reads eight bytes as a 64-bit floating point value. - - The raw 64-bit encoding of the double is read from the stream as a big-endian int64. - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeDoubleBigEndian, readFloatBigEndian - */ - virtual double readDoubleBigEndian(); - - /** Reads an encoded 32-bit number from the stream using a space-saving compressed format. - - For small values, this is more space-efficient than using readInt() and OutputStream::writeInt() - - The format used is: number of significant bytes + up to 4 bytes in little-endian order. - - @see OutputStream::writeCompressedInt() - */ - virtual int readCompressedInt(); - - //============================================================================== - /** Reads a UTF-8 string from the stream, up to the next linefeed or carriage return. - - This will read up to the next "\n" or "\r\n" or end-of-stream. - - After this call, the stream's position will be left pointing to the next character - following the line-feed, but the linefeeds aren't included in the string that - is returned. - */ - virtual String readNextLine(); - - /** Reads a zero-terminated UTF-8 string from the stream. - - This will read characters from the stream until it hits a null character - or end-of-stream. - - @see OutputStream::writeString, readEntireStreamAsString - */ - virtual String readString(); - - /** Tries to read the whole stream and turn it into a string. - - This will read from the stream's current position until the end-of-stream. - It can read from either UTF-16 or UTF-8 formats. - */ - virtual String readEntireStreamAsString(); - - /** Reads from the stream and appends the data to a MemoryBlock. - - @param destBlock the block to append the data onto - @param maxNumBytesToRead if this is a positive value, it sets a limit to the number - of bytes that will be read - if it's negative, data - will be read until the stream is exhausted. - @returns the number of bytes that were added to the memory block - */ - virtual int readIntoMemoryBlock (MemoryBlock& destBlock, - ssize_t maxNumBytesToRead = -1); - - //============================================================================== - /** Returns the offset of the next byte that will be read from the stream. - - @see setPosition - */ - virtual int64 getPosition() = 0; - - /** Tries to move the current read position of the stream. - - The position is an absolute number of bytes from the stream's start. - - Some streams might not be able to do this, in which case they should do - nothing and return false. Others might be able to manage it by resetting - themselves and skipping to the correct position, although this is - obviously a bit slow. - - @returns true if the stream manages to reposition itself correctly - @see getPosition - */ - virtual bool setPosition (int64 newPosition) = 0; - - /** Reads and discards a number of bytes from the stream. - - Some input streams might implement this efficiently, but the base - class will just keep reading data until the requisite number of bytes - have been done. - */ - virtual void skipNextBytes (int64 numBytesToSkip); - - -protected: - //============================================================================== - InputStream() noexcept {} - -private: - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InputStream) -}; - -#endif // BEAST_INPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.cpp deleted file mode 100644 index d14900e3b4..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.cpp +++ /dev/null @@ -1,155 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -MemoryInputStream::MemoryInputStream (const void* const sourceData, - const size_t sourceDataSize, - const bool keepInternalCopy) - : data (sourceData), - dataSize (sourceDataSize), - position (0) -{ - if (keepInternalCopy) - createInternalCopy(); -} - -MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, - const bool keepInternalCopy) - : data (sourceData.getData()), - dataSize (sourceData.getSize()), - position (0) -{ - if (keepInternalCopy) - createInternalCopy(); -} - -void MemoryInputStream::createInternalCopy() -{ - internalCopy.malloc (dataSize); - memcpy (internalCopy, data, dataSize); - data = internalCopy; -} - -MemoryInputStream::~MemoryInputStream() -{ -} - -int64 MemoryInputStream::getTotalLength() -{ - return dataSize; -} - -int MemoryInputStream::read (void* const buffer, const int howMany) -{ - bassert (buffer != nullptr && howMany >= 0); - - const int num = bmin (howMany, (int) (dataSize - position)); - if (num <= 0) - return 0; - - memcpy (buffer, addBytesToPointer (data, position), (size_t) num); - position += (unsigned int) num; - return num; -} - -bool MemoryInputStream::isExhausted() -{ - return position >= dataSize; -} - -bool MemoryInputStream::setPosition (const int64 pos) -{ - position = (size_t) blimit ((int64) 0, (int64) dataSize, pos); - return true; -} - -int64 MemoryInputStream::getPosition() -{ - return position; -} - - -//============================================================================== -#if BEAST_UNIT_TESTS - -class MemoryStreamTests : public UnitTest -{ -public: - MemoryStreamTests() : UnitTest ("MemoryInputStream & MemoryOutputStream") {} - - void runTest() - { - beginTest ("Basics"); - Random r; - - int randomInt = r.nextInt(); - int64 randomInt64 = r.nextInt64(); - double randomDouble = r.nextDouble(); - String randomString (createRandomWideCharString()); - - MemoryOutputStream mo; - mo.writeInt (randomInt); - mo.writeIntBigEndian (randomInt); - mo.writeCompressedInt (randomInt); - mo.writeString (randomString); - mo.writeInt64 (randomInt64); - mo.writeInt64BigEndian (randomInt64); - mo.writeDouble (randomDouble); - mo.writeDoubleBigEndian (randomDouble); - - MemoryInputStream mi (mo.getData(), mo.getDataSize(), false); - expect (mi.readInt() == randomInt); - expect (mi.readIntBigEndian() == randomInt); - expect (mi.readCompressedInt() == randomInt); - expectEquals (mi.readString(), randomString); - expect (mi.readInt64() == randomInt64); - expect (mi.readInt64BigEndian() == randomInt64); - expect (mi.readDouble() == randomDouble); - expect (mi.readDoubleBigEndian() == randomDouble); - } - - static String createRandomWideCharString() - { - beast_wchar buffer [50] = { 0 }; - Random r; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (beast_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (beast_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } -}; - -static MemoryStreamTests memoryInputStreamUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.h b/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.h deleted file mode 100644 index ce39cc7897..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_MemoryInputStream.h +++ /dev/null @@ -1,95 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORYINPUTSTREAM_BEASTHEADER -#define BEAST_MEMORYINPUTSTREAM_BEASTHEADER - -#include "beast_InputStream.h" -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** - Allows a block of data to be accessed as a stream. - - This can either be used to refer to a shared block of memory, or can make its - own internal copy of the data when the MemoryInputStream is created. -*/ -class BEAST_API MemoryInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a MemoryInputStream. - - @param sourceData the block of data to use as the stream's source - @param sourceDataSize the number of bytes in the source data block - @param keepInternalCopyOfData if false, the stream will just keep a pointer to - the source data, so this data shouldn't be changed - for the lifetime of the stream; if this parameter is - true, the stream will make its own copy of the - data and use that. - */ - MemoryInputStream (const void* sourceData, - size_t sourceDataSize, - bool keepInternalCopyOfData); - - /** Creates a MemoryInputStream. - - @param data a block of data to use as the stream's source - @param keepInternalCopyOfData if false, the stream will just keep a reference to - the source data, so this data shouldn't be changed - for the lifetime of the stream; if this parameter is - true, the stream will make its own copy of the - data and use that. - */ - MemoryInputStream (const MemoryBlock& data, - bool keepInternalCopyOfData); - - /** Destructor. */ - ~MemoryInputStream(); - - /** Returns a pointer to the source data block from which this stream is reading. */ - const void* getData() const noexcept { return data; } - - /** Returns the number of bytes of source data in the block from which this stream is reading. */ - size_t getDataSize() const noexcept { return dataSize; } - - //============================================================================== - int64 getPosition(); - bool setPosition (int64 pos); - int64 getTotalLength(); - bool isExhausted(); - int read (void* destBuffer, int maxBytesToRead); - -private: - //============================================================================== - const void* data; - size_t dataSize, position; - HeapBlock internalCopy; - - void createInternalCopy(); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream) -}; - -#endif // BEAST_MEMORYINPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.cpp deleted file mode 100644 index 0505920614..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.cpp +++ /dev/null @@ -1,165 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -MemoryOutputStream::MemoryOutputStream (const size_t initialSize) - : data (internalBlock), - position (0), - size (0) -{ - internalBlock.setSize (initialSize, false); -} - -MemoryOutputStream::MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo, - const bool appendToExistingBlockContent) - : data (memoryBlockToWriteTo), - position (0), - size (0) -{ - if (appendToExistingBlockContent) - position = size = memoryBlockToWriteTo.getSize(); -} - -MemoryOutputStream::~MemoryOutputStream() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::flush() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::trimExternalBlockSize() -{ - if (&data != &internalBlock) - data.setSize (size, false); -} - -void MemoryOutputStream::preallocate (const size_t bytesToPreallocate) -{ - data.ensureSize (bytesToPreallocate + 1); -} - -void MemoryOutputStream::reset() noexcept -{ - position = 0; - size = 0; -} - -char* MemoryOutputStream::prepareToWrite (size_t numBytes) -{ - bassert ((ssize_t) numBytes >= 0); - size_t storageNeeded = position + numBytes; - - if (storageNeeded >= data.getSize()) - data.ensureSize ((storageNeeded + bmin (storageNeeded / 2, (size_t) (1024 * 1024)) + 32) & ~31u); - - char* const writePointer = static_cast (data.getData()) + position; - position += numBytes; - size = bmax (size, position); - return writePointer; -} - -bool MemoryOutputStream::write (const void* const buffer, size_t howMany) -{ - bassert (buffer != nullptr && ((ssize_t) howMany) >= 0); - - if (howMany > 0) - memcpy (prepareToWrite (howMany), buffer, howMany); - - return true; -} - -void MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany) -{ - if (howMany > 0) - memset (prepareToWrite (howMany), byte, howMany); -} - -void MemoryOutputStream::appendUTF8Char (beast_wchar c) -{ - CharPointer_UTF8 (prepareToWrite (CharPointer_UTF8::getBytesRequiredFor (c))).write (c); -} - -MemoryBlock MemoryOutputStream::getMemoryBlock() const -{ - return MemoryBlock (getData(), getDataSize()); -} - -const void* MemoryOutputStream::getData() const noexcept -{ - if (data.getSize() > size) - static_cast (data.getData()) [size] = 0; - - return data.getData(); -} - -bool MemoryOutputStream::setPosition (int64 newPosition) -{ - if (newPosition <= (int64) size) - { - // ok to seek backwards - position = blimit ((size_t) 0, size, (size_t) newPosition); - return true; - } - - // can't move beyond the end of the stream.. - return false; -} - -int MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite) -{ - // before writing from an input, see if we can preallocate to make it more efficient.. - int64 availableData = source.getTotalLength() - source.getPosition(); - - if (availableData > 0) - { - if (maxNumBytesToWrite > availableData) - maxNumBytesToWrite = availableData; - - preallocate (data.getSize() + (size_t) maxNumBytesToWrite); - } - - return OutputStream::writeFromInputStream (source, maxNumBytesToWrite); -} - -String MemoryOutputStream::toUTF8() const -{ - const char* const d = static_cast (getData()); - return String (CharPointer_UTF8 (d), CharPointer_UTF8 (d + getDataSize())); -} - -String MemoryOutputStream::toString() const -{ - return String::createStringFromData (getData(), (int) getDataSize()); -} - -OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead) -{ - const size_t dataSize = streamToRead.getDataSize(); - - if (dataSize > 0) - stream.write (streamToRead.getData(), dataSize); - - return stream; -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.h b/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.h deleted file mode 100644 index 98ea3daf90..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_MemoryOutputStream.h +++ /dev/null @@ -1,131 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_MEMORYOUTPUTSTREAM_BEASTHEADER -#define BEAST_MEMORYOUTPUTSTREAM_BEASTHEADER - -#include "beast_OutputStream.h" -#include "../memory/beast_MemoryBlock.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - Writes data to an internal memory buffer, which grows as required. - - The data that was written into the stream can then be accessed later as - a contiguous block of memory. -*/ -class BEAST_API MemoryOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates an empty memory stream, ready to be written into. - - @param initialSize the intial amount of capacity to allocate for writing into - */ - MemoryOutputStream (size_t initialSize = 256); - - /** Creates a memory stream for writing into into a pre-existing MemoryBlock object. - - Note that the destination block will always be larger than the amount of data - that has been written to the stream, because the MemoryOutputStream keeps some - spare capactity at its end. To trim the block's size down to fit the actual - data, call flush(), or delete the MemoryOutputStream. - - @param memoryBlockToWriteTo the block into which new data will be written. - @param appendToExistingBlockContent if this is true, the contents of the block will be - kept, and new data will be appended to it. If false, - the block will be cleared before use - */ - MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo, - bool appendToExistingBlockContent); - - /** Destructor. - This will free any data that was written to it. - */ - ~MemoryOutputStream(); - - //============================================================================== - /** Returns a pointer to the data that has been written to the stream. - @see getDataSize - */ - const void* getData() const noexcept; - - /** Returns the number of bytes of data that have been written to the stream. - @see getData - */ - size_t getDataSize() const noexcept { return size; } - - /** Resets the stream, clearing any data that has been written to it so far. */ - void reset() noexcept; - - /** Increases the internal storage capacity to be able to contain at least the specified - amount of data without needing to be resized. - */ - void preallocate (size_t bytesToPreallocate); - - /** Appends the utf-8 bytes for a unicode character */ - void appendUTF8Char (beast_wchar character); - - /** Returns a String created from the (UTF8) data that has been written to the stream. */ - String toUTF8() const; - - /** Attempts to detect the encoding of the data and convert it to a string. - @see String::createStringFromData - */ - String toString() const; - - /** Returns a copy of the stream's data as a memory block. */ - MemoryBlock getMemoryBlock() const; - - //============================================================================== - /** If the stream is writing to a user-supplied MemoryBlock, this will trim any excess - capacity off the block, so that its length matches the amount of actual data that - has been written so far. - */ - void flush(); - - bool write (const void* buffer, size_t howMany); - int64 getPosition() { return position; } - bool setPosition (int64 newPosition); - int writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); - void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); - -private: - //============================================================================== - MemoryBlock& data; - MemoryBlock internalBlock; - size_t position, size; - - void trimExternalBlockSize(); - char* prepareToWrite (size_t); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryOutputStream) -}; - -/** Copies all the data that has been written to a MemoryOutputStream into another stream. */ -OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead); - - -#endif // BEAST_MEMORYOUTPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.cpp deleted file mode 100644 index 5089153779..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.cpp +++ /dev/null @@ -1,320 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if BEAST_DEBUG - -struct DanglingStreamChecker -{ - DanglingStreamChecker() {} - - ~DanglingStreamChecker() - { - /* - It's always a bad idea to leak any object, but if you're leaking output - streams, then there's a good chance that you're failing to flush a file - to disk properly, which could result in corrupted data and other similar - nastiness.. - */ - bassert (activeStreams.size() == 0); - } - - Array activeStreams; -}; - -static DanglingStreamChecker danglingStreamChecker; -#endif - -//============================================================================== -OutputStream::OutputStream() - : newLineString (NewLine::getDefault()) -{ - #if BEAST_DEBUG - danglingStreamChecker.activeStreams.add (this); - #endif -} - -OutputStream::~OutputStream() -{ - #if BEAST_DEBUG - danglingStreamChecker.activeStreams.removeFirstMatchingValue (this); - #endif -} - -//============================================================================== -void OutputStream::writeBool (const bool b) -{ - writeByte (b ? (char) 1 - : (char) 0); -} - -void OutputStream::writeByte (char byte) -{ - write (&byte, 1); -} - -void OutputStream::writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) -{ - for (size_t i = 0; i < numTimesToRepeat; ++i) - writeByte ((char) byte); -} - -void OutputStream::writeShort (short value) -{ - const unsigned short v = ByteOrder::swapIfBigEndian ((unsigned short) value); - write (&v, 2); -} - -void OutputStream::writeShortBigEndian (short value) -{ - const unsigned short v = ByteOrder::swapIfLittleEndian ((unsigned short) value); - write (&v, 2); -} - -void OutputStream::writeInt (int value) -{ - const unsigned int v = ByteOrder::swapIfBigEndian ((unsigned int) value); - write (&v, 4); -} - -void OutputStream::writeIntBigEndian (int value) -{ - const unsigned int v = ByteOrder::swapIfLittleEndian ((unsigned int) value); - write (&v, 4); -} - -void OutputStream::writeCompressedInt (int value) -{ - unsigned int un = (value < 0) ? (unsigned int) -value - : (unsigned int) value; - - uint8 data[5]; - int num = 0; - - while (un > 0) - { - data[++num] = (uint8) un; - un >>= 8; - } - - data[0] = (uint8) num; - - if (value < 0) - data[0] |= 0x80; - - write (data, num + 1); -} - -void OutputStream::writeInt64 (int64 value) -{ - const uint64 v = ByteOrder::swapIfBigEndian ((uint64) value); - write (&v, 8); -} - -void OutputStream::writeInt64BigEndian (int64 value) -{ - const uint64 v = ByteOrder::swapIfLittleEndian ((uint64) value); - write (&v, 8); -} - -void OutputStream::writeFloat (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - writeInt (n.asInt); -} - -void OutputStream::writeFloatBigEndian (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - writeIntBigEndian (n.asInt); -} - -void OutputStream::writeDouble (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - writeInt64 (n.asInt); -} - -void OutputStream::writeDoubleBigEndian (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - writeInt64BigEndian (n.asInt); -} - -void OutputStream::writeString (const String& text) -{ - // (This avoids using toUTF8() to prevent the memory bloat that it would leave behind - // if lots of large, persistent strings were to be written to streams). - const size_t numBytes = text.getNumBytesAsUTF8() + 1; - HeapBlock temp (numBytes); - text.copyToUTF8 (temp, numBytes); - write (temp, numBytes); -} - -void OutputStream::writeText (const String& text, const bool asUTF16, - const bool writeUTF16ByteOrderMark) -{ - if (asUTF16) - { - if (writeUTF16ByteOrderMark) - write ("\x0ff\x0fe", 2); - - String::CharPointerType src (text.getCharPointer()); - bool lastCharWasReturn = false; - - for (;;) - { - const beast_wchar c = src.getAndAdvance(); - - if (c == 0) - break; - - if (c == '\n' && ! lastCharWasReturn) - writeShort ((short) '\r'); - - lastCharWasReturn = (c == L'\r'); - writeShort ((short) c); - } - } - else - { - const char* src = text.toUTF8(); - const char* t = src; - - for (;;) - { - if (*t == '\n') - { - if (t > src) - write (src, (int) (t - src)); - - write ("\r\n", 2); - src = t + 1; - } - else if (*t == '\r') - { - if (t[1] == '\n') - ++t; - } - else if (*t == 0) - { - if (t > src) - write (src, (int) (t - src)); - - break; - } - - ++t; - } - } -} - -int OutputStream::writeFromInputStream (InputStream& source, int64 numBytesToWrite) -{ - if (numBytesToWrite < 0) - numBytesToWrite = std::numeric_limits::max(); - - int numWritten = 0; - - while (numBytesToWrite > 0) - { - char buffer [8192]; - const int num = source.read (buffer, (int) bmin (numBytesToWrite, (int64) sizeof (buffer))); - - if (num <= 0) - break; - - write (buffer, num); - - numBytesToWrite -= num; - numWritten += num; - } - - return numWritten; -} - -//============================================================================== -void OutputStream::setNewLineString (const String& newLineString_) -{ - newLineString = newLineString_; -} - -//============================================================================== -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const int number) -{ - return stream << String (number); -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const int64 number) -{ - return stream << String (number); -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const double number) -{ - return stream << String (number); -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const char character) -{ - stream.writeByte (character); - return stream; -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const char* const text) -{ - stream.write (text, strlen (text)); - return stream; -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data) -{ - if (data.getSize() > 0) - stream.write (data.getData(), data.getSize()); - - return stream; -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead) -{ - FileInputStream in (fileToRead); - - if (in.openedOk()) - return stream << in; - - return stream; -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, InputStream& streamToRead) -{ - stream.writeFromInputStream (streamToRead, -1); - return stream; -} - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const NewLine&) -{ - return stream << stream.getNewLineString(); -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.h b/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.h deleted file mode 100644 index 052cbc4fc7..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_OutputStream.h +++ /dev/null @@ -1,262 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_OUTPUTSTREAM_BEASTHEADER -#define BEAST_OUTPUTSTREAM_BEASTHEADER - -#include "../text/beast_String.h" -#include "../text/beast_NewLine.h" -class InputStream; -class MemoryBlock; -class File; - - -//============================================================================== -/** - The base class for streams that write data to some kind of destination. - - Input and output streams are used throughout the library - subclasses can override - some or all of the virtual functions to implement their behaviour. - - @see InputStream, MemoryOutputStream, FileOutputStream -*/ -class BEAST_API OutputStream -{ -protected: - //============================================================================== - OutputStream(); - -public: - /** Destructor. - - Some subclasses might want to do things like call flush() during their - destructors. - */ - virtual ~OutputStream(); - - //============================================================================== - /** If the stream is using a buffer, this will ensure it gets written - out to the destination. */ - virtual void flush() = 0; - - /** Tries to move the stream's output position. - - Not all streams will be able to seek to a new position - this will return - false if it fails to work. - - @see getPosition - */ - virtual bool setPosition (int64 newPosition) = 0; - - /** Returns the stream's current position. - - @see setPosition - */ - virtual int64 getPosition() = 0; - - //============================================================================== - /** Writes a block of data to the stream. - - When creating a subclass of OutputStream, this is the only write method - that needs to be overloaded - the base class has methods for writing other - types of data which use this to do the work. - - @param dataToWrite the target buffer to receive the data. This must not be null. - @param numberOfBytes the number of bytes to write. - @returns false if the write operation fails for some reason - */ - virtual bool write (const void* dataToWrite, - size_t numberOfBytes) = 0; - - //============================================================================== - /** Writes a single byte to the stream. - - @see InputStream::readByte - */ - virtual void writeByte (char byte); - - /** Writes a boolean to the stream as a single byte. - This is encoded as a binary byte (not as text) with a value of 1 or 0. - @see InputStream::readBool - */ - virtual void writeBool (bool boolValue); - - /** Writes a 16-bit integer to the stream in a little-endian byte order. - This will write two bytes to the stream: (value & 0xff), then (value >> 8). - @see InputStream::readShort - */ - virtual void writeShort (short value); - - /** Writes a 16-bit integer to the stream in a big-endian byte order. - This will write two bytes to the stream: (value >> 8), then (value & 0xff). - @see InputStream::readShortBigEndian - */ - virtual void writeShortBigEndian (short value); - - /** Writes a 32-bit integer to the stream in a little-endian byte order. - @see InputStream::readInt - */ - virtual void writeInt (int value); - - /** Writes a 32-bit integer to the stream in a big-endian byte order. - @see InputStream::readIntBigEndian - */ - virtual void writeIntBigEndian (int value); - - /** Writes a 64-bit integer to the stream in a little-endian byte order. - @see InputStream::readInt64 - */ - virtual void writeInt64 (int64 value); - - /** Writes a 64-bit integer to the stream in a big-endian byte order. - @see InputStream::readInt64BigEndian - */ - virtual void writeInt64BigEndian (int64 value); - - /** Writes a 32-bit floating point value to the stream in a binary format. - The binary 32-bit encoding of the float is written as a little-endian int. - @see InputStream::readFloat - */ - virtual void writeFloat (float value); - - /** Writes a 32-bit floating point value to the stream in a binary format. - The binary 32-bit encoding of the float is written as a big-endian int. - @see InputStream::readFloatBigEndian - */ - virtual void writeFloatBigEndian (float value); - - /** Writes a 64-bit floating point value to the stream in a binary format. - The eight raw bytes of the double value are written out as a little-endian 64-bit int. - @see InputStream::readDouble - */ - virtual void writeDouble (double value); - - /** Writes a 64-bit floating point value to the stream in a binary format. - The eight raw bytes of the double value are written out as a big-endian 64-bit int. - @see InputStream::readDoubleBigEndian - */ - virtual void writeDoubleBigEndian (double value); - - /** Writes a byte to the output stream a given number of times. */ - virtual void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); - - /** Writes a condensed binary encoding of a 32-bit integer. - - If you're storing a lot of integers which are unlikely to have very large values, - this can save a lot of space, because values under 0xff will only take up 2 bytes, - under 0xffff only 3 bytes, etc. - - The format used is: number of significant bytes + up to 4 bytes in little-endian order. - - @see InputStream::readCompressedInt - */ - virtual void writeCompressedInt (int value); - - /** Stores a string in the stream in a binary format. - - This isn't the method to use if you're trying to append text to the end of a - text-file! It's intended for storing a string so that it can be retrieved later - by InputStream::readString(). - - It writes the string to the stream as UTF8, including the null termination character. - - For appending text to a file, instead use writeText, or operator<< - - @see InputStream::readString, writeText, operator<< - */ - virtual void writeString (const String& text); - - /** Writes a string of text to the stream. - - It can either write the text as UTF-8 or UTF-16, and can also add the UTF-16 byte-order-mark - bytes (0xff, 0xfe) to indicate the endianness (these should only be used at the start - of a file). - - The method also replaces '\\n' characters in the text with '\\r\\n'. - */ - virtual void writeText (const String& text, - bool asUTF16, - bool writeUTF16ByteOrderMark); - - /** Reads data from an input stream and writes it to this stream. - - @param source the stream to read from - @param maxNumBytesToWrite the number of bytes to read from the stream (if this is - less than zero, it will keep reading until the input - is exhausted) - */ - virtual int writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); - - //============================================================================== - /** Sets the string that will be written to the stream when the writeNewLine() - method is called. - By default this will be set the the value of NewLine::getDefault(). - */ - void setNewLineString (const String& newLineString); - - /** Returns the current new-line string that was set by setNewLineString(). */ - const String& getNewLineString() const noexcept { return newLineString; } - -private: - //============================================================================== - String newLineString; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OutputStream) -}; - -//============================================================================== -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, int number); - -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, int64 number); - -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, double number); - -/** Writes a character to a stream. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, char character); - -/** Writes a null-terminated text string to a stream. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const char* text); - -/** Writes a block of data from a MemoryBlock to a stream. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data); - -/** Writes the contents of a file to a stream. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead); - -/** Writes the complete contents of an input stream to an output stream. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, InputStream& streamToRead); - -/** Writes a new-line to a stream. - You can use the predefined symbol 'newLine' to invoke this, e.g. - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode - @see OutputStream::setNewLineString -*/ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const NewLine&); - - -#endif // BEAST_OUTPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.cpp b/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.cpp deleted file mode 100644 index 158b99a06c..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -SubregionStream::SubregionStream (InputStream* const sourceStream, - const int64 start, const int64 length, - const bool deleteSourceWhenDestroyed) - : source (sourceStream, deleteSourceWhenDestroyed), - startPositionInSourceStream (start), - lengthOfSourceStream (length) -{ - SubregionStream::setPosition (0); -} - -SubregionStream::~SubregionStream() -{ -} - -int64 SubregionStream::getTotalLength() -{ - const int64 srcLen = source->getTotalLength() - startPositionInSourceStream; - - return lengthOfSourceStream >= 0 ? bmin (lengthOfSourceStream, srcLen) - : srcLen; -} - -int64 SubregionStream::getPosition() -{ - return source->getPosition() - startPositionInSourceStream; -} - -bool SubregionStream::setPosition (int64 newPosition) -{ - return source->setPosition (bmax ((int64) 0, newPosition + startPositionInSourceStream)); -} - -int SubregionStream::read (void* destBuffer, int maxBytesToRead) -{ - bassert (destBuffer != nullptr && maxBytesToRead >= 0); - - if (lengthOfSourceStream < 0) - return source->read (destBuffer, maxBytesToRead); - - maxBytesToRead = (int) bmin ((int64) maxBytesToRead, lengthOfSourceStream - getPosition()); - - if (maxBytesToRead <= 0) - return 0; - - return source->read (destBuffer, maxBytesToRead); -} - -bool SubregionStream::isExhausted() -{ - if (lengthOfSourceStream >= 0 && getPosition() >= lengthOfSourceStream) - return true; - - return source->isExhausted(); -} diff --git a/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.h b/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.h deleted file mode 100644 index f98cdecfe5..0000000000 --- a/Subtrees/beast/modules/beast_core/streams/beast_SubregionStream.h +++ /dev/null @@ -1,87 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SUBREGIONSTREAM_BEASTHEADER -#define BEAST_SUBREGIONSTREAM_BEASTHEADER - -#include "beast_InputStream.h" -#include "../memory/beast_OptionalScopedPointer.h" - - -//============================================================================== -/** Wraps another input stream, and reads from a specific part of it. - - This lets you take a subsection of a stream and present it as an entire - stream in its own right. -*/ -class BEAST_API SubregionStream : public InputStream -{ -public: - //============================================================================== - /** Creates a SubregionStream from an input source. - - @param sourceStream the source stream to read from - @param startPositionInSourceStream this is the position in the source stream that - corresponds to position 0 in this stream - @param lengthOfSourceStream this specifies the maximum number of bytes - from the source stream that will be passed through - by this stream. When the position of this stream - exceeds lengthOfSourceStream, it will cause an end-of-stream. - If the length passed in here is greater than the length - of the source stream (as returned by getTotalLength()), - then the smaller value will be used. - Passing a negative value for this parameter means it - will keep reading until the source's end-of-stream. - @param deleteSourceWhenDestroyed whether the sourceStream that is passed in should be - deleted by this object when it is itself deleted. - */ - SubregionStream (InputStream* sourceStream, - int64 startPositionInSourceStream, - int64 lengthOfSourceStream, - bool deleteSourceWhenDestroyed); - - /** Destructor. - - This may also delete the source stream, if that option was chosen when the - buffered stream was created. - */ - ~SubregionStream(); - - - //============================================================================== - int64 getTotalLength(); - int64 getPosition(); - bool setPosition (int64 newPosition); - int read (void* destBuffer, int maxBytesToRead); - bool isExhausted(); - - - //============================================================================== -private: - OptionalScopedPointer source; - const int64 startPositionInSourceStream, lengthOfSourceStream; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubregionStream) -}; - -#endif // BEAST_SUBREGIONSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/system/beast_PlatformDefs.h b/Subtrees/beast/modules/beast_core/system/beast_PlatformDefs.h deleted file mode 100644 index dd3ff1051e..0000000000 --- a/Subtrees/beast/modules/beast_core/system/beast_PlatformDefs.h +++ /dev/null @@ -1,352 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PLATFORMDEFS_BEASTHEADER -#define BEAST_PLATFORMDEFS_BEASTHEADER - -//============================================================================== -/* This file defines miscellaneous macros for debugging, assertions, etc. -*/ - -//============================================================================== -#ifdef BEAST_FORCE_DEBUG - #undef BEAST_DEBUG - - #if BEAST_FORCE_DEBUG - #define BEAST_DEBUG 1 - #endif -#endif - -/** This macro defines the C calling convention used as the standard for Beast calls. */ -#if BEAST_MSVC - #define BEAST_CALLTYPE __stdcall - #define BEAST_CDECL __cdecl -#else - #define BEAST_CALLTYPE - #define BEAST_CDECL -#endif - -//============================================================================== -// Debugging and assertion macros - -#if BEAST_LOG_ASSERTIONS || BEAST_DEBUG - #define beast_LogCurrentAssertion beast::logAssertion (__FILE__, __LINE__); -#else - #define beast_LogCurrentAssertion -#endif - -//============================================================================== -#if BEAST_IOS || BEAST_LINUX || BEAST_ANDROID || BEAST_PPC - /** This will try to break into the debugger if the app is currently being debugged. - If called by an app that's not being debugged, the behaiour isn't defined - it may crash or not, depending - on the platform. - @see bassert() - */ - #define beast_breakDebugger { ::kill (0, SIGTRAP); } -#elif BEAST_USE_INTRINSICS - #ifndef __INTEL_COMPILER - #pragma intrinsic (__debugbreak) - #endif - #define beast_breakDebugger { __debugbreak(); } -#elif BEAST_GCC || BEAST_MAC - #if BEAST_NO_INLINE_ASM - #define beast_breakDebugger { } - #else - #define beast_breakDebugger { asm ("int $3"); } - #endif -#else - #define beast_breakDebugger { __asm int 3 } -#endif - - -//============================================================================== -#if BEAST_DEBUG || DOXYGEN - /** Writes a string to the standard error stream. - This is only compiled in a debug build. - @see Logger::outputDebugString - */ - #define DBG(dbgtext) { beast::String tempDbgBuf; tempDbgBuf << dbgtext; beast::Logger::outputDebugString (tempDbgBuf); } - - //============================================================================== - /** This will always cause an assertion failure. - It is only compiled in a debug build, (unless BEAST_LOG_ASSERTIONS is enabled for your build). - @see bassert - */ - #define bassertfalse { beast_LogCurrentAssertion; if (beast::beast_isRunningUnderDebugger()) beast_breakDebugger; } - - //============================================================================== - /** Platform-independent assertion macro. - - This macro gets turned into a no-op when you're building with debugging turned off, so be - careful that the expression you pass to it doesn't perform any actions that are vital for the - correct behaviour of your program! - @see bassertfalse - */ - #define bassert(expression) { if (! (expression)) bassertfalse; } - -#else - //============================================================================== - // If debugging is disabled, these dummy debug and assertion macros are used.. - - #define DBG(dbgtext) - #define bassertfalse { beast_LogCurrentAssertion } - - #if BEAST_LOG_ASSERTIONS - #define bassert(expression) { if (! (expression)) bassertfalse; } - #else - #define bassert(a) {} - #endif - -#endif - -//============================================================================== -#ifndef DOXYGEN -namespace beast -{ - template struct BeastStaticAssert; - template <> struct BeastStaticAssert { static void dummy() {} }; -} -#endif - -/** A compile-time assertion macro. - If the expression parameter is false, the macro will cause a compile error. (The actual error - message that the compiler generates may be completely bizarre and seem to have no relation to - the place where you put the static_assert though!) -*/ -#define static_bassert(expression) beast::BeastStaticAssert::dummy(); - -/** This is a shorthand macro for declaring stubs for a class's copy constructor and operator=. - - For example, instead of - @code - class MyClass - { - etc.. - - private: - MyClass (const MyClass&); - MyClass& operator= (const MyClass&); - };@endcode - - ..you can just write: - - @code - class MyClass - { - etc.. - - private: - BEAST_DECLARE_NON_COPYABLE (MyClass) - };@endcode -*/ -#define BEAST_DECLARE_NON_COPYABLE(className) \ - className (const className&);\ - className& operator= (const className&); - -/** This is a shorthand way of writing both a BEAST_DECLARE_NON_COPYABLE and - BEAST_LEAK_DETECTOR macro for a class. -*/ -#define BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className) \ - BEAST_DECLARE_NON_COPYABLE(className) \ - BEAST_LEAK_DETECTOR(className) - -/** This macro can be added to class definitions to disable the use of new/delete to - allocate the object on the heap, forcing it to only be used as a stack or member variable. -*/ -#define BEAST_PREVENT_HEAP_ALLOCATION \ - private: \ - static void* operator new (size_t); \ - static void operator delete (void*); - - -//============================================================================== -#if ! DOXYGEN - #define BEAST_JOIN_MACRO_HELPER(a, b) a ## b - #define BEAST_STRINGIFY_MACRO_HELPER(a) #a -#endif - -/** A good old-fashioned C macro concatenation helper. - This combines two items (which may themselves be macros) into a single string, - avoiding the pitfalls of the ## macro operator. -*/ -#define BEAST_JOIN_MACRO(item1, item2) BEAST_JOIN_MACRO_HELPER (item1, item2) - -/** A handy C macro for stringifying any symbol, rather than just a macro parameter. -*/ -#define BEAST_STRINGIFY(item) BEAST_STRINGIFY_MACRO_HELPER (item) - - -//============================================================================== -#if BEAST_CATCH_UNHANDLED_EXCEPTIONS - - #define BEAST_TRY try - - #define BEAST_CATCH_ALL catch (...) {} - #define BEAST_CATCH_ALL_ASSERT catch (...) { bassertfalse; } - - #if ! BEAST_MODULE_AVAILABLE_beast_gui_basics - #define BEAST_CATCH_EXCEPTION BEAST_CATCH_ALL - #else - /** Used in try-catch blocks, this macro will send exceptions to the BEASTApplication - object so they can be logged by the application if it wants to. - */ - #define BEAST_CATCH_EXCEPTION \ - catch (const std::exception& e) \ - { \ - beast::BEASTApplication::sendUnhandledException (&e, __FILE__, __LINE__); \ - } \ - catch (...) \ - { \ - beast::BEASTApplication::sendUnhandledException (nullptr, __FILE__, __LINE__); \ - } - #endif - -#else - - #define BEAST_TRY - #define BEAST_CATCH_EXCEPTION - #define BEAST_CATCH_ALL - #define BEAST_CATCH_ALL_ASSERT - -#endif - -//============================================================================== -#if BEAST_DEBUG || DOXYGEN - /** A platform-independent way of forcing an inline function. - Use the syntax: @code - forcedinline void myfunction (int x) - @endcode - */ - #define forcedinline inline -#else - #if BEAST_MSVC - #define forcedinline __forceinline - #else - #define forcedinline inline __attribute__((always_inline)) - #endif -#endif - -#if BEAST_MSVC || DOXYGEN - /** This can be placed before a stack or member variable declaration to tell the compiler - to align it to the specified number of bytes. */ - #define BEAST_ALIGN(bytes) __declspec (align (bytes)) -#else - #define BEAST_ALIGN(bytes) __attribute__ ((aligned (bytes))) -#endif - -//============================================================================== -// Cross-compiler deprecation macros.. -#if DOXYGEN || (BEAST_MSVC && ! BEAST_NO_DEPRECATION_WARNINGS) - /** This can be used to wrap a function which has been deprecated. */ - #define BEAST_DEPRECATED(functionDef) __declspec(deprecated) functionDef -#elif BEAST_GCC && ! BEAST_NO_DEPRECATION_WARNINGS - #define BEAST_DEPRECATED(functionDef) functionDef __attribute__ ((deprecated)) -#else - #define BEAST_DEPRECATED(functionDef) functionDef -#endif - -//============================================================================== -#if BEAST_ANDROID && ! DOXYGEN - #define BEAST_MODAL_LOOPS_PERMITTED 0 -#elif ! defined (BEAST_MODAL_LOOPS_PERMITTED) - /** Some operating environments don't provide a modal loop mechanism, so this flag can be - used to disable any functions that try to run a modal loop. */ - #define BEAST_MODAL_LOOPS_PERMITTED 1 -#endif - -//============================================================================== -#if BEAST_GCC - #define BEAST_PACKED __attribute__((packed)) -#elif ! DOXYGEN - #define BEAST_PACKED -#endif - -//============================================================================== -// Here, we'll check for C++11 compiler support, and if it's not available, define -// a few workarounds, so that we can still use some of the newer language features. -#if defined (__GXX_EXPERIMENTAL_CXX0X__) && defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 - #define BEAST_COMPILER_SUPPORTS_NOEXCEPT 1 - #define BEAST_COMPILER_SUPPORTS_NULLPTR 1 - #define BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 - - #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL) - #define BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 - #endif -#endif - -#if BEAST_CLANG && defined (__has_feature) - #if __has_feature (cxx_nullptr) - #define BEAST_COMPILER_SUPPORTS_NULLPTR 1 - #endif - - #if __has_feature (cxx_noexcept) - #define BEAST_COMPILER_SUPPORTS_NOEXCEPT 1 - #endif - - #if __has_feature (cxx_rvalue_references) - #define BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 - #endif - - #ifndef BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL - #define BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 - #endif - - #ifndef BEAST_COMPILER_SUPPORTS_ARC - #define BEAST_COMPILER_SUPPORTS_ARC 1 - #endif -#endif - -#if defined (_MSC_VER) && _MSC_VER >= 1600 - #define BEAST_COMPILER_SUPPORTS_NULLPTR 1 - #define BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 -#endif - -#if defined (_MSC_VER) && _MSC_VER >= 1700 - #define BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 -#endif - -//============================================================================== -// Declare some fake versions of nullptr and noexcept, for older compilers: -#if ! (DOXYGEN || BEAST_COMPILER_SUPPORTS_NOEXCEPT) - #ifdef noexcept - #undef noexcept - #endif - #define noexcept throw() - #if defined (_MSC_VER) && _MSC_VER > 1600 - #define _ALLOW_KEYWORD_MACROS 1 // (to stop VC2012 complaining) - #endif -#endif - -#if ! (DOXYGEN || BEAST_COMPILER_SUPPORTS_NULLPTR) - #ifdef nullptr - #undef nullptr - #endif - #define nullptr (0) -#endif - -#if ! (DOXYGEN || BEAST_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL) - #undef override - #define override -#endif - -#endif // BEAST_PLATFORMDEFS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/system/beast_StandardHeader.h b/Subtrees/beast/modules/beast_core/system/beast_StandardHeader.h deleted file mode 100644 index ce4e4f7efe..0000000000 --- a/Subtrees/beast/modules/beast_core/system/beast_StandardHeader.h +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STANDARDHEADER_BEASTHEADER -#define BEAST_STANDARDHEADER_BEASTHEADER - -//============================================================================== -/** Current BEAST version number. - - See also SystemStats::getBEASTVersion() for a string version. -*/ -#define BEAST_MAJOR_VERSION 0 -#define BEAST_MINOR_VERSION 0 -#define BEAST_BUILDNUMBER 1 - -/** Current Beast version number. - - Bits 16 to 32 = major version. - Bits 8 to 16 = minor version. - Bits 0 to 8 = point release. - - See also SystemStats::getBEASTVersion() for a string version. -*/ -#define BEAST_VERSION ((BEAST_MAJOR_VERSION << 16) + (BEAST_MINOR_VERSION << 8) + BEAST_BUILDNUMBER) - - -//============================================================================== -#include "beast_TargetPlatform.h" // (sets up the various BEAST_WINDOWS, BEAST_MAC, etc flags) -#include "beast_PlatformDefs.h" - -//============================================================================== -// Now we'll include some common OS headers.. -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4245 4100) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if BEAST_USE_INTRINSICS - #include -#endif - -#if BEAST_MAC || BEAST_IOS - #include -#endif - -#if BEAST_LINUX - #include - - #if __INTEL_COMPILER - #if __ia64__ - #include - #else - #include - #endif - #endif -#endif - -#if BEAST_MSVC && BEAST_DEBUG - #include -#endif - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -#if BEAST_ANDROID - #include - #include -#endif - -// undef symbols that are sometimes set by misguided 3rd-party headers.. -#undef check -#undef TYPE_BOOL -#undef max -#undef min - -//============================================================================== -// DLL building settings on Windows -#if BEAST_MSVC - #ifdef BEAST_DLL_BUILD - #define BEAST_API __declspec (dllexport) - #pragma warning (disable: 4251) - #elif defined (BEAST_DLL) - #define BEAST_API __declspec (dllimport) - #pragma warning (disable: 4251) - #endif - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) // (virtual override warning) - #endif -#elif defined (BEAST_DLL) || defined (BEAST_DLL_BUILD) - #define BEAST_API __attribute__ ((visibility("default"))) -#endif - -//============================================================================== -#ifndef BEAST_API - #define BEAST_API /**< This macro is added to all beast public class declarations. */ -#endif - -#if BEAST_MSVC && BEAST_DLL_BUILD - #define BEAST_PUBLIC_IN_DLL_BUILD(declaration) public: declaration; private: -#else - #define BEAST_PUBLIC_IN_DLL_BUILD(declaration) declaration; -#endif - -/** This macro is added to all beast public function declarations. */ -#define BEAST_PUBLIC_FUNCTION BEAST_API BEAST_CALLTYPE - -#if (! defined (BEAST_CATCH_DEPRECATED_CODE_MISUSE)) && BEAST_DEBUG && ! DOXYGEN - /** This turns on some non-essential bits of code that should prevent old code from compiling - in cases where method signatures have changed, etc. - */ - #define BEAST_CATCH_DEPRECATED_CODE_MISUSE 1 -#endif - -#ifndef DOXYGEN - #define BEAST_NAMESPACE beast // This old macro is deprecated: you should just use the beast namespace directly. -#endif - -//============================================================================== -// Now include some common headers... -namespace beast -{ - extern BEAST_API bool BEAST_CALLTYPE beast_isRunningUnderDebugger(); - extern BEAST_API void BEAST_CALLTYPE logAssertion (const char* file, int line) noexcept; - - #include "../memory/beast_Memory.h" - #include "../maths/beast_MathsFunctions.h" - #include "../memory/beast_ByteOrder.h" - #include "../logging/beast_Logger.h" - #include "../memory/beast_LeakedObjectDetector.h" -} - -#endif // BEAST_STANDARDHEADER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/system/beast_SystemStats.cpp b/Subtrees/beast/modules/beast_core/system/beast_SystemStats.cpp deleted file mode 100644 index 07a8b43c8c..0000000000 --- a/Subtrees/beast/modules/beast_core/system/beast_SystemStats.cpp +++ /dev/null @@ -1,152 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -const SystemStats::CPUFlags& SystemStats::getCPUFlags() -{ - static CPUFlags cpuFlags; - return cpuFlags; -} - -String SystemStats::getBEASTVersion() -{ - // Some basic tests, to keep an eye on things and make sure these types work ok - // on all platforms. Let me know if any of these assertions fail on your system! - static_bassert (sizeof (pointer_sized_int) == sizeof (void*)); - static_bassert (sizeof (int8) == 1); - static_bassert (sizeof (uint8) == 1); - static_bassert (sizeof (int16) == 2); - static_bassert (sizeof (uint16) == 2); - static_bassert (sizeof (int32) == 4); - static_bassert (sizeof (uint32) == 4); - static_bassert (sizeof (int64) == 8); - static_bassert (sizeof (uint64) == 8); - - return "BEAST v" BEAST_STRINGIFY(BEAST_MAJOR_VERSION) - "." BEAST_STRINGIFY(BEAST_MINOR_VERSION) - "." BEAST_STRINGIFY(BEAST_BUILDNUMBER); -} - -#if BEAST_ANDROID && ! defined (BEAST_DISABLE_BEAST_VERSION_PRINTING) - #define BEAST_DISABLE_BEAST_VERSION_PRINTING 1 -#endif - -#if BEAST_DEBUG && ! BEAST_DISABLE_BEAST_VERSION_PRINTING - struct BeastVersionPrinter - { - BeastVersionPrinter() - { - DBG (SystemStats::getBEASTVersion()); - } - }; - - static BeastVersionPrinter beastVersionPrinter; -#endif - - -//============================================================================== -String SystemStats::getStackBacktrace() -{ - String result; - - #if BEAST_ANDROID || BEAST_MINGW || BEAST_BSD - bassertfalse; // sorry, not implemented yet! - - #elif BEAST_WINDOWS - HANDLE process = GetCurrentProcess(); - SymInitialize (process, nullptr, TRUE); - - void* stack[128]; - int frames = (int) CaptureStackBackTrace (0, numElementsInArray (stack), stack, nullptr); - - HeapBlock symbol; - symbol.calloc (sizeof(SYMBOL_INFO) + 256, 1); - symbol->MaxNameLen = 255; - symbol->SizeOfStruct = sizeof (SYMBOL_INFO); - - for (int i = 0; i < frames; ++i) - { - DWORD64 displacement = 0; - - if (SymFromAddr (process, (DWORD64) stack[i], &displacement, symbol)) - { - result << i << ": "; - - IMAGEHLP_MODULE64 moduleInfo; - zerostruct (moduleInfo); - moduleInfo.SizeOfStruct = sizeof (moduleInfo); - - if (::SymGetModuleInfo64 (process, symbol->ModBase, &moduleInfo)) - result << moduleInfo.ModuleName << ": "; - - result << symbol->Name << " + 0x" << String::toHexString ((int64) displacement) << newLine; - } - } - - #else - void* stack[128]; - int frames = backtrace (stack, numElementsInArray (stack)); - char** frameStrings = backtrace_symbols (stack, frames); - - for (int i = 0; i < frames; ++i) - result << frameStrings[i] << newLine; - - ::free (frameStrings); - #endif - - return result; -} - -//============================================================================== -static SystemStats::CrashHandlerFunction globalCrashHandler = nullptr; - -#if BEAST_WINDOWS -static LONG WINAPI handleCrash (LPEXCEPTION_POINTERS) -{ - globalCrashHandler(); - return EXCEPTION_EXECUTE_HANDLER; -} -#else -static void handleCrash (int) -{ - globalCrashHandler(); - kill (getpid(), SIGKILL); -} -#endif - -void SystemStats::setApplicationCrashHandler (CrashHandlerFunction handler) -{ - bassert (handler != nullptr); // This must be a valid function. - globalCrashHandler = handler; - - #if BEAST_WINDOWS - SetUnhandledExceptionFilter (handleCrash); - #else - const int signals[] = { SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT, SIGSYS }; - - for (int i = 0; i < numElementsInArray (signals); ++i) - { - ::signal (signals[i], handleCrash); - ::siginterrupt (signals[i], 1); - } - #endif -} diff --git a/Subtrees/beast/modules/beast_core/system/beast_SystemStats.h b/Subtrees/beast/modules/beast_core/system/beast_SystemStats.h deleted file mode 100644 index 761f7c91bf..0000000000 --- a/Subtrees/beast/modules/beast_core/system/beast_SystemStats.h +++ /dev/null @@ -1,201 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SYSTEMSTATS_BEASTHEADER -#define BEAST_SYSTEMSTATS_BEASTHEADER - -#include "../text/beast_StringArray.h" - - -//============================================================================== -/** - Contains methods for finding out about the current hardware and OS configuration. -*/ -class BEAST_API SystemStats -{ -public: - //============================================================================== - /** Returns the current version of BEAST, - See also the BEAST_VERSION, BEAST_MAJOR_VERSION and BEAST_MINOR_VERSION macros. - */ - static String getBEASTVersion(); - - //============================================================================== - /** The set of possible results of the getOperatingSystemType() method. */ - enum OperatingSystemType - { - UnknownOS = 0, - - Linux = 0x2000, - Android = 0x3000, - iOS = 0x8000, - - MacOSX_10_4 = 0x1004, - MacOSX_10_5 = 0x1005, - MacOSX_10_6 = 0x1006, - MacOSX_10_7 = 0x1007, - MacOSX_10_8 = 0x1008, - - Win2000 = 0x4105, - WinXP = 0x4106, - WinVista = 0x4107, - Windows7 = 0x4108, - Windows8 = 0x4109, - - Windows = 0x4000, /**< To test whether any version of Windows is running, - you can use the expression ((getOperatingSystemType() & Windows) != 0). */ - }; - - /** Returns the type of operating system we're running on. - - @returns one of the values from the OperatingSystemType enum. - @see getOperatingSystemName - */ - static OperatingSystemType getOperatingSystemType(); - - /** Returns the name of the type of operating system we're running on. - - @returns a string describing the OS type. - @see getOperatingSystemType - */ - static String getOperatingSystemName(); - - /** Returns true if the OS is 64-bit, or false for a 32-bit OS. - */ - static bool isOperatingSystem64Bit(); - - /** Returns an environment variable. - If the named value isn't set, this will return the defaultValue string instead. - */ - static String getEnvironmentVariable (const String& name, const String& defaultValue); - - //============================================================================== - /** Returns the current user's name, if available. - @see getFullUserName() - */ - static String getLogonName(); - - /** Returns the current user's full name, if available. - On some OSes, this may just return the same value as getLogonName(). - @see getLogonName() - */ - static String getFullUserName(); - - /** Returns the host-name of the computer. */ - static String getComputerName(); - - /** Returns the language of the user's locale. - The return value is a 2 or 3 letter language code (ISO 639-1 or ISO 639-2) - */ - static String getUserLanguage(); - - /** Returns the region of the user's locale. - The return value is a 2 letter country code (ISO 3166-1 alpha-2). - */ - static String getUserRegion(); - - /** Returns the user's display language. - The return value is a 2 or 3 letter language code (ISO 639-1 or ISO 639-2) - */ - static String getDisplayLanguage(); - - //============================================================================== - // CPU and memory information.. - - /** Returns the number of CPUs. */ - static int getNumCpus() noexcept { return getCPUFlags().numCpus; } - - /** Returns the approximate CPU speed. - @returns the speed in megahertz, e.g. 1500, 2500, 32000 (depending on - what year you're reading this...) - */ - static int getCpuSpeedInMegaherz(); - - /** Returns a string to indicate the CPU vendor. - Might not be known on some systems. - */ - static String getCpuVendor(); - - /** Checks whether Intel MMX instructions are available. */ - static bool hasMMX() noexcept { return getCPUFlags().hasMMX; } - - /** Checks whether Intel SSE instructions are available. */ - static bool hasSSE() noexcept { return getCPUFlags().hasSSE; } - - /** Checks whether Intel SSE2 instructions are available. */ - static bool hasSSE2() noexcept { return getCPUFlags().hasSSE2; } - - /** Checks whether AMD 3DNOW instructions are available. */ - static bool has3DNow() noexcept { return getCPUFlags().has3DNow; } - - //============================================================================== - /** Finds out how much RAM is in the machine. - @returns the approximate number of megabytes of memory, or zero if - something goes wrong when finding out. - */ - static int getMemorySizeInMegabytes(); - - /** Returns the system page-size. - This is only used by programmers with beards. - */ - static int getPageSize(); - - //============================================================================== - /** Returns a backtrace of the current call-stack. - The usefulness of the result will depend on the level of debug symbols - that are available in the executable. - */ - static String getStackBacktrace(); - - /** A void() function type, used by setApplicationCrashHandler(). */ - typedef void (*CrashHandlerFunction)(); - - /** Sets up a global callback function that will be called if the application - executes some kind of illegal instruction. - - You may want to call getStackBacktrace() in your handler function, to find out - where the problem happened and log it, etc. - */ - static void setApplicationCrashHandler (CrashHandlerFunction); - -private: - //============================================================================== - struct CPUFlags - { - CPUFlags(); - - int numCpus; - bool hasMMX : 1; - bool hasSSE : 1; - bool hasSSE2 : 1; - bool has3DNow : 1; - }; - - SystemStats(); - static const CPUFlags& getCPUFlags(); - - BEAST_DECLARE_NON_COPYABLE (SystemStats) -}; - - -#endif // BEAST_SYSTEMSTATS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/system/beast_TargetPlatform.h b/Subtrees/beast/modules/beast_core/system/beast_TargetPlatform.h deleted file mode 100644 index ac88ca8dbc..0000000000 --- a/Subtrees/beast/modules/beast_core/system/beast_TargetPlatform.h +++ /dev/null @@ -1,216 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_TARGETPLATFORM_BEASTHEADER -#define BEAST_TARGETPLATFORM_BEASTHEADER - -//============================================================================== -/* This file figures out which platform is being built, and defines some macros - that the rest of the code can use for OS-specific compilation. - - Macros that will be set here are: - - - One of BEAST_WINDOWS, BEAST_MAC BEAST_LINUX, BEAST_IOS, BEAST_ANDROID, etc. - - Either BEAST_32BIT or BEAST_64BIT, depending on the architecture. - - Either BEAST_LITTLE_ENDIAN or BEAST_BIG_ENDIAN. - - Either BEAST_INTEL or BEAST_PPC - - Either BEAST_GCC or BEAST_MSVC -*/ - -//============================================================================== -#if (defined (_WIN32) || defined (_WIN64)) - #define BEAST_WIN32 1 - #define BEAST_WINDOWS 1 -#elif defined (BEAST_ANDROID) - #undef BEAST_ANDROID - #define BEAST_ANDROID 1 -#elif defined (LINUX) || defined (__linux__) - #define BEAST_LINUX 1 -#elif defined (__APPLE_CPP__) || defined(__APPLE_CC__) - #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) - #define Component CarbonDummyCompName - #include // (needed to find out what platform we're using) - #undef Point - #undef Component - - #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR - #define BEAST_IPHONE 1 - #define BEAST_IOS 1 - #else - #define BEAST_MAC 1 - #endif -#elif defined (__FreeBSD__) - #define BEAST_BSD 1 -#else - #error "Unknown platform!" -#endif - -//============================================================================== -#if BEAST_WINDOWS - #ifdef _MSC_VER - #ifdef _WIN64 - #define BEAST_64BIT 1 - #else - #define BEAST_32BIT 1 - #endif - #endif - - #ifdef _DEBUG - #define BEAST_DEBUG 1 - #endif - - #ifdef __MINGW32__ - #define BEAST_MINGW 1 - #ifdef __MINGW64__ - #define BEAST_64BIT 1 - #else - #define BEAST_32BIT 1 - #endif - #endif - - /** If defined, this indicates that the processor is little-endian. */ - #define BEAST_LITTLE_ENDIAN 1 - - #define BEAST_INTEL 1 -#endif - -//============================================================================== -#if BEAST_MAC || BEAST_IOS - - #if defined (DEBUG) || defined (_DEBUG) || ! (defined (NDEBUG) || defined (_NDEBUG)) - #define BEAST_DEBUG 1 - #endif - - #if ! (defined (DEBUG) || defined (_DEBUG) || defined (NDEBUG) || defined (_NDEBUG)) - #warning "Neither NDEBUG or DEBUG has been defined - you should set one of these to make it clear whether this is a release build," - #endif - - #ifdef __LITTLE_ENDIAN__ - #define BEAST_LITTLE_ENDIAN 1 - #else - #define BEAST_BIG_ENDIAN 1 - #endif -#endif - -#if BEAST_MAC - - #if defined (__ppc__) || defined (__ppc64__) - #define BEAST_PPC 1 - #elif defined (__arm__) - #define BEAST_ARM 1 - #else - #define BEAST_INTEL 1 - #endif - - #ifdef __LP64__ - #define BEAST_64BIT 1 - #else - #define BEAST_32BIT 1 - #endif - - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4 - #error "Building for OSX 10.3 is no longer supported!" - #endif - - #ifndef MAC_OS_X_VERSION_10_5 - #error "To build with 10.4 compatibility, use a 10.5 or 10.6 SDK and set the deployment target to 10.4" - #endif - -#endif - -//============================================================================== -#if BEAST_LINUX || BEAST_ANDROID || BEAST_BSD - - #ifdef _DEBUG - #define BEAST_DEBUG 1 - #endif - - // Allow override for big-endian Linux platforms - #if defined (__LITTLE_ENDIAN__) || ! defined (BEAST_BIG_ENDIAN) - #define BEAST_LITTLE_ENDIAN 1 - #undef BEAST_BIG_ENDIAN - #else - #undef BEAST_LITTLE_ENDIAN - #define BEAST_BIG_ENDIAN 1 - #endif - - #if defined (__LP64__) || defined (_LP64) - #define BEAST_64BIT 1 - #else - #define BEAST_32BIT 1 - #endif - - #if __MMX__ || __SSE__ || __amd64__ - #ifdef __arm__ - #define BEAST_ARM 1 - #else - #define BEAST_INTEL 1 - #endif - #endif -#endif - -//============================================================================== -// Compiler type macros. - -#ifdef __clang__ - #define BEAST_CLANG 1 - #define BEAST_GCC 1 -#elif defined (__GNUC__) - #define BEAST_GCC 1 -#elif defined (_MSC_VER) - #define BEAST_MSVC 1 - - #if _MSC_VER < 1500 - #define BEAST_VC8_OR_EARLIER 1 - - #if _MSC_VER < 1400 - #define BEAST_VC7_OR_EARLIER 1 - - #if _MSC_VER < 1300 - #warning "MSVC 6.0 is no longer supported!" - #endif - #endif - #endif - - #if BEAST_64BIT || ! BEAST_VC7_OR_EARLIER - #define BEAST_USE_INTRINSICS 1 - #endif -#else - #error unknown compiler -#endif - -//------------------------------------------------------------------------------ - -// Handy macro that lets pragma warnings be clicked in the output window -// -// Usage: #pragma message(BEAST_FILEANDLINE_ "Advertise here!") -// -// Note that a space following the macro is mandatory for C++11. -// -// This is here so it can be used in C compilations that include this directly. -// -#define BEAST_PP_STR2_(x) #x -#define BEAST_PP_STR1_(x) BEAST_PP_STR2_(x) -#define BEAST_FILEANDLINE_ __FILE__ "(" BEAST_PP_STR1_(__LINE__) "): warning:" - -#endif // BEAST_TARGETPLATFORM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_ASCII.h b/Subtrees/beast/modules/beast_core/text/beast_CharPointer_ASCII.h deleted file mode 100644 index 8b09445ba4..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_ASCII.h +++ /dev/null @@ -1,382 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHARPOINTER_ASCII_BEASTHEADER -#define BEAST_CHARPOINTER_ASCII_BEASTHEADER - - -//============================================================================== -/** - Wraps a pointer to a null-terminated ASCII character string, and provides - various methods to operate on the data. - - A valid ASCII string is assumed to not contain any characters above 127. - - @see CharPointer_UTF8, CharPointer_UTF16, CharPointer_UTF32 -*/ -class CharPointer_ASCII -{ -public: - typedef char CharType; - - inline explicit CharPointer_ASCII (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_ASCII (const CharPointer_ASCII& other) noexcept - : data (other.data) - { - } - - inline CharPointer_ASCII operator= (const CharPointer_ASCII other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_ASCII operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_ASCII other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_ASCII other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_ASCII other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_ASCII other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_ASCII other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_ASCII other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - inline beast_wchar operator*() const noexcept { return (beast_wchar) (uint8) *data; } - - /** Moves this pointer along to the next character in the string. */ - inline CharPointer_ASCII operator++() noexcept - { - ++data; - return *this; - } - - /** Moves this pointer to the previous character in the string. */ - inline CharPointer_ASCII operator--() noexcept - { - --data; - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - inline beast_wchar getAndAdvance() noexcept { return (beast_wchar) (uint8) *data++; } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_ASCII operator++ (int) noexcept - { - CharPointer_ASCII temp (*this); - ++data; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - inline void operator+= (const int numToSkip) noexcept - { - data += numToSkip; - } - - inline void operator-= (const int numToSkip) noexcept - { - data -= numToSkip; - } - - /** Returns the character at a given character index from the start of the string. */ - inline beast_wchar operator[] (const int characterIndex) const noexcept - { - return (beast_wchar) (unsigned char) data [characterIndex]; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_ASCII operator+ (const int numToSkip) const noexcept - { - return CharPointer_ASCII (data + numToSkip); - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_ASCII operator- (const int numToSkip) const noexcept - { - return CharPointer_ASCII (data - numToSkip); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - inline void write (const beast_wchar charToWrite) noexcept - { - *data++ = (char) charToWrite; - } - - inline void replaceChar (const beast_wchar newChar) noexcept - { - *data = (char) newChar; - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - return (size_t) strlen (data); - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_ASCII end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return length() + 1; - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static inline size_t getBytesRequiredFor (const beast_wchar) noexcept - { - return 1; - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (const CharPointer text) noexcept - { - return text.length(); - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_ASCII findTerminatingNull() const noexcept - { - return CharPointer_ASCII (data + length()); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_ASCII src) noexcept - { - strcpy (data, src.data); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one. */ - int compare (const CharPointer_ASCII other) const noexcept - { - return strcmp (data, other.data); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one, up to a specified number of characters. */ - int compareUpTo (const CharPointer_ASCII other, const int maxChars) const noexcept - { - return strncmp (data, other.data, (size_t) maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - int compareIgnoreCase (const CharPointer_ASCII other) const - { - #if BEAST_WINDOWS - return stricmp (data, other.data); - #else - return strcasecmp (data, other.data); - #endif - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind) const noexcept - { - int i = 0; - - while (data[i] != 0) - { - if (data[i] == (char) charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const { return CharacterFunctions::isWhitespace (*data) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const { return CharacterFunctions::isDigit (*data) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const { return CharacterFunctions::isLetter (*data) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const { return CharacterFunctions::isLetterOrDigit (*data) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const { return CharacterFunctions::isUpperCase ((beast_wchar) (uint8) *data) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const { return CharacterFunctions::isLowerCase ((beast_wchar) (uint8) *data) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - beast_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase ((beast_wchar) (uint8) *data); } - /** Returns a lower-case version of the first character of this string. */ - beast_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase ((beast_wchar) (uint8) *data); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return atoi (data); } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if BEAST_LINUX || BEAST_ANDROID - return atoll (data); - #elif BEAST_WINDOWS - return _atoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_ASCII findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (beast_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 128; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - while (--maxBytesToRead >= 0) - { - if (((signed char) *dataToTest) <= 0) - return *dataToTest == 0; - - ++dataToTest; - } - - return true; - } - -private: - CharType* data; -}; - - -#endif // BEAST_CHARPOINTER_ASCII_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF16.h b/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF16.h deleted file mode 100644 index 22a0bdb213..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF16.h +++ /dev/null @@ -1,496 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHARPOINTER_UTF16_BEASTHEADER -#define BEAST_CHARPOINTER_UTF16_BEASTHEADER - - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-16 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF8, CharPointer_UTF32 -*/ -class CharPointer_UTF16 -{ -public: - #if BEAST_NATIVE_WCHAR_IS_UTF16 - typedef wchar_t CharType; - #else - typedef int16 CharType; - #endif - - inline explicit CharPointer_UTF16 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF16 (const CharPointer_UTF16& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF16 operator= (CharPointer_UTF16 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF16 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF16 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF16 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF16 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF16 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF16 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF16 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - beast_wchar operator*() const noexcept - { - uint32 n = (uint32) (uint16) *data; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) data[1]) >= 0xdc00) - n = 0x10000 + (((n - 0xd800) << 10) | (((uint32) (uint16) data[1]) - 0xdc00)); - - return (beast_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF16 operator++() noexcept - { - const beast_wchar n = *data++; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) *data) >= 0xdc00) - ++data; - - return *this; - } - - /** Moves this pointer back to the previous character in the string. */ - CharPointer_UTF16 operator--() noexcept - { - const beast_wchar n = *--data; - - if (n >= 0xdc00 && n <= 0xdfff) - --data; - - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - beast_wchar getAndAdvance() noexcept - { - uint32 n = (uint32) (uint16) *data++; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) *data) >= 0xdc00) - n = 0x10000 + ((((n - 0xd800) << 10) | (((uint32) (uint16) *data++) - 0xdc00))); - - return (beast_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF16 operator++ (int) noexcept - { - CharPointer_UTF16 temp (*this); - ++*this; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - void operator+= (int numToSkip) noexcept - { - if (numToSkip < 0) - { - while (++numToSkip <= 0) - --*this; - } - else - { - while (--numToSkip >= 0) - ++*this; - } - } - - /** Moves this pointer backwards by the specified number of characters. */ - void operator-= (int numToSkip) noexcept - { - operator+= (-numToSkip); - } - - /** Returns the character at a given character index from the start of the string. */ - beast_wchar operator[] (const int characterIndex) const noexcept - { - CharPointer_UTF16 p (*this); - p += characterIndex; - return *p; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF16 operator+ (const int numToSkip) const noexcept - { - CharPointer_UTF16 p (*this); - p += numToSkip; - return p; - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF16 operator- (const int numToSkip) const noexcept - { - CharPointer_UTF16 p (*this); - p += -numToSkip; - return p; - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - void write (beast_wchar charToWrite) noexcept - { - if (charToWrite >= 0x10000) - { - charToWrite -= 0x10000; - *data++ = (CharType) (0xd800 + (charToWrite >> 10)); - *data++ = (CharType) (0xdc00 + (charToWrite & 0x3ff)); - } - else - { - *data++ = (CharType) charToWrite; - } - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - const CharType* d = data; - size_t count = 0; - - for (;;) - { - const int n = *d++; - - if (n >= 0xd800 && n <= 0xdfff) - { - if (*d++ == 0) - break; - } - else if (n == 0) - break; - - ++count; - } - - return count; - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF16 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return sizeof (CharType) * (findNullIndex (data) + 1); - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static size_t getBytesRequiredFor (const beast_wchar charToWrite) noexcept - { - return (charToWrite >= 0x10000) ? (sizeof (CharType) * 2) : sizeof (CharType); - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (CharPointer text) noexcept - { - size_t count = 0; - beast_wchar n; - - while ((n = text.getAndAdvance()) != 0) - count += getBytesRequiredFor (n); - - return count; - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF16 findTerminatingNull() const noexcept - { - const CharType* t = data; - - while (*t != 0) - ++t; - - return CharPointer_UTF16 (t); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF16 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const noexcept - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - #if BEAST_WINDOWS && ! DOXYGEN - int compareIgnoreCase (const CharPointer_UTF16 other) const noexcept - { - return _wcsicmp (data, other.data); - } - - int compareIgnoreCaseUpTo (const CharPointer_UTF16 other, int maxChars) const noexcept - { - return _wcsnicmp (data, other.data, (size_t) maxChars); - } - - int indexOf (const CharPointer_UTF16 stringToFind) const noexcept - { - const CharType* const t = wcsstr (data, stringToFind.getAddress()); - return t == nullptr ? -1 : (int) (t - data); - } - #endif - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind) const noexcept - { - return CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const noexcept { return CharacterFunctions::isWhitespace (operator*()) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { return CharacterFunctions::isDigit (operator*()) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const noexcept { return CharacterFunctions::isLetter (operator*()) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const noexcept { return CharacterFunctions::isLetterOrDigit (operator*()) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const noexcept { return CharacterFunctions::isUpperCase (operator*()) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const noexcept { return CharacterFunctions::isLowerCase (operator*()) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - beast_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (operator*()); } - /** Returns a lower-case version of the first character of this string. */ - beast_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (operator*()); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept - { - #if BEAST_WINDOWS - return _wtoi (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if BEAST_WINDOWS - return _wtoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF16 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (beast_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff - && (((unsigned int) character) < 0xd800 || ((unsigned int) character) > 0xdfff); - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - maxBytesToRead /= sizeof (CharType); - - while (--maxBytesToRead >= 0 && *dataToTest != 0) - { - const uint32 n = (uint32) (uint16) *dataToTest++; - - if (n >= 0xd800) - { - if (n > 0x10ffff) - return false; - - if (n <= 0xdfff) - { - if (n > 0xdc00) - return false; - - const uint32 nextChar = (uint32) (uint16) *dataToTest++; - - if (nextChar < 0xdc00 || nextChar > 0xdfff) - return false; - } - } - } - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF16 atomicSwap (const CharPointer_UTF16 newValue) - { - return CharPointer_UTF16 (reinterpret_cast &> (data).exchange (newValue.data)); - } - - /** These values are the byte-order-mark (BOM) values for a UTF-16 stream. */ - enum - { - byteOrderMarkBE1 = 0xfe, - byteOrderMarkBE2 = 0xff, - byteOrderMarkLE1 = 0xff, - byteOrderMarkLE2 = 0xfe - }; - -private: - CharType* data; - - static unsigned int findNullIndex (const CharType* const t) noexcept - { - unsigned int n = 0; - - while (t[n] != 0) - ++n; - - return n; - } -}; - - -#endif // BEAST_CHARPOINTER_UTF16_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF32.h b/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF32.h deleted file mode 100644 index fe24978e18..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF32.h +++ /dev/null @@ -1,373 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHARPOINTER_UTF32_BEASTHEADER -#define BEAST_CHARPOINTER_UTF32_BEASTHEADER - - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-32 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF8, CharPointer_UTF16 -*/ -class CharPointer_UTF32 -{ -public: - typedef beast_wchar CharType; - - inline explicit CharPointer_UTF32 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF32 (const CharPointer_UTF32& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF32 operator= (CharPointer_UTF32 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF32 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF32 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF32 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF32 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF32 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF32 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF32 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - inline beast_wchar operator*() const noexcept { return *data; } - - /** Moves this pointer along to the next character in the string. */ - inline CharPointer_UTF32 operator++() noexcept - { - ++data; - return *this; - } - - /** Moves this pointer to the previous character in the string. */ - inline CharPointer_UTF32 operator--() noexcept - { - --data; - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - inline beast_wchar getAndAdvance() noexcept { return *data++; } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF32 operator++ (int) noexcept - { - CharPointer_UTF32 temp (*this); - ++data; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - inline void operator+= (const int numToSkip) noexcept - { - data += numToSkip; - } - - inline void operator-= (const int numToSkip) noexcept - { - data -= numToSkip; - } - - /** Returns the character at a given character index from the start of the string. */ - inline beast_wchar& operator[] (const int characterIndex) const noexcept - { - return data [characterIndex]; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF32 operator+ (const int numToSkip) const noexcept - { - return CharPointer_UTF32 (data + numToSkip); - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF32 operator- (const int numToSkip) const noexcept - { - return CharPointer_UTF32 (data - numToSkip); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - inline void write (const beast_wchar charToWrite) noexcept - { - *data++ = charToWrite; - } - - inline void replaceChar (const beast_wchar newChar) noexcept - { - *data = newChar; - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - #if BEAST_NATIVE_WCHAR_IS_UTF32 && ! BEAST_ANDROID - return wcslen (data); - #else - size_t n = 0; - while (data[n] != 0) - ++n; - return n; - #endif - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF32 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return sizeof (CharType) * (length() + 1); - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static inline size_t getBytesRequiredFor (const beast_wchar) noexcept - { - return sizeof (CharType); - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (const CharPointer text) noexcept - { - return sizeof (CharType) * text.length(); - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF32 findTerminatingNull() const noexcept - { - return CharPointer_UTF32 (data + length()); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF32 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - #if BEAST_NATIVE_WCHAR_IS_UTF32 && ! BEAST_ANDROID - /** Compares this string with another one. */ - int compare (const CharPointer_UTF32 other) const noexcept - { - return wcscmp (data, other.data); - } - #endif - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind) const noexcept - { - int i = 0; - - while (data[i] != 0) - { - if (data[i] == charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const { return CharacterFunctions::isWhitespace (*data) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const { return CharacterFunctions::isDigit (*data) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const { return CharacterFunctions::isLetter (*data) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const { return CharacterFunctions::isLetterOrDigit (*data) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const { return CharacterFunctions::isUpperCase (*data) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const { return CharacterFunctions::isLowerCase (*data) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - beast_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (*data); } - /** Returns a lower-case version of the first character of this string. */ - beast_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (*data); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return CharacterFunctions::getIntValue (*this); } - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept { return CharacterFunctions::getIntValue (*this); } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF32 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (beast_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - maxBytesToRead /= sizeof (CharType); - - while (--maxBytesToRead >= 0 && *dataToTest != 0) - if (! canRepresent (*dataToTest++)) - return false; - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF32 atomicSwap (const CharPointer_UTF32 newValue) - { - return CharPointer_UTF32 (reinterpret_cast &> (data).exchange (newValue.data)); - } - -private: - CharType* data; -}; - - -#endif // BEAST_CHARPOINTER_UTF32_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF8.h b/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF8.h deleted file mode 100644 index 0b4720bd09..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharPointer_UTF8.h +++ /dev/null @@ -1,560 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHARPOINTER_UTF8_BEASTHEADER -#define BEAST_CHARPOINTER_UTF8_BEASTHEADER - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-8 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF16, CharPointer_UTF32 -*/ -class CharPointer_UTF8 -{ -public: - typedef char CharType; - - inline explicit CharPointer_UTF8 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF8 (const CharPointer_UTF8& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF8 operator= (CharPointer_UTF8 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF8 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF8 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF8 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF8 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF8 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF8 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF8 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - beast_wchar operator*() const noexcept - { - const signed char byte = (signed char) *data; - - if (byte >= 0) - return (beast_wchar) (uint8) byte; - - uint32 n = (uint32) (uint8) byte; - uint32 mask = 0x7f; - uint32 bit = 0x40; - size_t numExtraValues = 0; - - while ((n & bit) != 0 && bit > 0x10) - { - mask >>= 1; - ++numExtraValues; - bit >>= 1; - } - - n &= mask; - - for (size_t i = 1; i <= numExtraValues; ++i) - { - const uint8 nextByte = (uint8) data [i]; - - if ((nextByte & 0xc0) != 0x80) - break; - - n <<= 6; - n |= (nextByte & 0x3f); - } - - return (beast_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF8& operator++() noexcept - { - const signed char n = (signed char) *data++; - - if (n < 0) - { - beast_wchar bit = 0x40; - - while ((n & bit) != 0 && bit > 0x8) - { - ++data; - bit >>= 1; - } - } - - return *this; - } - - /** Moves this pointer back to the previous character in the string. */ - CharPointer_UTF8 operator--() noexcept - { - int count = 0; - - while ((*--data & 0xc0) == 0x80 && ++count < 4) - {} - - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - beast_wchar getAndAdvance() noexcept - { - const signed char byte = (signed char) *data++; - - if (byte >= 0) - return (beast_wchar) (uint8) byte; - - uint32 n = (uint32) (uint8) byte; - uint32 mask = 0x7f; - uint32 bit = 0x40; - int numExtraValues = 0; - - while ((n & bit) != 0 && bit > 0x8) - { - mask >>= 1; - ++numExtraValues; - bit >>= 1; - } - - n &= mask; - - while (--numExtraValues >= 0) - { - const uint32 nextByte = (uint32) (uint8) *data++; - - if ((nextByte & 0xc0) != 0x80) - break; - - n <<= 6; - n |= (nextByte & 0x3f); - } - - return (beast_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF8 operator++ (int) noexcept - { - CharPointer_UTF8 temp (*this); - ++*this; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - void operator+= (int numToSkip) noexcept - { - if (numToSkip < 0) - { - while (++numToSkip <= 0) - --*this; - } - else - { - while (--numToSkip >= 0) - ++*this; - } - } - - /** Moves this pointer backwards by the specified number of characters. */ - void operator-= (int numToSkip) noexcept - { - operator+= (-numToSkip); - } - - /** Returns the character at a given character index from the start of the string. */ - beast_wchar operator[] (int characterIndex) const noexcept - { - CharPointer_UTF8 p (*this); - p += characterIndex; - return *p; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF8 operator+ (int numToSkip) const noexcept - { - CharPointer_UTF8 p (*this); - p += numToSkip; - return p; - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF8 operator- (int numToSkip) const noexcept - { - CharPointer_UTF8 p (*this); - p += -numToSkip; - return p; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - const CharType* d = data; - size_t count = 0; - - for (;;) - { - const uint32 n = (uint32) (uint8) *d++; - - if ((n & 0x80) != 0) - { - uint32 bit = 0x40; - - while ((n & bit) != 0) - { - ++d; - bit >>= 1; - - if (bit == 0) - break; // illegal utf-8 sequence - } - } - else if (n == 0) - break; - - ++count; - } - - return count; - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF8 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - bassert (data != nullptr); - return strlen (data) + 1; - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static size_t getBytesRequiredFor (const beast_wchar charToWrite) noexcept - { - size_t num = 1; - const uint32 c = (uint32) charToWrite; - - if (c >= 0x80) - { - ++num; - if (c >= 0x800) - { - ++num; - if (c >= 0x10000) - ++num; - } - } - - return num; - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (CharPointer text) noexcept - { - size_t count = 0; - beast_wchar n; - - while ((n = text.getAndAdvance()) != 0) - count += getBytesRequiredFor (n); - - return count; - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF8 findTerminatingNull() const noexcept - { - return CharPointer_UTF8 (data + strlen (data)); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - void write (const beast_wchar charToWrite) noexcept - { - const uint32 c = (uint32) charToWrite; - - if (c >= 0x80) - { - int numExtraBytes = 1; - if (c >= 0x800) - { - ++numExtraBytes; - if (c >= 0x10000) - ++numExtraBytes; - } - - *data++ = (CharType) ((uint32) (0xff << (7 - numExtraBytes)) | (c >> (numExtraBytes * 6))); - - while (--numExtraBytes >= 0) - *data++ = (CharType) (0x80 | (0x3f & (c >> (numExtraBytes * 6)))); - } - else - { - *data++ = (CharType) c; - } - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF8 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const noexcept - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one. */ - int compareIgnoreCase (const CharPointer_UTF8 other) const noexcept - { - #if BEAST_WINDOWS - return stricmp (data, other.data); - #else - return strcasecmp (data, other.data); - #endif - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind) const noexcept - { - return CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const beast_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const noexcept { return *data == ' ' || (*data <= 13 && *data >= 9); } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { return *data >= '0' && *data <= '9'; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const noexcept { return CharacterFunctions::isLetter (operator*()) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const noexcept { return CharacterFunctions::isLetterOrDigit (operator*()) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const noexcept { return CharacterFunctions::isUpperCase (operator*()) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const noexcept { return CharacterFunctions::isLowerCase (operator*()) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - beast_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (operator*()); } - /** Returns a lower-case version of the first character of this string. */ - beast_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (operator*()); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return atoi (data); } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if BEAST_LINUX || BEAST_ANDROID - return atoll (data); - #elif BEAST_WINDOWS - return _atoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF8 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (beast_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - while (--maxBytesToRead >= 0 && *dataToTest != 0) - { - const signed char byte = (signed char) *dataToTest++; - - if (byte < 0) - { - uint8 bit = 0x40; - int numExtraValues = 0; - - while ((byte & bit) != 0) - { - if (bit < 8) - return false; - - ++numExtraValues; - bit >>= 1; - - if (bit == 8 && (numExtraValues > maxBytesToRead - || *CharPointer_UTF8 (dataToTest - 1) > 0x10ffff)) - return false; - } - - maxBytesToRead -= numExtraValues; - if (maxBytesToRead < 0) - return false; - - while (--numExtraValues >= 0) - if ((*dataToTest++ & 0xc0) != 0x80) - return false; - } - } - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF8 atomicSwap (const CharPointer_UTF8 newValue) - { - return CharPointer_UTF8 (reinterpret_cast &> (data).exchange (newValue.data)); - } - - /** These values are the byte-order-mark (BOM) values for a UTF-8 stream. */ - enum - { - byteOrderMark1 = 0xef, - byteOrderMark2 = 0xbb, - byteOrderMark3 = 0xbf - }; - -private: - CharType* data; -}; - -#endif // BEAST_CHARPOINTER_UTF8_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.cpp b/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.cpp deleted file mode 100644 index 0f70a0a9b8..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.cpp +++ /dev/null @@ -1,149 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -//============================================================================== -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -beast_wchar CharacterFunctions::toUpperCase (const beast_wchar character) noexcept -{ - return towupper ((wchar_t) character); -} - -beast_wchar CharacterFunctions::toLowerCase (const beast_wchar character) noexcept -{ - return towlower ((wchar_t) character); -} - -bool CharacterFunctions::isUpperCase (const beast_wchar character) noexcept -{ - #if BEAST_WINDOWS - return iswupper ((wchar_t) character) != 0; - #else - return toLowerCase (character) != character; - #endif -} - -bool CharacterFunctions::isLowerCase (const beast_wchar character) noexcept -{ - #if BEAST_WINDOWS - return iswlower ((wchar_t) character) != 0; - #else - return toUpperCase (character) != character; - #endif -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -bool CharacterFunctions::isWhitespace (const char character) noexcept -{ - return character == ' ' || (character <= 13 && character >= 9); -} - -bool CharacterFunctions::isWhitespace (const beast_wchar character) noexcept -{ - return iswspace ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isDigit (const char character) noexcept -{ - return (character >= '0' && character <= '9'); -} - -bool CharacterFunctions::isDigit (const beast_wchar character) noexcept -{ - return iswdigit ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isLetter (const char character) noexcept -{ - return (character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z'); -} - -bool CharacterFunctions::isLetter (const beast_wchar character) noexcept -{ - return iswalpha ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isLetterOrDigit (const char character) noexcept -{ - return (character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z') - || (character >= '0' && character <= '9'); -} - -bool CharacterFunctions::isLetterOrDigit (const beast_wchar character) noexcept -{ - return iswalnum ((wchar_t) character) != 0; -} - -int CharacterFunctions::getHexDigitValue (const beast_wchar digit) noexcept -{ - unsigned int d = (unsigned int) digit - '0'; - if (d < (unsigned int) 10) - return (int) d; - - d += (unsigned int) ('0' - 'a'); - if (d < (unsigned int) 6) - return (int) d + 10; - - d += (unsigned int) ('a' - 'A'); - if (d < (unsigned int) 6) - return (int) d + 10; - - return -1; -} - -double CharacterFunctions::mulexp10 (const double value, int exponent) noexcept -{ - if (exponent == 0) - return value; - - if (value == 0) - return 0; - - const bool negative = (exponent < 0); - if (negative) - exponent = -exponent; - - double result = 1.0, power = 10.0; - for (int bit = 1; exponent != 0; bit <<= 1) - { - if ((exponent & bit) != 0) - { - exponent ^= bit; - result *= power; - if (exponent == 0) - break; - } - power *= power; - } - - return negative ? (value / result) : (value * result); -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.h b/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.h deleted file mode 100644 index a8742a88b7..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_CharacterFunctions.h +++ /dev/null @@ -1,585 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHARACTERFUNCTIONS_BEASTHEADER -#define BEAST_CHARACTERFUNCTIONS_BEASTHEADER - - -//============================================================================== -#if BEAST_WINDOWS && ! DOXYGEN - #define BEAST_NATIVE_WCHAR_IS_UTF8 0 - #define BEAST_NATIVE_WCHAR_IS_UTF16 1 - #define BEAST_NATIVE_WCHAR_IS_UTF32 0 -#else - /** This macro will be set to 1 if the compiler's native wchar_t is an 8-bit type. */ - #define BEAST_NATIVE_WCHAR_IS_UTF8 0 - /** This macro will be set to 1 if the compiler's native wchar_t is a 16-bit type. */ - #define BEAST_NATIVE_WCHAR_IS_UTF16 0 - /** This macro will be set to 1 if the compiler's native wchar_t is a 32-bit type. */ - #define BEAST_NATIVE_WCHAR_IS_UTF32 1 -#endif - -#if BEAST_NATIVE_WCHAR_IS_UTF32 || DOXYGEN - /** A platform-independent 32-bit unicode character type. */ - typedef wchar_t beast_wchar; -#else - typedef uint32 beast_wchar; -#endif - -#ifndef DOXYGEN - /** This macro is deprecated, but preserved for compatibility with old code. */ - #define BEAST_T(stringLiteral) (L##stringLiteral) -#endif - -#if BEAST_DEFINE_T_MACRO - /** The 'T' macro is an alternative for using the "L" prefix in front of a string literal. - - This macro is deprecated, but available for compatibility with old code if you set - BEAST_DEFINE_T_MACRO = 1. The fastest, most portable and best way to write your string - literals is as standard char strings, using escaped utf-8 character sequences for extended - characters, rather than trying to store them as wide-char strings. - */ - #define T(stringLiteral) BEAST_T(stringLiteral) -#endif - -//============================================================================== -/** - A collection of functions for manipulating characters and character strings. - - Most of these methods are designed for internal use by the String and CharPointer - classes, but some of them may be useful to call directly. - - @see String, CharPointer_UTF8, CharPointer_UTF16, CharPointer_UTF32 -*/ -class BEAST_API CharacterFunctions -{ -public: - //============================================================================== - /** Converts a character to upper-case. */ - static beast_wchar toUpperCase (beast_wchar character) noexcept; - /** Converts a character to lower-case. */ - static beast_wchar toLowerCase (beast_wchar character) noexcept; - - /** Checks whether a unicode character is upper-case. */ - static bool isUpperCase (beast_wchar character) noexcept; - /** Checks whether a unicode character is lower-case. */ - static bool isLowerCase (beast_wchar character) noexcept; - - /** Checks whether a character is whitespace. */ - static bool isWhitespace (char character) noexcept; - /** Checks whether a character is whitespace. */ - static bool isWhitespace (beast_wchar character) noexcept; - - /** Checks whether a character is a digit. */ - static bool isDigit (char character) noexcept; - /** Checks whether a character is a digit. */ - static bool isDigit (beast_wchar character) noexcept; - - /** Checks whether a character is alphabetic. */ - static bool isLetter (char character) noexcept; - /** Checks whether a character is alphabetic. */ - static bool isLetter (beast_wchar character) noexcept; - - /** Checks whether a character is alphabetic or numeric. */ - static bool isLetterOrDigit (char character) noexcept; - /** Checks whether a character is alphabetic or numeric. */ - static bool isLetterOrDigit (beast_wchar character) noexcept; - - /** Returns 0 to 16 for '0' to 'F", or -1 for characters that aren't a legal hex digit. */ - static int getHexDigitValue (beast_wchar digit) noexcept; - - //============================================================================== - /** Parses a character string to read a floating-point number. - Note that this will advance the pointer that is passed in, leaving it at - the end of the number. - */ - template - static double readDoubleValue (CharPointerType& text) noexcept - { - double result[3] = { 0 }, accumulator[2] = { 0 }; - int exponentAdjustment[2] = { 0 }, exponentAccumulator[2] = { -1, -1 }; - int exponent = 0, decPointIndex = 0, digit = 0; - int lastDigit = 0, numSignificantDigits = 0; - bool isNegative = false, digitsFound = false; - const int maxSignificantDigits = 15 + 2; - - text = text.findEndOfWhitespace(); - beast_wchar c = *text; - - switch (c) - { - case '-': isNegative = true; // fall-through.. - case '+': c = *++text; - } - - switch (c) - { - case 'n': - case 'N': - if ((text[1] == 'a' || text[1] == 'A') && (text[2] == 'n' || text[2] == 'N')) - return std::numeric_limits::quiet_NaN(); - break; - - case 'i': - case 'I': - if ((text[1] == 'n' || text[1] == 'N') && (text[2] == 'f' || text[2] == 'F')) - return std::numeric_limits::infinity(); - break; - } - - for (;;) - { - if (text.isDigit()) - { - lastDigit = digit; - digit = (int) text.getAndAdvance() - '0'; - digitsFound = true; - - if (decPointIndex != 0) - exponentAdjustment[1]++; - - if (numSignificantDigits == 0 && digit == 0) - continue; - - if (++numSignificantDigits > maxSignificantDigits) - { - if (digit > 5) - ++accumulator [decPointIndex]; - else if (digit == 5 && (lastDigit & 1) != 0) - ++accumulator [decPointIndex]; - - if (decPointIndex > 0) - exponentAdjustment[1]--; - else - exponentAdjustment[0]++; - - while (text.isDigit()) - { - ++text; - if (decPointIndex == 0) - exponentAdjustment[0]++; - } - } - else - { - const double maxAccumulatorValue = (double) ((std::numeric_limits::max() - 9) / 10); - if (accumulator [decPointIndex] > maxAccumulatorValue) - { - result [decPointIndex] = mulexp10 (result [decPointIndex], exponentAccumulator [decPointIndex]) - + accumulator [decPointIndex]; - accumulator [decPointIndex] = 0; - exponentAccumulator [decPointIndex] = 0; - } - - accumulator [decPointIndex] = accumulator[decPointIndex] * 10 + digit; - exponentAccumulator [decPointIndex]++; - } - } - else if (decPointIndex == 0 && *text == '.') - { - ++text; - decPointIndex = 1; - - if (numSignificantDigits > maxSignificantDigits) - { - while (text.isDigit()) - ++text; - break; - } - } - else - { - break; - } - } - - result[0] = mulexp10 (result[0], exponentAccumulator[0]) + accumulator[0]; - - if (decPointIndex != 0) - result[1] = mulexp10 (result[1], exponentAccumulator[1]) + accumulator[1]; - - c = *text; - if ((c == 'e' || c == 'E') && digitsFound) - { - bool negativeExponent = false; - - switch (*++text) - { - case '-': negativeExponent = true; // fall-through.. - case '+': ++text; - } - - while (text.isDigit()) - exponent = (exponent * 10) + ((int) text.getAndAdvance() - '0'); - - if (negativeExponent) - exponent = -exponent; - } - - double r = mulexp10 (result[0], exponent + exponentAdjustment[0]); - if (decPointIndex != 0) - r += mulexp10 (result[1], exponent - exponentAdjustment[1]); - - return isNegative ? -r : r; - } - - /** Parses a character string, to read a floating-point value. */ - template - static double getDoubleValue (CharPointerType text) noexcept - { - return readDoubleValue (text); - } - - //============================================================================== - /** Parses a character string, to read an integer value. */ - template - static IntType getIntValue (const CharPointerType text) noexcept - { - IntType v = 0; - CharPointerType s (text.findEndOfWhitespace()); - - const bool isNeg = *s == '-'; - if (isNeg) - ++s; - - for (;;) - { - const beast_wchar c = s.getAndAdvance(); - - if (c >= '0' && c <= '9') - v = v * 10 + (IntType) (c - '0'); - else - break; - } - - return isNeg ? -v : v; - } - - //============================================================================== - /** Counts the number of characters in a given string, stopping if the count exceeds - a specified limit. */ - template - static size_t lengthUpTo (CharPointerType text, const size_t maxCharsToCount) noexcept - { - size_t len = 0; - - while (len < maxCharsToCount && text.getAndAdvance() != 0) - ++len; - - return len; - } - - /** Counts the number of characters in a given string, stopping if the count exceeds - a specified end-pointer. */ - template - static size_t lengthUpTo (CharPointerType start, const CharPointerType end) noexcept - { - size_t len = 0; - - while (start < end && start.getAndAdvance() != 0) - ++len; - - return len; - } - - /** Copies null-terminated characters from one string to another. */ - template - static void copyAll (DestCharPointerType& dest, SrcCharPointerType src) noexcept - { - for (;;) - { - const beast_wchar c = src.getAndAdvance(); - - if (c == 0) - break; - - dest.write (c); - } - - dest.writeNull(); - } - - /** Copies characters from one string to another, up to a null terminator - or a given byte size limit. */ - template - static size_t copyWithDestByteLimit (DestCharPointerType& dest, SrcCharPointerType src, size_t maxBytesToWrite) noexcept - { - typename DestCharPointerType::CharType const* const startAddress = dest.getAddress(); - ssize_t maxBytes = (ssize_t) maxBytesToWrite; - maxBytes -= sizeof (typename DestCharPointerType::CharType); // (allow for a terminating null) - - for (;;) - { - const beast_wchar c = src.getAndAdvance(); - const size_t bytesNeeded = DestCharPointerType::getBytesRequiredFor (c); - - maxBytes -= bytesNeeded; - if (c == 0 || maxBytes < 0) - break; - - dest.write (c); - } - - dest.writeNull(); - - return (size_t) getAddressDifference (dest.getAddress(), startAddress) - + sizeof (typename DestCharPointerType::CharType); - } - - /** Copies characters from one string to another, up to a null terminator - or a given maximum number of characters. */ - template - static void copyWithCharLimit (DestCharPointerType& dest, SrcCharPointerType src, int maxChars) noexcept - { - while (--maxChars > 0) - { - const beast_wchar c = src.getAndAdvance(); - if (c == 0) - break; - - dest.write (c); - } - - dest.writeNull(); - } - - /** Compares two null-terminated character strings. */ - template - static int compare (CharPointerType1 s1, CharPointerType2 s2) noexcept - { - for (;;) - { - const int c1 = (int) s1.getAndAdvance(); - const int c2 = (int) s2.getAndAdvance(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Compares two null-terminated character strings, up to a given number of characters. */ - template - static int compareUpTo (CharPointerType1 s1, CharPointerType2 s2, int maxChars) noexcept - { - while (--maxChars >= 0) - { - const int c1 = (int) s1.getAndAdvance(); - const int c2 = (int) s2.getAndAdvance(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Compares two null-terminated character strings, using a case-independant match. */ - template - static int compareIgnoreCase (CharPointerType1 s1, CharPointerType2 s2) noexcept - { - for (;;) - { - const int c1 = (int) s1.toUpperCase(); ++s1; - const int c2 = (int) s2.toUpperCase(); ++s2; - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Compares two null-terminated character strings, using a case-independent match. */ - template - static int compareIgnoreCaseUpTo (CharPointerType1 s1, CharPointerType2 s2, int maxChars) noexcept - { - while (--maxChars >= 0) - { - const int c1 = (int) s1.toUpperCase(); ++s1; - const int c2 = (int) s2.toUpperCase(); ++s2; - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Finds the character index of a given substring in another string. - Returns -1 if the substring is not found. - */ - template - static int indexOf (CharPointerType1 textToSearch, const CharPointerType2 substringToLookFor) noexcept - { - int index = 0; - const int substringLength = (int) substringToLookFor.length(); - - for (;;) - { - if (textToSearch.compareUpTo (substringToLookFor, substringLength) == 0) - return index; - - if (textToSearch.getAndAdvance() == 0) - return -1; - - ++index; - } - } - - /** Returns a pointer to the first occurrence of a substring in a string. - If the substring is not found, this will return a pointer to the string's - null terminator. - */ - template - static CharPointerType1 find (CharPointerType1 textToSearch, const CharPointerType2 substringToLookFor) noexcept - { - const int substringLength = (int) substringToLookFor.length(); - - while (textToSearch.compareUpTo (substringToLookFor, substringLength) != 0 - && ! textToSearch.isEmpty()) - ++textToSearch; - - return textToSearch; - } - - /** Finds the character index of a given substring in another string, using - a case-independent match. - Returns -1 if the substring is not found. - */ - template - static int indexOfIgnoreCase (CharPointerType1 haystack, const CharPointerType2 needle) noexcept - { - int index = 0; - const int needleLength = (int) needle.length(); - - for (;;) - { - if (haystack.compareIgnoreCaseUpTo (needle, needleLength) == 0) - return index; - - if (haystack.getAndAdvance() == 0) - return -1; - - ++index; - } - } - - /** Finds the character index of a given character in another string. - Returns -1 if the character is not found. - */ - template - static int indexOfChar (Type text, const beast_wchar charToFind) noexcept - { - int i = 0; - - while (! text.isEmpty()) - { - if (text.getAndAdvance() == charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Finds the character index of a given character in another string, using - a case-independent match. - Returns -1 if the character is not found. - */ - template - static int indexOfCharIgnoreCase (Type text, beast_wchar charToFind) noexcept - { - charToFind = CharacterFunctions::toLowerCase (charToFind); - int i = 0; - - while (! text.isEmpty()) - { - if (text.toLowerCase() == charToFind) - return i; - - ++text; - ++i; - } - - return -1; - } - - /** Returns a pointer to the first non-whitespace character in a string. - If the string contains only whitespace, this will return a pointer - to its null terminator. - */ - template - static Type findEndOfWhitespace (const Type& text) noexcept - { - Type p (text); - - while (p.isWhitespace()) - ++p; - - return p; - } - - /** Returns a pointer to the first character in the string which is found in - the breakCharacters string. - */ - template - static Type findEndOfToken (const Type& text, const Type& breakCharacters, const Type& quoteCharacters) - { - Type t (text); - beast_wchar currentQuoteChar = 0; - - while (! t.isEmpty()) - { - const beast_wchar c = t.getAndAdvance(); - - if (currentQuoteChar == 0 && breakCharacters.indexOf (c) >= 0) - { - --t; - break; - } - - if (quoteCharacters.indexOf (c) >= 0) - { - if (currentQuoteChar == 0) - currentQuoteChar = c; - else if (currentQuoteChar == c) - currentQuoteChar = 0; - } - } - - return t; - } - -private: - static double mulexp10 (const double value, int exponent) noexcept; -}; - - -#endif // BEAST_CHARACTERFUNCTIONS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_Identifier.cpp b/Subtrees/beast/modules/beast_core/text/beast_Identifier.cpp deleted file mode 100644 index f003ad0034..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_Identifier.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -StringPool& Identifier::getPool() -{ - static StringPool pool; - return pool; -} - -Identifier::Identifier() noexcept - : name (nullptr) -{ -} - -Identifier::Identifier (const Identifier& other) noexcept - : name (other.name) -{ -} - -Identifier& Identifier::operator= (const Identifier other) noexcept -{ - name = other.name; - return *this; -} - -Identifier::Identifier (const String& nm) - : name (Identifier::getPool().getPooledString (nm)) -{ -} - -Identifier::Identifier (const char* const nm) - : name (Identifier::getPool().getPooledString (nm)) -{ - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - bassert (isValidIdentifier (toString())); -} - -Identifier::~Identifier() -{ -} - -Identifier Identifier::null; - -bool Identifier::isValidIdentifier (const String& possibleIdentifier) noexcept -{ - return possibleIdentifier.isNotEmpty() - && possibleIdentifier.containsOnly ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:#@$%"); -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_Identifier.h b/Subtrees/beast/modules/beast_core/text/beast_Identifier.h deleted file mode 100644 index f3157bcfee..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_Identifier.h +++ /dev/null @@ -1,106 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_IDENTIFIER_BEASTHEADER -#define BEAST_IDENTIFIER_BEASTHEADER - -class StringPool; - - -//============================================================================== -/** - Represents a string identifier, designed for accessing properties by name. - - Identifier objects are very light and fast to copy, but slower to initialise - from a string, so it's much faster to keep a static identifier object to refer - to frequently-used names, rather than constructing them each time you need it. - - @see NamedPropertySet, ValueTree -*/ -class BEAST_API Identifier -{ -public: - /** Creates a null identifier. */ - Identifier() noexcept; - - /** Creates an identifier with a specified name. - Because this name may need to be used in contexts such as script variables or XML - tags, it must only contain ascii letters and digits, or the underscore character. - */ - Identifier (const char* name); - - /** Creates an identifier with a specified name. - Because this name may need to be used in contexts such as script variables or XML - tags, it must only contain ascii letters and digits, or the underscore character. - */ - Identifier (const String& name); - - /** Creates a copy of another identifier. */ - Identifier (const Identifier& other) noexcept; - - /** Creates a copy of another identifier. */ - Identifier& operator= (const Identifier other) noexcept; - - /** Destructor */ - ~Identifier(); - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator== (const Identifier other) const noexcept { return name == other.name; } - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator!= (const Identifier other) const noexcept { return name != other.name; } - - /** Returns this identifier as a string. */ - String toString() const { return name; } - - /** Returns this identifier's raw string pointer. */ - operator const String::CharPointerType() const noexcept { return name; } - - /** Returns this identifier's raw string pointer. */ - const String::CharPointerType getCharPointer() const noexcept { return name; } - - /** Returns true if this Identifier is not null */ - bool isValid() const noexcept { return name.getAddress() != nullptr; } - - /** Returns true if this Identifier is null */ - bool isNull() const noexcept { return name.getAddress() == nullptr; } - - /** A null identifier. */ - static Identifier null; - - /** Checks a given string for characters that might not be valid in an Identifier. - Since Identifiers are used as a script variables and XML attributes, they should only contain - alphanumeric characters, underscores, or the '-' and ':' characters. - */ - static bool isValidIdentifier (const String& possibleIdentifier) noexcept; - - -private: - //============================================================================== - String::CharPointerType name; - - static StringPool& getPool(); -}; - - -#endif // BEAST_IDENTIFIER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.cpp b/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.cpp deleted file mode 100644 index 95866d4917..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.cpp +++ /dev/null @@ -1,182 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -LocalisedStrings::LocalisedStrings (const String& fileContents, bool ignoreCase) -{ - loadFromText (fileContents, ignoreCase); -} - -LocalisedStrings::LocalisedStrings (const File& fileToLoad, bool ignoreCase) -{ - loadFromText (fileToLoad.loadFileAsString(), ignoreCase); -} - -LocalisedStrings::~LocalisedStrings() -{ -} - -//============================================================================== -String LocalisedStrings::translate (const String& text) const -{ - return translations.getValue (text, text); -} - -String LocalisedStrings::translate (const String& text, const String& resultIfNotFound) const -{ - return translations.getValue (text, resultIfNotFound); -} - -namespace -{ - #if BEAST_CHECK_MEMORY_LEAKS - // By using this object to force a LocalisedStrings object to be created - // before the currentMappings object, we can force the static order-of-destruction to - // delete the currentMappings object first, which avoids a bogus leak warning. - // (Oddly, just creating a LocalisedStrings on the stack doesn't work in gcc, it - // has to be created with 'new' for this to work..) - struct LeakAvoidanceTrick - { - LeakAvoidanceTrick() - { - const ScopedPointer dummy (new LocalisedStrings (String(), false)); - } - }; - - LeakAvoidanceTrick leakAvoidanceTrick; - #endif - - SpinLock currentMappingsLock; - ScopedPointer currentMappings; - - int findCloseQuote (const String& text, int startPos) - { - beast_wchar lastChar = 0; - String::CharPointerType t (text.getCharPointer() + startPos); - - for (;;) - { - const beast_wchar c = t.getAndAdvance(); - - if (c == 0 || (c == '"' && lastChar != '\\')) - break; - - lastChar = c; - ++startPos; - } - - return startPos; - } - - String unescapeString (const String& s) - { - return s.replace ("\\\"", "\"") - .replace ("\\\'", "\'") - .replace ("\\t", "\t") - .replace ("\\r", "\r") - .replace ("\\n", "\n"); - } -} - -void LocalisedStrings::loadFromText (const String& fileContents, bool ignoreCase) -{ - translations.setIgnoresCase (ignoreCase); - - StringArray lines; - lines.addLines (fileContents); - - for (int i = 0; i < lines.size(); ++i) - { - String line (lines[i].trim()); - - if (line.startsWithChar ('"')) - { - int closeQuote = findCloseQuote (line, 1); - - const String originalText (unescapeString (line.substring (1, closeQuote))); - - if (originalText.isNotEmpty()) - { - const int openingQuote = findCloseQuote (line, closeQuote + 1); - closeQuote = findCloseQuote (line, openingQuote + 1); - - const String newText (unescapeString (line.substring (openingQuote + 1, closeQuote))); - - if (newText.isNotEmpty()) - translations.set (originalText, newText); - } - } - else if (line.startsWithIgnoreCase ("language:")) - { - languageName = line.substring (9).trim(); - } - else if (line.startsWithIgnoreCase ("countries:")) - { - countryCodes.addTokens (line.substring (10).trim(), true); - countryCodes.trim(); - countryCodes.removeEmptyStrings(); - } - } -} - -//============================================================================== -void LocalisedStrings::setCurrentMappings (LocalisedStrings* newTranslations) -{ - const SpinLock::ScopedLockType sl (currentMappingsLock); - currentMappings = newTranslations; -} - -LocalisedStrings* LocalisedStrings::getCurrentMappings() -{ - return currentMappings; -} - -String LocalisedStrings::translateWithCurrentMappings (const String& text) -{ - return beast::translate (text); -} - -String LocalisedStrings::translateWithCurrentMappings (const char* text) -{ - return beast::translate (String (text)); -} - -String translate (const String& text) -{ - return translate (text, text); -} - -String translate (const char* const literal) -{ - const String text (literal); - return translate (text, text); -} - -String translate (const String& text, const String& resultIfNotFound) -{ - const SpinLock::ScopedLockType sl (currentMappingsLock); - - if (const LocalisedStrings* const mappings = LocalisedStrings::getCurrentMappings()) - return mappings->translate (text, resultIfNotFound); - - return resultIfNotFound; -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.h b/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.h deleted file mode 100644 index 8e805ec007..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_LocalisedStrings.h +++ /dev/null @@ -1,219 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_LOCALISEDSTRINGS_BEASTHEADER -#define BEAST_LOCALISEDSTRINGS_BEASTHEADER - -#include "beast_StringPairArray.h" -#include "../files/beast_File.h" - -//============================================================================== -/** - Used to convert strings to localised foreign-language versions. - - This is basically a look-up table of strings and their translated equivalents. - It can be loaded from a text file, so that you can supply a set of localised - versions of strings that you use in your app. - - To use it in your code, simply call the translate() method on each string that - might have foreign versions, and if none is found, the method will just return - the original string. - - The translation file should start with some lines specifying a description of - the language it contains, and also a list of ISO country codes where it might - be appropriate to use the file. After that, each line of the file should contain - a pair of quoted strings with an '=' sign. - - E.g. for a french translation, the file might be: - - @code - language: French - countries: fr be mc ch lu - - "hello" = "bonjour" - "goodbye" = "au revoir" - @endcode - - If the strings need to contain a quote character, they can use '\"' instead, and - if the first non-whitespace character on a line isn't a quote, then it's ignored, - (you can use this to add comments). - - Note that this is a singleton class, so don't create or destroy the object directly. - There's also a TRANS(text) macro defined to make it easy to use the this. - - E.g. @code - printSomething (TRANS("hello")); - @endcode - - This macro is used in the Beast classes themselves, so your application has a chance to - intercept and translate any internal Beast text strings that might be shown. (You can easily - get a list of all the messages by searching for the TRANS() macro in the Beast source - code). -*/ -class BEAST_API LocalisedStrings -{ -public: - //============================================================================== - /** Creates a set of translations from the text of a translation file. - - When you create one of these, you can call setCurrentMappings() to make it - the set of mappings that the system's using. - */ - LocalisedStrings (const String& fileContents, - bool ignoreCaseOfKeys); - - /** Creates a set of translations from a file. - - When you create one of these, you can call setCurrentMappings() to make it - the set of mappings that the system's using. - */ - LocalisedStrings (const File& fileToLoad, - bool ignoreCaseOfKeys); - - /** Destructor. */ - ~LocalisedStrings(); - - //============================================================================== - /** Selects the current set of mappings to be used by the system. - - The object you pass in will be automatically deleted when no longer needed, so - don't keep a pointer to it. You can also pass in zero to remove the current - mappings. - - See also the TRANS() macro, which uses the current set to do its translation. - - @see translateWithCurrentMappings - */ - static void setCurrentMappings (LocalisedStrings* newTranslations); - - /** Returns the currently selected set of mappings. - - This is the object that was last passed to setCurrentMappings(). It may - be nullptr if none has been created. - */ - static LocalisedStrings* getCurrentMappings(); - - /** Tries to translate a string using the currently selected set of mappings. - - If no mapping has been set, or if the mapping doesn't contain a translation - for the string, this will just return the original string. - - See also the TRANS() macro, which uses this method to do its translation. - - @see setCurrentMappings, getCurrentMappings - */ - static String translateWithCurrentMappings (const String& text); - - /** Tries to translate a string using the currently selected set of mappings. - - If no mapping has been set, or if the mapping doesn't contain a translation - for the string, this will just return the original string. - - See also the TRANS() macro, which uses this method to do its translation. - - @see setCurrentMappings, getCurrentMappings - */ - static String translateWithCurrentMappings (const char* text); - - //============================================================================== - /** Attempts to look up a string and return its localised version. - If the string isn't found in the list, the original string will be returned. - */ - String translate (const String& text) const; - - /** Attempts to look up a string and return its localised version. - If the string isn't found in the list, the resultIfNotFound string will be returned. - */ - String translate (const String& text, const String& resultIfNotFound) const; - - /** Returns the name of the language specified in the translation file. - - This is specified in the file using a line starting with "language:", e.g. - @code - language: german - @endcode - */ - String getLanguageName() const { return languageName; } - - /** Returns the list of suitable country codes listed in the translation file. - - These is specified in the file using a line starting with "countries:", e.g. - @code - countries: fr be mc ch lu - @endcode - - The country codes are supposed to be 2-character ISO complient codes. - */ - const StringArray& getCountryCodes() const { return countryCodes; } - - /** Provides access to the actual list of mappings. */ - const StringPairArray& getMappings() const { return translations; } - -private: - //============================================================================== - String languageName; - StringArray countryCodes; - StringPairArray translations; - - void loadFromText (const String&, bool ignoreCase); - - BEAST_LEAK_DETECTOR (LocalisedStrings) -}; - -//============================================================================== -#ifndef TRANS - /** Uses the LocalisedStrings class to translate the given string literal. - This macro is provided for backwards-compatibility, and just calls the translate() - function. In new code, it's recommended that you just call translate() directly - instead, and avoid using macros. - @see translate(), LocalisedStrings - */ - #define TRANS(stringLiteral) beast::translate (stringLiteral) -#endif - -/** A dummy version of the TRANS macro, used to indicate a string literal that should be - added to the translation file by source-code scanner tools. - - Wrapping a string literal in this macro has no effect, but by using it around strings - that your app needs to translate at a later stage, it lets automatic code-scanning tools - find this string and add it to the list of strings that need translation. -*/ -#define NEEDS_TRANS(stringLiteral) (stringLiteral) - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const String& stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const char* stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const String& stringLiteral, const String& resultIfNotFound); - - -#endif // BEAST_LOCALISEDSTRINGS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_NewLine.h b/Subtrees/beast/modules/beast_core/text/beast_NewLine.h deleted file mode 100644 index 4256d29470..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_NewLine.h +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_NEWLINE_BEASTHEADER -#define BEAST_NEWLINE_BEASTHEADER - - -//============================================================================== -/** This class is used for represent a new-line character sequence. - - To write a new-line to a stream, you can use the predefined 'newLine' variable, e.g. - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode - - The exact character sequence that will be used for the new-line can be set and - retrieved with OutputStream::setNewLineString() and OutputStream::getNewLineString(). -*/ -class BEAST_API NewLine -{ -public: - /** Returns the default new-line sequence that the library uses. - @see OutputStream::setNewLineString() - */ - static const char* getDefault() noexcept { return "\r\n"; } - - /** Returns the default new-line sequence that the library uses. - @see getDefault() - */ - operator String() const { return getDefault(); } -}; - -//============================================================================== -/** A predefined object representing a new-line, which can be written to a string or stream. - - To write a new-line to a stream, you can use the predefined 'newLine' variable like this: - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode -*/ -extern NewLine newLine; - -//============================================================================== -/** Writes a new-line sequence to a string. - You can use the predefined object 'newLine' to invoke this, e.g. - @code - myString << "Hello World" << newLine << newLine; - @endcode -*/ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, const NewLine&); - - -#endif // BEAST_NEWLINE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_String.cpp b/Subtrees/beast/modules/beast_core/text/beast_String.cpp deleted file mode 100644 index 45a64ed674..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_String.cpp +++ /dev/null @@ -1,2406 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -NewLine newLine; - -#if defined (BEAST_STRINGS_ARE_UNICODE) && ! BEAST_STRINGS_ARE_UNICODE - #error "BEAST_STRINGS_ARE_UNICODE is deprecated! All strings are now unicode by default." -#endif - -#if BEAST_NATIVE_WCHAR_IS_UTF8 - typedef CharPointer_UTF8 CharPointer_wchar_t; -#elif BEAST_NATIVE_WCHAR_IS_UTF16 - typedef CharPointer_UTF16 CharPointer_wchar_t; -#else - typedef CharPointer_UTF32 CharPointer_wchar_t; -#endif - -static inline CharPointer_wchar_t castToCharPointer_wchar_t (const void* t) noexcept -{ - return CharPointer_wchar_t (static_cast (t)); -} - -//============================================================================== -class StringHolder -{ -public: - StringHolder() noexcept - : refCount (0x3fffffff), allocatedNumBytes (sizeof (*text)) - { - text[0] = 0; - } - - typedef String::CharPointerType CharPointerType; - typedef String::CharPointerType::CharType CharType; - - //============================================================================== - static CharPointerType createUninitialisedBytes (const size_t numBytes) - { - StringHolder* const s = reinterpret_cast (new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]); - s->refCount.value = 0; - s->allocatedNumBytes = numBytes; - return CharPointerType (s->text); - } - - template - static CharPointerType createFromCharPointer (const CharPointer text) - { - if (text.getAddress() == nullptr || text.isEmpty()) - return getEmpty(); - - CharPointer t (text); - size_t bytesNeeded = sizeof (CharType); - - while (! t.isEmpty()) - bytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeAll (text); - return dest; - } - - template - static CharPointerType createFromCharPointer (const CharPointer text, size_t maxChars) - { - if (text.getAddress() == nullptr || text.isEmpty() || maxChars == 0) - return getEmpty(); - - CharPointer end (text); - size_t numChars = 0; - size_t bytesNeeded = sizeof (CharType); - - while (numChars < maxChars && ! end.isEmpty()) - { - bytesNeeded += CharPointerType::getBytesRequiredFor (end.getAndAdvance()); - ++numChars; - } - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeWithCharLimit (text, (int) numChars + 1); - return dest; - } - - template - static CharPointerType createFromCharPointer (const CharPointer start, const CharPointer end) - { - if (start.getAddress() == nullptr || start.isEmpty()) - return getEmpty(); - - CharPointer e (start); - int numChars = 0; - size_t bytesNeeded = sizeof (CharType); - - while (e < end && ! e.isEmpty()) - { - bytesNeeded += CharPointerType::getBytesRequiredFor (e.getAndAdvance()); - ++numChars; - } - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeWithCharLimit (start, numChars + 1); - return dest; - } - - static CharPointerType createFromCharPointer (const CharPointerType start, const CharPointerType end) - { - if (start.getAddress() == nullptr || start.isEmpty()) - return getEmpty(); - - const size_t numBytes = (size_t) (end.getAddress() - start.getAddress()); - const CharPointerType dest (createUninitialisedBytes (numBytes + 1)); - memcpy (dest.getAddress(), start, numBytes); - dest.getAddress()[numBytes] = 0; - return dest; - } - - static CharPointerType createFromFixedLength (const char* const src, const size_t numChars) - { - const CharPointerType dest (createUninitialisedBytes (numChars * sizeof (CharType) + sizeof (CharType))); - CharPointerType (dest).writeWithCharLimit (CharPointer_UTF8 (src), (int) (numChars + 1)); - return dest; - } - - static inline CharPointerType getEmpty() noexcept - { - return CharPointerType (empty.text); - } - - //============================================================================== - static void retain (const CharPointerType text) noexcept - { - ++(bufferFromText (text)->refCount); - } - - static inline void release (StringHolder* const b) noexcept - { - if (--(b->refCount) == -1 && b != &empty) - delete[] reinterpret_cast (b); - } - - static void release (const CharPointerType text) noexcept - { - release (bufferFromText (text)); - } - - //============================================================================== - static CharPointerType makeUnique (const CharPointerType text) - { - StringHolder* const b = bufferFromText (text); - - if (b->refCount.get() <= 0) - return text; - - CharPointerType newText (createUninitialisedBytes (b->allocatedNumBytes)); - memcpy (newText.getAddress(), text.getAddress(), b->allocatedNumBytes); - release (b); - - return newText; - } - - static CharPointerType makeUniqueWithByteSize (const CharPointerType text, size_t numBytes) - { - StringHolder* const b = bufferFromText (text); - - if (b->refCount.get() <= 0 && b->allocatedNumBytes >= numBytes) - return text; - - CharPointerType newText (createUninitialisedBytes (bmax (b->allocatedNumBytes, numBytes))); - memcpy (newText.getAddress(), text.getAddress(), b->allocatedNumBytes); - release (b); - - return newText; - } - - static size_t getAllocatedNumBytes (const CharPointerType text) noexcept - { - return bufferFromText (text)->allocatedNumBytes; - } - - //============================================================================== - Atomic refCount; - size_t allocatedNumBytes; - CharType text[1]; - - static StringHolder empty; - -private: - static inline StringHolder* bufferFromText (const CharPointerType text) noexcept - { - // (Can't use offsetof() here because of warnings about this not being a POD) - return reinterpret_cast (reinterpret_cast (text.getAddress()) - - (reinterpret_cast (reinterpret_cast (1)->text) - 1)); - } - - void compileTimeChecks() - { - // Let me know if any of these assertions fail on your system! - #if BEAST_NATIVE_WCHAR_IS_UTF8 - static_bassert (sizeof (wchar_t) == 1); - #elif BEAST_NATIVE_WCHAR_IS_UTF16 - static_bassert (sizeof (wchar_t) == 2); - #elif BEAST_NATIVE_WCHAR_IS_UTF32 - static_bassert (sizeof (wchar_t) == 4); - #else - #error "native wchar_t size is unknown" - #endif - } -}; - -StringHolder StringHolder::empty; -const String String::empty; - -//============================================================================== -void String::preallocateBytes (const size_t numBytesNeeded) -{ - text = StringHolder::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); -} - -//============================================================================== -String::String() noexcept : text (StringHolder::getEmpty()) -{ -} - -String::~String() noexcept -{ - StringHolder::release (text); -} - -String::String (const String& other) noexcept - : text (other.text) -{ - StringHolder::retain (text); -} - -void String::swapWith (String& other) noexcept -{ - std::swap (text, other.text); -} - -String& String::operator= (const String& other) noexcept -{ - StringHolder::retain (other.text); - StringHolder::release (text.atomicSwap (other.text)); - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -String::String (String&& other) noexcept - : text (other.text) -{ - other.text = StringHolder::getEmpty(); -} - -String& String::operator= (String&& other) noexcept -{ - std::swap (text, other.text); - return *this; -} -#endif - -inline String::PreallocationBytes::PreallocationBytes (const size_t numBytes_) : numBytes (numBytes_) {} - -String::String (const PreallocationBytes& preallocationSize) - : text (StringHolder::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) -{ -} - -//============================================================================== -String::String (const char* const t) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t))) -{ - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the String class - so for example if your source data is actually UTF-8, - you'd call String (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - */ - bassert (t == nullptr || CharPointer_ASCII::isValidString (t, std::numeric_limits::max())); -} - -String::String (const char* const t, const size_t maxChars) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t), maxChars)) -{ - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the String class - so for example if your source data is actually UTF-8, - you'd call String (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - */ - bassert (t == nullptr || CharPointer_ASCII::isValidString (t, (int) maxChars)); -} - -String::String (const wchar_t* const t) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t))) {} -String::String (const CharPointer_UTF8 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF16 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF32 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_ASCII t) : text (StringHolder::createFromCharPointer (t)) {} - -String::String (const CharPointer_UTF8 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const CharPointer_UTF16 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const CharPointer_UTF32 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const wchar_t* const t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} - -String::String (const CharPointer_UTF8 start, const CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (const CharPointer_UTF16 start, const CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (const CharPointer_UTF32 start, const CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {} - -String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {} - -String String::charToString (const beast_wchar character) -{ - String result (PreallocationBytes (CharPointerType::getBytesRequiredFor (character))); - CharPointerType t (result.text); - t.write (character); - t.writeNull(); - return result; -} - -//============================================================================== -namespace NumberToStringConverters -{ - // pass in a pointer to the END of a buffer.. - static char* numberToString (char* t, const int64 n) noexcept - { - *--t = 0; - int64 v = (n >= 0) ? n : -n; - - do - { - *--t = (char) ('0' + (int) (v % 10)); - v /= 10; - - } while (v > 0); - - if (n < 0) - *--t = '-'; - - return t; - } - - static char* numberToString (char* t, uint64 v) noexcept - { - *--t = 0; - - do - { - *--t = (char) ('0' + (int) (v % 10)); - v /= 10; - - } while (v > 0); - - return t; - } - - static char* numberToString (char* t, const int n) noexcept - { - if (n == (int) 0x80000000) // (would cause an overflow) - return numberToString (t, (int64) n); - - *--t = 0; - int v = abs (n); - - do - { - *--t = (char) ('0' + (v % 10)); - v /= 10; - - } while (v > 0); - - if (n < 0) - *--t = '-'; - - return t; - } - - static char* numberToString (char* t, unsigned int v) noexcept - { - *--t = 0; - - do - { - *--t = (char) ('0' + (v % 10)); - v /= 10; - - } while (v > 0); - - return t; - } - - static char* doubleToString (char* buffer, const int numChars, double n, int numDecPlaces, size_t& len) noexcept - { - if (numDecPlaces > 0 && numDecPlaces < 7 && n > -1.0e20 && n < 1.0e20) - { - char* const end = buffer + numChars; - char* t = end; - int64 v = (int64) (pow (10.0, numDecPlaces) * std::abs (n) + 0.5); - *--t = (char) 0; - - while (numDecPlaces >= 0 || v > 0) - { - if (numDecPlaces == 0) - *--t = '.'; - - *--t = (char) ('0' + (v % 10)); - - v /= 10; - --numDecPlaces; - } - - if (n < 0) - *--t = '-'; - - len = (size_t) (end - t - 1); - return t; - } - - // Use a locale-free sprintf where possible (not available on linux AFAICT) - #if BEAST_MSVC - static _locale_t cLocale = _create_locale (LC_NUMERIC, "C"); - - len = (size_t) (numDecPlaces > 0 ? _sprintf_l (buffer, "%.*f", cLocale, numDecPlaces, n) - : _sprintf_l (buffer, "%.9g", cLocale, n)); - #elif BEAST_MAC || BEAST_IOS - len = (size_t) (numDecPlaces > 0 ? sprintf_l (buffer, nullptr, "%.*f", numDecPlaces, n) - : sprintf_l (buffer, nullptr, "%.9g", n)); - #else - len = (size_t) (numDecPlaces > 0 ? sprintf (buffer, "%.*f", numDecPlaces, n) - : sprintf (buffer, "%.9g", n)); - #endif - - return buffer; - } - - template - static String::CharPointerType createFromInteger (const IntegerType number) - { - char buffer [32]; - char* const end = buffer + numElementsInArray (buffer); - char* const start = numberToString (end, number); - - return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1)); - } - - static String::CharPointerType createFromDouble (const double number, const int numberOfDecimalPlaces) - { - char buffer [48]; - size_t len; - char* const start = doubleToString (buffer, numElementsInArray (buffer), (double) number, numberOfDecimalPlaces, len); - return StringHolder::createFromFixedLength (start, len); - } -} - -//============================================================================== -String::String (const int number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const unsigned int number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const short number) : text (NumberToStringConverters::createFromInteger ((int) number)) {} -String::String (const unsigned short number) : text (NumberToStringConverters::createFromInteger ((unsigned int) number)) {} -String::String (const int64 number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const uint64 number) : text (NumberToStringConverters::createFromInteger (number)) {} - -String::String (const float number) : text (NumberToStringConverters::createFromDouble ((double) number, 0)) {} -String::String (const double number) : text (NumberToStringConverters::createFromDouble (number, 0)) {} -String::String (const float number, const int numberOfDecimalPlaces) : text (NumberToStringConverters::createFromDouble ((double) number, numberOfDecimalPlaces)) {} -String::String (const double number, const int numberOfDecimalPlaces) : text (NumberToStringConverters::createFromDouble (number, numberOfDecimalPlaces)) {} - -//============================================================================== -int String::length() const noexcept -{ - return (int) text.length(); -} - -size_t String::getByteOffsetOfEnd() const noexcept -{ - return (size_t) (((char*) text.findTerminatingNull().getAddress()) - (char*) text.getAddress()); -} - -beast_wchar String::operator[] (int index) const noexcept -{ - bassert (index == 0 || (index > 0 && index <= (int) text.lengthUpTo ((size_t) index + 1))); - return text [index]; -} - -int String::hashCode() const noexcept -{ - CharPointerType t (text); - int result = 0; - - while (! t.isEmpty()) - result = 31 * result + (int) t.getAndAdvance(); - - return result; -} - -int64 String::hashCode64() const noexcept -{ - CharPointerType t (text); - int64 result = 0; - - while (! t.isEmpty()) - result = 101 * result + t.getAndAdvance(); - - return result; -} - -//============================================================================== -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const String& s2) noexcept { return s1.compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const char* const s2) noexcept { return s1.compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const wchar_t* const s2) noexcept { return s1.compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const CharPointer_UTF8 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const CharPointer_UTF16 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator== (const String& s1, const CharPointer_UTF32 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const String& s2) noexcept { return s1.compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const char* const s2) noexcept { return s1.compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const wchar_t* const s2) noexcept { return s1.compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const CharPointer_UTF8 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const CharPointer_UTF16 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator!= (const String& s1, const CharPointer_UTF32 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -BEAST_API bool BEAST_CALLTYPE operator> (const String& s1, const String& s2) noexcept { return s1.compare (s2) > 0; } -BEAST_API bool BEAST_CALLTYPE operator< (const String& s1, const String& s2) noexcept { return s1.compare (s2) < 0; } -BEAST_API bool BEAST_CALLTYPE operator>= (const String& s1, const String& s2) noexcept { return s1.compare (s2) >= 0; } -BEAST_API bool BEAST_CALLTYPE operator<= (const String& s1, const String& s2) noexcept { return s1.compare (s2) <= 0; } - -bool String::equalsIgnoreCase (const wchar_t* const t) const noexcept -{ - return t != nullptr ? text.compareIgnoreCase (castToCharPointer_wchar_t (t)) == 0 - : isEmpty(); -} - -bool String::equalsIgnoreCase (const char* const t) const noexcept -{ - return t != nullptr ? text.compareIgnoreCase (CharPointer_UTF8 (t)) == 0 - : isEmpty(); -} - -bool String::equalsIgnoreCase (const String& other) const noexcept -{ - return text == other.text - || text.compareIgnoreCase (other.text) == 0; -} - -int String::compare (const String& other) const noexcept { return (text == other.text) ? 0 : text.compare (other.text); } -int String::compare (const char* const other) const noexcept { return text.compare (CharPointer_UTF8 (other)); } -int String::compare (const wchar_t* const other) const noexcept { return text.compare (castToCharPointer_wchar_t (other)); } -int String::compareIgnoreCase (const String& other) const noexcept { return (text == other.text) ? 0 : text.compareIgnoreCase (other.text); } - -int String::compareLexicographically (const String& other) const noexcept -{ - CharPointerType s1 (text); - - while (! (s1.isEmpty() || s1.isLetterOrDigit())) - ++s1; - - CharPointerType s2 (other.text); - - while (! (s2.isEmpty() || s2.isLetterOrDigit())) - ++s2; - - return s1.compareIgnoreCase (s2); -} - -//============================================================================== -void String::append (const String& textToAppend, size_t maxCharsToTake) -{ - appendCharPointer (textToAppend.text, maxCharsToTake); -} - -String& String::operator+= (const wchar_t* const t) -{ - appendCharPointer (castToCharPointer_wchar_t (t)); - return *this; -} - -String& String::operator+= (const char* const t) -{ - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the String class - so for example if your source data is actually UTF-8, - you'd call String (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - */ - bassert (t == nullptr || CharPointer_ASCII::isValidString (t, std::numeric_limits::max())); - - appendCharPointer (CharPointer_ASCII (t)); - return *this; -} - -String& String::operator+= (const String& other) -{ - if (isEmpty()) - return operator= (other); - - appendCharPointer (other.text); - return *this; -} - -String& String::operator+= (const char ch) -{ - const char asString[] = { ch, 0 }; - return operator+= (asString); -} - -String& String::operator+= (const wchar_t ch) -{ - const wchar_t asString[] = { ch, 0 }; - return operator+= (asString); -} - -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -String& String::operator+= (const beast_wchar ch) -{ - const beast_wchar asString[] = { ch, 0 }; - appendCharPointer (CharPointer_UTF32 (asString)); - return *this; -} -#endif - -String& String::operator+= (const int number) -{ - char buffer [16]; - char* const end = buffer + numElementsInArray (buffer); - char* const start = NumberToStringConverters::numberToString (end, number); - - const int numExtraChars = (int) (end - start); - - if (numExtraChars > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - const size_t newBytesNeeded = sizeof (CharPointerType::CharType) + byteOffsetOfNull - + sizeof (CharPointerType::CharType) * (size_t) numExtraChars; - - text = StringHolder::makeUniqueWithByteSize (text, newBytesNeeded); - - CharPointerType newEnd (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)); - newEnd.writeWithCharLimit (CharPointer_ASCII (start), numExtraChars); - } - - return *this; -} - -//============================================================================== -BEAST_API String BEAST_CALLTYPE operator+ (const char* const string1, const String& string2) -{ - String s (string1); - return s += string2; -} - -BEAST_API String BEAST_CALLTYPE operator+ (const wchar_t* const string1, const String& string2) -{ - String s (string1); - return s += string2; -} - -BEAST_API String BEAST_CALLTYPE operator+ (const char s1, const String& s2) { return String::charToString ((beast_wchar) (uint8) s1) + s2; } -BEAST_API String BEAST_CALLTYPE operator+ (const wchar_t s1, const String& s2) { return String::charToString (s1) + s2; } -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -BEAST_API String BEAST_CALLTYPE operator+ (const beast_wchar s1, const String& s2) { return String::charToString (s1) + s2; } -#endif - -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const String& s2) { return s1 += s2; } -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const char* const s2) { return s1 += s2; } -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const wchar_t* s2) { return s1 += s2; } - -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const char s2) { return s1 += s2; } -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const wchar_t s2) { return s1 += s2; } -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -BEAST_API String BEAST_CALLTYPE operator+ (String s1, const beast_wchar s2) { return s1 += s2; } -#endif - -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const char s2) { return s1 += s2; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const wchar_t s2) { return s1 += s2; } -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const beast_wchar s2) { return s1 += s2; } -#endif - -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const char* const s2) { return s1 += s2; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const wchar_t* const s2) { return s1 += s2; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const String& s2) { return s1 += s2; } - -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const short number) { return s1 += (int) number; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const int number) { return s1 += number; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const long number) { return s1 += (int) number; } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const int64 number) { return s1 << String (number); } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const float number) { return s1 += String (number); } -BEAST_API String& BEAST_CALLTYPE operator<< (String& s1, const double number) { return s1 += String (number); } - -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const String& text) -{ - const size_t numBytes = text.getNumBytesAsUTF8(); - - #if (BEAST_STRING_UTF_TYPE == 8) - stream.write (text.getCharPointer().getAddress(), numBytes); - #else - // (This avoids using toUTF8() to prevent the memory bloat that it would leave behind - // if lots of large, persistent strings were to be written to streams). - HeapBlock temp (numBytes + 1); - CharPointer_UTF8 (temp).writeAll (text.getCharPointer()); - stream.write (temp, numBytes); - #endif - - return stream; -} - -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, const NewLine&) -{ - return string1 += NewLine::getDefault(); -} - -//============================================================================== -int String::indexOfChar (const beast_wchar character) const noexcept -{ - return text.indexOf (character); -} - -int String::indexOfChar (const int startIndex, const beast_wchar character) const noexcept -{ - CharPointerType t (text); - - for (int i = 0; ! t.isEmpty(); ++i) - { - if (i >= startIndex) - { - if (t.getAndAdvance() == character) - return i; - } - else - { - ++t; - } - } - - return -1; -} - -int String::lastIndexOfChar (const beast_wchar character) const noexcept -{ - CharPointerType t (text); - int last = -1; - - for (int i = 0; ! t.isEmpty(); ++i) - if (t.getAndAdvance() == character) - last = i; - - return last; -} - -int String::indexOfAnyOf (const String& charactersToLookFor, const int startIndex, const bool ignoreCase) const noexcept -{ - CharPointerType t (text); - - for (int i = 0; ! t.isEmpty(); ++i) - { - if (i >= startIndex) - { - if (charactersToLookFor.text.indexOf (t.getAndAdvance(), ignoreCase) >= 0) - return i; - } - else - { - ++t; - } - } - - return -1; -} - -int String::indexOf (const String& other) const noexcept -{ - return other.isEmpty() ? 0 : text.indexOf (other.text); -} - -int String::indexOfIgnoreCase (const String& other) const noexcept -{ - return other.isEmpty() ? 0 : CharacterFunctions::indexOfIgnoreCase (text, other.text); -} - -int String::indexOf (const int startIndex, const String& other) const noexcept -{ - if (other.isEmpty()) - return -1; - - CharPointerType t (text); - - for (int i = startIndex; --i >= 0;) - { - if (t.isEmpty()) - return -1; - - ++t; - } - - int found = t.indexOf (other.text); - if (found >= 0) - found += startIndex; - return found; -} - -int String::indexOfIgnoreCase (const int startIndex, const String& other) const noexcept -{ - if (other.isEmpty()) - return -1; - - CharPointerType t (text); - - for (int i = startIndex; --i >= 0;) - { - if (t.isEmpty()) - return -1; - - ++t; - } - - int found = CharacterFunctions::indexOfIgnoreCase (t, other.text); - if (found >= 0) - found += startIndex; - return found; -} - -int String::lastIndexOf (const String& other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - CharPointerType n (text + i); - - while (i >= 0) - { - if (n.compareUpTo (other.text, len) == 0) - return i; - - --n; - --i; - } - } - } - - return -1; -} - -int String::lastIndexOfIgnoreCase (const String& other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - CharPointerType n (text + i); - - while (i >= 0) - { - if (n.compareIgnoreCaseUpTo (other.text, len) == 0) - return i; - - --n; - --i; - } - } - } - - return -1; -} - -int String::lastIndexOfAnyOf (const String& charactersToLookFor, const bool ignoreCase) const noexcept -{ - CharPointerType t (text); - int last = -1; - - for (int i = 0; ! t.isEmpty(); ++i) - if (charactersToLookFor.text.indexOf (t.getAndAdvance(), ignoreCase) >= 0) - last = i; - - return last; -} - -bool String::contains (const String& other) const noexcept -{ - return indexOf (other) >= 0; -} - -bool String::containsChar (const beast_wchar character) const noexcept -{ - return text.indexOf (character) >= 0; -} - -bool String::containsIgnoreCase (const String& t) const noexcept -{ - return indexOfIgnoreCase (t) >= 0; -} - -int String::indexOfWholeWord (const String& word) const noexcept -{ - if (word.isNotEmpty()) - { - CharPointerType t (text); - const int wordLen = word.length(); - const int end = (int) t.length() - wordLen; - - for (int i = 0; i <= end; ++i) - { - if (t.compareUpTo (word.text, wordLen) == 0 - && (i == 0 || ! (t - 1).isLetterOrDigit()) - && ! (t + wordLen).isLetterOrDigit()) - return i; - - ++t; - } - } - - return -1; -} - -int String::indexOfWholeWordIgnoreCase (const String& word) const noexcept -{ - if (word.isNotEmpty()) - { - CharPointerType t (text); - const int wordLen = word.length(); - const int end = (int) t.length() - wordLen; - - for (int i = 0; i <= end; ++i) - { - if (t.compareIgnoreCaseUpTo (word.text, wordLen) == 0 - && (i == 0 || ! (t - 1).isLetterOrDigit()) - && ! (t + wordLen).isLetterOrDigit()) - return i; - - ++t; - } - } - - return -1; -} - -bool String::containsWholeWord (const String& wordToLookFor) const noexcept -{ - return indexOfWholeWord (wordToLookFor) >= 0; -} - -bool String::containsWholeWordIgnoreCase (const String& wordToLookFor) const noexcept -{ - return indexOfWholeWordIgnoreCase (wordToLookFor) >= 0; -} - -//============================================================================== -template -struct WildCardMatcher -{ - static bool matches (CharPointer wildcard, CharPointer test, const bool ignoreCase) noexcept - { - for (;;) - { - const beast_wchar wc = wildcard.getAndAdvance(); - - if (wc == '*') - return wildcard.isEmpty() || matchesAnywhere (wildcard, test, ignoreCase); - - if (! characterMatches (wc, test.getAndAdvance(), ignoreCase)) - return false; - - if (wc == 0) - return true; - } - } - - static bool characterMatches (const beast_wchar wc, const beast_wchar tc, const bool ignoreCase) noexcept - { - return (wc == tc) || (wc == '?' && tc != 0) - || (ignoreCase && CharacterFunctions::toLowerCase (wc) == CharacterFunctions::toLowerCase (tc)); - } - - static bool matchesAnywhere (const CharPointer wildcard, CharPointer test, const bool ignoreCase) noexcept - { - for (; ! test.isEmpty(); ++test) - if (matches (wildcard, test, ignoreCase)) - return true; - - return false; - } -}; - -bool String::matchesWildcard (const String& wildcard, const bool ignoreCase) const noexcept -{ - return WildCardMatcher::matches (wildcard.text, text, ignoreCase); -} - -//============================================================================== -String String::repeatedString (const String& stringToRepeat, int numberOfTimesToRepeat) -{ - if (numberOfTimesToRepeat <= 0) - return empty; - - String result (PreallocationBytes (stringToRepeat.getByteOffsetOfEnd() * (size_t) numberOfTimesToRepeat)); - CharPointerType n (result.text); - - while (--numberOfTimesToRepeat >= 0) - n.writeAll (stringToRepeat.text); - - return result; -} - -String String::paddedLeft (const beast_wchar padCharacter, int minimumLength) const -{ - bassert (padCharacter != 0); - - int extraChars = minimumLength; - CharPointerType end (text); - - while (! end.isEmpty()) - { - --extraChars; - ++end; - } - - if (extraChars <= 0 || padCharacter == 0) - return *this; - - const size_t currentByteSize = (size_t) (((char*) end.getAddress()) - (char*) text.getAddress()); - String result (PreallocationBytes (currentByteSize + (size_t) extraChars * CharPointerType::getBytesRequiredFor (padCharacter))); - CharPointerType n (result.text); - - while (--extraChars >= 0) - n.write (padCharacter); - - n.writeAll (text); - return result; -} - -String String::paddedRight (const beast_wchar padCharacter, int minimumLength) const -{ - bassert (padCharacter != 0); - - int extraChars = minimumLength; - CharPointerType end (text); - - while (! end.isEmpty()) - { - --extraChars; - ++end; - } - - if (extraChars <= 0 || padCharacter == 0) - return *this; - - const size_t currentByteSize = (size_t) (((char*) end.getAddress()) - (char*) text.getAddress()); - String result (PreallocationBytes (currentByteSize + (size_t) extraChars * CharPointerType::getBytesRequiredFor (padCharacter))); - CharPointerType n (result.text); - - n.writeAll (text); - - while (--extraChars >= 0) - n.write (padCharacter); - - n.writeNull(); - return result; -} - -//============================================================================== -String String::replaceSection (int index, int numCharsToReplace, const String& stringToInsert) const -{ - if (index < 0) - { - // a negative index to replace from? - bassertfalse; - index = 0; - } - - if (numCharsToReplace < 0) - { - // replacing a negative number of characters? - numCharsToReplace = 0; - bassertfalse; - } - - int i = 0; - CharPointerType insertPoint (text); - - while (i < index) - { - if (insertPoint.isEmpty()) - { - // replacing beyond the end of the string? - bassertfalse; - return *this + stringToInsert; - } - - ++insertPoint; - ++i; - } - - CharPointerType startOfRemainder (insertPoint); - - i = 0; - while (i < numCharsToReplace && ! startOfRemainder.isEmpty()) - { - ++startOfRemainder; - ++i; - } - - if (insertPoint == text && startOfRemainder.isEmpty()) - return stringToInsert; - - const size_t initialBytes = (size_t) (((char*) insertPoint.getAddress()) - (char*) text.getAddress()); - const size_t newStringBytes = stringToInsert.getByteOffsetOfEnd(); - const size_t remainderBytes = (size_t) (((char*) startOfRemainder.findTerminatingNull().getAddress()) - (char*) startOfRemainder.getAddress()); - - const size_t newTotalBytes = initialBytes + newStringBytes + remainderBytes; - if (newTotalBytes <= 0) - return String::empty; - - String result (PreallocationBytes ((size_t) newTotalBytes)); - - char* dest = (char*) result.text.getAddress(); - memcpy (dest, text.getAddress(), initialBytes); - dest += initialBytes; - memcpy (dest, stringToInsert.text.getAddress(), newStringBytes); - dest += newStringBytes; - memcpy (dest, startOfRemainder.getAddress(), remainderBytes); - dest += remainderBytes; - CharPointerType ((CharPointerType::CharType*) dest).writeNull(); - - return result; -} - -String String::replace (const String& stringToReplace, const String& stringToInsert, const bool ignoreCase) const -{ - const int stringToReplaceLen = stringToReplace.length(); - const int stringToInsertLen = stringToInsert.length(); - - int i = 0; - String result (*this); - - while ((i = (ignoreCase ? result.indexOfIgnoreCase (i, stringToReplace) - : result.indexOf (i, stringToReplace))) >= 0) - { - result = result.replaceSection (i, stringToReplaceLen, stringToInsert); - i += stringToInsertLen; - } - - return result; -} - -class StringCreationHelper -{ -public: - StringCreationHelper (const size_t initialBytes) - : source (nullptr), dest (nullptr), allocatedBytes (initialBytes), bytesWritten (0) - { - result.preallocateBytes (allocatedBytes); - dest = result.getCharPointer(); - } - - StringCreationHelper (const String::CharPointerType& source_) - : source (source_), dest (nullptr), allocatedBytes (StringHolder::getAllocatedNumBytes (source)), bytesWritten (0) - { - result.preallocateBytes (allocatedBytes); - dest = result.getCharPointer(); - } - - void write (beast_wchar c) - { - bytesWritten += String::CharPointerType::getBytesRequiredFor (c); - - if (bytesWritten > allocatedBytes) - { - allocatedBytes += bmax ((size_t) 8, allocatedBytes / 16); - const size_t destOffset = (size_t) (((char*) dest.getAddress()) - (char*) result.getCharPointer().getAddress()); - result.preallocateBytes (allocatedBytes); - dest = addBytesToPointer (result.getCharPointer().getAddress(), (int) destOffset); - } - - dest.write (c); - } - - String result; - String::CharPointerType source; - -private: - String::CharPointerType dest; - size_t allocatedBytes, bytesWritten; -}; - -String String::replaceCharacter (const beast_wchar charToReplace, const beast_wchar charToInsert) const -{ - if (! containsChar (charToReplace)) - return *this; - - StringCreationHelper builder (text); - - for (;;) - { - beast_wchar c = builder.source.getAndAdvance(); - - if (c == charToReplace) - c = charToInsert; - - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::replaceCharacters (const String& charactersToReplace, const String& charactersToInsertInstead) const -{ - StringCreationHelper builder (text); - - for (;;) - { - beast_wchar c = builder.source.getAndAdvance(); - - const int index = charactersToReplace.indexOfChar (c); - if (index >= 0) - c = charactersToInsertInstead [index]; - - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -//============================================================================== -bool String::startsWith (const String& other) const noexcept -{ - return text.compareUpTo (other.text, other.length()) == 0; -} - -bool String::startsWithIgnoreCase (const String& other) const noexcept -{ - return text.compareIgnoreCaseUpTo (other.text, other.length()) == 0; -} - -bool String::startsWithChar (const beast_wchar character) const noexcept -{ - bassert (character != 0); // strings can't contain a null character! - - return *text == character; -} - -bool String::endsWithChar (const beast_wchar character) const noexcept -{ - bassert (character != 0); // strings can't contain a null character! - - if (text.isEmpty()) - return false; - - CharPointerType t (text.findTerminatingNull()); - return *--t == character; -} - -bool String::endsWith (const String& other) const noexcept -{ - CharPointerType end (text.findTerminatingNull()); - CharPointerType otherEnd (other.text.findTerminatingNull()); - - while (end > text && otherEnd > other.text) - { - --end; - --otherEnd; - - if (*end != *otherEnd) - return false; - } - - return otherEnd == other.text; -} - -bool String::endsWithIgnoreCase (const String& other) const noexcept -{ - CharPointerType end (text.findTerminatingNull()); - CharPointerType otherEnd (other.text.findTerminatingNull()); - - while (end > text && otherEnd > other.text) - { - --end; - --otherEnd; - - if (end.toLowerCase() != otherEnd.toLowerCase()) - return false; - } - - return otherEnd == other.text; -} - -//============================================================================== -String String::toUpperCase() const -{ - StringCreationHelper builder (text); - - for (;;) - { - const beast_wchar c = builder.source.toUpperCase(); - ++(builder.source); - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::toLowerCase() const -{ - StringCreationHelper builder (text); - - for (;;) - { - const beast_wchar c = builder.source.toLowerCase(); - ++(builder.source); - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -//============================================================================== -beast_wchar String::getLastCharacter() const noexcept -{ - return isEmpty() ? beast_wchar() : text [length() - 1]; -} - -String String::substring (int start, const int end) const -{ - if (start < 0) - start = 0; - - if (end <= start) - return empty; - - int i = 0; - CharPointerType t1 (text); - - while (i < start) - { - if (t1.isEmpty()) - return empty; - - ++i; - ++t1; - } - - CharPointerType t2 (t1); - while (i < end) - { - if (t2.isEmpty()) - { - if (start == 0) - return *this; - - break; - } - - ++i; - ++t2; - } - - return String (t1, t2); -} - -String String::substring (int start) const -{ - if (start <= 0) - return *this; - - CharPointerType t (text); - - while (--start >= 0) - { - if (t.isEmpty()) - return empty; - - ++t; - } - - return String (t); -} - -String String::dropLastCharacters (const int numberToDrop) const -{ - return String (text, (size_t) bmax (0, length() - numberToDrop)); -} - -String String::getLastCharacters (const int numCharacters) const -{ - return String (text + bmax (0, length() - bmax (0, numCharacters))); -} - -String String::fromFirstOccurrenceOf (const String& sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? indexOfIgnoreCase (sub) - : indexOf (sub); - if (i < 0) - return empty; - - return substring (includeSubString ? i : i + sub.length()); -} - -String String::fromLastOccurrenceOf (const String& sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? lastIndexOfIgnoreCase (sub) - : lastIndexOf (sub); - if (i < 0) - return *this; - - return substring (includeSubString ? i : i + sub.length()); -} - -String String::upToFirstOccurrenceOf (const String& sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? indexOfIgnoreCase (sub) - : indexOf (sub); - if (i < 0) - return *this; - - return substring (0, includeSubString ? i + sub.length() : i); -} - -String String::upToLastOccurrenceOf (const String& sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? lastIndexOfIgnoreCase (sub) - : lastIndexOf (sub); - if (i < 0) - return *this; - - return substring (0, includeSubString ? i + sub.length() : i); -} - -bool String::isQuotedString() const -{ - const String trimmed (trimStart()); - - return trimmed[0] == '"' - || trimmed[0] == '\''; -} - -String String::unquoted() const -{ - const int len = length(); - - if (len == 0) - return empty; - - const beast_wchar lastChar = text [len - 1]; - const int dropAtStart = (*text == '"' || *text == '\'') ? 1 : 0; - const int dropAtEnd = (lastChar == '"' || lastChar == '\'') ? 1 : 0; - - return substring (dropAtStart, len - dropAtEnd); -} - -String String::quoted (const beast_wchar quoteCharacter) const -{ - if (isEmpty()) - return charToString (quoteCharacter) + quoteCharacter; - - String t (*this); - - if (! t.startsWithChar (quoteCharacter)) - t = charToString (quoteCharacter) + t; - - if (! t.endsWithChar (quoteCharacter)) - t += quoteCharacter; - - return t; -} - -//============================================================================== -static String::CharPointerType findTrimmedEnd (const String::CharPointerType& start, String::CharPointerType end) -{ - while (end > start) - { - if (! (--end).isWhitespace()) - { - ++end; - break; - } - } - - return end; -} - -String String::trim() const -{ - if (isNotEmpty()) - { - CharPointerType start (text.findEndOfWhitespace()); - - const CharPointerType end (start.findTerminatingNull()); - CharPointerType trimmedEnd (findTrimmedEnd (start, end)); - - if (trimmedEnd <= start) - return empty; - - if (text < start || trimmedEnd < end) - return String (start, trimmedEnd); - } - - return *this; -} - -String String::trimStart() const -{ - if (isNotEmpty()) - { - const CharPointerType t (text.findEndOfWhitespace()); - - if (t != text) - return String (t); - } - - return *this; -} - -String String::trimEnd() const -{ - if (isNotEmpty()) - { - const CharPointerType end (text.findTerminatingNull()); - CharPointerType trimmedEnd (findTrimmedEnd (text, end)); - - if (trimmedEnd < end) - return String (text, trimmedEnd); - } - - return *this; -} - -String String::trimCharactersAtStart (const String& charactersToTrim) const -{ - CharPointerType t (text); - - while (charactersToTrim.containsChar (*t)) - ++t; - - return t == text ? *this : String (t); -} - -String String::trimCharactersAtEnd (const String& charactersToTrim) const -{ - if (isNotEmpty()) - { - const CharPointerType end (text.findTerminatingNull()); - CharPointerType trimmedEnd (end); - - while (trimmedEnd > text) - { - if (! charactersToTrim.containsChar (*--trimmedEnd)) - { - ++trimmedEnd; - break; - } - } - - if (trimmedEnd < end) - return String (text, trimmedEnd); - } - - return *this; -} - -//============================================================================== -String String::retainCharacters (const String& charactersToRetain) const -{ - if (isEmpty()) - return empty; - - StringCreationHelper builder (text); - - for (;;) - { - beast_wchar c = builder.source.getAndAdvance(); - - if (charactersToRetain.containsChar (c)) - builder.write (c); - - if (c == 0) - break; - } - - builder.write (0); - return builder.result; -} - -String String::removeCharacters (const String& charactersToRemove) const -{ - if (isEmpty()) - return empty; - - StringCreationHelper builder (text); - - for (;;) - { - beast_wchar c = builder.source.getAndAdvance(); - - if (! charactersToRemove.containsChar (c)) - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::initialSectionContainingOnly (const String& permittedCharacters) const -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (! permittedCharacters.containsChar (*t)) - return String (text, t); - - ++t; - } - - return *this; -} - -String String::initialSectionNotContaining (const String& charactersToStopAt) const -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (charactersToStopAt.containsChar (*t)) - return String (text, t); - - ++t; - } - - return *this; -} - -bool String::containsOnly (const String& chars) const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - if (! chars.containsChar (t.getAndAdvance())) - return false; - - return true; -} - -bool String::containsAnyOf (const String& chars) const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - if (chars.containsChar (t.getAndAdvance())) - return true; - - return false; -} - -bool String::containsNonWhitespaceChars() const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (! t.isWhitespace()) - return true; - - ++t; - } - - return false; -} - -// Note! The format parameter here MUST NOT be a reference, otherwise MS's va_start macro fails to work (but still compiles). -String String::formatted (const String pf, ... ) -{ - size_t bufferSize = 256; - - for (;;) - { - va_list args; - va_start (args, pf); - - #if BEAST_WINDOWS - HeapBlock temp (bufferSize); - const int num = (int) _vsnwprintf (temp.getData(), bufferSize - 1, pf.toWideCharPointer(), args); - #elif BEAST_ANDROID - HeapBlock temp (bufferSize); - const int num = (int) vsnprintf (temp.getData(), bufferSize - 1, pf.toUTF8(), args); - #else - HeapBlock temp (bufferSize); - const int num = (int) vswprintf (temp.getData(), bufferSize - 1, pf.toWideCharPointer(), args); - #endif - - va_end (args); - - if (num > 0) - return String (temp); - - bufferSize += 256; - - if (num == 0 || bufferSize > 65536) // the upper limit is a sanity check to avoid situations where vprintf repeatedly - break; // returns -1 because of an error rather than because it needs more space. - } - - return empty; -} - -//============================================================================== -int String::getIntValue() const noexcept -{ - return text.getIntValue32(); -} - -int String::getTrailingIntValue() const noexcept -{ - int n = 0; - int mult = 1; - CharPointerType t (text.findTerminatingNull()); - - while (--t >= text) - { - if (! t.isDigit()) - { - if (*t == '-') - n = -n; - - break; - } - - n += mult * (*t - '0'); - mult *= 10; - } - - return n; -} - -int64 String::getLargeIntValue() const noexcept -{ - return text.getIntValue64(); -} - -float String::getFloatValue() const noexcept -{ - return (float) getDoubleValue(); -} - -double String::getDoubleValue() const noexcept -{ - return text.getDoubleValue(); -} - -static const char hexDigits[] = "0123456789abcdef"; - -template -struct HexConverter -{ - static String hexToString (Type v) - { - char buffer[32]; - char* const end = buffer + 32; - char* t = end; - *--t = 0; - - do - { - *--t = hexDigits [(int) (v & 15)]; - v >>= 4; - - } while (v != 0); - - return String (t, (size_t) (end - t) - 1); - } - - static Type stringToHex (String::CharPointerType t) noexcept - { - Type result = 0; - - while (! t.isEmpty()) - { - const int hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); - - if (hexValue >= 0) - result = (result << 4) | hexValue; - } - - return result; - } -}; - -String String::toHexString (const int number) -{ - return HexConverter ::hexToString ((unsigned int) number); -} - -String String::toHexString (const int64 number) -{ - return HexConverter ::hexToString ((uint64) number); -} - -String String::toHexString (const short number) -{ - return toHexString ((int) (unsigned short) number); -} - -String String::toHexString (const void* const d, const int size, const int groupSize) -{ - if (size <= 0) - return empty; - - int numChars = (size * 2) + 2; - if (groupSize > 0) - numChars += size / groupSize; - - String s (PreallocationBytes (sizeof (CharPointerType::CharType) * (size_t) numChars)); - - const unsigned char* data = static_cast (d); - CharPointerType dest (s.text); - - for (int i = 0; i < size; ++i) - { - const unsigned char nextByte = *data++; - dest.write ((beast_wchar) hexDigits [nextByte >> 4]); - dest.write ((beast_wchar) hexDigits [nextByte & 0xf]); - - if (groupSize > 0 && (i % groupSize) == (groupSize - 1) && i < (size - 1)) - dest.write ((beast_wchar) ' '); - } - - dest.writeNull(); - return s; -} - -int String::getHexValue32() const noexcept { return HexConverter ::stringToHex (text); } -int64 String::getHexValue64() const noexcept { return HexConverter::stringToHex (text); } - -//============================================================================== -String String::createStringFromData (const void* const data_, const int size) -{ - const uint8* const data = static_cast (data_); - - if (size <= 0 || data == nullptr) - return empty; - - if (size == 1) - return charToString ((beast_wchar) data[0]); - - if ((data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkBE2) - || (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkLE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkLE2)) - { - const bool bigEndian = (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1); - const int numChars = size / 2 - 1; - - StringCreationHelper builder ((size_t) numChars); - - const uint16* const src = (const uint16*) (data + 2); - - if (bigEndian) - { - for (int i = 0; i < numChars; ++i) - builder.write ((beast_wchar) ByteOrder::swapIfLittleEndian (src[i])); - } - else - { - for (int i = 0; i < numChars; ++i) - builder.write ((beast_wchar) ByteOrder::swapIfBigEndian (src[i])); - } - - builder.write (0); - return builder.result; - } - - const uint8* start = data; - const uint8* end = data + size; - - if (size >= 3 - && data[0] == (uint8) CharPointer_UTF8::byteOrderMark1 - && data[1] == (uint8) CharPointer_UTF8::byteOrderMark2 - && data[2] == (uint8) CharPointer_UTF8::byteOrderMark3) - start += 3; - - return String (CharPointer_UTF8 ((const char*) start), - CharPointer_UTF8 ((const char*) end)); -} - -//============================================================================== -static const beast_wchar emptyChar = 0; - -template -struct StringEncodingConverter -{ - static CharPointerType_Dest convert (const String& s) - { - String& source = const_cast (s); - - typedef typename CharPointerType_Dest::CharType DestChar; - - if (source.isEmpty()) - return CharPointerType_Dest (reinterpret_cast (&emptyChar)); - - CharPointerType_Src text (source.getCharPointer()); - const size_t extraBytesNeeded = CharPointerType_Dest::getBytesRequiredFor (text); - const size_t endOffset = (text.sizeInBytes() + 3) & ~3u; // the new string must be word-aligned or many Windows - // functions will fail to read it correctly! - source.preallocateBytes (endOffset + extraBytesNeeded); - text = source.getCharPointer(); - - void* const newSpace = addBytesToPointer (text.getAddress(), (int) endOffset); - const CharPointerType_Dest extraSpace (static_cast (newSpace)); - - #if BEAST_DEBUG // (This just avoids spurious warnings from valgrind about the uninitialised bytes at the end of the buffer..) - const size_t bytesToClear = (size_t) bmin ((int) extraBytesNeeded, 4); - zeromem (addBytesToPointer (newSpace, extraBytesNeeded - bytesToClear), bytesToClear); - #endif - - CharPointerType_Dest (extraSpace).writeAll (text); - return extraSpace; - } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF8 convert (const String& source) noexcept { return CharPointer_UTF8 ((CharPointer_UTF8::CharType*) source.getCharPointer().getAddress()); } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF16 convert (const String& source) noexcept { return CharPointer_UTF16 ((CharPointer_UTF16::CharType*) source.getCharPointer().getAddress()); } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF32 convert (const String& source) noexcept { return CharPointer_UTF32 ((CharPointer_UTF32::CharType*) source.getCharPointer().getAddress()); } -}; - -CharPointer_UTF8 String::toUTF8() const { return StringEncodingConverter ::convert (*this); } -CharPointer_UTF16 String::toUTF16() const { return StringEncodingConverter ::convert (*this); } -CharPointer_UTF32 String::toUTF32() const { return StringEncodingConverter ::convert (*this); } - -const char* String::toRawUTF8() const -{ - return toUTF8().getAddress(); -} - -const wchar_t* String::toWideCharPointer() const -{ - return StringEncodingConverter ::convert (*this).getAddress(); -} - -std::string String::toStdString() const -{ - return std::string (toRawUTF8()); -} - -//============================================================================== -template -struct StringCopier -{ - static size_t copyToBuffer (const CharPointerType_Src source, typename CharPointerType_Dest::CharType* const buffer, const size_t maxBufferSizeBytes) - { - bassert (((ssize_t) maxBufferSizeBytes) >= 0); // keep this value positive! - - if (buffer == nullptr) - return CharPointerType_Dest::getBytesRequiredFor (source) + sizeof (typename CharPointerType_Dest::CharType); - - return CharPointerType_Dest (buffer).writeWithDestByteLimit (source, maxBufferSizeBytes); - } -}; - -size_t String::copyToUTF8 (CharPointer_UTF8::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -size_t String::copyToUTF16 (CharPointer_UTF16::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -size_t String::copyToUTF32 (CharPointer_UTF32::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -//============================================================================== -size_t String::getNumBytesAsUTF8() const noexcept -{ - return CharPointer_UTF8::getBytesRequiredFor (text); -} - -String String::fromUTF8 (const char* const buffer, int bufferSizeBytes) -{ - if (buffer != nullptr) - { - if (bufferSizeBytes < 0) return String (CharPointer_UTF8 (buffer)); - if (bufferSizeBytes > 0) return String (CharPointer_UTF8 (buffer), - CharPointer_UTF8 (buffer + bufferSizeBytes)); - } - - return String::empty; -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -//============================================================================== -#if BEAST_UNIT_TESTS - -class StringTests : public UnitTest -{ -public: - StringTests() : UnitTest ("String class") {} - - template - struct TestUTFConversion - { - static void test (UnitTest& test) - { - String s (createRandomWideCharString()); - - typename CharPointerType::CharType buffer [300]; - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF32()); - test.expectEquals (String (CharPointerType (buffer)), s); - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF16()); - test.expectEquals (String (CharPointerType (buffer)), s); - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF8()); - test.expectEquals (String (CharPointerType (buffer)), s); - - test.expect (CharPointerType::isValidString (buffer, (int) strlen ((const char*) buffer))); - } - }; - - static String createRandomWideCharString() - { - beast_wchar buffer[50] = { 0 }; - Random r; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (beast_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (beast_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } - - void runTest() - { - { - beginTest ("Basics"); - - expect (String().length() == 0); - expect (String() == String::empty); - String s1, s2 ("abcd"); - expect (s1.isEmpty() && ! s1.isNotEmpty()); - expect (s2.isNotEmpty() && ! s2.isEmpty()); - expect (s2.length() == 4); - s1 = "abcd"; - expect (s2 == s1 && s1 == s2); - expect (s1 == "abcd" && s1 == L"abcd"); - expect (String ("abcd") == String (L"abcd")); - expect (String ("abcdefg", 4) == L"abcd"); - expect (String ("abcdefg", 4) == String (L"abcdefg", 4)); - expect (String::charToString ('x') == "x"); - expect (String::charToString (0) == String::empty); - expect (s2 + "e" == "abcde" && s2 + 'e' == "abcde"); - expect (s2 + L'e' == "abcde" && s2 + L"e" == "abcde"); - expect (s1.equalsIgnoreCase ("abcD") && s1 < "abce" && s1 > "abbb"); - expect (s1.startsWith ("ab") && s1.startsWith ("abcd") && ! s1.startsWith ("abcde")); - expect (s1.startsWithIgnoreCase ("aB") && s1.endsWithIgnoreCase ("CD")); - expect (s1.endsWith ("bcd") && ! s1.endsWith ("aabcd")); - expectEquals (s1.indexOf (String::empty), 0); - expectEquals (s1.indexOfIgnoreCase (String::empty), 0); - expect (s1.startsWith (String::empty) && s1.endsWith (String::empty) && s1.contains (String::empty)); - expect (s1.contains ("cd") && s1.contains ("ab") && s1.contains ("abcd")); - expect (s1.containsChar ('a')); - expect (! s1.containsChar ('x')); - expect (! s1.containsChar (0)); - expect (String ("abc foo bar").containsWholeWord ("abc") && String ("abc foo bar").containsWholeWord ("abc")); - } - - { - beginTest ("Operations"); - - String s ("012345678"); - expect (s.hashCode() != 0); - expect (s.hashCode64() != 0); - expect (s.hashCode() != (s + s).hashCode()); - expect (s.hashCode64() != (s + s).hashCode64()); - expect (s.compare (String ("012345678")) == 0); - expect (s.compare (String ("012345679")) < 0); - expect (s.compare (String ("012345676")) > 0); - expect (s.substring (2, 3) == String::charToString (s[2])); - expect (s.substring (0, 1) == String::charToString (s[0])); - expect (s.getLastCharacter() == s [s.length() - 1]); - expect (String::charToString (s.getLastCharacter()) == s.getLastCharacters (1)); - expect (s.substring (0, 3) == L"012"); - expect (s.substring (0, 100) == s); - expect (s.substring (-1, 100) == s); - expect (s.substring (3) == "345678"); - expect (s.indexOf (L"45") == 4); - expect (String ("444445").indexOf ("45") == 4); - expect (String ("444445").lastIndexOfChar ('4') == 4); - expect (String ("45454545x").lastIndexOf (L"45") == 6); - expect (String ("45454545x").lastIndexOfAnyOf ("456") == 7); - expect (String ("45454545x").lastIndexOfAnyOf (L"456x") == 8); - expect (String ("abABaBaBa").lastIndexOfIgnoreCase ("aB") == 6); - expect (s.indexOfChar (L'4') == 4); - expect (s + s == "012345678012345678"); - expect (s.startsWith (s)); - expect (s.startsWith (s.substring (0, 4))); - expect (s.startsWith (s.dropLastCharacters (4))); - expect (s.endsWith (s.substring (5))); - expect (s.endsWith (s)); - expect (s.contains (s.substring (3, 6))); - expect (s.contains (s.substring (3))); - expect (s.startsWithChar (s[0])); - expect (s.endsWithChar (s.getLastCharacter())); - expect (s [s.length()] == 0); - expect (String ("abcdEFGH").toLowerCase() == String ("abcdefgh")); - expect (String ("abcdEFGH").toUpperCase() == String ("ABCDEFGH")); - - String s2 ("123"); - s2 << ((int) 4) << ((short) 5) << "678" << L"9" << '0'; - s2 += "xyz"; - expect (s2 == "1234567890xyz"); - - beginTest ("Numeric conversions"); - expect (String::empty.getIntValue() == 0); - expect (String::empty.getDoubleValue() == 0.0); - expect (String::empty.getFloatValue() == 0.0f); - expect (s.getIntValue() == 12345678); - expect (s.getLargeIntValue() == (int64) 12345678); - expect (s.getDoubleValue() == 12345678.0); - expect (s.getFloatValue() == 12345678.0f); - expect (String (-1234).getIntValue() == -1234); - expect (String ((int64) -1234).getLargeIntValue() == -1234); - expect (String (-1234.56).getDoubleValue() == -1234.56); - expect (String (-1234.56f).getFloatValue() == -1234.56f); - expect (("xyz" + s).getTrailingIntValue() == s.getIntValue()); - expect (s.getHexValue32() == 0x12345678); - expect (s.getHexValue64() == (int64) 0x12345678); - expect (String::toHexString (0x1234abcd).equalsIgnoreCase ("1234abcd")); - expect (String::toHexString ((int64) 0x1234abcd).equalsIgnoreCase ("1234abcd")); - expect (String::toHexString ((short) 0x12ab).equalsIgnoreCase ("12ab")); - - unsigned char data[] = { 1, 2, 3, 4, 0xa, 0xb, 0xc, 0xd }; - expect (String::toHexString (data, 8, 0).equalsIgnoreCase ("010203040a0b0c0d")); - expect (String::toHexString (data, 8, 1).equalsIgnoreCase ("01 02 03 04 0a 0b 0c 0d")); - expect (String::toHexString (data, 8, 2).equalsIgnoreCase ("0102 0304 0a0b 0c0d")); - - beginTest ("Subsections"); - String s3; - s3 = "abcdeFGHIJ"; - expect (s3.equalsIgnoreCase ("ABCdeFGhiJ")); - expect (s3.compareIgnoreCase (L"ABCdeFGhiJ") == 0); - expect (s3.containsIgnoreCase (s3.substring (3))); - expect (s3.indexOfAnyOf ("xyzf", 2, true) == 5); - expect (s3.indexOfAnyOf (L"xyzf", 2, false) == -1); - expect (s3.indexOfAnyOf ("xyzF", 2, false) == 5); - expect (s3.containsAnyOf (L"zzzFs")); - expect (s3.startsWith ("abcd")); - expect (s3.startsWithIgnoreCase (L"abCD")); - expect (s3.startsWith (String::empty)); - expect (s3.startsWithChar ('a')); - expect (s3.endsWith (String ("HIJ"))); - expect (s3.endsWithIgnoreCase (L"Hij")); - expect (s3.endsWith (String::empty)); - expect (s3.endsWithChar (L'J')); - expect (s3.indexOf ("HIJ") == 7); - expect (s3.indexOf (L"HIJK") == -1); - expect (s3.indexOfIgnoreCase ("hij") == 7); - expect (s3.indexOfIgnoreCase (L"hijk") == -1); - expect (s3.toStdString() == s3.toRawUTF8()); - - String s4 (s3); - s4.append (String ("xyz123"), 3); - expect (s4 == s3 + "xyz"); - - expect (String (1234) < String (1235)); - expect (String (1235) > String (1234)); - expect (String (1234) >= String (1234)); - expect (String (1234) <= String (1234)); - expect (String (1235) >= String (1234)); - expect (String (1234) <= String (1235)); - - String s5 ("word word2 word3"); - expect (s5.containsWholeWord (String ("word2"))); - expect (s5.indexOfWholeWord ("word2") == 5); - expect (s5.containsWholeWord (L"word")); - expect (s5.containsWholeWord ("word3")); - expect (s5.containsWholeWord (s5)); - expect (s5.containsWholeWordIgnoreCase (L"Word2")); - expect (s5.indexOfWholeWordIgnoreCase ("Word2") == 5); - expect (s5.containsWholeWordIgnoreCase (L"Word")); - expect (s5.containsWholeWordIgnoreCase ("Word3")); - expect (! s5.containsWholeWordIgnoreCase (L"Wordx")); - expect (! s5.containsWholeWordIgnoreCase ("xWord2")); - expect (s5.containsNonWhitespaceChars()); - expect (s5.containsOnly ("ordw23 ")); - expect (! String (" \n\r\t").containsNonWhitespaceChars()); - - expect (s5.matchesWildcard (L"wor*", false)); - expect (s5.matchesWildcard ("wOr*", true)); - expect (s5.matchesWildcard (L"*word3", true)); - expect (s5.matchesWildcard ("*word?", true)); - expect (s5.matchesWildcard (L"Word*3", true)); - expect (! s5.matchesWildcard (L"*34", true)); - expect (String ("xx**y").matchesWildcard ("*y", true)); - expect (String ("xx**y").matchesWildcard ("x*y", true)); - expect (String ("xx**y").matchesWildcard ("xx*y", true)); - expect (String ("xx**y").matchesWildcard ("xx*", true)); - expect (String ("xx?y").matchesWildcard ("x??y", true)); - expect (String ("xx?y").matchesWildcard ("xx?y", true)); - expect (! String ("xx?y").matchesWildcard ("xx?y?", true)); - expect (String ("xx?y").matchesWildcard ("xx??", true)); - - expectEquals (s5.fromFirstOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.fromFirstOccurrenceOf ("xword2", true, false), s5.substring (100)); - expectEquals (s5.fromFirstOccurrenceOf (L"word2", true, false), s5.substring (5)); - expectEquals (s5.fromFirstOccurrenceOf ("Word2", true, true), s5.substring (5)); - expectEquals (s5.fromFirstOccurrenceOf ("word2", false, false), s5.getLastCharacters (6)); - expectEquals (s5.fromFirstOccurrenceOf (L"Word2", false, true), s5.getLastCharacters (6)); - - expectEquals (s5.fromLastOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.fromLastOccurrenceOf (L"wordx", true, false), s5); - expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf (L"worD", true, true), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf ("word", false, false), s5.getLastCharacters (1)); - expectEquals (s5.fromLastOccurrenceOf (L"worD", false, true), s5.getLastCharacters (1)); - - expect (s5.upToFirstOccurrenceOf (String::empty, true, false).isEmpty()); - expectEquals (s5.upToFirstOccurrenceOf ("word4", true, false), s5); - expectEquals (s5.upToFirstOccurrenceOf (L"word2", true, false), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf ("Word2", true, true), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf (L"word2", false, false), s5.substring (0, 5)); - expectEquals (s5.upToFirstOccurrenceOf ("Word2", false, true), s5.substring (0, 5)); - - expectEquals (s5.upToLastOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.upToLastOccurrenceOf ("zword", true, false), s5); - expectEquals (s5.upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1)); - expectEquals (s5.dropLastCharacters(1).upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1)); - expectEquals (s5.upToLastOccurrenceOf ("Word", true, true), s5.dropLastCharacters (1)); - expectEquals (s5.upToLastOccurrenceOf ("word", false, false), s5.dropLastCharacters (5)); - expectEquals (s5.upToLastOccurrenceOf ("Word", false, true), s5.dropLastCharacters (5)); - - expectEquals (s5.replace ("word", L"xyz", false), String ("xyz xyz2 xyz3")); - expect (s5.replace (L"Word", "xyz", true) == "xyz xyz2 xyz3"); - expect (s5.dropLastCharacters (1).replace ("Word", String ("xyz"), true) == L"xyz xyz2 xyz"); - expect (s5.replace ("Word", "", true) == " 2 3"); - expectEquals (s5.replace ("Word2", L"xyz", true), String ("word xyz word3")); - expect (s5.replaceCharacter (L'w', 'x') != s5); - expectEquals (s5.replaceCharacter ('w', L'x').replaceCharacter ('x', 'w'), s5); - expect (s5.replaceCharacters ("wo", "xy") != s5); - expectEquals (s5.replaceCharacters ("wo", "xy").replaceCharacters ("xy", L"wo"), s5); - expectEquals (s5.retainCharacters ("1wordxya"), String ("wordwordword")); - expect (s5.retainCharacters (String::empty).isEmpty()); - expect (s5.removeCharacters ("1wordxya") == " 2 3"); - expectEquals (s5.removeCharacters (String::empty), s5); - expect (s5.initialSectionContainingOnly ("word") == L"word"); - expect (String ("word").initialSectionContainingOnly ("word") == L"word"); - expectEquals (s5.initialSectionNotContaining (String ("xyz ")), String ("word")); - expectEquals (s5.initialSectionNotContaining (String (";[:'/")), s5); - expect (! s5.isQuotedString()); - expect (s5.quoted().isQuotedString()); - expect (! s5.quoted().unquoted().isQuotedString()); - expect (! String ("x'").isQuotedString()); - expect (String ("'x").isQuotedString()); - - String s6 (" \t xyz \t\r\n"); - expectEquals (s6.trim(), String ("xyz")); - expect (s6.trim().trim() == "xyz"); - expectEquals (s5.trim(), s5); - expectEquals (s6.trimStart().trimEnd(), s6.trim()); - expectEquals (s6.trimStart().trimEnd(), s6.trimEnd().trimStart()); - expectEquals (s6.trimStart().trimStart().trimEnd().trimEnd(), s6.trimEnd().trimStart()); - expect (s6.trimStart() != s6.trimEnd()); - expectEquals (("\t\r\n " + s6 + "\t\n \r").trim(), s6.trim()); - expect (String::repeatedString ("xyz", 3) == L"xyzxyzxyz"); - } - - { - beginTest ("UTF conversions"); - - TestUTFConversion ::test (*this); - TestUTFConversion ::test (*this); - TestUTFConversion ::test (*this); - } - - { - beginTest ("StringArray"); - - StringArray s; - s.addTokens ("4,3,2,1,0", ";,", "x"); - expectEquals (s.size(), 5); - - expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0")); - s.remove (2); - expectEquals (s.joinIntoString ("--"), String ("4--3--1--0")); - expectEquals (s.joinIntoString (String::empty), String ("4310")); - s.clear(); - expectEquals (s.joinIntoString ("x"), String::empty); - - StringArray toks; - toks.addTokens ("x,,", ";,", ""); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("x--")); - toks.clear(); - - toks.addTokens (",x,", ";,", ""); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("-x-")); - toks.clear(); - - toks.addTokens ("x,'y,z',", ";,", "'"); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("x-'y,z'-")); - } - } -}; - -static StringTests stringUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/text/beast_String.h b/Subtrees/beast/modules/beast_core/text/beast_String.h deleted file mode 100644 index 3a4ba8df9a..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_String.h +++ /dev/null @@ -1,1346 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STRING_BEASTHEADER -#define BEAST_STRING_BEASTHEADER - -#include "beast_CharacterFunctions.h" - -#ifndef BEAST_STRING_UTF_TYPE - #define BEAST_STRING_UTF_TYPE 8 -#endif - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -#include "../memory/beast_Atomic.h" -#include "beast_CharPointer_UTF8.h" -#include "beast_CharPointer_UTF16.h" -#include "beast_CharPointer_UTF32.h" -#include "beast_CharPointer_ASCII.h" - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -class OutputStream; - -//============================================================================== -/** - The BEAST String class! - - Using a reference-counted internal representation, these strings are fast - and efficient, and there are methods to do just about any operation you'll ever - dream of. - - @see StringArray, StringPairArray -*/ -class BEAST_API String -{ -public: - //============================================================================== - /** Creates an empty string. - @see empty - */ - String() noexcept; - - /** Creates a copy of another string. */ - String (const String& other) noexcept; - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - String (String&& other) noexcept; - #endif - - /** Creates a string from a zero-terminated ascii text string. - - The string passed-in must not contain any characters with a value above 127, because - these can't be converted to unicode without knowing the original encoding that was - used to create the string. If you attempt to pass-in values above 127, you'll get an - assertion. - - To create strings with extended characters from UTF-8, you should explicitly call - String (CharPointer_UTF8 ("my utf8 string..")). It's *highly* recommended that you - use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent unicode strings in a way that isn't dependent - on the compiler, source code editor and platform. - */ - String (const char* text); - - /** Creates a string from a string of 8-bit ascii characters. - - The string passed-in must not contain any characters with a value above 127, because - these can't be converted to unicode without knowing the original encoding that was - used to create the string. If you attempt to pass-in values above 127, you'll get an - assertion. - - To create strings with extended characters from UTF-8, you should explicitly call - String (CharPointer_UTF8 ("my utf8 string..")). It's *highly* recommended that you - use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent unicode strings in a way that isn't dependent - on the compiler, source code editor and platform. - - This will use up the the first maxChars characters of the string (or less if the string - is actually shorter). - */ - String (const char* text, size_t maxChars); - - /** Creates a string from a whcar_t character string. - Depending on the platform, this may be treated as either UTF-32 or UTF-16. - */ - String (const wchar_t* text); - - /** Creates a string from a whcar_t character string. - Depending on the platform, this may be treated as either UTF-32 or UTF-16. - */ - String (const wchar_t* text, size_t maxChars); - - //============================================================================== - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 text); - - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 text, size_t maxChars); - - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 start, const CharPointer_UTF8 end); - - //============================================================================== - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 text); - - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 text, size_t maxChars); - - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 start, const CharPointer_UTF16 end); - - //============================================================================== - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 text); - - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 text, size_t maxChars); - - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 start, const CharPointer_UTF32 end); - - //============================================================================== - /** Creates a string from an ASCII character string */ - String (const CharPointer_ASCII text); - - /** Creates a string from a UTF-8 encoded std::string. */ - String (const std::string&); - - //============================================================================== - /** Creates a string from a single character. */ - static String charToString (beast_wchar character); - - /** Destructor. */ - ~String() noexcept; - - //============================================================================== - /** This is an empty string that can be used whenever one is needed. - - It's better to use this than String() because it explains what's going on - and is more efficient. - */ - static const String empty; - - /** This is the character encoding type used internally to store the string. - - By setting the value of BEAST_STRING_UTF_TYPE to 8, 16, or 32, you can change the - internal storage format of the String class. UTF-8 uses the least space (if your strings - contain few extended characters), but call operator[] involves iterating the string to find - the required index. UTF-32 provides instant random access to its characters, but uses 4 bytes - per character to store them. UTF-16 uses more space than UTF-8 and is also slow to index, - but is the native wchar_t format used in Windows. - - It doesn't matter too much which format you pick, because the toUTF8(), toUTF16() and - toUTF32() methods let you access the string's content in any of the other formats. - */ - #if (BEAST_STRING_UTF_TYPE == 32) - typedef CharPointer_UTF32 CharPointerType; - #elif (BEAST_STRING_UTF_TYPE == 16) - typedef CharPointer_UTF16 CharPointerType; - #elif (BEAST_STRING_UTF_TYPE == 8) - typedef CharPointer_UTF8 CharPointerType; - #else - #error "You must set the value of BEAST_STRING_UTF_TYPE to be either 8, 16, or 32!" - #endif - - //============================================================================== - /** Generates a probably-unique 32-bit hashcode from this string. */ - int hashCode() const noexcept; - - /** Generates a probably-unique 64-bit hashcode from this string. */ - int64 hashCode64() const noexcept; - - /** Returns the number of characters in the string. */ - int length() const noexcept; - - //============================================================================== - // Assignment and concatenation operators.. - - /** Replaces this string's contents with another string. */ - String& operator= (const String& other) noexcept; - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - String& operator= (String&& other) noexcept; - #endif - - /** Appends another string at the end of this one. */ - String& operator+= (const String& stringToAppend); - /** Appends another string at the end of this one. */ - String& operator+= (const char* textToAppend); - /** Appends another string at the end of this one. */ - String& operator+= (const wchar_t* textToAppend); - /** Appends a decimal number at the end of this string. */ - String& operator+= (int numberToAppend); - /** Appends a character at the end of this string. */ - String& operator+= (char characterToAppend); - /** Appends a character at the end of this string. */ - String& operator+= (wchar_t characterToAppend); - #if ! BEAST_NATIVE_WCHAR_IS_UTF32 - /** Appends a character at the end of this string. */ - String& operator+= (beast_wchar characterToAppend); - #endif - - /** Appends a string to the end of this one. - - @param textToAppend the string to add - @param maxCharsToTake the maximum number of characters to take from the string passed in - */ - void append (const String& textToAppend, size_t maxCharsToTake); - - /** Appends a string to the end of this one. - - @param textToAppend the string to add - @param maxCharsToTake the maximum number of characters to take from the string passed in - */ - template - void appendCharPointer (const CharPointer textToAppend, size_t maxCharsToTake) - { - if (textToAppend.getAddress() != nullptr) - { - size_t extraBytesNeeded = 0; - size_t numChars = 0; - - for (CharPointer t (textToAppend); numChars < maxCharsToTake && ! t.isEmpty();) - { - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - ++numChars; - } - - if (numChars > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)).writeWithCharLimit (textToAppend, (int) (numChars + 1)); - } - } - } - - /** Appends a string to the end of this one. */ - template - void appendCharPointer (const CharPointer textToAppend) - { - if (textToAppend.getAddress() != nullptr) - { - size_t extraBytesNeeded = 0; - - for (CharPointer t (textToAppend); ! t.isEmpty();) - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - if (extraBytesNeeded > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)).writeAll (textToAppend); - } - } - } - - //============================================================================== - // Comparison methods.. - - /** Returns true if the string contains no characters. - Note that there's also an isNotEmpty() method to help write readable code. - @see containsNonWhitespaceChars() - */ - inline bool isEmpty() const noexcept { return text[0] == 0; } - - /** Returns true if the string contains at least one character. - Note that there's also an isEmpty() method to help write readable code. - @see containsNonWhitespaceChars() - */ - inline bool isNotEmpty() const noexcept { return text[0] != 0; } - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const String& other) const noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const wchar_t* other) const noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const char* other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const String& other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const char* other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const wchar_t* other) const noexcept; - - /** Case-insensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compareIgnoreCase (const String& other) const noexcept; - - /** Lexicographic comparison with another string. - - The comparison used here is case-insensitive and ignores leading non-alphanumeric - characters, making it good for sorting human-readable strings. - - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compareLexicographically (const String& other) const noexcept; - - /** Tests whether the string begins with another string. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool startsWith (const String& text) const noexcept; - - /** Tests whether the string begins with a particular character. - If the character is 0, this will always return false. - Uses a case-sensitive comparison. - */ - bool startsWithChar (beast_wchar character) const noexcept; - - /** Tests whether the string begins with another string. - If the parameter is an empty string, this will always return true. - Uses a case-insensitive comparison. - */ - bool startsWithIgnoreCase (const String& text) const noexcept; - - /** Tests whether the string ends with another string. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool endsWith (const String& text) const noexcept; - - /** Tests whether the string ends with a particular character. - If the character is 0, this will always return false. - Uses a case-sensitive comparison. - */ - bool endsWithChar (beast_wchar character) const noexcept; - - /** Tests whether the string ends with another string. - If the parameter is an empty string, this will always return true. - Uses a case-insensitive comparison. - */ - bool endsWithIgnoreCase (const String& text) const noexcept; - - /** Tests whether the string contains another substring. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool contains (const String& text) const noexcept; - - /** Tests whether the string contains a particular character. - Uses a case-sensitive comparison. - */ - bool containsChar (beast_wchar character) const noexcept; - - /** Tests whether the string contains another substring. - Uses a case-insensitive comparison. - */ - bool containsIgnoreCase (const String& text) const noexcept; - - /** Tests whether the string contains another substring as a distinct word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWord, containsWholeWordIgnoreCase - */ - bool containsWholeWord (const String& wordToLookFor) const noexcept; - - /** Tests whether the string contains another substring as a distinct word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWordIgnoreCase, containsWholeWord - */ - bool containsWholeWordIgnoreCase (const String& wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distinct word. - - @returns if the string contains this word, surrounded by non-alphanumeric characters, - then this will return the index of the start of the substring. If it isn't - found, then it will return -1 - @see indexOfWholeWordIgnoreCase, containsWholeWord - */ - int indexOfWholeWord (const String& wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distinct word. - - @returns if the string contains this word, surrounded by non-alphanumeric characters, - then this will return the index of the start of the substring. If it isn't - found, then it will return -1 - @see indexOfWholeWord, containsWholeWordIgnoreCase - */ - int indexOfWholeWordIgnoreCase (const String& wordToLookFor) const noexcept; - - /** Looks for any of a set of characters in the string. - Uses a case-sensitive comparison. - - @returns true if the string contains any of the characters from - the string that is passed in. - */ - bool containsAnyOf (const String& charactersItMightContain) const noexcept; - - /** Looks for a set of characters in the string. - Uses a case-sensitive comparison. - - @returns Returns false if any of the characters in this string do not occur in - the parameter string. If this string is empty, the return value will - always be true. - */ - bool containsOnly (const String& charactersItMightContain) const noexcept; - - /** Returns true if this string contains any non-whitespace characters. - - This will return false if the string contains only whitespace characters, or - if it's empty. - - It is equivalent to calling "myString.trim().isNotEmpty()". - */ - bool containsNonWhitespaceChars() const noexcept; - - /** Returns true if the string matches this simple wildcard expression. - - So for example String ("abcdef").matchesWildcard ("*DEF", true) would return true. - - This isn't a full-blown regex though! The only wildcard characters supported - are "*" and "?". It's mainly intended for filename pattern matching. - */ - bool matchesWildcard (const String& wildcard, bool ignoreCase) const noexcept; - - //============================================================================== - // Substring location methods.. - - /** Searches for a character inside this string. - Uses a case-sensitive comparison. - @returns the index of the first occurrence of the character in this - string, or -1 if it's not found. - */ - int indexOfChar (beast_wchar characterToLookFor) const noexcept; - - /** Searches for a character inside this string. - Uses a case-sensitive comparison. - @param startIndex the index from which the search should proceed - @param characterToLookFor the character to look for - @returns the index of the first occurrence of the character in this - string, or -1 if it's not found. - */ - int indexOfChar (int startIndex, beast_wchar characterToLookFor) const noexcept; - - /** Returns the index of the first character that matches one of the characters - passed-in to this method. - - This scans the string, beginning from the startIndex supplied, and if it finds - a character that appears in the string charactersToLookFor, it returns its index. - - If none of these characters are found, it returns -1. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see indexOfChar, lastIndexOfAnyOf - */ - int indexOfAnyOf (const String& charactersToLookFor, - int startIndex = 0, - bool ignoreCase = false) const noexcept; - - /** Searches for a substring within this string. - Uses a case-sensitive comparison. - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return 0. - */ - int indexOf (const String& textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-sensitive comparison. - @param startIndex the index from which the search should proceed - @param textToLookFor the string to search for - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return -1. - */ - int indexOf (int startIndex, const String& textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-insensitive comparison. - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return 0. - */ - int indexOfIgnoreCase (const String& textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-insensitive comparison. - @param startIndex the index from which the search should proceed - @param textToLookFor the string to search for - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return -1. - */ - int indexOfIgnoreCase (int startIndex, const String& textToLookFor) const noexcept; - - /** Searches for a character inside this string (working backwards from the end of the string). - Uses a case-sensitive comparison. - @returns the index of the last occurrence of the character in this string, or -1 if it's not found. - */ - int lastIndexOfChar (beast_wchar character) const noexcept; - - /** Searches for a substring inside this string (working backwards from the end of the string). - Uses a case-sensitive comparison. - @returns the index of the start of the last occurrence of the substring within this string, - or -1 if it's not found. If textToLookFor is an empty string, this will always return -1. - */ - int lastIndexOf (const String& textToLookFor) const noexcept; - - /** Searches for a substring inside this string (working backwards from the end of the string). - Uses a case-insensitive comparison. - @returns the index of the start of the last occurrence of the substring within this string, or -1 - if it's not found. If textToLookFor is an empty string, this will always return -1. - */ - int lastIndexOfIgnoreCase (const String& textToLookFor) const noexcept; - - /** Returns the index of the last character in this string that matches one of the - characters passed-in to this method. - - This scans the string backwards, starting from its end, and if it finds - a character that appears in the string charactersToLookFor, it returns its index. - - If none of these characters are found, it returns -1. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see lastIndexOf, indexOfAnyOf - */ - int lastIndexOfAnyOf (const String& charactersToLookFor, - bool ignoreCase = false) const noexcept; - - - //============================================================================== - // Substring extraction and manipulation methods.. - - /** Returns the character at this index in the string. - In a release build, no checks are made to see if the index is within a valid range, so be - careful! In a debug build, the index is checked and an assertion fires if it's out-of-range. - - Also beware that depending on the encoding format that the string is using internally, this - method may execute in either O(1) or O(n) time, so be careful when using it in your algorithms. - If you're scanning through a string to inspect its characters, you should never use this operator - for random access, it's far more efficient to call getCharPointer() to return a pointer, and - then to use that to iterate the string. - @see getCharPointer - */ - beast_wchar operator[] (int index) const noexcept; - - /** Returns the final character of the string. - If the string is empty this will return 0. - */ - beast_wchar getLastCharacter() const noexcept; - - //============================================================================== - /** Returns a subsection of the string. - - If the range specified is beyond the limits of the string, as much as - possible is returned. - - @param startIndex the index of the start of the substring needed - @param endIndex all characters from startIndex up to (but not including) - this index are returned - @see fromFirstOccurrenceOf, dropLastCharacters, getLastCharacters, upToFirstOccurrenceOf - */ - String substring (int startIndex, int endIndex) const; - - /** Returns a section of the string, starting from a given position. - - @param startIndex the first character to include. If this is beyond the end - of the string, an empty string is returned. If it is zero or - less, the whole string is returned. - @returns the substring from startIndex up to the end of the string - @see dropLastCharacters, getLastCharacters, fromFirstOccurrenceOf, upToFirstOccurrenceOf, fromLastOccurrenceOf - */ - String substring (int startIndex) const; - - /** Returns a version of this string with a number of characters removed - from the end. - - @param numberToDrop the number of characters to drop from the end of the - string. If this is greater than the length of the string, - an empty string will be returned. If zero or less, the - original string will be returned. - @see substring, fromFirstOccurrenceOf, upToFirstOccurrenceOf, fromLastOccurrenceOf, getLastCharacter - */ - String dropLastCharacters (int numberToDrop) const; - - /** Returns a number of characters from the end of the string. - - This returns the last numCharacters characters from the end of the string. If the - string is shorter than numCharacters, the whole string is returned. - - @see substring, dropLastCharacters, getLastCharacter - */ - String getLastCharacters (int numCharacters) const; - - //============================================================================== - /** Returns a section of the string starting from a given substring. - - This will search for the first occurrence of the given substring, and - return the section of the string starting from the point where this is - found (optionally not including the substring itself). - - e.g. for the string "123456", fromFirstOccurrenceOf ("34", true) would return "3456", and - fromFirstOccurrenceOf ("34", false) would return "56". - - If the substring isn't found, the method will return an empty string. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see upToFirstOccurrenceOf, fromLastOccurrenceOf - */ - String fromFirstOccurrenceOf (const String& substringToStartFrom, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns a section of the string starting from the last occurrence of a given substring. - - Similar to fromFirstOccurrenceOf(), but using the last occurrence of the substring, and - unlike fromFirstOccurrenceOf(), if the substring isn't found, this method will - return the whole of the original string. - - @see fromFirstOccurrenceOf, upToLastOccurrenceOf - */ - String fromLastOccurrenceOf (const String& substringToFind, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns the start of this string, up to the first occurrence of a substring. - - This will search for the first occurrence of a given substring, and then - return a copy of the string, up to the position of this substring, - optionally including or excluding the substring itself in the result. - - e.g. for the string "123456", upTo ("34", false) would return "12", and - upTo ("34", true) would return "1234". - - If the substring isn't found, this will return the whole of the original string. - - @see upToLastOccurrenceOf, fromFirstOccurrenceOf - */ - String upToFirstOccurrenceOf (const String& substringToEndWith, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns the start of this string, up to the last occurrence of a substring. - - Similar to upToFirstOccurrenceOf(), but this finds the last occurrence rather than the first. - If the substring isn't found, this will return the whole of the original string. - - @see upToFirstOccurrenceOf, fromFirstOccurrenceOf - */ - String upToLastOccurrenceOf (const String& substringToFind, - bool includeSubStringInResult, - bool ignoreCase) const; - - //============================================================================== - /** Returns a copy of this string with any whitespace characters removed from the start and end. */ - String trim() const; - - /** Returns a copy of this string with any whitespace characters removed from the start. */ - String trimStart() const; - - /** Returns a copy of this string with any whitespace characters removed from the end. */ - String trimEnd() const; - - /** Returns a copy of this string, having removed a specified set of characters from its start. - Characters are removed from the start of the string until it finds one that is not in the - specified set, and then it stops. - @param charactersToTrim the set of characters to remove. - @see trim, trimStart, trimCharactersAtEnd - */ - String trimCharactersAtStart (const String& charactersToTrim) const; - - /** Returns a copy of this string, having removed a specified set of characters from its end. - Characters are removed from the end of the string until it finds one that is not in the - specified set, and then it stops. - @param charactersToTrim the set of characters to remove. - @see trim, trimEnd, trimCharactersAtStart - */ - String trimCharactersAtEnd (const String& charactersToTrim) const; - - //============================================================================== - /** Returns an upper-case version of this string. */ - String toUpperCase() const; - - /** Returns an lower-case version of this string. */ - String toLowerCase() const; - - //============================================================================== - /** Replaces a sub-section of the string with another string. - - This will return a copy of this string, with a set of characters - from startIndex to startIndex + numCharsToReplace removed, and with - a new string inserted in their place. - - Note that this is a const method, and won't alter the string itself. - - @param startIndex the first character to remove. If this is beyond the bounds of the string, - it will be constrained to a valid range. - @param numCharactersToReplace the number of characters to remove. If zero or less, no - characters will be taken out. - @param stringToInsert the new string to insert at startIndex after the characters have been - removed. - */ - String replaceSection (int startIndex, - int numCharactersToReplace, - const String& stringToInsert) const; - - /** Replaces all occurrences of a substring with another string. - - Returns a copy of this string, with any occurrences of stringToReplace - swapped for stringToInsertInstead. - - Note that this is a const method, and won't alter the string itself. - */ - String replace (const String& stringToReplace, - const String& stringToInsertInstead, - bool ignoreCase = false) const; - - /** Returns a string with all occurrences of a character replaced with a different one. */ - String replaceCharacter (beast_wchar characterToReplace, - beast_wchar characterToInsertInstead) const; - - /** Replaces a set of characters with another set. - - Returns a string in which each character from charactersToReplace has been replaced - by the character at the equivalent position in newCharacters (so the two strings - passed in must be the same length). - - e.g. replaceCharacters ("abc", "def") replaces 'a' with 'd', 'b' with 'e', etc. - - Note that this is a const method, and won't affect the string itself. - */ - String replaceCharacters (const String& charactersToReplace, - const String& charactersToInsertInstead) const; - - /** Returns a version of this string that only retains a fixed set of characters. - - This will return a copy of this string, omitting any characters which are not - found in the string passed-in. - - e.g. for "1122334455", retainCharacters ("432") would return "223344" - - Note that this is a const method, and won't alter the string itself. - */ - String retainCharacters (const String& charactersToRetain) const; - - /** Returns a version of this string with a set of characters removed. - - This will return a copy of this string, omitting any characters which are - found in the string passed-in. - - e.g. for "1122334455", removeCharacters ("432") would return "1155" - - Note that this is a const method, and won't alter the string itself. - */ - String removeCharacters (const String& charactersToRemove) const; - - /** Returns a section from the start of the string that only contains a certain set of characters. - - This returns the leftmost section of the string, up to (and not including) the - first character that doesn't appear in the string passed in. - */ - String initialSectionContainingOnly (const String& permittedCharacters) const; - - /** Returns a section from the start of the string that only contains a certain set of characters. - - This returns the leftmost section of the string, up to (and not including) the - first character that occurs in the string passed in. (If none of the specified - characters are found in the string, the return value will just be the original string). - */ - String initialSectionNotContaining (const String& charactersToStopAt) const; - - //============================================================================== - /** Checks whether the string might be in quotation marks. - - @returns true if the string begins with a quote character (either a double or single quote). - It is also true if there is whitespace before the quote, but it doesn't check the end of the string. - @see unquoted, quoted - */ - bool isQuotedString() const; - - /** Removes quotation marks from around the string, (if there are any). - - Returns a copy of this string with any quotes removed from its ends. Quotes that aren't - at the ends of the string are not affected. If there aren't any quotes, the original string - is returned. - - Note that this is a const method, and won't alter the string itself. - - @see isQuotedString, quoted - */ - String unquoted() const; - - /** Adds quotation marks around a string. - - This will return a copy of the string with a quote at the start and end, (but won't - add the quote if there's already one there, so it's safe to call this on strings that - may already have quotes around them). - - Note that this is a const method, and won't alter the string itself. - - @param quoteCharacter the character to add at the start and end - @see isQuotedString, unquoted - */ - String quoted (beast_wchar quoteCharacter = '"') const; - - - //============================================================================== - /** Creates a string which is a version of a string repeated and joined together. - - @param stringToRepeat the string to repeat - @param numberOfTimesToRepeat how many times to repeat it - */ - static String repeatedString (const String& stringToRepeat, - int numberOfTimesToRepeat); - - /** Returns a copy of this string with the specified character repeatedly added to its - beginning until the total length is at least the minimum length specified. - */ - String paddedLeft (beast_wchar padCharacter, int minimumLength) const; - - /** Returns a copy of this string with the specified character repeatedly added to its - end until the total length is at least the minimum length specified. - */ - String paddedRight (beast_wchar padCharacter, int minimumLength) const; - - /** Creates a string from data in an unknown format. - - This looks at some binary data and tries to guess whether it's Unicode - or 8-bit characters, then returns a string that represents it correctly. - - Should be able to handle Unicode endianness correctly, by looking at - the first two bytes. - */ - static String createStringFromData (const void* data, int size); - - /** Creates a String from a printf-style parameter list. - - I don't like this method. I don't use it myself, and I recommend avoiding it and - using the operator<< methods or pretty much anything else instead. It's only provided - here because of the popular unrest that was stirred-up when I tried to remove it... - - If you're really determined to use it, at least make sure that you never, ever, - pass any String objects to it as parameters. And bear in mind that internally, depending - on the platform, it may be using wchar_t or char character types, so that even string - literals can't be safely used as parameters if you're writing portable code. - */ - static String formatted (const String formatString, ... ); - - //============================================================================== - // Numeric conversions.. - - /** Creates a string containing this signed 32-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (int decimalInteger); - - /** Creates a string containing this unsigned 32-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (unsigned int decimalInteger); - - /** Creates a string containing this signed 16-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (short decimalInteger); - - /** Creates a string containing this unsigned 16-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (unsigned short decimalInteger); - - /** Creates a string containing this signed 64-bit integer as a decimal number. - @see getLargeIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (int64 largeIntegerValue); - - /** Creates a string containing this unsigned 64-bit integer as a decimal number. - @see getLargeIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (uint64 largeIntegerValue); - - /** Creates a string representing this floating-point number. - @param floatValue the value to convert to a string - @see getDoubleValue, getIntValue - */ - explicit String (float floatValue); - - /** Creates a string representing this floating-point number. - @param doubleValue the value to convert to a string - @see getFloatValue, getIntValue - */ - explicit String (double doubleValue); - - /** Creates a string representing this floating-point number. - @param floatValue the value to convert to a string - @param numberOfDecimalPlaces if this is > 0, it will format the number using that many - decimal places, and will not use exponent notation. If 0 or - less, it will use exponent notation if necessary. - @see getDoubleValue, getIntValue - */ - String (float floatValue, int numberOfDecimalPlaces); - - /** Creates a string representing this floating-point number. - @param doubleValue the value to convert to a string - @param numberOfDecimalPlaces if this is > 0, it will format the number using that many - decimal places, and will not use exponent notation. If 0 or - less, it will use exponent notation if necessary. - @see getFloatValue, getIntValue - */ - String (double doubleValue, int numberOfDecimalPlaces); - - /** Reads the value of the string as a decimal number (up to 32 bits in size). - - @returns the value of the string as a 32 bit signed base-10 integer. - @see getTrailingIntValue, getHexValue32, getHexValue64 - */ - int getIntValue() const noexcept; - - /** Reads the value of the string as a decimal number (up to 64 bits in size). - - @returns the value of the string as a 64 bit signed base-10 integer. - */ - int64 getLargeIntValue() const noexcept; - - /** Parses a decimal number from the end of the string. - - This will look for a value at the end of the string. - e.g. for "321 xyz654" it will return 654; for "2 3 4" it'll return 4. - - Negative numbers are not handled, so "xyz-5" returns 5. - - @see getIntValue - */ - int getTrailingIntValue() const noexcept; - - /** Parses this string as a floating point number. - - @returns the value of the string as a 32-bit floating point value. - @see getDoubleValue - */ - float getFloatValue() const noexcept; - - /** Parses this string as a floating point number. - - @returns the value of the string as a 64-bit floating point value. - @see getFloatValue - */ - double getDoubleValue() const noexcept; - - /** Parses the string as a hexadecimal number. - - Non-hexadecimal characters in the string are ignored. - - If the string contains too many characters, then the lowest significant - digits are returned, e.g. "ffff12345678" would produce 0x12345678. - - @returns a 32-bit number which is the value of the string in hex. - */ - int getHexValue32() const noexcept; - - /** Parses the string as a hexadecimal number. - - Non-hexadecimal characters in the string are ignored. - - If the string contains too many characters, then the lowest significant - digits are returned, e.g. "ffff1234567812345678" would produce 0x1234567812345678. - - @returns a 64-bit number which is the value of the string in hex. - */ - int64 getHexValue64() const noexcept; - - /** Creates a string representing this 32-bit value in hexadecimal. */ - static String toHexString (int number); - - /** Creates a string representing this 64-bit value in hexadecimal. */ - static String toHexString (int64 number); - - /** Creates a string representing this 16-bit value in hexadecimal. */ - static String toHexString (short number); - - /** Creates a string containing a hex dump of a block of binary data. - - @param data the binary data to use as input - @param size how many bytes of data to use - @param groupSize how many bytes are grouped together before inserting a - space into the output. e.g. group size 0 has no spaces, - group size 1 looks like: "be a1 c2 ff", group size 2 looks - like "bea1 c2ff". - */ - static String toHexString (const void* data, int size, int groupSize = 1); - - //============================================================================== - /** Returns the character pointer currently being used to store this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - */ - inline CharPointerType getCharPointer() const noexcept { return text; } - - /** Returns a pointer to a UTF-8 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @see toRawUTF8, getCharPointer, toUTF16, toUTF32 - */ - CharPointer_UTF8 toUTF8() const; - - /** Returns a pointer to a UTF-8 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @see getCharPointer, toUTF8, toUTF16, toUTF32 - */ - const char* toRawUTF8() const; - - /** Returns a pointer to a UTF-16 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-16, you can call - CharPointer_UTF16::getBytesRequiredFor (myString.getCharPointer()) - - @see getCharPointer, toUTF8, toUTF32 - */ - CharPointer_UTF16 toUTF16() const; - - /** Returns a pointer to a UTF-32 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - @see getCharPointer, toUTF8, toUTF16 - */ - CharPointer_UTF32 toUTF32() const; - - /** Returns a pointer to a wchar_t version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - Bear in mind that the wchar_t type is different on different platforms, so on - Windows, this will be equivalent to calling toUTF16(), on unix it'll be the same - as calling toUTF32(), etc. - - @see getCharPointer, toUTF8, toUTF16, toUTF32 - */ - const wchar_t* toWideCharPointer() const; - - /** */ - std::string toStdString() const; - - //============================================================================== - /** Creates a String from a UTF-8 encoded buffer. - If the size is < 0, it'll keep reading until it hits a zero. - */ - static String fromUTF8 (const char* utf8buffer, int bufferSizeBytes = -1); - - /** Returns the number of bytes required to represent this string as UTF8. - The number returned does NOT include the trailing zero. - @see toUTF8, copyToUTF8 - */ - size_t getNumBytesAsUTF8() const noexcept; - - //============================================================================== - /** Copies the string to a buffer as UTF-8 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF8::writeWithDestByteLimit - */ - size_t copyToUTF8 (CharPointer_UTF8::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - /** Copies the string to a buffer as UTF-16 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-16, you can call - CharPointer_UTF16::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF16::writeWithDestByteLimit - */ - size_t copyToUTF16 (CharPointer_UTF16::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - /** Copies the string to a buffer as UTF-32 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-32, you can call - CharPointer_UTF32::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF32::writeWithDestByteLimit - */ - size_t copyToUTF32 (CharPointer_UTF32::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - //============================================================================== - /** Increases the string's internally allocated storage. - - Although the string's contents won't be affected by this call, it will - increase the amount of memory allocated internally for the string to grow into. - - If you're about to make a large number of calls to methods such - as += or <<, it's more efficient to preallocate enough extra space - beforehand, so that these methods won't have to keep resizing the string - to append the extra characters. - - @param numBytesNeeded the number of bytes to allocate storage for. If this - value is less than the currently allocated size, it will - have no effect. - */ - void preallocateBytes (size_t numBytesNeeded); - - /** Swaps the contents of this string with another one. - This is a very fast operation, as no allocation or copying needs to be done. - */ - void swapWith (String& other) noexcept; - - //============================================================================== - #if BEAST_MAC || BEAST_IOS || DOXYGEN - /** MAC ONLY - Creates a String from an OSX CFString. */ - static String fromCFString (CFStringRef cfString); - - /** MAC ONLY - Converts this string to a CFString. - Remember that you must use CFRelease() to free the returned string when you're - finished with it. - */ - CFStringRef toCFString() const; - - /** MAC ONLY - Returns a copy of this string in which any decomposed unicode characters have - been converted to their precomposed equivalents. */ - String convertToPrecomposedUnicode() const; - #endif - -private: - //============================================================================== - CharPointerType text; - - //============================================================================== - struct PreallocationBytes - { - explicit PreallocationBytes (size_t); - size_t numBytes; - }; - - explicit String (const PreallocationBytes&); // This constructor preallocates a certain amount of memory - void appendFixedLength (const char* text, int numExtraChars); - size_t getByteOffsetOfEnd() const noexcept; - BEAST_DEPRECATED (String (const String& stringToCopy, size_t charsToAllocate)); - - // This private cast operator should prevent strings being accidentally cast - // to bools (this is possible because the compiler can add an implicit cast - // via a const char*) - operator bool() const noexcept { return false; } -}; - -//============================================================================== -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (const char* string1, const String& string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (const wchar_t* string1, const String& string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (char string1, const String& string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (wchar_t string1, const String& string2); -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (beast_wchar string1, const String& string2); -#endif - -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, const String& string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, const char* string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, const wchar_t* string2); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, char characterToAppend); -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, wchar_t characterToAppend); -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -/** Concatenates two strings. */ -BEAST_API String BEAST_CALLTYPE operator+ (String string1, beast_wchar characterToAppend); -#endif - -//============================================================================== -/** Appends a character at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, char characterToAppend); -/** Appends a character at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, wchar_t characterToAppend); -#if ! BEAST_NATIVE_WCHAR_IS_UTF32 -/** Appends a character at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, beast_wchar characterToAppend); -#endif - -/** Appends a string to the end of the first one. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, const char* string2); -/** Appends a string to the end of the first one. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, const wchar_t* string2); -/** Appends a string to the end of the first one. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, const String& string2); - -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, short number); -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, int number); -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, long number); -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, int64 number); -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, float number); -/** Appends a decimal number at the end of a string. */ -BEAST_API String& BEAST_CALLTYPE operator<< (String& string1, double number); - -//============================================================================== -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const char* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const wchar_t* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const CharPointer_UTF8 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const CharPointer_UTF16 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator== (const String& string1, const CharPointer_UTF32 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const char* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const wchar_t* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const CharPointer_UTF8 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const CharPointer_UTF16 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator!= (const String& string1, const CharPointer_UTF32 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator> (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator< (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator>= (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -BEAST_API bool BEAST_CALLTYPE operator<= (const String& string1, const String& string2) noexcept; - -//============================================================================== -/** This operator allows you to write a beast String directly to std output streams. - This is handy for writing strings to std::cout, std::cerr, etc. -*/ -template -std::basic_ostream & BEAST_CALLTYPE operator<< (std::basic_ostream & stream, const String& stringToWrite) -{ - return stream << stringToWrite.toRawUTF8(); -} - -/** This operator allows you to write a beast String directly to std output streams. - This is handy for writing strings to std::wcout, std::wcerr, etc. -*/ -template -std::basic_ostream & BEAST_CALLTYPE operator<< (std::basic_ostream & stream, const String& stringToWrite) -{ - return stream << stringToWrite.toWideCharPointer(); -} - -/** Writes a string to an OutputStream as UTF8. */ -BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const String& stringToWrite); - - -#endif // BEAST_STRING_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringArray.cpp b/Subtrees/beast/modules/beast_core/text/beast_StringArray.cpp deleted file mode 100644 index 8df29ea4f0..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringArray.cpp +++ /dev/null @@ -1,505 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -StringArray::StringArray() noexcept -{ -} - -StringArray::StringArray (const StringArray& other) - : strings (other.strings) -{ -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -StringArray::StringArray (StringArray&& other) noexcept - : strings (static_cast &&> (other.strings)) -{ -} -#endif - -StringArray::StringArray (const String& firstValue) -{ - strings.add (firstValue); -} - -namespace StringArrayHelpers -{ - template - void addArray (Array& dest, const CharType* const* strings) - { - if (strings != nullptr) - while (*strings != nullptr) - dest.add (*strings++); - } - - template - void addArray (Array& dest, const Type* const strings, const int numberOfStrings) - { - for (int i = 0; i < numberOfStrings; ++i) - dest.add (strings [i]); - } -} - -StringArray::StringArray (const String* initialStrings, int numberOfStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings); -} - -StringArray::StringArray (const char* const* const initialStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings); -} - -StringArray::StringArray (const char* const* const initialStrings, const int numberOfStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings); -} - -StringArray::StringArray (const wchar_t* const* const initialStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings); -} - -StringArray::StringArray (const wchar_t* const* const initialStrings, const int numberOfStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings); -} - -StringArray& StringArray::operator= (const StringArray& other) -{ - strings = other.strings; - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -StringArray& StringArray::operator= (StringArray&& other) noexcept -{ - strings = static_cast &&> (other.strings); - return *this; -} -#endif - -StringArray::~StringArray() -{ -} - -bool StringArray::operator== (const StringArray& other) const noexcept -{ - if (other.size() != size()) - return false; - - for (int i = size(); --i >= 0;) - if (other.strings.getReference(i) != strings.getReference(i)) - return false; - - return true; -} - -bool StringArray::operator!= (const StringArray& other) const noexcept -{ - return ! operator== (other); -} - -void StringArray::swapWith (StringArray& other) noexcept -{ - strings.swapWithArray (other.strings); -} - -void StringArray::clear() -{ - strings.clear(); -} - -const String& StringArray::operator[] (const int index) const noexcept -{ - if (isPositiveAndBelow (index, strings.size())) - return strings.getReference (index); - - return String::empty; -} - -String& StringArray::getReference (const int index) noexcept -{ - bassert (isPositiveAndBelow (index, strings.size())); - return strings.getReference (index); -} - -void StringArray::add (const String& newString) -{ - strings.add (newString); -} - -void StringArray::insert (const int index, const String& newString) -{ - strings.insert (index, newString); -} - -void StringArray::addIfNotAlreadyThere (const String& newString, const bool ignoreCase) -{ - if (! contains (newString, ignoreCase)) - add (newString); -} - -void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd) -{ - if (startIndex < 0) - { - bassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > otherArray.size()) - numElementsToAdd = otherArray.size() - startIndex; - - while (--numElementsToAdd >= 0) - strings.add (otherArray.strings.getReference (startIndex++)); -} - -void StringArray::set (const int index, const String& newString) -{ - strings.set (index, newString); -} - -bool StringArray::contains (const String& stringToLookFor, const bool ignoreCase) const -{ - if (ignoreCase) - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).equalsIgnoreCase (stringToLookFor)) - return true; - } - else - { - for (int i = size(); --i >= 0;) - if (stringToLookFor == strings.getReference(i)) - return true; - } - - return false; -} - -int StringArray::indexOf (const String& stringToLookFor, const bool ignoreCase, int i) const -{ - if (i < 0) - i = 0; - - const int numElements = size(); - - if (ignoreCase) - { - while (i < numElements) - { - if (strings.getReference(i).equalsIgnoreCase (stringToLookFor)) - return i; - - ++i; - } - } - else - { - while (i < numElements) - { - if (stringToLookFor == strings.getReference (i)) - return i; - - ++i; - } - } - - return -1; -} - -//============================================================================== -void StringArray::remove (const int index) -{ - strings.remove (index); -} - -void StringArray::removeString (const String& stringToRemove, - const bool ignoreCase) -{ - if (ignoreCase) - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).equalsIgnoreCase (stringToRemove)) - strings.remove (i); - } - else - { - for (int i = size(); --i >= 0;) - if (stringToRemove == strings.getReference (i)) - strings.remove (i); - } -} - -void StringArray::removeRange (int startIndex, int numberToRemove) -{ - strings.removeRange (startIndex, numberToRemove); -} - -//============================================================================== -void StringArray::removeEmptyStrings (const bool removeWhitespaceStrings) -{ - if (removeWhitespaceStrings) - { - for (int i = size(); --i >= 0;) - if (! strings.getReference(i).containsNonWhitespaceChars()) - strings.remove (i); - } - else - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).isEmpty()) - strings.remove (i); - } -} - -void StringArray::trim() -{ - for (int i = size(); --i >= 0;) - { - String& s = strings.getReference(i); - s = s.trim(); - } -} - -//============================================================================== -struct InternalStringArrayComparator_CaseSensitive -{ - static int compareElements (String& first, String& second) { return first.compare (second); } -}; - -struct InternalStringArrayComparator_CaseInsensitive -{ - static int compareElements (String& first, String& second) { return first.compareIgnoreCase (second); } -}; - -void StringArray::sort (const bool ignoreCase) -{ - if (ignoreCase) - { - InternalStringArrayComparator_CaseInsensitive comp; - strings.sort (comp); - } - else - { - InternalStringArrayComparator_CaseSensitive comp; - strings.sort (comp); - } -} - -void StringArray::move (const int currentIndex, int newIndex) noexcept -{ - strings.move (currentIndex, newIndex); -} - - -//============================================================================== -String StringArray::joinIntoString (const String& separator, int start, int numberToJoin) const -{ - const int last = (numberToJoin < 0) ? size() - : bmin (size(), start + numberToJoin); - - if (start < 0) - start = 0; - - if (start >= last) - return String::empty; - - if (start == last - 1) - return strings.getReference (start); - - const size_t separatorBytes = separator.getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType); - size_t bytesNeeded = separatorBytes * (size_t) (last - start - 1); - - for (int i = start; i < last; ++i) - bytesNeeded += strings.getReference(i).getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType); - - String result; - result.preallocateBytes (bytesNeeded); - - String::CharPointerType dest (result.getCharPointer()); - - while (start < last) - { - const String& s = strings.getReference (start); - - if (! s.isEmpty()) - dest.writeAll (s.getCharPointer()); - - if (++start < last && separatorBytes > 0) - dest.writeAll (separator.getCharPointer()); - } - - dest.writeNull(); - - return result; -} - -int StringArray::addTokens (const String& text, const bool preserveQuotedStrings) -{ - return addTokens (text, " \n\r\t", preserveQuotedStrings ? "\"" : ""); -} - -int StringArray::addTokens (const String& text, const String& breakCharacters, const String& quoteCharacters) -{ - int num = 0; - String::CharPointerType t (text.getCharPointer()); - - if (! t.isEmpty()) - { - for (;;) - { - String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t, - breakCharacters.getCharPointer(), - quoteCharacters.getCharPointer())); - strings.add (String (t, tokenEnd)); - ++num; - - if (tokenEnd.isEmpty()) - break; - - t = ++tokenEnd; - } - } - - return num; -} - -int StringArray::addLines (const String& sourceText) -{ - int numLines = 0; - String::CharPointerType text (sourceText.getCharPointer()); - bool finished = text.isEmpty(); - - while (! finished) - { - for (String::CharPointerType startOfLine (text);;) - { - const String::CharPointerType endOfLine (text); - - switch (text.getAndAdvance()) - { - case 0: finished = true; break; - case '\n': break; - case '\r': if (*text == '\n') ++text; break; - default: continue; - } - - strings.add (String (startOfLine, endOfLine)); - ++numLines; - break; - } - } - - return numLines; -} - -StringArray StringArray::fromTokens (const String& stringToTokenise, - bool preserveQuotedStrings) -{ - StringArray s; - s.addTokens (stringToTokenise, preserveQuotedStrings); - return s; -} - -StringArray StringArray::fromTokens (const String& stringToTokenise, - const String& breakCharacters, - const String& quoteCharacters) -{ - StringArray s; - s.addTokens (stringToTokenise, breakCharacters, quoteCharacters); - return s; -} - -StringArray StringArray::fromLines (const String& stringToBreakUp) -{ - StringArray s; - s.addLines (stringToBreakUp); - return s; -} - -//============================================================================== -void StringArray::removeDuplicates (const bool ignoreCase) -{ - for (int i = 0; i < size() - 1; ++i) - { - const String s (strings.getReference(i)); - - int nextIndex = i + 1; - - for (;;) - { - nextIndex = indexOf (s, ignoreCase, nextIndex); - - if (nextIndex < 0) - break; - - strings.remove (nextIndex); - } - } -} - -void StringArray::appendNumbersToDuplicates (const bool ignoreCase, - const bool appendNumberToFirstInstance, - CharPointer_UTF8 preNumberString, - CharPointer_UTF8 postNumberString) -{ - CharPointer_UTF8 defaultPre (" ("), defaultPost (")"); - - if (preNumberString.getAddress() == nullptr) - preNumberString = defaultPre; - - if (postNumberString.getAddress() == nullptr) - postNumberString = defaultPost; - - for (int i = 0; i < size() - 1; ++i) - { - String& s = strings.getReference(i); - - int nextIndex = indexOf (s, ignoreCase, i + 1); - - if (nextIndex >= 0) - { - const String original (s); - - int number = 0; - - if (appendNumberToFirstInstance) - s = original + String (preNumberString) + String (++number) + String (postNumberString); - else - ++number; - - while (nextIndex >= 0) - { - set (nextIndex, (*this)[nextIndex] + String (preNumberString) + String (++number) + String (postNumberString)); - nextIndex = indexOf (original, ignoreCase, nextIndex + 1); - } - } - } -} - -void StringArray::minimiseStorageOverheads() -{ - strings.minimiseStorageOverheads(); -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringArray.h b/Subtrees/beast/modules/beast_core/text/beast_StringArray.h deleted file mode 100644 index 26d1536cea..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringArray.h +++ /dev/null @@ -1,406 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STRINGARRAY_BEASTHEADER -#define BEAST_STRINGARRAY_BEASTHEADER - -#include "beast_String.h" -#include "../containers/beast_Array.h" - - -//============================================================================== -/** - A special array for holding a list of strings. - - @see String, StringPairArray -*/ -class BEAST_API StringArray -{ -public: - //============================================================================== - /** Creates an empty string array */ - StringArray() noexcept; - - /** Creates a copy of another string array */ - StringArray (const StringArray& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray (StringArray&& other) noexcept; - #endif - - /** Creates an array containing a single string. */ - explicit StringArray (const String& firstValue); - - /** Creates an array from a raw array of strings. - @param strings an array of strings to add - @param numberOfStrings how many items there are in the array - */ - StringArray (const String* strings, int numberOfStrings); - - /** Creates a copy of an array of string literals. - @param strings an array of strings to add. Null pointers in the array will be - treated as empty strings - @param numberOfStrings how many items there are in the array - */ - StringArray (const char* const* strings, int numberOfStrings); - - /** Creates a copy of a null-terminated array of string literals. - - Each item from the array passed-in is added, until it encounters a null pointer, - at which point it stops. - */ - explicit StringArray (const char* const* strings); - - /** Creates a copy of a null-terminated array of string literals. - Each item from the array passed-in is added, until it encounters a null pointer, - at which point it stops. - */ - explicit StringArray (const wchar_t* const* strings); - - /** Creates a copy of an array of string literals. - @param strings an array of strings to add. Null pointers in the array will be - treated as empty strings - @param numberOfStrings how many items there are in the array - */ - StringArray (const wchar_t* const* strings, int numberOfStrings); - - /** Destructor. */ - ~StringArray(); - - /** Copies the contents of another string array into this one */ - StringArray& operator= (const StringArray& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray& operator= (StringArray&& other) noexcept; - #endif - - /** Swaps the contents of this and another StringArray. */ - void swapWith (StringArray& other) noexcept; - - //============================================================================== - /** Compares two arrays. - Comparisons are case-sensitive. - @returns true only if the other array contains exactly the same strings in the same order - */ - bool operator== (const StringArray& other) const noexcept; - - /** Compares two arrays. - Comparisons are case-sensitive. - @returns false if the other array contains exactly the same strings in the same order - */ - bool operator!= (const StringArray& other) const noexcept; - - //============================================================================== - /** Returns the number of strings in the array */ - inline int size() const noexcept { return strings.size(); }; - - /** Returns one of the strings from the array. - - If the index is out-of-range, an empty string is returned. - - Obviously the reference returned shouldn't be stored for later use, as the - string it refers to may disappear when the array changes. - */ - const String& operator[] (int index) const noexcept; - - /** Returns a reference to one of the strings in the array. - This lets you modify a string in-place in the array, but you must be sure that - the index is in-range. - */ - String& getReference (int index) noexcept; - - /** Returns a pointer to the first String in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline String* begin() const noexcept - { - return strings.begin(); - } - - /** Returns a pointer to the String which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline String* end() const noexcept - { - return strings.end(); - } - - /** Searches for a string in the array. - - The comparison will be case-insensitive if the ignoreCase parameter is true. - - @returns true if the string is found inside the array - */ - bool contains (const String& stringToLookFor, - bool ignoreCase = false) const; - - /** Searches for a string in the array. - - The comparison will be case-insensitive if the ignoreCase parameter is true. - - @param stringToLookFor the string to try to find - @param ignoreCase whether the comparison should be case-insensitive - @param startIndex the first index to start searching from - @returns the index of the first occurrence of the string in this array, - or -1 if it isn't found. - */ - int indexOf (const String& stringToLookFor, - bool ignoreCase = false, - int startIndex = 0) const; - - //============================================================================== - /** Appends a string at the end of the array. */ - void add (const String& stringToAdd); - - /** Inserts a string into the array. - - This will insert a string into the array at the given index, moving - up the other elements to make room for it. - If the index is less than zero or greater than the size of the array, - the new string will be added to the end of the array. - */ - void insert (int index, const String& stringToAdd); - - /** Adds a string to the array as long as it's not already in there. - - The search can optionally be case-insensitive. - */ - void addIfNotAlreadyThere (const String& stringToAdd, bool ignoreCase = false); - - /** Replaces one of the strings in the array with another one. - - If the index is higher than the array's size, the new string will be - added to the end of the array; if it's less than zero nothing happens. - */ - void set (int index, const String& newString); - - /** Appends some strings from another array to the end of this one. - - @param other the array to add - @param startIndex the first element of the other array to add - @param numElementsToAdd the maximum number of elements to add (if this is - less than zero, they are all added) - */ - void addArray (const StringArray& other, - int startIndex = 0, - int numElementsToAdd = -1); - - /** Breaks up a string into tokens and adds them to this array. - - This will tokenise the given string using whitespace characters as the - token delimiters, and will add these tokens to the end of the array. - @returns the number of tokens added - @see fromTokens - */ - int addTokens (const String& stringToTokenise, - bool preserveQuotedStrings); - - /** Breaks up a string into tokens and adds them to this array. - - This will tokenise the given string (using the string passed in to define the - token delimiters), and will add these tokens to the end of the array. - - @param stringToTokenise the string to tokenise - @param breakCharacters a string of characters, any of which will be considered - to be a token delimiter. - @param quoteCharacters if this string isn't empty, it defines a set of characters - which are treated as quotes. Any text occurring - between quotes is not broken up into tokens. - @returns the number of tokens added - @see fromTokens - */ - int addTokens (const String& stringToTokenise, - const String& breakCharacters, - const String& quoteCharacters); - - /** Breaks up a string into lines and adds them to this array. - - This breaks a string down into lines separated by \\n or \\r\\n, and adds each line - to the array. Line-break characters are omitted from the strings that are added to - the array. - */ - int addLines (const String& stringToBreakUp); - - /** Returns an array containing the tokens in a given string. - - This will tokenise the given string using whitespace characters as the - token delimiters, and return these tokens as an array. - @see addTokens - */ - static StringArray fromTokens (const String& stringToTokenise, - bool preserveQuotedStrings); - - /** Returns an array containing the tokens in a given string. - - This will tokenise the given string using whitespace characters as the - token delimiters, and return these tokens as an array. - - @param stringToTokenise the string to tokenise - @param breakCharacters a string of characters, any of which will be considered - to be a token delimiter. - @param quoteCharacters if this string isn't empty, it defines a set of characters - which are treated as quotes. Any text occurring - between quotes is not broken up into tokens. - @see addTokens - */ - static StringArray fromTokens (const String& stringToTokenise, - const String& breakCharacters, - const String& quoteCharacters); - - /** Returns an array containing the lines in a given string. - - This breaks a string down into lines separated by \\n or \\r\\n, and returns an - array containing these lines. Line-break characters are omitted from the strings that - are added to the array. - */ - static StringArray fromLines (const String& stringToBreakUp); - - //============================================================================== - /** Removes all elements from the array. */ - void clear(); - - /** Removes a string from the array. - - If the index is out-of-range, no action will be taken. - */ - void remove (int index); - - /** Finds a string in the array and removes it. - - This will remove the first occurrence of the given string from the array. The - comparison may be case-insensitive depending on the ignoreCase parameter. - */ - void removeString (const String& stringToRemove, - bool ignoreCase = false); - - /** Removes a range of elements from the array. - - This will remove a set of elements, starting from the given index, - and move subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first element to remove - @param numberToRemove how many elements should be removed - */ - void removeRange (int startIndex, int numberToRemove); - - /** Removes any duplicated elements from the array. - - If any string appears in the array more than once, only the first occurrence of - it will be retained. - - @param ignoreCase whether to use a case-insensitive comparison - */ - void removeDuplicates (bool ignoreCase); - - /** Removes empty strings from the array. - - @param removeWhitespaceStrings if true, strings that only contain whitespace - characters will also be removed - */ - void removeEmptyStrings (bool removeWhitespaceStrings = true); - - /** Moves one of the strings to a different position. - - This will move the string to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the value to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this value to end up. If this - is less than zero, the value will be moved to the end - of the array - */ - void move (int currentIndex, int newIndex) noexcept; - - /** Deletes any whitespace characters from the starts and ends of all the strings. */ - void trim(); - - /** Adds numbers to the strings in the array, to make each string unique. - - This will add numbers to the ends of groups of similar strings. - e.g. if there are two "moose" strings, they will become "moose (1)" and "moose (2)" - - @param ignoreCaseWhenComparing whether the comparison used is case-insensitive - @param appendNumberToFirstInstance whether the first of a group of similar strings - also has a number appended to it. - @param preNumberString when adding a number, this string is added before the number. - If you pass 0, a default string will be used, which adds - brackets around the number. - @param postNumberString this string is appended after any numbers that are added. - If you pass 0, a default string will be used, which adds - brackets around the number. - */ - void appendNumbersToDuplicates (bool ignoreCaseWhenComparing, - bool appendNumberToFirstInstance, - CharPointer_UTF8 preNumberString = CharPointer_UTF8 (nullptr), - CharPointer_UTF8 postNumberString = CharPointer_UTF8 (nullptr)); - - //============================================================================== - /** Joins the strings in the array together into one string. - - This will join a range of elements from the array into a string, separating - them with a given string. - - e.g. joinIntoString (",") will turn an array of "a" "b" and "c" into "a,b,c". - - @param separatorString the string to insert between all the strings - @param startIndex the first element to join - @param numberOfElements how many elements to join together. If this is less - than zero, all available elements will be used. - */ - String joinIntoString (const String& separatorString, - int startIndex = 0, - int numberOfElements = -1) const; - - //============================================================================== - /** Sorts the array into alphabetical order. - - @param ignoreCase if true, the comparisons used will be case-sensitive. - */ - void sort (bool ignoreCase); - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads(); - - -private: - //============================================================================== - Array strings; - - BEAST_LEAK_DETECTOR (StringArray) -}; - - -#endif // BEAST_STRINGARRAY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.cpp b/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.cpp deleted file mode 100644 index f325556f64..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.cpp +++ /dev/null @@ -1,137 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -StringPairArray::StringPairArray (const bool ignoreCase_) - : ignoreCase (ignoreCase_) -{ -} - -StringPairArray::StringPairArray (const StringPairArray& other) - : keys (other.keys), - values (other.values), - ignoreCase (other.ignoreCase) -{ -} - -StringPairArray::~StringPairArray() -{ -} - -StringPairArray& StringPairArray::operator= (const StringPairArray& other) -{ - keys = other.keys; - values = other.values; - return *this; -} - -bool StringPairArray::operator== (const StringPairArray& other) const -{ - for (int i = keys.size(); --i >= 0;) - if (other [keys[i]] != values[i]) - return false; - - return true; -} - -bool StringPairArray::operator!= (const StringPairArray& other) const -{ - return ! operator== (other); -} - -const String& StringPairArray::operator[] (const String& key) const -{ - return values [keys.indexOf (key, ignoreCase)]; -} - -String StringPairArray::getValue (const String& key, const String& defaultReturnValue) const -{ - const int i = keys.indexOf (key, ignoreCase); - - if (i >= 0) - return values[i]; - - return defaultReturnValue; -} - -void StringPairArray::set (const String& key, const String& value) -{ - const int i = keys.indexOf (key, ignoreCase); - - if (i >= 0) - { - values.set (i, value); - } - else - { - keys.add (key); - values.add (value); - } -} - -void StringPairArray::addArray (const StringPairArray& other) -{ - for (int i = 0; i < other.size(); ++i) - set (other.keys[i], other.values[i]); -} - -void StringPairArray::clear() -{ - keys.clear(); - values.clear(); -} - -void StringPairArray::remove (const String& key) -{ - remove (keys.indexOf (key, ignoreCase)); -} - -void StringPairArray::remove (const int index) -{ - keys.remove (index); - values.remove (index); -} - -void StringPairArray::setIgnoresCase (const bool shouldIgnoreCase) -{ - ignoreCase = shouldIgnoreCase; -} - -String StringPairArray::getDescription() const -{ - String s; - - for (int i = 0; i < keys.size(); ++i) - { - s << keys[i] << " = " << values[i]; - if (i < keys.size()) - s << ", "; - } - - return s; -} - -void StringPairArray::minimiseStorageOverheads() -{ - keys.minimiseStorageOverheads(); - values.minimiseStorageOverheads(); -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.h b/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.h deleted file mode 100644 index a3eac9b3bf..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringPairArray.h +++ /dev/null @@ -1,158 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STRINGPAIRARRAY_BEASTHEADER -#define BEAST_STRINGPAIRARRAY_BEASTHEADER - -#include "beast_StringArray.h" - - -//============================================================================== -/** - A container for holding a set of strings which are keyed by another string. - - @see StringArray -*/ -class BEAST_API StringPairArray -{ -public: - //============================================================================== - /** Creates an empty array */ - StringPairArray (bool ignoreCaseWhenComparingKeys = true); - - /** Creates a copy of another array */ - StringPairArray (const StringPairArray& other); - - /** Destructor. */ - ~StringPairArray(); - - /** Copies the contents of another string array into this one */ - StringPairArray& operator= (const StringPairArray& other); - - //============================================================================== - /** Compares two arrays. - Comparisons are case-sensitive. - @returns true only if the other array contains exactly the same strings with the same keys - */ - bool operator== (const StringPairArray& other) const; - - /** Compares two arrays. - Comparisons are case-sensitive. - @returns false if the other array contains exactly the same strings with the same keys - */ - bool operator!= (const StringPairArray& other) const; - - //============================================================================== - /** Finds the value corresponding to a key string. - - If no such key is found, this will just return an empty string. To check whether - a given key actually exists (because it might actually be paired with an empty string), use - the getAllKeys() method to obtain a list. - - Obviously the reference returned shouldn't be stored for later use, as the - string it refers to may disappear when the array changes. - - @see getValue - */ - const String& operator[] (const String& key) const; - - /** Finds the value corresponding to a key string. - - If no such key is found, this will just return the value provided as a default. - - @see operator[] - */ - String getValue (const String& key, const String& defaultReturnValue) const; - - - /** Returns a list of all keys in the array. */ - const StringArray& getAllKeys() const noexcept { return keys; } - - /** Returns a list of all values in the array. */ - const StringArray& getAllValues() const noexcept { return values; } - - /** Returns the number of strings in the array */ - inline int size() const noexcept { return keys.size(); }; - - - //============================================================================== - /** Adds or amends a key/value pair. - - If a value already exists with this key, its value will be overwritten, - otherwise the key/value pair will be added to the array. - */ - void set (const String& key, const String& value); - - /** Adds the items from another array to this one. - - This is equivalent to using set() to add each of the pairs from the other array. - */ - void addArray (const StringPairArray& other); - - //============================================================================== - /** Removes all elements from the array. */ - void clear(); - - /** Removes a string from the array based on its key. - - If the key isn't found, nothing will happen. - */ - void remove (const String& key); - - /** Removes a string from the array based on its index. - - If the index is out-of-range, no action will be taken. - */ - void remove (int index); - - //============================================================================== - /** Indicates whether to use a case-insensitive search when looking up a key string. - */ - void setIgnoresCase (bool shouldIgnoreCase); - - //============================================================================== - /** Returns a descriptive string containing the items. - This is handy for dumping the contents of an array. - */ - String getDescription() const; - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads(); - - -private: - //============================================================================== - StringArray keys, values; - bool ignoreCase; - - BEAST_LEAK_DETECTOR (StringPairArray) -}; - - -#endif // BEAST_STRINGPAIRARRAY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringPool.cpp b/Subtrees/beast/modules/beast_core/text/beast_StringPool.cpp deleted file mode 100644 index b86188244f..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringPool.cpp +++ /dev/null @@ -1,109 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -StringPool::StringPool() noexcept {} -StringPool::~StringPool() {} - -namespace StringPoolHelpers -{ - template - String::CharPointerType getPooledStringFromArray (Array& strings, - StringType newString, - const CriticalSection& lock) - { - const ScopedLock sl (lock); - int start = 0; - int end = strings.size(); - - for (;;) - { - if (start >= end) - { - bassert (start <= end); - strings.insert (start, newString); - return strings.getReference (start).getCharPointer(); - } - else - { - const String& startString = strings.getReference (start); - - if (startString == newString) - return startString.getCharPointer(); - - const int halfway = (start + end) >> 1; - - if (halfway == start) - { - if (startString.compare (newString) < 0) - ++start; - - strings.insert (start, newString); - return strings.getReference (start).getCharPointer(); - } - - const int comp = strings.getReference (halfway).compare (newString); - - if (comp == 0) - return strings.getReference (halfway).getCharPointer(); - else if (comp < 0) - start = halfway; - else - end = halfway; - } - } - } -} - -String::CharPointerType StringPool::getPooledString (const String& s) -{ - if (s.isEmpty()) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -String::CharPointerType StringPool::getPooledString (const char* const s) -{ - if (s == nullptr || *s == 0) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -String::CharPointerType StringPool::getPooledString (const wchar_t* const s) -{ - if (s == nullptr || *s == 0) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -int StringPool::size() const noexcept -{ - return strings.size(); -} - -String::CharPointerType StringPool::operator[] (const int index) const noexcept -{ - return strings [index].getCharPointer(); -} diff --git a/Subtrees/beast/modules/beast_core/text/beast_StringPool.h b/Subtrees/beast/modules/beast_core/text/beast_StringPool.h deleted file mode 100644 index d991209429..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_StringPool.h +++ /dev/null @@ -1,90 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_STRINGPOOL_BEASTHEADER -#define BEAST_STRINGPOOL_BEASTHEADER - -#include "beast_String.h" -#include "../containers/beast_Array.h" - - -//============================================================================== -/** - A StringPool holds a set of shared strings, which reduces storage overheads and improves - comparison speed when dealing with many duplicate strings. - - When you add a string to a pool using getPooledString, it'll return a character - array containing the same string. This array is owned by the pool, and the same array - is returned every time a matching string is asked for. This means that it's trivial to - compare two pooled strings for equality, as you can simply compare their pointers. It - also cuts down on storage if you're using many copies of the same string. -*/ -class BEAST_API StringPool -{ -public: - //============================================================================== - /** Creates an empty pool. */ - StringPool() noexcept; - - /** Destructor */ - ~StringPool(); - - //============================================================================== - /** Returns a pointer to a copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const String& original); - - /** Returns a pointer to a copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const char* original); - - /** Returns a pointer to a copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const wchar_t* original); - - //============================================================================== - /** Returns the number of strings in the pool. */ - int size() const noexcept; - - /** Returns one of the strings in the pool, by index. */ - String::CharPointerType operator[] (int index) const noexcept; - -private: - Array strings; - CriticalSection lock; -}; - - -#endif // BEAST_STRINGPOOL_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/text/beast_TextDiff.cpp b/Subtrees/beast/modules/beast_core/text/beast_TextDiff.cpp deleted file mode 100644 index 5739da32ea..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_TextDiff.cpp +++ /dev/null @@ -1,236 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -struct TextDiffHelpers -{ - enum { minLengthToMatch = 3 }; - - struct StringRegion - { - StringRegion (const String& s) noexcept - : text (s.getCharPointer()), start (0), length (s.length()) {} - - StringRegion (const String::CharPointerType& t, int s, int len) noexcept - : text (t), start (s), length (len) {} - - String::CharPointerType text; - int start, length; - }; - - static void addInsertion (TextDiff& td, const String::CharPointerType& text, int index, int length) - { - TextDiff::Change c; - c.insertedText = String (text, (size_t) length); - c.start = index; - c.length = length; - td.changes.add (c); - } - - static void addDeletion (TextDiff& td, int index, int length) - { - TextDiff::Change c; - c.start = index; - c.length = length; - td.changes.add (c); - } - - static void diffSkippingCommonStart (TextDiff& td, const StringRegion& a, const StringRegion& b) - { - String::CharPointerType sa (a.text); - String::CharPointerType sb (b.text); - const int maxLen = bmax (a.length, b.length); - - for (int i = 0; i < maxLen; ++i, ++sa, ++sb) - { - if (*sa != *sb) - { - diffRecursively (td, StringRegion (sa, a.start + i, a.length - i), - StringRegion (sb, b.start + i, b.length - i)); - break; - } - } - } - - static void diffRecursively (TextDiff& td, const StringRegion& a, const StringRegion& b) - { - int indexA, indexB; - const int len = findLongestCommonSubstring (a.text, a.length, - b.text, b.length, - indexA, indexB); - - if (len >= minLengthToMatch) - { - if (indexA > 0 && indexB > 0) - diffSkippingCommonStart (td, StringRegion (a.text, a.start, indexA), - StringRegion (b.text, b.start, indexB)); - else if (indexA > 0) - addDeletion (td, b.start, indexA); - else if (indexB > 0) - addInsertion (td, b.text, b.start, indexB); - - diffRecursively (td, StringRegion (a.text + indexA + len, a.start + indexA + len, a.length - indexA - len), - StringRegion (b.text + indexB + len, b.start + indexB + len, b.length - indexB - len)); - } - else - { - if (a.length > 0) addDeletion (td, b.start, a.length); - if (b.length > 0) addInsertion (td, b.text, b.start, b.length); - } - } - - static int findLongestCommonSubstring (String::CharPointerType a, const int lenA, - const String::CharPointerType& b, const int lenB, - int& indexInA, int& indexInB) - { - if (lenA == 0 || lenB == 0) - return 0; - - HeapBlock lines; - lines.calloc (2 + 2 * (size_t) lenB); - - int* l0 = lines; - int* l1 = l0 + lenB + 1; - - int bestLength = 0; - indexInA = indexInB = 0; - - for (int i = 0; i < lenA; ++i) - { - const beast_wchar ca = a.getAndAdvance(); - String::CharPointerType b2 (b); - - for (int j = 0; j < lenB; ++j) - { - if (ca != b2.getAndAdvance()) - { - l1[j + 1] = 0; - } - else - { - const int len = l0[j] + 1; - l1[j + 1] = len; - - if (len > bestLength) - { - bestLength = len; - indexInA = i; - indexInB = j; - } - } - } - - std::swap (l0, l1); - } - - indexInA -= bestLength - 1; - indexInB -= bestLength - 1; - return bestLength; - } -}; - -TextDiff::TextDiff (const String& original, const String& target) -{ - TextDiffHelpers::diffSkippingCommonStart (*this, original, target); -} - -String TextDiff::appliedTo (String text) const -{ - for (int i = 0; i < changes.size(); ++i) - text = changes.getReference(i).appliedTo (text); - - return text; -} - -bool TextDiff::Change::isDeletion() const noexcept -{ - return insertedText.isEmpty(); -} - -String TextDiff::Change::appliedTo (const String& text) const noexcept -{ - return text.substring (0, start) + (isDeletion() ? text.substring (start + length) - : (insertedText + text.substring (start))); -} - -//============================================================================== -//============================================================================== -#if BEAST_UNIT_TESTS - -class DiffTests : public UnitTest -{ -public: - DiffTests() : UnitTest ("TextDiff class") {} - - static String createString() - { - beast_wchar buffer[50] = { 0 }; - Random r; - - for (int i = r.nextInt (49); --i >= 0;) - { - if (r.nextInt (10) == 0) - { - do - { - buffer[i] = (beast_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (beast_wchar) ('a' + r.nextInt (3)); - } - - return CharPointer_UTF32 (buffer); - } - - void testDiff (const String& a, const String& b) - { - TextDiff diff (a, b); - const String result (diff.appliedTo (a)); - expectEquals (result, b); - } - - void runTest() - { - beginTest ("TextDiff"); - - testDiff (String::empty, String::empty); - testDiff ("x", String::empty); - testDiff (String::empty, "x"); - testDiff ("x", "x"); - testDiff ("x", "y"); - testDiff ("xxx", "x"); - testDiff ("x", "xxx"); - - for (int i = 5000; --i >= 0;) - { - String s (createString()); - testDiff (s, createString()); - testDiff (s + createString(), s + createString()); - } - } -}; - -static DiffTests diffTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/text/beast_TextDiff.h b/Subtrees/beast/modules/beast_core/text/beast_TextDiff.h deleted file mode 100644 index 514c8d0c41..0000000000 --- a/Subtrees/beast/modules/beast_core/text/beast_TextDiff.h +++ /dev/null @@ -1,75 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_TEXTDIFF_BEASTHEADER -#define BEAST_TEXTDIFF_BEASTHEADER - - -/** - Calculates and applies a sequence of changes to convert one text string into - another. - - Once created, the TextDiff object contains an array of change objects, where - each change can be either an insertion or a deletion. When applied in order - to the original string, these changes will convert it to the target string. -*/ -class BEAST_API TextDiff -{ -public: - /** Creates a set of diffs for converting the original string into the target. */ - TextDiff (const String& original, - const String& target); - - /** Applies this sequence of changes to the original string, producing the - target string that was specified when generating them. - - Obviously it only makes sense to call this function with the string that - was originally passed to the constructor. Any other input will produce an - undefined result. - */ - String appliedTo (String text) const; - - /** Describes a change, which can be either an insertion or deletion. */ - struct Change - { - String insertedText; /**< If this change is a deletion, this string will be empty; otherwise, - it'll be the text that should be inserted at the index specified by start. */ - int start; /**< Specifies the character index in a string at which text should be inserted or deleted. */ - int length; /**< If this change is a deletion, this specifies the number of characters to delete. For an - insertion, this is the length of the new text being inserted. */ - - /** Returns true if this change is a deletion, or false for an insertion. */ - bool isDeletion() const noexcept; - - /** Returns the result of applying this change to a string. */ - String appliedTo (const String& original) const noexcept; - }; - - /** The list of changes required to perform the transformation. - Applying each of these, in order, to the original string will produce the target. - */ - Array changes; -}; - - -#endif // BEAST_TEXTDIFF_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.cpp b/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.cpp deleted file mode 100644 index 49a928a236..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ChildProcess::ChildProcess() {} -ChildProcess::~ChildProcess() {} - -bool ChildProcess::waitForProcessToFinish (const int timeoutMs) const -{ - const uint32 timeoutTime = Time::getMillisecondCounter() + (uint32) timeoutMs; - - do - { - if (! isRunning()) - return true; - } - while (timeoutMs < 0 || Time::getMillisecondCounter() < timeoutTime); - - return false; -} - -String ChildProcess::readAllProcessOutput() -{ - MemoryOutputStream result; - - for (;;) - { - char buffer [512]; - const int num = readProcessOutput (buffer, sizeof (buffer)); - - if (num <= 0) - break; - - result.write (buffer, (size_t) num); - } - - return result.toString(); -} - -//============================================================================== -#if BEAST_UNIT_TESTS - -class ChildProcessTests : public UnitTest -{ -public: - ChildProcessTests() : UnitTest ("ChildProcess") {} - - void runTest() - { - beginTest ("Child Processes"); - - #if BEAST_WINDOWS || BEAST_MAC || BEAST_LINUX - ChildProcess p; - - #if BEAST_WINDOWS - expect (p.start ("tasklist")); - #else - expect (p.start ("ls /")); - #endif - - //String output (p.readAllProcessOutput()); - //expect (output.isNotEmpty()); - #endif - } -}; - -static ChildProcessTests childProcessUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.h b/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.h deleted file mode 100644 index 4875efd608..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ChildProcess.h +++ /dev/null @@ -1,100 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CHILDPROCESS_BEASTHEADER -#define BEAST_CHILDPROCESS_BEASTHEADER - - -//============================================================================== -/** - Launches and monitors a child process. - - This class lets you launch an executable, and read its output. You can also - use it to check whether the child process has finished. -*/ -class BEAST_API ChildProcess -{ -public: - //============================================================================== - /** Creates a process object. - To actually launch the process, use start(). - */ - ChildProcess(); - - /** Destructor. - Note that deleting this object won't terminate the child process. - */ - ~ChildProcess(); - - /** Attempts to launch a child process command. - - The command should be the name of the executable file, followed by any arguments - that are required. - If the process has already been launched, this will launch it again. If a problem - occurs, the method will return false. - */ - bool start (const String& command); - - /** Attempts to launch a child process command. - - The first argument should be the name of the executable file, followed by any other - arguments that are needed. - If the process has already been launched, this will launch it again. If a problem - occurs, the method will return false. - */ - bool start (const StringArray& arguments); - - /** Returns true if the child process is alive. */ - bool isRunning() const; - - /** Attempts to read some output from the child process. - This will attempt to read up to the given number of bytes of data from the - process. It returns the number of bytes that were actually read. - */ - int readProcessOutput (void* destBuffer, int numBytesToRead); - - /** Blocks until the process has finished, and then returns its complete output - as a string. - */ - String readAllProcessOutput(); - - /** Blocks until the process is no longer running. */ - bool waitForProcessToFinish (int timeoutMs) const; - - /** Attempts to kill the child process. - Returns true if it succeeded. Trying to read from the process after calling this may - result in undefined behaviour. - */ - bool kill(); - -private: - //============================================================================== - class ActiveProcess; - friend class ScopedPointer; - ScopedPointer activeProcess; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcess) -}; - - -#endif // BEAST_CHILDPROCESS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_CriticalSection.h b/Subtrees/beast/modules/beast_core/threads/beast_CriticalSection.h deleted file mode 100644 index d0da916418..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_CriticalSection.h +++ /dev/null @@ -1,252 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_CRITICALSECTION_BEASTHEADER -#define BEAST_CRITICALSECTION_BEASTHEADER - -#include "beast_ScopedLock.h" - - -//============================================================================== -/** - A re-entrant mutex. - - A CriticalSection acts as a re-entrant mutex object. The best way to lock and unlock - one of these is by using RAII in the form of a local ScopedLock object - have a look - through the codebase for many examples of how to do this. - - @see ScopedLock, ScopedTryLock, ScopedUnlock, SpinLock, ReadWriteLock, Thread, InterProcessLock -*/ -class BEAST_API CriticalSection -{ -public: - //============================================================================== - /** Creates a CriticalSection object. */ - CriticalSection() noexcept; - - /** Destructor. - If the critical section is deleted whilst locked, any subsequent behaviour - is unpredictable. - */ - ~CriticalSection() noexcept; - - //============================================================================== - /** Acquires the lock. - - If the lock is already held by the caller thread, the method returns immediately. - If the lock is currently held by another thread, this will wait until it becomes free. - - It's strongly recommended that you never call this method directly - instead use the - ScopedLock class to manage the locking using an RAII pattern instead. - - @see exit, tryEnter, ScopedLock - */ - void enter() const noexcept; - - /** Attempts to lock this critical section without blocking. - - This method behaves identically to CriticalSection::enter, except that the caller thread - does not wait if the lock is currently held by another thread but returns false immediately. - - @returns false if the lock is currently held by another thread, true otherwise. - @see enter - */ - bool tryEnter() const noexcept; - - /** Releases the lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enter() method has been called multiple times by the thread, each - call must be matched by a call to exit() before other threads will be allowed - to take over the lock. - - @see enter, ScopedLock - */ - void exit() const noexcept; - - - //============================================================================== - /** Provides the type of scoped lock to use with a CriticalSection. */ - typedef GenericScopedLock ScopedLockType; - - /** Provides the type of scoped unlocker to use with a CriticalSection. */ - typedef GenericScopedUnlock ScopedUnlockType; - - /** Provides the type of scoped try-locker to use with a CriticalSection. */ - typedef GenericScopedTryLock ScopedTryLockType; - - -private: - //============================================================================== - #if BEAST_WINDOWS - // To avoid including windows.h in the public BEAST headers, we'll just allocate a - // block of memory here that's big enough to be used internally as a windows critical - // section structure. - #if BEAST_64BIT - uint8 internal [44]; - #else - uint8 internal [24]; - #endif - #else - mutable pthread_mutex_t internal; - #endif - - BEAST_DECLARE_NON_COPYABLE (CriticalSection) -}; - - -//============================================================================== -/** - A class that can be used in place of a real CriticalSection object, but which - doesn't perform any locking. - - This is currently used by some templated classes, and most compilers should - manage to optimise it out of existence. - - @see CriticalSection, Array, OwnedArray, ReferenceCountedArray -*/ -class BEAST_API DummyCriticalSection -{ -public: - inline DummyCriticalSection() noexcept {} - inline ~DummyCriticalSection() noexcept {} - - inline void enter() const noexcept {} - inline bool tryEnter() const noexcept { return true; } - inline void exit() const noexcept {} - - //============================================================================== - /** A dummy scoped-lock type to use with a dummy critical section. */ - struct ScopedLockType - { - ScopedLockType (const DummyCriticalSection&) noexcept {} - }; - - /** A dummy scoped-unlocker type to use with a dummy critical section. */ - typedef ScopedLockType ScopedUnlockType; - -private: - BEAST_DECLARE_NON_COPYABLE (DummyCriticalSection) -}; - -//============================================================================== -/** - Automatically locks and unlocks a CriticalSection object. - - Use one of these as a local variable to provide RAII-based locking of a CriticalSection. - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ...do some stuff... - - // myCriticalSection gets unlocked here. - } - @endcode - - @see CriticalSection, ScopedUnlock -*/ -typedef CriticalSection::ScopedLockType ScopedLock; - -//============================================================================== -/** - Automatically unlocks and re-locks a CriticalSection object. - - This is the reverse of a ScopedLock object - instead of locking the critical - section for the lifetime of this object, it unlocks it. - - Make sure you don't try to unlock critical sections that aren't actually locked! - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ... do some stuff with it locked .. - - while (xyz) - { - ... do some stuff with it locked .. - - const ScopedUnlock unlocker (myCriticalSection); - - // myCriticalSection is now unlocked for the remainder of this block, - // and re-locked at the end. - - ...do some stuff with it unlocked ... - } - - // myCriticalSection gets unlocked here. - } - @endcode - - @see CriticalSection, ScopedLock -*/ -typedef CriticalSection::ScopedUnlockType ScopedUnlock; - -//============================================================================== -/** - Automatically tries to lock and unlock a CriticalSection object. - - Use one of these as a local variable to control access to a CriticalSection. - - e.g. @code - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedTryLock myScopedTryLock (myCriticalSection); - - // Unlike using a ScopedLock, this may fail to actually get the lock, so you - // should test this with the isLocked() method before doing your thread-unsafe - // action.. - if (myScopedTryLock.isLocked()) - { - ...do some stuff... - } - else - { - ..our attempt at locking failed because another thread had already locked it.. - } - - // myCriticalSection gets unlocked here (if it was locked) - } - @endcode - - @see CriticalSection::tryEnter, ScopedLock, ScopedUnlock, ScopedReadLock -*/ -typedef CriticalSection::ScopedTryLockType ScopedTryLock; - - -#endif // BEAST_CRITICALSECTION_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_DynamicLibrary.h b/Subtrees/beast/modules/beast_core/threads/beast_DynamicLibrary.h deleted file mode 100644 index 9b99c6a8a3..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_DynamicLibrary.h +++ /dev/null @@ -1,80 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_DYNAMICLIBRARY_BEASTHEADER -#define BEAST_DYNAMICLIBRARY_BEASTHEADER - -/** - Handles the opening and closing of DLLs. - - This class can be used to open a DLL and get some function pointers from it. - Since the DLL is freed when this object is deleted, it's handy for managing - library lifetimes using RAII. -*/ -class BEAST_API DynamicLibrary -{ -public: - /** Creates an unopened DynamicLibrary object. - Call open() to actually open one. - */ - DynamicLibrary() noexcept : handle (nullptr) {} - - /** - */ - DynamicLibrary (const String& name) : handle (nullptr) { open (name); } - - /** Destructor. - If a library is currently open, it will be closed when this object is destroyed. - */ - ~DynamicLibrary() { close(); } - - /** Opens a DLL. - The name and the method by which it gets found is of course platform-specific, and - may or may not include a path, depending on the OS. - If a library is already open when this method is called, it will first close the library - before attempting to load the new one. - @returns true if the library was successfully found and opened. - */ - bool open (const String& name); - - /** Releases the currently-open DLL, or has no effect if none was open. */ - void close(); - - /** Tries to find a named function in the currently-open DLL, and returns a pointer to it. - If no library is open, or if the function isn't found, this will return a null pointer. - */ - void* getFunction (const String& functionName) noexcept; - - /** Returns the platform-specific native library handle. - You'll need to cast this to whatever is appropriate for the OS that's in use. - */ - void* getNativeHandle() const noexcept { return handle; } - -private: - void* handle; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DynamicLibrary) -}; - - -#endif // BEAST_DYNAMICLIBRARY_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.cpp b/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.cpp deleted file mode 100644 index 68cd34988d..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.cpp +++ /dev/null @@ -1,31 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -HighResolutionTimer::HighResolutionTimer() { pimpl = new Pimpl (*this); } -HighResolutionTimer::~HighResolutionTimer() { stopTimer(); } - -void HighResolutionTimer::startTimer (int periodMs) { pimpl->start (bmax (1, periodMs)); } -void HighResolutionTimer::stopTimer() { pimpl->stop(); } - -bool HighResolutionTimer::isTimerRunning() const noexcept { return pimpl->periodMs != 0; } -int HighResolutionTimer::getTimerInterval() const noexcept { return pimpl->periodMs; } diff --git a/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.h b/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.h deleted file mode 100644 index a42674f911..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_HighResolutionTimer.h +++ /dev/null @@ -1,104 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_HIGHRESOLUTIONTIMER_BEASTHEADER -#define BEAST_HIGHRESOLUTIONTIMER_BEASTHEADER - -/** - A high-resolution periodic timer. - - This provides accurately-timed regular callbacks. Unlike the normal Timer - class, this one uses a dedicated thread, not the message thread, so is - far more stable and precise. - - You should only use this class in situations where you really need accuracy, - because unlike the normal Timer class, which is very lightweight and cheap - to start/stop, the HighResolutionTimer will use far more resources, and - starting/stopping it may involve launching and killing threads. - - @see Timer -*/ -class BEAST_API HighResolutionTimer -{ -protected: - /** Creates a HighResolutionTimer. - When created, the timer is stopped, so use startTimer() to get it going. - */ - HighResolutionTimer(); - -public: - /** Destructor. */ - virtual ~HighResolutionTimer(); - - //============================================================================== - /** The user-defined callback routine that actually gets called periodically. - - This will be called on a dedicated timer thread, so make sure your - implementation is thread-safe! - - It's perfectly ok to call startTimer() or stopTimer() from within this - callback to change the subsequent intervals. - */ - virtual void hiResTimerCallback() = 0; - - //============================================================================== - /** Starts the timer and sets the length of interval required. - - If the timer is already started, this will reset its counter, so the - time between calling this method and the next timer callback will not be - less than the interval length passed in. - - @param intervalInMilliseconds the interval to use (any values less than 1 will be - rounded up to 1) - */ - void startTimer (int intervalInMilliseconds); - - /** Stops the timer. - - This method may block while it waits for pending callbacks to complete. Once it - returns, no more callbacks will be made. If it is called from the timer's own thread, - it will cancel the timer after the current callback returns. - */ - void stopTimer(); - - /** Checks if the timer has been started. - @returns true if the timer is running. - */ - bool isTimerRunning() const noexcept; - - /** Returns the timer's interval. - @returns the timer's interval in milliseconds if it's running, or 0 if it's not. - */ - int getTimerInterval() const noexcept; - -private: - struct Pimpl; - friend struct Pimpl; - friend class ScopedPointer; - ScopedPointer pimpl; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HighResolutionTimer) -}; - - -#endif // BEAST_HIGHRESOLUTIONTIMER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_InterProcessLock.h b/Subtrees/beast/modules/beast_core/threads/beast_InterProcessLock.h deleted file mode 100644 index 946f29580d..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_InterProcessLock.h +++ /dev/null @@ -1,126 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_INTERPROCESSLOCK_BEASTHEADER -#define BEAST_INTERPROCESSLOCK_BEASTHEADER - -#include "../text/beast_String.h" -#include "../memory/beast_ScopedPointer.h" - - -//============================================================================== -/** - Acts as a critical section which processes can use to block each other. - - @see CriticalSection -*/ -class BEAST_API InterProcessLock -{ -public: - //============================================================================== - /** Creates a lock object. - @param name a name that processes will use to identify this lock object - */ - explicit InterProcessLock (const String& name); - - /** Destructor. - This will also release the lock if it's currently held by this process. - */ - ~InterProcessLock(); - - //============================================================================== - /** Attempts to lock the critical section. - - @param timeOutMillisecs how many milliseconds to wait if the lock is already - held by another process - a value of 0 will return - immediately, negative values will wait forever - @returns true if the lock could be gained within the timeout period, or - false if the timeout expired. - */ - bool enter (int timeOutMillisecs = -1); - - /** Releases the lock if it's currently held by this process. */ - void exit(); - - //============================================================================== - /** - Automatically locks and unlocks an InterProcessLock object. - - This works like a ScopedLock, but using an InterprocessLock rather than - a CriticalSection. - - @see ScopedLock - */ - class ScopedLockType - { - public: - //============================================================================== - /** Creates a scoped lock. - - As soon as it is created, this will lock the InterProcessLock, and - when the ScopedLockType object is deleted, the InterProcessLock will - be unlocked. - - Note that since an InterprocessLock can fail due to errors, you should check - isLocked() to make sure that the lock was successful before using it. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - explicit ScopedLockType (InterProcessLock& l) : ipLock (l) { lockWasSuccessful = l.enter(); } - - /** Destructor. - - The InterProcessLock will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedLockType() { ipLock.exit(); } - - /** Returns true if the InterProcessLock was successfully locked. */ - bool isLocked() const noexcept { return lockWasSuccessful; } - - private: - //============================================================================== - InterProcessLock& ipLock; - bool lockWasSuccessful; - - BEAST_DECLARE_NON_COPYABLE (ScopedLockType) - }; - -private: - //============================================================================== - class Pimpl; - friend class ScopedPointer ; - ScopedPointer pimpl; - - CriticalSection lock; - String name; - - BEAST_DECLARE_NON_COPYABLE (InterProcessLock) -}; - - -#endif // BEAST_INTERPROCESSLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_Process.h b/Subtrees/beast/modules/beast_core/threads/beast_Process.h deleted file mode 100644 index 05a9f1f367..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_Process.h +++ /dev/null @@ -1,147 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PROCESS_BEASTHEADER -#define BEAST_PROCESS_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** Represents the current executable's process. - - This contains methods for controlling the current application at the - process-level. - - @see Thread, BEASTApplication -*/ -class BEAST_API Process -{ -public: - //============================================================================== - enum ProcessPriority - { - LowPriority = 0, - NormalPriority = 1, - HighPriority = 2, - RealtimePriority = 3 - }; - - /** Changes the current process's priority. - - @param priority the process priority, where - 0=low, 1=normal, 2=high, 3=realtime - */ - static void setPriority (const ProcessPriority priority); - - /** Kills the current process immediately. - - This is an emergency process terminator that kills the application - immediately - it's intended only for use only when something goes - horribly wrong. - - @see BEASTApplication::quit - */ - static void terminate(); - - //============================================================================== - /** Returns true if this application process is the one that the user is - currently using. - */ - static bool isForegroundProcess(); - - /** Attempts to make the current process the active one. - (This is not possible on some platforms). - */ - static void makeForegroundProcess(); - - //============================================================================== - /** Raises the current process's privilege level. - - Does nothing if this isn't supported by the current OS, or if process - privilege level is fixed. - */ - static void raisePrivilege(); - - /** Lowers the current process's privilege level. - - Does nothing if this isn't supported by the current OS, or if process - privilege level is fixed. - */ - static void lowerPrivilege(); - - //============================================================================== - /** Returns true if this process is being hosted by a debugger. */ - static bool BEAST_CALLTYPE isRunningUnderDebugger(); - - - //============================================================================== - /** Tries to launch the OS's default reader application for a given file or URL. */ - static bool openDocument (const String& documentURL, const String& parameters); - - /** Tries to launch the OS's default email application to let the user create a message. */ - static bool openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach); - - #if BEAST_WINDOWS || DOXYGEN - //============================================================================== - /** WINDOWS ONLY - This returns the HINSTANCE of the current module. - - The return type is a void* to avoid being dependent on windows.h - just cast - it to a HINSTANCE to use it. - - In a normal BEAST application, this will be automatically set to the module - handle of the executable. - - If you've built a DLL and plan to use any BEAST messaging or windowing classes, - you'll need to make sure you call the setCurrentModuleInstanceHandle() - to provide the correct module handle in your DllMain() function, because - the system relies on the correct instance handle when opening windows. - */ - static void* BEAST_CALLTYPE getCurrentModuleInstanceHandle() noexcept; - - /** WINDOWS ONLY - Sets a new module handle to be used by the library. - - The parameter type is a void* to avoid being dependent on windows.h, but it actually - expects a HINSTANCE value. - - @see getCurrentModuleInstanceHandle() - */ - static void BEAST_CALLTYPE setCurrentModuleInstanceHandle (void* newHandle) noexcept; - #endif - - #if BEAST_MAC || DOXYGEN - //============================================================================== - /** OSX ONLY - Shows or hides the OSX dock icon for this app. */ - static void setDockIconVisible (bool isVisible); - #endif - -private: - Process(); - BEAST_DECLARE_NON_COPYABLE (Process) -}; - - -#endif // BEAST_PROCESS_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.cpp b/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.cpp deleted file mode 100644 index fbc784a24d..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.cpp +++ /dev/null @@ -1,153 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ReadWriteLock::ReadWriteLock() noexcept - : numWaitingWriters (0), - numWriters (0), - writerThreadId (0) -{ - readerThreads.ensureStorageAllocated (16); -} - -ReadWriteLock::~ReadWriteLock() noexcept -{ - bassert (readerThreads.size() == 0); - bassert (numWriters == 0); -} - -//============================================================================== -void ReadWriteLock::enterRead() const noexcept -{ - while (! tryEnterRead()) - waitEvent.wait (100); -} - -bool ReadWriteLock::tryEnterRead() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - const SpinLock::ScopedLockType sl (accessLock); - - for (int i = 0; i < readerThreads.size(); ++i) - { - ThreadRecursionCount& trc = readerThreads.getReference(i); - - if (trc.threadID == threadId) - { - trc.count++; - return true; - } - } - - if (numWriters + numWaitingWriters == 0 - || (threadId == writerThreadId && numWriters > 0)) - { - ThreadRecursionCount trc = { threadId, 1 }; - readerThreads.add (trc); - return true; - } - - return false; -} - -void ReadWriteLock::exitRead() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - for (int i = 0; i < readerThreads.size(); ++i) - { - ThreadRecursionCount& trc = readerThreads.getReference(i); - - if (trc.threadID == threadId) - { - if (--(trc.count) == 0) - { - readerThreads.remove (i); - waitEvent.signal(); - } - - return; - } - } - - bassertfalse; // unlocking a lock that wasn't locked.. -} - -//============================================================================== -void ReadWriteLock::enterWrite() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - for (;;) - { - if (readerThreads.size() + numWriters == 0 - || threadId == writerThreadId - || (readerThreads.size() == 1 - && readerThreads.getReference(0).threadID == threadId)) - { - writerThreadId = threadId; - ++numWriters; - break; - } - - ++numWaitingWriters; - accessLock.exit(); - waitEvent.wait (100); - accessLock.enter(); - --numWaitingWriters; - } -} - -bool ReadWriteLock::tryEnterWrite() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - if (readerThreads.size() + numWriters == 0 - || threadId == writerThreadId - || (readerThreads.size() == 1 - && readerThreads.getReference(0).threadID == threadId)) - { - writerThreadId = threadId; - ++numWriters; - return true; - } - - return false; -} - -void ReadWriteLock::exitWrite() const noexcept -{ - const SpinLock::ScopedLockType sl (accessLock); - - // check this thread actually had the lock.. - bassert (numWriters > 0 && writerThreadId == Thread::getCurrentThreadId()); - - if (--numWriters == 0) - { - writerThreadId = 0; - waitEvent.signal(); - } -} diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.h b/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.h deleted file mode 100644 index 1b9d961e02..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ReadWriteLock.h +++ /dev/null @@ -1,154 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_READWRITELOCK_BEASTHEADER -#define BEAST_READWRITELOCK_BEASTHEADER - -#include "beast_CriticalSection.h" -#include "beast_SpinLock.h" -#include "beast_WaitableEvent.h" -#include "beast_Thread.h" -#include "../containers/beast_Array.h" - - -//============================================================================== -/** - A critical section that allows multiple simultaneous readers. - - Features of this type of lock are: - - - Multiple readers can hold the lock at the same time, but only one writer - can hold it at once. - - Writers trying to gain the lock will be blocked until all readers and writers - have released it - - Readers trying to gain the lock while a writer is waiting to acquire it will be - blocked until the writer has obtained and released it - - If a thread already has a read lock and tries to obtain a write lock, it will succeed if - there are no other readers - - If a thread already has the write lock and tries to obtain a read lock, this will succeed. - - Recursive locking is supported. - - @see ScopedReadLock, ScopedWriteLock, CriticalSection -*/ -class BEAST_API ReadWriteLock -{ -public: - //============================================================================== - /** - Creates a ReadWriteLock object. - */ - ReadWriteLock() noexcept; - - /** Destructor. - - If the object is deleted whilst locked, any subsequent behaviour - is unpredictable. - */ - ~ReadWriteLock() noexcept; - - //============================================================================== - /** Locks this object for reading. - - Multiple threads can simulaneously lock the object for reading, but if another - thread has it locked for writing, then this will block until it releases the - lock. - - @see exitRead, ScopedReadLock - */ - void enterRead() const noexcept; - - /** Tries to lock this object for reading. - - Multiple threads can simulaneously lock the object for reading, but if another - thread has it locked for writing, then this will fail and return false. - - @returns true if the lock is successfully gained. - @see exitRead, ScopedReadLock - */ - bool tryEnterRead() const noexcept; - - /** Releases the read-lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enterRead() method has been called multiple times by the thread, each - call must be matched by a call to exitRead() before other threads will be allowed - to take over the lock. - - @see enterRead, ScopedReadLock - */ - void exitRead() const noexcept; - - //============================================================================== - /** Locks this object for writing. - - This will block until any other threads that have it locked for reading or - writing have released their lock. - - @see exitWrite, ScopedWriteLock - */ - void enterWrite() const noexcept; - - /** Tries to lock this object for writing. - - This is like enterWrite(), but doesn't block - it returns true if it manages - to obtain the lock. - - @returns true if the lock is successfully gained. - @see enterWrite - */ - bool tryEnterWrite() const noexcept; - - /** Releases the write-lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enterWrite() method has been called multiple times by the thread, each - call must be matched by a call to exit() before other threads will be allowed - to take over the lock. - - @see enterWrite, ScopedWriteLock - */ - void exitWrite() const noexcept; - - -private: - //============================================================================== - SpinLock accessLock; - WaitableEvent waitEvent; - mutable int numWaitingWriters, numWriters; - mutable Thread::ThreadID writerThreadId; - - struct ThreadRecursionCount - { - Thread::ThreadID threadID; - int count; - }; - - mutable Array readerThreads; - - BEAST_DECLARE_NON_COPYABLE (ReadWriteLock) -}; - - -#endif // BEAST_READWRITELOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ScopedLock.h b/Subtrees/beast/modules/beast_core/threads/beast_ScopedLock.h deleted file mode 100644 index cd19d5df60..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ScopedLock.h +++ /dev/null @@ -1,232 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SCOPEDLOCK_BEASTHEADER -#define BEAST_SCOPEDLOCK_BEASTHEADER - - -//============================================================================== -/** - Automatically locks and unlocks a mutex object. - - Use one of these as a local variable to provide RAII-based locking of a mutex. - - The templated class could be a CriticalSection, SpinLock, or anything else that - provides enter() and exit() methods. - - e.g. @code - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ...do some stuff... - - // myCriticalSection gets unlocked here. - } - @endcode - - @see GenericScopedUnlock, CriticalSection, SpinLock, ScopedLock, ScopedUnlock -*/ -template -class GenericScopedLock -{ -public: - //============================================================================== - /** Creates a GenericScopedLock. - - As soon as it is created, this will acquire the lock, and when the GenericScopedLock - object is deleted, the lock will be released. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedLock (const LockType& lock) noexcept : lock_ (lock) { lock.enter(); } - - /** Destructor. - The lock will be released when the destructor is called. - Make sure this object is created and deleted by the same thread, otherwise there are - no guarantees what will happen! - */ - inline ~GenericScopedLock() noexcept { lock_.exit(); } - -private: - //============================================================================== - const LockType& lock_; - - BEAST_DECLARE_NON_COPYABLE (GenericScopedLock) -}; - - -//============================================================================== -/** - Automatically unlocks and re-locks a mutex object. - - This is the reverse of a GenericScopedLock object - instead of locking the mutex - for the lifetime of this object, it unlocks it. - - Make sure you don't try to unlock mutexes that aren't actually locked! - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ... do some stuff with it locked .. - - while (xyz) - { - ... do some stuff with it locked .. - - const GenericScopedUnlock unlocker (myCriticalSection); - - // myCriticalSection is now unlocked for the remainder of this block, - // and re-locked at the end. - - ...do some stuff with it unlocked ... - } - - // myCriticalSection gets unlocked here. - } - @endcode - - @see GenericScopedLock, CriticalSection, ScopedLock, ScopedUnlock -*/ -template -class GenericScopedUnlock -{ -public: - //============================================================================== - /** Creates a GenericScopedUnlock. - - As soon as it is created, this will unlock the CriticalSection, and - when the ScopedLock object is deleted, the CriticalSection will - be re-locked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedUnlock (const LockType& lock) noexcept : lock_ (lock) { lock.exit(); } - - /** Destructor. - - The CriticalSection will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~GenericScopedUnlock() noexcept { lock_.enter(); } - - -private: - //============================================================================== - const LockType& lock_; - - BEAST_DECLARE_NON_COPYABLE (GenericScopedUnlock) -}; - - -//============================================================================== -/** - Automatically locks and unlocks a mutex object. - - Use one of these as a local variable to provide RAII-based locking of a mutex. - - The templated class could be a CriticalSection, SpinLock, or anything else that - provides enter() and exit() methods. - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedTryLock myScopedTryLock (myCriticalSection); - - // Unlike using a ScopedLock, this may fail to actually get the lock, so you - // should test this with the isLocked() method before doing your thread-unsafe - // action.. - if (myScopedTryLock.isLocked()) - { - ...do some stuff... - } - else - { - ..our attempt at locking failed because another thread had already locked it.. - } - - // myCriticalSection gets unlocked here (if it was locked) - } - @endcode - - @see CriticalSection::tryEnter, GenericScopedLock, GenericScopedUnlock -*/ -template -class GenericScopedTryLock -{ -public: - //============================================================================== - /** Creates a GenericScopedTryLock. - - As soon as it is created, this will attempt to acquire the lock, and when the - GenericScopedTryLock is deleted, the lock will be released (if the lock was - successfully acquired). - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedTryLock (const LockType& lock) noexcept - : lock_ (lock), lockWasSuccessful (lock.tryEnter()) {} - - /** Destructor. - - The mutex will be unlocked (if it had been successfully locked) when the - destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~GenericScopedTryLock() noexcept { if (lockWasSuccessful) lock_.exit(); } - - /** Returns true if the mutex was successfully locked. */ - bool isLocked() const noexcept { return lockWasSuccessful; } - -private: - //============================================================================== - const LockType& lock_; - const bool lockWasSuccessful; - - BEAST_DECLARE_NON_COPYABLE (GenericScopedTryLock) -}; - - -#endif // BEAST_SCOPEDLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ScopedReadLock.h b/Subtrees/beast/modules/beast_core/threads/beast_ScopedReadLock.h deleted file mode 100644 index 0ec698c6ae..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ScopedReadLock.h +++ /dev/null @@ -1,87 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SCOPEDREADLOCK_BEASTHEADER -#define BEAST_SCOPEDREADLOCK_BEASTHEADER - -#include "beast_ReadWriteLock.h" - - -//============================================================================== -/** - Automatically locks and unlocks a ReadWriteLock object. - - Use one of these as a local variable to control access to a ReadWriteLock. - - e.g. @code - - ReadWriteLock myLock; - - for (;;) - { - const ScopedReadLock myScopedLock (myLock); - // myLock is now locked - - ...do some stuff... - - // myLock gets unlocked here. - } - @endcode - - @see ReadWriteLock, ScopedWriteLock -*/ -class BEAST_API ScopedReadLock -{ -public: - //============================================================================== - /** Creates a ScopedReadLock. - - As soon as it is created, this will call ReadWriteLock::enterRead(), and - when the ScopedReadLock object is deleted, the ReadWriteLock will - be unlocked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedReadLock (const ReadWriteLock& lock) noexcept : lock_ (lock) { lock.enterRead(); } - - /** Destructor. - - The ReadWriteLock's exitRead() method will be called when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedReadLock() noexcept { lock_.exitRead(); } - - -private: - //============================================================================== - const ReadWriteLock& lock_; - - BEAST_DECLARE_NON_COPYABLE (ScopedReadLock) -}; - - -#endif // BEAST_SCOPEDREADLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ScopedWriteLock.h b/Subtrees/beast/modules/beast_core/threads/beast_ScopedWriteLock.h deleted file mode 100644 index fc0894fdb1..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ScopedWriteLock.h +++ /dev/null @@ -1,87 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SCOPEDWRITELOCK_BEASTHEADER -#define BEAST_SCOPEDWRITELOCK_BEASTHEADER - -#include "beast_ReadWriteLock.h" - - -//============================================================================== -/** - Automatically locks and unlocks a ReadWriteLock object. - - Use one of these as a local variable to control access to a ReadWriteLock. - - e.g. @code - - ReadWriteLock myLock; - - for (;;) - { - const ScopedWriteLock myScopedLock (myLock); - // myLock is now locked - - ...do some stuff... - - // myLock gets unlocked here. - } - @endcode - - @see ReadWriteLock, ScopedReadLock -*/ -class BEAST_API ScopedWriteLock -{ -public: - //============================================================================== - /** Creates a ScopedWriteLock. - - As soon as it is created, this will call ReadWriteLock::enterWrite(), and - when the ScopedWriteLock object is deleted, the ReadWriteLock will - be unlocked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedWriteLock (const ReadWriteLock& lock) noexcept : lock_ (lock) { lock.enterWrite(); } - - /** Destructor. - - The ReadWriteLock's exitWrite() method will be called when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedWriteLock() noexcept { lock_.exitWrite(); } - - -private: - //============================================================================== - const ReadWriteLock& lock_; - - BEAST_DECLARE_NON_COPYABLE (ScopedWriteLock) -}; - - -#endif // BEAST_SCOPEDWRITELOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_SpinLock.h b/Subtrees/beast/modules/beast_core/threads/beast_SpinLock.h deleted file mode 100644 index 4d773a6042..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_SpinLock.h +++ /dev/null @@ -1,88 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_SPINLOCK_BEASTHEADER -#define BEAST_SPINLOCK_BEASTHEADER - -#include "beast_ScopedLock.h" - - -//============================================================================== -/** - A simple spin-lock class that can be used as a simple, low-overhead mutex for - uncontended situations. - - Note that unlike a CriticalSection, this type of lock is not re-entrant, and may - be less efficient when used it a highly contended situation, but it's very small and - requires almost no initialisation. - It's most appropriate for simple situations where you're only going to hold the - lock for a very brief time. - - @see CriticalSection -*/ -class BEAST_API SpinLock -{ -public: - inline SpinLock() noexcept {} - inline ~SpinLock() noexcept {} - - /** Acquires the lock. - This will block until the lock has been successfully acquired by this thread. - Note that a SpinLock is NOT re-entrant, and is not smart enough to know whether the - caller thread already has the lock - so if a thread tries to acquire a lock that it - already holds, this method will never return! - - It's strongly recommended that you never call this method directly - instead use the - ScopedLockType class to manage the locking using an RAII pattern instead. - */ - void enter() const noexcept; - - /** Attempts to acquire the lock, returning true if this was successful. */ - inline bool tryEnter() const noexcept - { - return lock.compareAndSetBool (1, 0); - } - - /** Releases the lock. */ - inline void exit() const noexcept - { - bassert (lock.value == 1); // Agh! Releasing a lock that isn't currently held! - lock = 0; - } - - //============================================================================== - /** Provides the type of scoped lock to use for locking a SpinLock. */ - typedef GenericScopedLock ScopedLockType; - - /** Provides the type of scoped unlocker to use with a SpinLock. */ - typedef GenericScopedUnlock ScopedUnlockType; - -private: - //============================================================================== - mutable Atomic lock; - - BEAST_DECLARE_NON_COPYABLE (SpinLock) -}; - - -#endif // BEAST_SPINLOCK_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_Thread.cpp b/Subtrees/beast/modules/beast_core/threads/beast_Thread.cpp deleted file mode 100644 index b891733651..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_Thread.cpp +++ /dev/null @@ -1,358 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -Thread::Thread (const String& threadName_) - : threadName (threadName_), - threadHandle (nullptr), - threadId (0), - threadPriority (5), - affinityMask (0), - shouldExit (false) -{ -} - -Thread::~Thread() -{ - /* If your thread class's destructor has been called without first stopping the thread, that - means that this partially destructed object is still performing some work - and that's - probably a Bad Thing! - - To avoid this type of nastiness, always make sure you call stopThread() before or during - your subclass's destructor. - */ - bassert (! isThreadRunning()); - - stopThread (100); -} - -//============================================================================== -// Use a ref-counted object to hold this shared data, so that it can outlive its static -// shared pointer when threads are still running during static shutdown. -struct CurrentThreadHolder : public ReferenceCountedObject -{ - CurrentThreadHolder() noexcept {} - - typedef ReferenceCountedObjectPtr Ptr; - ThreadLocalValue value; - - BEAST_DECLARE_NON_COPYABLE (CurrentThreadHolder) -}; - -static char currentThreadHolderLock [sizeof (SpinLock)]; // (statically initialised to zeros). - -static CurrentThreadHolder::Ptr getCurrentThreadHolder() -{ - static CurrentThreadHolder::Ptr currentThreadHolder; - SpinLock::ScopedLockType lock (*reinterpret_cast (currentThreadHolderLock)); - - if (currentThreadHolder == nullptr) - currentThreadHolder = new CurrentThreadHolder(); - - return currentThreadHolder; -} - -void Thread::threadEntryPoint() -{ - const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder()); - currentThreadHolder->value = this; - - BEAST_TRY - { - if (threadName.isNotEmpty()) - setCurrentThreadName (threadName); - - if (startSuspensionEvent.wait (10000)) - { - bassert (getCurrentThreadId() == threadId); - - if (affinityMask != 0) - setCurrentThreadAffinityMask (affinityMask); - - run(); - } - } - BEAST_CATCH_ALL_ASSERT - - currentThreadHolder->value.releaseCurrentThreadStorage(); - closeThreadHandle(); -} - -// used to wrap the incoming call from the platform-specific code -void BEAST_API beast_threadEntryPoint (void* userData) -{ - static_cast (userData)->threadEntryPoint(); -} - -//============================================================================== -void Thread::startThread() -{ - const ScopedLock sl (startStopLock); - - shouldExit = false; - - if (threadHandle == nullptr) - { - launchThread(); - setThreadPriority (threadHandle, threadPriority); - startSuspensionEvent.signal(); - } -} - -void Thread::startThread (const int priority) -{ - const ScopedLock sl (startStopLock); - - if (threadHandle == nullptr) - { - threadPriority = priority; - startThread(); - } - else - { - setPriority (priority); - } -} - -bool Thread::isThreadRunning() const -{ - return threadHandle != nullptr; -} - -Thread* Thread::getCurrentThread() -{ - return getCurrentThreadHolder()->value.get(); -} - -//============================================================================== -void Thread::signalThreadShouldExit() -{ - shouldExit = true; -} - -bool Thread::waitForThreadToExit (const int timeOutMilliseconds) const -{ - // Doh! So how exactly do you expect this thread to wait for itself to stop?? - bassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == 0); - - const uint32 timeoutEnd = Time::getMillisecondCounter() + (uint32) timeOutMilliseconds; - - while (isThreadRunning()) - { - if (timeOutMilliseconds >= 0 && Time::getMillisecondCounter() > timeoutEnd) - return false; - - sleep (2); - } - - return true; -} - -void Thread::stopThread (const int timeOutMilliseconds) -{ - // agh! You can't stop the thread that's calling this method! How on earth - // would that work?? - bassert (getCurrentThreadId() != getThreadId()); - - const ScopedLock sl (startStopLock); - - if (isThreadRunning()) - { - signalThreadShouldExit(); - notify(); - - if (timeOutMilliseconds != 0) - waitForThreadToExit (timeOutMilliseconds); - - if (isThreadRunning()) - { - // very bad karma if this point is reached, as there are bound to be - // locks and events left in silly states when a thread is killed by force.. - bassertfalse; - Logger::writeToLog ("!! killing thread by force !!"); - - killThread(); - - threadHandle = nullptr; - threadId = 0; - } - } -} - -//============================================================================== -bool Thread::setPriority (const int newPriority) -{ - // NB: deadlock possible if you try to set the thread prio from the thread itself, - // so using setCurrentThreadPriority instead in that case. - if (getCurrentThreadId() == getThreadId()) - return setCurrentThreadPriority (newPriority); - - const ScopedLock sl (startStopLock); - - if (setThreadPriority (threadHandle, newPriority)) - { - threadPriority = newPriority; - return true; - } - - return false; -} - -bool Thread::setCurrentThreadPriority (const int newPriority) -{ - return setThreadPriority (0, newPriority); -} - -void Thread::setAffinityMask (const uint32 newAffinityMask) -{ - affinityMask = newAffinityMask; -} - -//============================================================================== -bool Thread::wait (const int timeOutMilliseconds) const -{ - return defaultEvent.wait (timeOutMilliseconds); -} - -void Thread::notify() const -{ - defaultEvent.signal(); -} - -//============================================================================== -void SpinLock::enter() const noexcept -{ - if (! tryEnter()) - { - for (int i = 20; --i >= 0;) - if (tryEnter()) - return; - - while (! tryEnter()) - Thread::yield(); - } -} - -//============================================================================== -#if BEAST_UNIT_TESTS - -class AtomicTests : public UnitTest -{ -public: - AtomicTests() : UnitTest ("Atomics") {} - - void runTest() - { - beginTest ("Misc"); - - char a1[7]; - expect (numElementsInArray(a1) == 7); - int a2[3]; - expect (numElementsInArray(a2) == 3); - - expect (ByteOrder::swap ((uint16) 0x1122) == 0x2211); - expect (ByteOrder::swap ((uint32) 0x11223344) == 0x44332211); - expect (ByteOrder::swap ((uint64) literal64bit (0x1122334455667788)) == literal64bit (0x8877665544332211)); - - beginTest ("Atomic int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic unsigned int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic long"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic void*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic float"); - AtomicTester ::testFloat (*this); - #if ! BEAST_64BIT_ATOMICS_UNAVAILABLE // 64-bit intrinsics aren't available on some old platforms - beginTest ("Atomic int64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic double"); - AtomicTester ::testFloat (*this); - #endif - } - - template - class AtomicTester - { - public: - AtomicTester() {} - - static void testInteger (UnitTest& test) - { - Atomic a, b; - a.set ((Type) 10); - test.expect (a.value == (Type) 10); - test.expect (a.get() == (Type) 10); - a += (Type) 15; - test.expect (a.get() == (Type) 25); - a.memoryBarrier(); - a -= (Type) 5; - test.expect (a.get() == (Type) 20); - test.expect (++a == (Type) 21); - ++a; - test.expect (--a == (Type) 21); - test.expect (a.get() == (Type) 21); - a.memoryBarrier(); - - testFloat (test); - } - - static void testFloat (UnitTest& test) - { - Atomic a, b; - a = (Type) 21; - a.memoryBarrier(); - - /* These are some simple test cases to check the atomics - let me know - if any of these assertions fail on your system! - */ - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 100, (Type) 50) == (Type) 21); - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 101, a.get()) == (Type) 21); - test.expect (a.get() == (Type) 101); - test.expect (! a.compareAndSetBool ((Type) 300, (Type) 200)); - test.expect (a.get() == (Type) 101); - test.expect (a.compareAndSetBool ((Type) 200, a.get())); - test.expect (a.get() == (Type) 200); - - test.expect (a.exchange ((Type) 300) == (Type) 200); - test.expect (a.get() == (Type) 300); - - b = a; - test.expect (b.get() == a.get()); - } - }; -}; - -static AtomicTests atomicUnitTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/threads/beast_Thread.h b/Subtrees/beast/modules/beast_core/threads/beast_Thread.h deleted file mode 100644 index e553913da6..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_Thread.h +++ /dev/null @@ -1,287 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THREAD_BEASTHEADER -#define BEAST_THREAD_BEASTHEADER - -#include "beast_WaitableEvent.h" -#include "beast_CriticalSection.h" - - -//============================================================================== -/** - Encapsulates a thread. - - Subclasses derive from Thread and implement the run() method, in which they - do their business. The thread can then be started with the startThread() method - and controlled with various other methods. - - This class also contains some thread-related static methods, such - as sleep(), yield(), getCurrentThreadId() etc. - - @see CriticalSection, WaitableEvent, Process, ThreadWithProgressWindow, - MessageManagerLock -*/ -class BEAST_API Thread -{ -public: - //============================================================================== - /** - Creates a thread. - - When first created, the thread is not running. Use the startThread() - method to start it. - */ - explicit Thread (const String& threadName); - - /** Destructor. - - Deleting a Thread object that is running will only give the thread a - brief opportunity to stop itself cleanly, so it's recommended that you - should always call stopThread() with a decent timeout before deleting, - to avoid the thread being forcibly killed (which is a Bad Thing). - */ - virtual ~Thread(); - - //============================================================================== - /** Must be implemented to perform the thread's actual code. - - Remember that the thread must regularly check the threadShouldExit() - method whilst running, and if this returns true it should return from - the run() method as soon as possible to avoid being forcibly killed. - - @see threadShouldExit, startThread - */ - virtual void run() = 0; - - //============================================================================== - // Thread control functions.. - - /** Starts the thread running. - - This will start the thread's run() method. - (if it's already started, startThread() won't do anything). - - @see stopThread - */ - void startThread(); - - /** Starts the thread with a given priority. - - Launches the thread with a given priority, where 0 = lowest, 10 = highest. - If the thread is already running, its priority will be changed. - - @see startThread, setPriority - */ - void startThread (int priority); - - /** Attempts to stop the thread running. - - This method will cause the threadShouldExit() method to return true - and call notify() in case the thread is currently waiting. - - Hopefully the thread will then respond to this by exiting cleanly, and - the stopThread method will wait for a given time-period for this to - happen. - - If the thread is stuck and fails to respond after the time-out, it gets - forcibly killed, which is a very bad thing to happen, as it could still - be holding locks, etc. which are needed by other parts of your program. - - @param timeOutMilliseconds The number of milliseconds to wait for the - thread to finish before killing it by force. A negative - value in here will wait forever. - @see signalThreadShouldExit, threadShouldExit, waitForThreadToExit, isThreadRunning - */ - void stopThread (int timeOutMilliseconds); - - //============================================================================== - /** Returns true if the thread is currently active */ - bool isThreadRunning() const; - - /** Sets a flag to tell the thread it should stop. - - Calling this means that the threadShouldExit() method will then return true. - The thread should be regularly checking this to see whether it should exit. - - If your thread makes use of wait(), you might want to call notify() after calling - this method, to interrupt any waits that might be in progress, and allow it - to reach a point where it can exit. - - @see threadShouldExit - @see waitForThreadToExit - */ - void signalThreadShouldExit(); - - /** Checks whether the thread has been told to stop running. - - Threads need to check this regularly, and if it returns true, they should - return from their run() method at the first possible opportunity. - - @see signalThreadShouldExit - */ - inline bool threadShouldExit() const { return shouldExit; } - - /** Waits for the thread to stop. - - This will waits until isThreadRunning() is false or until a timeout expires. - - @param timeOutMilliseconds the time to wait, in milliseconds. If this value - is less than zero, it will wait forever. - @returns true if the thread exits, or false if the timeout expires first. - */ - bool waitForThreadToExit (int timeOutMilliseconds) const; - - //============================================================================== - /** Changes the thread's priority. - May return false if for some reason the priority can't be changed. - - @param priority the new priority, in the range 0 (lowest) to 10 (highest). A priority - of 5 is normal. - */ - bool setPriority (int priority); - - /** Changes the priority of the caller thread. - - Similar to setPriority(), but this static method acts on the caller thread. - May return false if for some reason the priority can't be changed. - - @see setPriority - */ - static bool setCurrentThreadPriority (int priority); - - //============================================================================== - /** Sets the affinity mask for the thread. - - This will only have an effect next time the thread is started - i.e. if the - thread is already running when called, it'll have no effect. - - @see setCurrentThreadAffinityMask - */ - void setAffinityMask (uint32 affinityMask); - - /** Changes the affinity mask for the caller thread. - - This will change the affinity mask for the thread that calls this static method. - - @see setAffinityMask - */ - static void setCurrentThreadAffinityMask (uint32 affinityMask); - - //============================================================================== - // this can be called from any thread that needs to pause.. - static void BEAST_CALLTYPE sleep (int milliseconds); - - /** Yields the calling thread's current time-slot. */ - static void BEAST_CALLTYPE yield(); - - //============================================================================== - /** Makes the thread wait for a notification. - - This puts the thread to sleep until either the timeout period expires, or - another thread calls the notify() method to wake it up. - - A negative time-out value means that the method will wait indefinitely. - - @returns true if the event has been signalled, false if the timeout expires. - */ - bool wait (int timeOutMilliseconds) const; - - /** Wakes up the thread. - - If the thread has called the wait() method, this will wake it up. - - @see wait - */ - void notify() const; - - //============================================================================== - /** A value type used for thread IDs. - @see getCurrentThreadId(), getThreadId() - */ - typedef void* ThreadID; - - /** Returns an id that identifies the caller thread. - - To find the ID of a particular thread object, use getThreadId(). - - @returns a unique identifier that identifies the calling thread. - @see getThreadId - */ - static ThreadID getCurrentThreadId(); - - /** Finds the thread object that is currently running. - - Note that the main UI thread (or other non-Beast threads) don't have a Thread - object associated with them, so this will return 0. - */ - static Thread* getCurrentThread(); - - /** Returns the ID of this thread. - - That means the ID of this thread object - not of the thread that's calling the method. - - This can change when the thread is started and stopped, and will be invalid if the - thread's not actually running. - - @see getCurrentThreadId - */ - ThreadID getThreadId() const noexcept { return threadId; } - - /** Returns the name of the thread. - - This is the name that gets set in the constructor. - */ - const String& getThreadName() const { return threadName; } - - /** Changes the name of the caller thread. - Different OSes may place different length or content limits on this name. - */ - static void setCurrentThreadName (const String& newThreadName); - - -private: - //============================================================================== - const String threadName; - void* volatile threadHandle; - ThreadID threadId; - CriticalSection startStopLock; - WaitableEvent startSuspensionEvent, defaultEvent; - int threadPriority; - uint32 affinityMask; - bool volatile shouldExit; - - #ifndef DOXYGEN - friend void BEAST_API beast_threadEntryPoint (void*); - #endif - - void launchThread(); - void closeThreadHandle(); - void killThread(); - void threadEntryPoint(); - static bool setThreadPriority (void*, int); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Thread) -}; - -#endif // BEAST_THREAD_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ThreadLocalValue.h b/Subtrees/beast/modules/beast_core/threads/beast_ThreadLocalValue.h deleted file mode 100644 index 2a0bd68fe4..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ThreadLocalValue.h +++ /dev/null @@ -1,194 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THREADLOCALVALUE_BEASTHEADER -#define BEAST_THREADLOCALVALUE_BEASTHEADER - -// (NB: on win32, native thread-locals aren't possible in a dynamically loaded DLL in XP). -#if ! ((BEAST_MSVC && (BEAST_64BIT || ! defined (BeastPlugin_PluginCode))) \ - || (BEAST_MAC && BEAST_CLANG && defined (MAC_OS_X_VERSION_10_7) \ - && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7)) - #define BEAST_NO_COMPILER_THREAD_LOCAL 1 -#endif - -//============================================================================== -/** - Provides cross-platform support for thread-local objects. - - This class holds an internal list of objects of the templated type, keeping - an instance for each thread that requests one. The first time a thread attempts - to access its value, an object is created and added to the list for that thread. - - Typically, you'll probably want to create a static instance of a ThreadLocalValue - object, or hold one within a singleton. - - The templated class for your value could be a primitive type, or any class that - has a default constructor and copy operator. - - When a thread no longer needs to use its value, it can call releaseCurrentThreadStorage() - to allow the storage to be re-used by another thread. If a thread exits without calling - this method, the object storage will be left allocated until the ThreadLocalValue object - is deleted. -*/ -template -class ThreadLocalValue -{ -public: - /** */ - ThreadLocalValue() noexcept - { - } - - /** Destructor. - When this object is deleted, all the value objects for all threads will be deleted. - */ - ~ThreadLocalValue() - { - #if BEAST_NO_COMPILER_THREAD_LOCAL - for (ObjectHolder* o = first.value; o != nullptr;) - { - ObjectHolder* const next = o->next; - delete o; - o = next; - } - #endif - } - - /** Returns a reference to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type& operator*() const noexcept { return get(); } - - /** Returns a pointer to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - operator Type*() const noexcept { return &get(); } - - /** Accesses a method or field of the value object. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type* operator->() const noexcept { return &get(); } - - /** Assigns a new value to the thread-local object. */ - ThreadLocalValue& operator= (const Type& newValue) { get() = newValue; return *this; } - - /** Returns a reference to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type& get() const noexcept - { - #if BEAST_NO_COMPILER_THREAD_LOCAL - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - if (o->threadId == threadId) - return o->object; - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - { - if (o->threadId == nullptr) - { - { - SpinLock::ScopedLockType sl (lock); - - if (o->threadId != nullptr) - continue; - - o->threadId = threadId; - } - - o->object = Type(); - return o->object; - } - } - - ObjectHolder* const newObject = new ObjectHolder (threadId); - - do - { - newObject->next = first.get(); - } - while (! first.compareAndSetBool (newObject, newObject->next)); - - return newObject->object; - #elif BEAST_MAC - static __thread Type object; - return object; - #elif BEAST_MSVC - static __declspec(thread) Type object; - return object; - #endif - } - - /** Called by a thread before it terminates, to allow this class to release - any storage associated with the thread. - */ - void releaseCurrentThreadStorage() - { - #if BEAST_NO_COMPILER_THREAD_LOCAL - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - { - if (o->threadId == threadId) - { - SpinLock::ScopedLockType sl (lock); - o->threadId = nullptr; - } - } - #endif - } - -private: - //============================================================================== - #if BEAST_NO_COMPILER_THREAD_LOCAL - struct ObjectHolder - { - ObjectHolder (const Thread::ThreadID& tid) - : threadId (tid), object() - {} - - Thread::ThreadID threadId; - ObjectHolder* next; - Type object; - - BEAST_DECLARE_NON_COPYABLE (ObjectHolder) - }; - - mutable Atomic first; - SpinLock lock; - #endif - - BEAST_DECLARE_NON_COPYABLE (ThreadLocalValue) -}; - - -#endif // BEAST_THREADLOCALVALUE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.cpp b/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.cpp deleted file mode 100644 index a7247ef955..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.cpp +++ /dev/null @@ -1,375 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -ThreadPoolJob::ThreadPoolJob (const String& name) - : jobName (name), - pool (nullptr), - shouldStop (false), - isActive (false), - shouldBeDeleted (false) -{ -} - -ThreadPoolJob::~ThreadPoolJob() -{ - // you mustn't delete a job while it's still in a pool! Use ThreadPool::removeJob() - // to remove it first! - bassert (pool == nullptr || ! pool->contains (this)); -} - -String ThreadPoolJob::getJobName() const -{ - return jobName; -} - -void ThreadPoolJob::setJobName (const String& newName) -{ - jobName = newName; -} - -void ThreadPoolJob::signalJobShouldExit() -{ - shouldStop = true; -} - -//============================================================================== -class ThreadPool::ThreadPoolThread : public Thread -{ -public: - ThreadPoolThread (ThreadPool& pool_) - : Thread ("Pool"), - pool (pool_) - { - } - - void run() - { - while (! threadShouldExit()) - { - if (! pool.runNextJob()) - wait (500); - } - } - -private: - ThreadPool& pool; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolThread) -}; - -//============================================================================== -ThreadPool::ThreadPool (const int numThreads) -{ - bassert (numThreads > 0); // not much point having a pool without any threads! - - createThreads (numThreads); -} - -ThreadPool::ThreadPool() -{ - createThreads (SystemStats::getNumCpus()); -} - -ThreadPool::~ThreadPool() -{ - removeAllJobs (true, 5000); - stopThreads(); -} - -void ThreadPool::createThreads (int numThreads) -{ - for (int i = bmax (1, numThreads); --i >= 0;) - threads.add (new ThreadPoolThread (*this)); - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->startThread(); -} - -void ThreadPool::stopThreads() -{ - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->signalThreadShouldExit(); - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->stopThread (500); -} - -void ThreadPool::addJob (ThreadPoolJob* const job, const bool deleteJobWhenFinished) -{ - bassert (job != nullptr); - bassert (job->pool == nullptr); - - if (job->pool == nullptr) - { - job->pool = this; - job->shouldStop = false; - job->isActive = false; - job->shouldBeDeleted = deleteJobWhenFinished; - - { - const ScopedLock sl (lock); - jobs.add (job); - } - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->notify(); - } -} - -int ThreadPool::getNumJobs() const -{ - return jobs.size(); -} - -ThreadPoolJob* ThreadPool::getJob (const int index) const -{ - const ScopedLock sl (lock); - return jobs [index]; -} - -bool ThreadPool::contains (const ThreadPoolJob* const job) const -{ - const ScopedLock sl (lock); - return jobs.contains (const_cast (job)); -} - -bool ThreadPool::isJobRunning (const ThreadPoolJob* const job) const -{ - const ScopedLock sl (lock); - return jobs.contains (const_cast (job)) && job->isActive; -} - -bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* const job, - const int timeOutMs) const -{ - if (job != nullptr) - { - const uint32 start = Time::getMillisecondCounter(); - - while (contains (job)) - { - if (timeOutMs >= 0 && Time::getMillisecondCounter() >= start + (uint32) timeOutMs) - return false; - - jobFinishedSignal.wait (2); - } - } - - return true; -} - -bool ThreadPool::removeJob (ThreadPoolJob* const job, - const bool interruptIfRunning, - const int timeOutMs) -{ - bool dontWait = true; - OwnedArray deletionList; - - if (job != nullptr) - { - const ScopedLock sl (lock); - - if (jobs.contains (job)) - { - if (job->isActive) - { - if (interruptIfRunning) - job->signalJobShouldExit(); - - dontWait = false; - } - else - { - jobs.removeFirstMatchingValue (job); - addToDeleteList (deletionList, job); - } - } - } - - return dontWait || waitForJobToFinish (job, timeOutMs); -} - -bool ThreadPool::removeAllJobs (const bool interruptRunningJobs, const int timeOutMs, - ThreadPool::JobSelector* selectedJobsToRemove) -{ - Array jobsToWaitFor; - - { - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - for (int i = jobs.size(); --i >= 0;) - { - ThreadPoolJob* const job = jobs.getUnchecked(i); - - if (selectedJobsToRemove == nullptr || selectedJobsToRemove->isJobSuitable (job)) - { - if (job->isActive) - { - jobsToWaitFor.add (job); - - if (interruptRunningJobs) - job->signalJobShouldExit(); - } - else - { - jobs.remove (i); - addToDeleteList (deletionList, job); - } - } - } - } - } - - const uint32 start = Time::getMillisecondCounter(); - - for (;;) - { - for (int i = jobsToWaitFor.size(); --i >= 0;) - { - ThreadPoolJob* const job = jobsToWaitFor.getUnchecked (i); - - if (! isJobRunning (job)) - jobsToWaitFor.remove (i); - } - - if (jobsToWaitFor.size() == 0) - break; - - if (timeOutMs >= 0 && Time::getMillisecondCounter() >= start + (uint32) timeOutMs) - return false; - - jobFinishedSignal.wait (20); - } - - return true; -} - -StringArray ThreadPool::getNamesOfAllJobs (const bool onlyReturnActiveJobs) const -{ - StringArray s; - const ScopedLock sl (lock); - - for (int i = 0; i < jobs.size(); ++i) - { - const ThreadPoolJob* const job = jobs.getUnchecked(i); - if (job->isActive || ! onlyReturnActiveJobs) - s.add (job->getJobName()); - } - - return s; -} - -bool ThreadPool::setThreadPriorities (const int newPriority) -{ - bool ok = true; - - for (int i = threads.size(); --i >= 0;) - if (! threads.getUnchecked(i)->setPriority (newPriority)) - ok = false; - - return ok; -} - -ThreadPoolJob* ThreadPool::pickNextJobToRun() -{ - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - for (int i = 0; i < jobs.size(); ++i) - { - ThreadPoolJob* job = jobs[i]; - - if (job != nullptr && ! job->isActive) - { - if (job->shouldStop) - { - jobs.remove (i); - addToDeleteList (deletionList, job); - --i; - continue; - } - - job->isActive = true; - return job; - } - } - } - - return nullptr; -} - -bool ThreadPool::runNextJob() -{ - ThreadPoolJob* const job = pickNextJobToRun(); - - if (job == nullptr) - return false; - - ThreadPoolJob::JobStatus result = ThreadPoolJob::jobHasFinished; - - BEAST_TRY - { - result = job->runJob(); - } - BEAST_CATCH_ALL_ASSERT - - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - if (jobs.contains (job)) - { - job->isActive = false; - - if (result != ThreadPoolJob::jobNeedsRunningAgain || job->shouldStop) - { - jobs.removeFirstMatchingValue (job); - addToDeleteList (deletionList, job); - - jobFinishedSignal.signal(); - } - else - { - // move the job to the end of the queue if it wants another go - jobs.move (jobs.indexOf (job), -1); - } - } - } - - return true; -} - -void ThreadPool::addToDeleteList (OwnedArray& deletionList, ThreadPoolJob* const job) const -{ - job->shouldStop = true; - job->pool = nullptr; - - if (job->shouldBeDeleted) - deletionList.add (job); -} diff --git a/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.h b/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.h deleted file mode 100644 index d4d5dfe835..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_ThreadPool.h +++ /dev/null @@ -1,313 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_THREADPOOL_BEASTHEADER -#define BEAST_THREADPOOL_BEASTHEADER - -#include "beast_Thread.h" -#include "../text/beast_StringArray.h" -#include "../containers/beast_Array.h" -#include "../containers/beast_OwnedArray.h" -class ThreadPool; -class ThreadPoolThread; - - -//============================================================================== -/** - A task that is executed by a ThreadPool object. - - A ThreadPool keeps a list of ThreadPoolJob objects which are executed by - its threads. - - The runJob() method needs to be implemented to do the task, and if the code that - does the work takes a significant time to run, it must keep checking the shouldExit() - method to see if something is trying to interrupt the job. If shouldExit() returns - true, the runJob() method must return immediately. - - @see ThreadPool, Thread -*/ -class BEAST_API ThreadPoolJob -{ -public: - //============================================================================== - /** Creates a thread pool job object. - After creating your job, add it to a thread pool with ThreadPool::addJob(). - */ - explicit ThreadPoolJob (const String& name); - - /** Destructor. */ - virtual ~ThreadPoolJob(); - - //============================================================================== - /** Returns the name of this job. - @see setJobName - */ - String getJobName() const; - - /** Changes the job's name. - @see getJobName - */ - void setJobName (const String& newName); - - //============================================================================== - /** These are the values that can be returned by the runJob() method. - */ - enum JobStatus - { - jobHasFinished = 0, /**< indicates that the job has finished and can be - removed from the pool. */ - - jobNeedsRunningAgain /**< indicates that the job would like to be called - again when a thread is free. */ - }; - - /** Peforms the actual work that this job needs to do. - - Your subclass must implement this method, in which is does its work. - - If the code in this method takes a significant time to run, it must repeatedly check - the shouldExit() method to see if something is trying to interrupt the job. - If shouldExit() ever returns true, the runJob() method must return immediately. - - If this method returns jobHasFinished, then the job will be removed from the pool - immediately. If it returns jobNeedsRunningAgain, then the job will be left in the - pool and will get a chance to run again as soon as a thread is free. - - @see shouldExit() - */ - virtual JobStatus runJob() = 0; - - - //============================================================================== - /** Returns true if this job is currently running its runJob() method. */ - bool isRunning() const noexcept { return isActive; } - - /** Returns true if something is trying to interrupt this job and make it stop. - - Your runJob() method must call this whenever it gets a chance, and if it ever - returns true, the runJob() method must return immediately. - - @see signalJobShouldExit() - */ - bool shouldExit() const noexcept { return shouldStop; } - - /** Calling this will cause the shouldExit() method to return true, and the job - should (if it's been implemented correctly) stop as soon as possible. - - @see shouldExit() - */ - void signalJobShouldExit(); - - //============================================================================== -private: - friend class ThreadPool; - friend class ThreadPoolThread; - String jobName; - ThreadPool* pool; - bool shouldStop, isActive, shouldBeDeleted; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolJob) -}; - - -//============================================================================== -/** - A set of threads that will run a list of jobs. - - When a ThreadPoolJob object is added to the ThreadPool's list, its runJob() method - will be called by the next pooled thread that becomes free. - - @see ThreadPoolJob, Thread -*/ -class BEAST_API ThreadPool -{ -public: - //============================================================================== - /** Creates a thread pool. - Once you've created a pool, you can give it some jobs by calling addJob(). - @param numberOfThreads the number of threads to run. These will be started - immediately, and will run until the pool is deleted. - */ - ThreadPool (int numberOfThreads); - - /** Creates a thread pool with one thread per CPU core. - Once you've created a pool, you can give it some jobs by calling addJob(). - If you want to specify the number of threads, use the other constructor; this - one creates a pool which has one thread for each CPU core. - @see SystemStats::getNumCpus() - */ - ThreadPool(); - - /** Destructor. - - This will attempt to remove all the jobs before deleting, but if you want to - specify a timeout, you should call removeAllJobs() explicitly before deleting - the pool. - */ - ~ThreadPool(); - - //============================================================================== - /** A callback class used when you need to select which ThreadPoolJob objects are suitable - for some kind of operation. - @see ThreadPool::removeAllJobs - */ - class BEAST_API JobSelector - { - public: - virtual ~JobSelector() {} - - /** Should return true if the specified thread matches your criteria for whatever - operation that this object is being used for. - - Any implementation of this method must be extremely fast and thread-safe! - */ - virtual bool isJobSuitable (ThreadPoolJob* job) = 0; - }; - - //============================================================================== - /** Adds a job to the queue. - - Once a job has been added, then the next time a thread is free, it will run - the job's ThreadPoolJob::runJob() method. Depending on the return value of the - runJob() method, the pool will either remove the job from the pool or add it to - the back of the queue to be run again. - - If deleteJobWhenFinished is true, then the job object will be owned and deleted by - the pool when not needed - if you do this, make sure that your object's destructor - is thread-safe. - - If deleteJobWhenFinished is false, the pointer will be used but not deleted, and - the caller is responsible for making sure the object is not deleted before it has - been removed from the pool. - */ - void addJob (ThreadPoolJob* job, - bool deleteJobWhenFinished); - - /** Tries to remove a job from the pool. - - If the job isn't yet running, this will simply remove it. If it is running, it - will wait for it to finish. - - If the timeout period expires before the job finishes running, then the job will be - left in the pool and this will return false. It returns true if the job is sucessfully - stopped and removed. - - @param job the job to remove - @param interruptIfRunning if true, then if the job is currently busy, its - ThreadPoolJob::signalJobShouldExit() method will be called to try - to interrupt it. If false, then if the job will be allowed to run - until it stops normally (or the timeout expires) - @param timeOutMilliseconds the length of time this method should wait for the job to finish - before giving up and returning false - */ - bool removeJob (ThreadPoolJob* job, - bool interruptIfRunning, - int timeOutMilliseconds); - - /** Tries to remove all jobs from the pool. - - @param interruptRunningJobs if true, then all running jobs will have their ThreadPoolJob::signalJobShouldExit() - methods called to try to interrupt them - @param timeOutMilliseconds the length of time this method should wait for all the jobs to finish - before giving up and returning false - @param selectedJobsToRemove if this is non-zero, the JobSelector object is asked to decide which - jobs should be removed. If it is zero, all jobs are removed - @returns true if all jobs are successfully stopped and removed; false if the timeout period - expires while waiting for one or more jobs to stop - */ - bool removeAllJobs (bool interruptRunningJobs, - int timeOutMilliseconds, - JobSelector* selectedJobsToRemove = nullptr); - - /** Returns the number of jobs currently running or queued. - */ - int getNumJobs() const; - - /** Returns one of the jobs in the queue. - - Note that this can be a very volatile list as jobs might be continuously getting shifted - around in the list, and this method may return 0 if the index is currently out-of-range. - */ - ThreadPoolJob* getJob (int index) const; - - /** Returns true if the given job is currently queued or running. - - @see isJobRunning() - */ - bool contains (const ThreadPoolJob* job) const; - - /** Returns true if the given job is currently being run by a thread. - */ - bool isJobRunning (const ThreadPoolJob* job) const; - - /** Waits until a job has finished running and has been removed from the pool. - - This will wait until the job is no longer in the pool - i.e. until its - runJob() method returns ThreadPoolJob::jobHasFinished. - - If the timeout period expires before the job finishes, this will return false; - it returns true if the job has finished successfully. - */ - bool waitForJobToFinish (const ThreadPoolJob* job, - int timeOutMilliseconds) const; - - /** Returns a list of the names of all the jobs currently running or queued. - If onlyReturnActiveJobs is true, only the ones currently running are returned. - */ - StringArray getNamesOfAllJobs (bool onlyReturnActiveJobs) const; - - /** Changes the priority of all the threads. - - This will call Thread::setPriority() for each thread in the pool. - May return false if for some reason the priority can't be changed. - */ - bool setThreadPriorities (int newPriority); - - -private: - //============================================================================== - Array jobs; - - class ThreadPoolThread; - friend class ThreadPoolThread; - friend class OwnedArray ; - OwnedArray threads; - - CriticalSection lock; - WaitableEvent jobFinishedSignal; - - bool runNextJob(); - ThreadPoolJob* pickNextJobToRun(); - void addToDeleteList (OwnedArray&, ThreadPoolJob*) const; - void createThreads (int numThreads); - void stopThreads(); - - // Note that this method has changed, and no longer has a parameter to indicate - // whether the jobs should be deleted - see the new method for details. - void removeAllJobs (bool, int, bool); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPool) -}; - - -#endif // BEAST_THREADPOOL_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.cpp b/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.cpp deleted file mode 100644 index 106e7084db..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -TimeSliceThread::TimeSliceThread (const String& name) - : Thread (name), - clientBeingCalled (nullptr) -{ -} - -TimeSliceThread::~TimeSliceThread() -{ - stopThread (2000); -} - -//============================================================================== -void TimeSliceThread::addTimeSliceClient (TimeSliceClient* const client, int millisecondsBeforeStarting) -{ - if (client != nullptr) - { - const ScopedLock sl (listLock); - client->nextCallTime = Time::getCurrentTime() + RelativeTime::milliseconds (millisecondsBeforeStarting); - clients.addIfNotAlreadyThere (client); - notify(); - } -} - -void TimeSliceThread::removeTimeSliceClient (TimeSliceClient* const client) -{ - const ScopedLock sl1 (listLock); - - // if there's a chance we're in the middle of calling this client, we need to - // also lock the outer lock.. - if (clientBeingCalled == client) - { - const ScopedUnlock ul (listLock); // unlock first to get the order right.. - - const ScopedLock sl2 (callbackLock); - const ScopedLock sl3 (listLock); - - clients.removeFirstMatchingValue (client); - } - else - { - clients.removeFirstMatchingValue (client); - } -} - -void TimeSliceThread::moveToFrontOfQueue (TimeSliceClient* client) -{ - const ScopedLock sl (listLock); - - if (clients.contains (client)) - { - client->nextCallTime = Time::getCurrentTime(); - notify(); - } -} - -int TimeSliceThread::getNumClients() const -{ - return clients.size(); -} - -TimeSliceClient* TimeSliceThread::getClient (const int i) const -{ - const ScopedLock sl (listLock); - return clients [i]; -} - -//============================================================================== -TimeSliceClient* TimeSliceThread::getNextClient (int index) const -{ - Time soonest; - TimeSliceClient* client = nullptr; - - for (int i = clients.size(); --i >= 0;) - { - TimeSliceClient* const c = clients.getUnchecked ((i + index) % clients.size()); - - if (client == nullptr || c->nextCallTime < soonest) - { - client = c; - soonest = c->nextCallTime; - } - } - - return client; -} - -void TimeSliceThread::run() -{ - int index = 0; - - while (! threadShouldExit()) - { - int timeToWait = 500; - - { - Time nextClientTime; - - { - const ScopedLock sl2 (listLock); - - index = clients.size() > 0 ? ((index + 1) % clients.size()) : 0; - - if (TimeSliceClient* const firstClient = getNextClient (index)) - nextClientTime = firstClient->nextCallTime; - } - - const Time now (Time::getCurrentTime()); - - if (nextClientTime > now) - { - timeToWait = (int) bmin ((int64) 500, (nextClientTime - now).inMilliseconds()); - } - else - { - timeToWait = index == 0 ? 1 : 0; - - const ScopedLock sl (callbackLock); - - { - const ScopedLock sl2 (listLock); - clientBeingCalled = getNextClient (index); - } - - if (clientBeingCalled != nullptr) - { - const int msUntilNextCall = clientBeingCalled->useTimeSlice(); - - const ScopedLock sl2 (listLock); - - if (msUntilNextCall >= 0) - clientBeingCalled->nextCallTime = now + RelativeTime::milliseconds (msUntilNextCall); - else - clients.removeFirstMatchingValue (clientBeingCalled); - - clientBeingCalled = nullptr; - } - } - } - - if (timeToWait > 0) - wait (timeToWait); - } -} diff --git a/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.h b/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.h deleted file mode 100644 index eddba2e6e4..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_TimeSliceThread.h +++ /dev/null @@ -1,147 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_TIMESLICETHREAD_BEASTHEADER -#define BEAST_TIMESLICETHREAD_BEASTHEADER - -#include "beast_Thread.h" -#include "../containers/beast_Array.h" -#include "../time/beast_Time.h" -class TimeSliceThread; - - -//============================================================================== -/** - Used by the TimeSliceThread class. - - To register your class with a TimeSliceThread, derive from this class and - use the TimeSliceThread::addTimeSliceClient() method to add it to the list. - - Make sure you always call TimeSliceThread::removeTimeSliceClient() before - deleting your client! - - @see TimeSliceThread -*/ -class BEAST_API TimeSliceClient -{ -public: - /** Destructor. */ - virtual ~TimeSliceClient() {} - - /** Called back by a TimeSliceThread. - - When you register this class with it, a TimeSliceThread will repeatedly call - this method. - - The implementation of this method should use its time-slice to do something that's - quick - never block for longer than absolutely necessary. - - @returns Your method should return the number of milliseconds which it would like to wait before being called - again. Returning 0 will make the thread call again as soon as possible (after possibly servicing - other busy clients). If you return a value below zero, your client will be removed from the list of clients, - and won't be called again. The value you specify isn't a guaranteee, and is only used as a hint by the - thread - the actual time before the next callback may be more or less than specified. - You can force the TimeSliceThread to wake up and poll again immediately by calling its notify() method. - */ - virtual int useTimeSlice() = 0; - - -private: - friend class TimeSliceThread; - Time nextCallTime; -}; - - -//============================================================================== -/** - A thread that keeps a list of clients, and calls each one in turn, giving them - all a chance to run some sort of short task. - - @see TimeSliceClient, Thread -*/ -class BEAST_API TimeSliceThread : public Thread -{ -public: - //============================================================================== - /** - Creates a TimeSliceThread. - - When first created, the thread is not running. Use the startThread() - method to start it. - */ - explicit TimeSliceThread (const String& threadName); - - /** Destructor. - - Deleting a Thread object that is running will only give the thread a - brief opportunity to stop itself cleanly, so it's recommended that you - should always call stopThread() with a decent timeout before deleting, - to avoid the thread being forcibly killed (which is a Bad Thing). - */ - ~TimeSliceThread(); - - //============================================================================== - /** Adds a client to the list. - - The client's callbacks will start after the number of milliseconds specified - by millisecondsBeforeStarting (and this may happen before this method has returned). - */ - void addTimeSliceClient (TimeSliceClient* client, int millisecondsBeforeStarting = 0); - - /** Removes a client from the list. - - This method will make sure that all callbacks to the client have completely - finished before the method returns. - */ - void removeTimeSliceClient (TimeSliceClient* client); - - /** If the given client is waiting in the queue, it will be moved to the front - and given a time-slice as soon as possible. - If the specified client has not been added, nothing will happen. - */ - void moveToFrontOfQueue (TimeSliceClient* client); - - /** Returns the number of registered clients. */ - int getNumClients() const; - - /** Returns one of the registered clients. */ - TimeSliceClient* getClient (int index) const; - - //============================================================================== - #ifndef DOXYGEN - void run(); - #endif - - //============================================================================== -private: - CriticalSection callbackLock, listLock; - Array clients; - TimeSliceClient* clientBeingCalled; - - TimeSliceClient* getNextClient (int index) const; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimeSliceThread) -}; - - -#endif // BEAST_TIMESLICETHREAD_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/threads/beast_WaitableEvent.h b/Subtrees/beast/modules/beast_core/threads/beast_WaitableEvent.h deleted file mode 100644 index e95ef02044..0000000000 --- a/Subtrees/beast/modules/beast_core/threads/beast_WaitableEvent.h +++ /dev/null @@ -1,114 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_WAITABLEEVENT_BEASTHEADER -#define BEAST_WAITABLEEVENT_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** - Allows threads to wait for events triggered by other threads. - - A thread can call wait() on a WaitableObject, and this will suspend the - calling thread until another thread wakes it up by calling the signal() - method. -*/ -class BEAST_API WaitableEvent -{ -public: - //============================================================================== - /** Creates a WaitableEvent object. - - @param manualReset If this is false, the event will be reset automatically when the wait() - method is called. If manualReset is true, then once the event is signalled, - the only way to reset it will be by calling the reset() method. - */ - WaitableEvent (bool manualReset = false) noexcept; - - /** Destructor. - - If other threads are waiting on this object when it gets deleted, this - can cause nasty errors, so be careful! - */ - ~WaitableEvent() noexcept; - - //============================================================================== - /** Suspends the calling thread until the event has been signalled. - - This will wait until the object's signal() method is called by another thread, - or until the timeout expires. - - After the event has been signalled, this method will return true and if manualReset - was set to false in the WaitableEvent's constructor, then the event will be reset. - - @param timeOutMilliseconds the maximum time to wait, in milliseconds. A negative - value will cause it to wait forever. - - @returns true if the object has been signalled, false if the timeout expires first. - @see signal, reset - */ - bool wait (int timeOutMilliseconds = -1) const noexcept; - - //============================================================================== - /** Wakes up any threads that are currently waiting on this object. - - If signal() is called when nothing is waiting, the next thread to call wait() - will return immediately and reset the signal. - - If the WaitableEvent is manual reset, all current and future threads that wait upon this - object will be woken, until reset() is explicitly called. - - If the WaitableEvent is automatic reset, and one or more threads is waiting upon the object, - then one of them will be woken up. If no threads are currently waiting, then the next thread - to call wait() will be woken up. As soon as a thread is woken, the signal is automatically - reset. - - @see wait, reset - */ - void signal() const noexcept; - - //============================================================================== - /** Resets the event to an unsignalled state. - - If it's not already signalled, this does nothing. - */ - void reset() const noexcept; - - -private: - //============================================================================== - #if BEAST_WINDOWS - void* internal; - #else - mutable pthread_cond_t condition; - mutable pthread_mutex_t mutex; - mutable bool triggered, manualReset; - #endif - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaitableEvent) -}; - - -#endif // BEAST_WAITABLEEVENT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.cpp b/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.cpp deleted file mode 100644 index fe1f82c8af..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -PerformanceCounter::PerformanceCounter (const String& name_, - const int runsPerPrintout, - const File& loggingFile) - : name (name_), - numRuns (0), - runsPerPrint (runsPerPrintout), - totalTime (0), - outputFile (loggingFile) -{ - if (outputFile != File::nonexistent) - { - String s ("**** Counter for \""); - s << name_ << "\" started at: " - << Time::getCurrentTime().toString (true, true) - << newLine; - - outputFile.appendText (s, false, false); - } -} - -PerformanceCounter::~PerformanceCounter() -{ - printStatistics(); -} - -void PerformanceCounter::start() -{ - started = Time::getHighResolutionTicks(); -} - -void PerformanceCounter::stop() -{ - const int64 now = Time::getHighResolutionTicks(); - - totalTime += 1000.0 * Time::highResolutionTicksToSeconds (now - started); - - if (++numRuns == runsPerPrint) - printStatistics(); -} - -void PerformanceCounter::printStatistics() -{ - if (numRuns > 0) - { - String s ("Performance count for \""); - s << name << "\" - average over " << numRuns << " run(s) = "; - - const int micros = (int) (totalTime * (1000.0 / numRuns)); - - if (micros > 10000) - s << (micros/1000) << " millisecs"; - else - s << micros << " microsecs"; - - s << ", total = " << String (totalTime / 1000, 5) << " seconds"; - - Logger::outputDebugString (s); - - s << newLine; - - if (outputFile != File::nonexistent) - outputFile.appendText (s, false, false); - - numRuns = 0; - totalTime = 0; - } -} diff --git a/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.h b/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.h deleted file mode 100644 index f826511382..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_PerformanceCounter.h +++ /dev/null @@ -1,103 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_PERFORMANCECOUNTER_BEASTHEADER -#define BEAST_PERFORMANCECOUNTER_BEASTHEADER - -#include "../files/beast_File.h" - - -//============================================================================== -/** A timer for measuring performance of code and dumping the results to a file. - - e.g. @code - - PerformanceCounter pc ("fish", 50, "/temp/myfishlog.txt"); - - for (;;) - { - pc.start(); - - doSomethingFishy(); - - pc.stop(); - } - @endcode - - In this example, the time of each period between calling start/stop will be - measured and averaged over 50 runs, and the results printed to a file - every 50 times round the loop. -*/ -class BEAST_API PerformanceCounter -{ -public: - //============================================================================== - /** Creates a PerformanceCounter object. - - @param counterName the name used when printing out the statistics - @param runsPerPrintout the number of start/stop iterations before calling - printStatistics() - @param loggingFile a file to dump the results to - if this is File::nonexistent, - the results are just written to the debugger output - */ - PerformanceCounter (const String& counterName, - int runsPerPrintout = 100, - const File& loggingFile = File::nonexistent); - - /** Destructor. */ - ~PerformanceCounter(); - - //============================================================================== - /** Starts timing. - - @see stop - */ - void start(); - - /** Stops timing and prints out the results. - - The number of iterations before doing a printout of the - results is set in the constructor. - - @see start - */ - void stop(); - - /** Dumps the current metrics to the debugger output and to a file. - - As well as using Logger::outputDebugString to print the results, - this will write then to the file specified in the constructor (if - this was valid). - */ - void printStatistics(); - -private: - //============================================================================== - String name; - int numRuns, runsPerPrint; - double totalTime; - int64 started; - File outputFile; -}; - -#endif // BEAST_PERFORMANCECOUNTER_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.cpp b/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.cpp deleted file mode 100644 index 85db5c9b9e..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.cpp +++ /dev/null @@ -1,133 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -RelativeTime::RelativeTime (const double secs) noexcept : seconds (secs) {} -RelativeTime::RelativeTime (const RelativeTime& other) noexcept : seconds (other.seconds) {} -RelativeTime::~RelativeTime() noexcept {} - -//============================================================================== -RelativeTime RelativeTime::milliseconds (const int milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -RelativeTime RelativeTime::milliseconds (const int64 milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -RelativeTime RelativeTime::minutes (const double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); } -RelativeTime RelativeTime::hours (const double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); } -RelativeTime RelativeTime::days (const double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); } -RelativeTime RelativeTime::weeks (const double numberOfWeeks) noexcept { return RelativeTime (numberOfWeeks * (60.0 * 60.0 * 24.0 * 7.0)); } - -//============================================================================== -int64 RelativeTime::inMilliseconds() const noexcept { return (int64) (seconds * 1000.0); } -double RelativeTime::inMinutes() const noexcept { return seconds / 60.0; } -double RelativeTime::inHours() const noexcept { return seconds / (60.0 * 60.0); } -double RelativeTime::inDays() const noexcept { return seconds / (60.0 * 60.0 * 24.0); } -double RelativeTime::inWeeks() const noexcept { return seconds / (60.0 * 60.0 * 24.0 * 7.0); } - -//============================================================================== -RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept { seconds = other.seconds; return *this; } - -RelativeTime RelativeTime::operator+= (RelativeTime t) noexcept { seconds += t.seconds; return *this; } -RelativeTime RelativeTime::operator-= (RelativeTime t) noexcept { seconds -= t.seconds; return *this; } -RelativeTime RelativeTime::operator+= (const double secs) noexcept { seconds += secs; return *this; } -RelativeTime RelativeTime::operator-= (const double secs) noexcept { seconds -= secs; return *this; } - -RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept { return t1 += t2; } -RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept { return t1 -= t2; } - -bool operator== (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() == t2.inSeconds(); } -bool operator!= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() != t2.inSeconds(); } -bool operator> (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() > t2.inSeconds(); } -bool operator< (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() < t2.inSeconds(); } -bool operator>= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); } -bool operator<= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); } - -//============================================================================== -static void translateTimeField (String& result, int n, const char* singular, const char* plural) -{ - result << TRANS (n == 1 ? singular : plural) - .replace (n == 1 ? "1" : "2", String (n)) - << ' '; -} - -String RelativeTime::getDescription (const String& returnValueForZeroTime) const -{ - if (seconds < 0.001 && seconds > -0.001) - return returnValueForZeroTime; - - String result; - result.preallocateBytes (32); - - if (seconds < 0) - result << '-'; - - int fieldsShown = 0; - int n = std::abs ((int) inWeeks()); - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 week"), NEEDS_TRANS("2 weeks")); - ++fieldsShown; - } - - n = std::abs ((int) inDays()) % 7; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 day"), NEEDS_TRANS("2 days")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inHours()) % 24; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 hr"), NEEDS_TRANS("2 hrs")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inMinutes()) % 60; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 min"), NEEDS_TRANS("2 mins")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inSeconds()) % 60; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 sec"), NEEDS_TRANS("2 secs")); - ++fieldsShown; - } - - if (fieldsShown == 0) - { - n = std::abs ((int) inMilliseconds()) % 1000; - if (n > 0) - result << n << ' ' << TRANS ("ms"); - } - } - } - } - - return result.trimEnd(); -} diff --git a/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.h b/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.h deleted file mode 100644 index 3a3d9e2eb7..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_RelativeTime.h +++ /dev/null @@ -1,176 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_RELATIVETIME_BEASTHEADER -#define BEAST_RELATIVETIME_BEASTHEADER - -#include "../text/beast_String.h" - - -//============================================================================== -/** A relative measure of time. - - The time is stored as a number of seconds, at double-precision floating - point accuracy, and may be positive or negative. - - If you need an absolute time, (i.e. a date + time), see the Time class. -*/ -class BEAST_API RelativeTime -{ -public: - //============================================================================== - /** Creates a RelativeTime. - - @param seconds the number of seconds, which may be +ve or -ve. - @see milliseconds, minutes, hours, days, weeks - */ - explicit RelativeTime (double seconds = 0.0) noexcept; - - /** Copies another relative time. */ - RelativeTime (const RelativeTime& other) noexcept; - - /** Copies another relative time. */ - RelativeTime& operator= (const RelativeTime& other) noexcept; - - /** Destructor. */ - ~RelativeTime() noexcept; - - //============================================================================== - /** Creates a new RelativeTime object representing a number of milliseconds. - @see minutes, hours, days, weeks - */ - static RelativeTime milliseconds (int milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of milliseconds. - @see minutes, hours, days, weeks - */ - static RelativeTime milliseconds (int64 milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of minutes. - @see milliseconds, hours, days, weeks - */ - static RelativeTime minutes (double numberOfMinutes) noexcept; - - /** Creates a new RelativeTime object representing a number of hours. - @see milliseconds, minutes, days, weeks - */ - static RelativeTime hours (double numberOfHours) noexcept; - - /** Creates a new RelativeTime object representing a number of days. - @see milliseconds, minutes, hours, weeks - */ - static RelativeTime days (double numberOfDays) noexcept; - - /** Creates a new RelativeTime object representing a number of weeks. - @see milliseconds, minutes, hours, days - */ - static RelativeTime weeks (double numberOfWeeks) noexcept; - - //============================================================================== - /** Returns the number of milliseconds this time represents. - @see milliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks - */ - int64 inMilliseconds() const noexcept; - - /** Returns the number of seconds this time represents. - @see inMilliseconds, inMinutes, inHours, inDays, inWeeks - */ - double inSeconds() const noexcept { return seconds; } - - /** Returns the number of minutes this time represents. - @see inMilliseconds, inSeconds, inHours, inDays, inWeeks - */ - double inMinutes() const noexcept; - - /** Returns the number of hours this time represents. - @see inMilliseconds, inSeconds, inMinutes, inDays, inWeeks - */ - double inHours() const noexcept; - - /** Returns the number of days this time represents. - @see inMilliseconds, inSeconds, inMinutes, inHours, inWeeks - */ - double inDays() const noexcept; - - /** Returns the number of weeks this time represents. - @see inMilliseconds, inSeconds, inMinutes, inHours, inDays - */ - double inWeeks() const noexcept; - - /** Returns a readable textual description of the time. - - The exact format of the string returned will depend on - the magnitude of the time - e.g. - - "1 min 4 secs", "1 hr 45 mins", "2 weeks 5 days", "140 ms" - - so that only the two most significant units are printed. - - The returnValueForZeroTime value is the result that is returned if the - length is zero. Depending on your application you might want to use this - to return something more relevant like "empty" or "0 secs", etc. - - @see inMilliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks - */ - String getDescription (const String& returnValueForZeroTime = "0") const; - - - //============================================================================== - /** Adds another RelativeTime to this one. */ - RelativeTime operator+= (RelativeTime timeToAdd) noexcept; - /** Subtracts another RelativeTime from this one. */ - RelativeTime operator-= (RelativeTime timeToSubtract) noexcept; - - /** Adds a number of seconds to this time. */ - RelativeTime operator+= (double secondsToAdd) noexcept; - /** Subtracts a number of seconds from this time. */ - RelativeTime operator-= (double secondsToSubtract) noexcept; - -private: - //============================================================================== - double seconds; -}; - -//============================================================================== -/** Compares two RelativeTimes. */ -bool operator== (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator!= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator> (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator< (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator>= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator<= (RelativeTime t1, RelativeTime t2) noexcept; - -//============================================================================== -/** Adds two RelativeTimes together. */ -RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept; -/** Subtracts two RelativeTimes. */ -RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept; - - - -#endif // BEAST_RELATIVETIME_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/time/beast_Time.cpp b/Subtrees/beast/modules/beast_core/time/beast_Time.cpp deleted file mode 100644 index c84c98eaf6..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_Time.cpp +++ /dev/null @@ -1,441 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -namespace TimeHelpers -{ - static struct tm millisToLocal (const int64 millis) noexcept - { - struct tm result; - const int64 seconds = millis / 1000; - - if (seconds < literal64bit (86400) || seconds >= literal64bit (2145916800)) - { - // use extended maths for dates beyond 1970 to 2037.. - const int timeZoneAdjustment = 31536000 - (int) (Time (1971, 0, 1, 0, 0).toMilliseconds() / 1000); - const int64 jdm = seconds + timeZoneAdjustment + literal64bit (210866803200); - - const int days = (int) (jdm / literal64bit (86400)); - const int a = 32044 + days; - const int b = (4 * a + 3) / 146097; - const int c = a - (b * 146097) / 4; - const int d = (4 * c + 3) / 1461; - const int e = c - (d * 1461) / 4; - const int m = (5 * e + 2) / 153; - - result.tm_mday = e - (153 * m + 2) / 5 + 1; - result.tm_mon = m + 2 - 12 * (m / 10); - result.tm_year = b * 100 + d - 6700 + (m / 10); - result.tm_wday = (days + 1) % 7; - result.tm_yday = -1; - - int t = (int) (jdm % literal64bit (86400)); - result.tm_hour = t / 3600; - t %= 3600; - result.tm_min = t / 60; - result.tm_sec = t % 60; - result.tm_isdst = -1; - } - else - { - time_t now = static_cast (seconds); - - #if BEAST_WINDOWS - #ifdef _INC_TIME_INL - if (now >= 0 && now <= 0x793406fff) - localtime_s (&result, &now); - else - zerostruct (result); - #else - result = *localtime (&now); - #endif - #else - - localtime_r (&now, &result); // more thread-safe - #endif - } - - return result; - } - - static int extendedModulo (const int64 value, const int modulo) noexcept - { - return (int) (value >= 0 ? (value % modulo) - : (value - ((value / modulo) + 1) * modulo)); - } - - static inline String formatString (const String& format, const struct tm* const tm) - { - #if BEAST_ANDROID - typedef CharPointer_UTF8 StringType; - #elif BEAST_WINDOWS - typedef CharPointer_UTF16 StringType; - #else - typedef CharPointer_UTF32 StringType; - #endif - - for (size_t bufferSize = 256; ; bufferSize += 256) - { - HeapBlock buffer (bufferSize); - - #if BEAST_ANDROID - const size_t numChars = strftime (buffer, bufferSize - 1, format.toUTF8(), tm); - #elif BEAST_WINDOWS - const size_t numChars = wcsftime (buffer, bufferSize - 1, format.toWideCharPointer(), tm); - #else - const size_t numChars = wcsftime (buffer, bufferSize - 1, format.toUTF32(), tm); - #endif - - if (numChars > 0) - return String (StringType (buffer), - StringType (buffer) + (int) numChars); - } - } - - static uint32 lastMSCounterValue = 0; -} - -//============================================================================== -Time::Time() noexcept - : millisSinceEpoch (0) -{ -} - -Time::Time (const Time& other) noexcept - : millisSinceEpoch (other.millisSinceEpoch) -{ -} - -Time::Time (const int64 ms) noexcept - : millisSinceEpoch (ms) -{ -} - -Time::Time (const int year, - const int month, - const int day, - const int hours, - const int minutes, - const int seconds, - const int milliseconds, - const bool useLocalTime) noexcept -{ - bassert (year > 100); // year must be a 4-digit version - - if (year < 1971 || year >= 2038 || ! useLocalTime) - { - // use extended maths for dates beyond 1970 to 2037.. - const int timeZoneAdjustment = useLocalTime ? (31536000 - (int) (Time (1971, 0, 1, 0, 0).toMilliseconds() / 1000)) - : 0; - const int a = (13 - month) / 12; - const int y = year + 4800 - a; - const int jd = day + (153 * (month + 12 * a - 2) + 2) / 5 - + (y * 365) + (y / 4) - (y / 100) + (y / 400) - - 32045; - - const int64 s = ((int64) jd) * literal64bit (86400) - literal64bit (210866803200); - - millisSinceEpoch = 1000 * (s + (hours * 3600 + minutes * 60 + seconds - timeZoneAdjustment)) - + milliseconds; - } - else - { - struct tm t; - t.tm_year = year - 1900; - t.tm_mon = month; - t.tm_mday = day; - t.tm_hour = hours; - t.tm_min = minutes; - t.tm_sec = seconds; - t.tm_isdst = -1; - - millisSinceEpoch = 1000 * (int64) mktime (&t); - - if (millisSinceEpoch < 0) - millisSinceEpoch = 0; - else - millisSinceEpoch += milliseconds; - } -} - -Time::~Time() noexcept -{ -} - -Time& Time::operator= (const Time& other) noexcept -{ - millisSinceEpoch = other.millisSinceEpoch; - return *this; -} - -//============================================================================== -int64 Time::currentTimeMillis() noexcept -{ - #if BEAST_WINDOWS - struct _timeb t; - #ifdef _INC_TIME_INL - _ftime_s (&t); - #else - _ftime (&t); - #endif - return ((int64) t.time) * 1000 + t.millitm; - #else - struct timeval tv; - gettimeofday (&tv, nullptr); - return ((int64) tv.tv_sec) * 1000 + tv.tv_usec / 1000; - #endif -} - -Time BEAST_CALLTYPE Time::getCurrentTime() noexcept -{ - return Time (currentTimeMillis()); -} - -//============================================================================== -uint32 beast_millisecondsSinceStartup() noexcept; - -uint32 Time::getMillisecondCounter() noexcept -{ - const uint32 now = beast_millisecondsSinceStartup(); - - if (now < TimeHelpers::lastMSCounterValue) - { - // in multi-threaded apps this might be called concurrently, so - // make sure that our last counter value only increases and doesn't - // go backwards.. - if (now < TimeHelpers::lastMSCounterValue - 1000) - TimeHelpers::lastMSCounterValue = now; - } - else - { - TimeHelpers::lastMSCounterValue = now; - } - - return now; -} - -uint32 Time::getApproximateMillisecondCounter() noexcept -{ - if (TimeHelpers::lastMSCounterValue == 0) - getMillisecondCounter(); - - return TimeHelpers::lastMSCounterValue; -} - -void Time::waitForMillisecondCounter (const uint32 targetTime) noexcept -{ - for (;;) - { - const uint32 now = getMillisecondCounter(); - - if (now >= targetTime) - break; - - const int toWait = (int) (targetTime - now); - - if (toWait > 2) - { - Thread::sleep (bmin (20, toWait >> 1)); - } - else - { - // xxx should consider using mutex_pause on the mac as it apparently - // makes it seem less like a spinlock and avoids lowering the thread pri. - for (int i = 10; --i >= 0;) - Thread::yield(); - } - } -} - -//============================================================================== -double Time::highResolutionTicksToSeconds (const int64 ticks) noexcept -{ - return ticks / (double) getHighResolutionTicksPerSecond(); -} - -int64 Time::secondsToHighResolutionTicks (const double seconds) noexcept -{ - return (int64) (seconds * (double) getHighResolutionTicksPerSecond()); -} - -//============================================================================== -String Time::toString (const bool includeDate, - const bool includeTime, - const bool includeSeconds, - const bool use24HourClock) const noexcept -{ - String result; - - if (includeDate) - { - result << getDayOfMonth() << ' ' - << getMonthName (true) << ' ' - << getYear(); - - if (includeTime) - result << ' '; - } - - if (includeTime) - { - const int mins = getMinutes(); - - result << (use24HourClock ? getHours() : getHoursInAmPmFormat()) - << (mins < 10 ? ":0" : ":") << mins; - - if (includeSeconds) - { - const int secs = getSeconds(); - result << (secs < 10 ? ":0" : ":") << secs; - } - - if (! use24HourClock) - result << (isAfternoon() ? "pm" : "am"); - } - - return result.trimEnd(); -} - -String Time::formatted (const String& format) const -{ - struct tm t (TimeHelpers::millisToLocal (millisSinceEpoch)); - return TimeHelpers::formatString (format, &t); -} - -//============================================================================== -int Time::getYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_year + 1900; } -int Time::getMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mon; } -int Time::getDayOfYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_yday; } -int Time::getDayOfMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mday; } -int Time::getDayOfWeek() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_wday; } -int Time::getHours() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_hour; } -int Time::getMinutes() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_min; } -int Time::getSeconds() const noexcept { return TimeHelpers::extendedModulo (millisSinceEpoch / 1000, 60); } -int Time::getMilliseconds() const noexcept { return TimeHelpers::extendedModulo (millisSinceEpoch, 1000); } - -int Time::getHoursInAmPmFormat() const noexcept -{ - const int hours = getHours(); - - if (hours == 0) return 12; - if (hours <= 12) return hours; - - return hours - 12; -} - -bool Time::isAfternoon() const noexcept -{ - return getHours() >= 12; -} - -bool Time::isDaylightSavingTime() const noexcept -{ - return TimeHelpers::millisToLocal (millisSinceEpoch).tm_isdst != 0; -} - -String Time::getTimeZone() const noexcept -{ - String zone[2]; - - #if BEAST_WINDOWS - _tzset(); - - #ifdef _INC_TIME_INL - for (int i = 0; i < 2; ++i) - { - char name[128] = { 0 }; - size_t length; - _get_tzname (&length, name, 127, i); - zone[i] = name; - } - #else - const char** const zonePtr = (const char**) _tzname; - zone[0] = zonePtr[0]; - zone[1] = zonePtr[1]; - #endif - #else - tzset(); - const char** const zonePtr = (const char**) tzname; - zone[0] = zonePtr[0]; - zone[1] = zonePtr[1]; - #endif - - if (isDaylightSavingTime()) - { - zone[0] = zone[1]; - - if (zone[0].length() > 3 - && zone[0].containsIgnoreCase ("daylight") - && zone[0].contains ("GMT")) - zone[0] = "BST"; - } - - return zone[0].substring (0, 3); -} - -String Time::getMonthName (const bool threeLetterVersion) const -{ - return getMonthName (getMonth(), threeLetterVersion); -} - -String Time::getWeekdayName (const bool threeLetterVersion) const -{ - return getWeekdayName (getDayOfWeek(), threeLetterVersion); -} - -String Time::getMonthName (int monthNumber, const bool threeLetterVersion) -{ - const char* const shortMonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - const char* const longMonthNames[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; - - monthNumber %= 12; - - return TRANS (threeLetterVersion ? shortMonthNames [monthNumber] - : longMonthNames [monthNumber]); -} - -String Time::getWeekdayName (int day, const bool threeLetterVersion) -{ - const char* const shortDayNames[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - const char* const longDayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; - - day %= 7; - - return TRANS (threeLetterVersion ? shortDayNames [day] - : longDayNames [day]); -} - -//============================================================================== -Time& Time::operator+= (RelativeTime delta) { millisSinceEpoch += delta.inMilliseconds(); return *this; } -Time& Time::operator-= (RelativeTime delta) { millisSinceEpoch -= delta.inMilliseconds(); return *this; } - -Time operator+ (Time time, RelativeTime delta) { Time t (time); return t += delta; } -Time operator- (Time time, RelativeTime delta) { Time t (time); return t -= delta; } -Time operator+ (RelativeTime delta, Time time) { Time t (time); return t += delta; } -const RelativeTime operator- (Time time1, Time time2) { return RelativeTime::milliseconds (time1.toMilliseconds() - time2.toMilliseconds()); } - -bool operator== (Time time1, Time time2) { return time1.toMilliseconds() == time2.toMilliseconds(); } -bool operator!= (Time time1, Time time2) { return time1.toMilliseconds() != time2.toMilliseconds(); } -bool operator< (Time time1, Time time2) { return time1.toMilliseconds() < time2.toMilliseconds(); } -bool operator> (Time time1, Time time2) { return time1.toMilliseconds() > time2.toMilliseconds(); } -bool operator<= (Time time1, Time time2) { return time1.toMilliseconds() <= time2.toMilliseconds(); } -bool operator>= (Time time1, Time time2) { return time1.toMilliseconds() >= time2.toMilliseconds(); } diff --git a/Subtrees/beast/modules/beast_core/time/beast_Time.h b/Subtrees/beast/modules/beast_core/time/beast_Time.h deleted file mode 100644 index a4717c47c9..0000000000 --- a/Subtrees/beast/modules/beast_core/time/beast_Time.h +++ /dev/null @@ -1,401 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_TIME_BEASTHEADER -#define BEAST_TIME_BEASTHEADER - -#include "beast_RelativeTime.h" - - -//============================================================================== -/** - Holds an absolute date and time. - - Internally, the time is stored at millisecond precision. - - @see RelativeTime -*/ -class BEAST_API Time -{ -public: - //============================================================================== - /** Creates a Time object. - - This default constructor creates a time of 1st January 1970, (which is - represented internally as 0ms). - - To create a time object representing the current time, use getCurrentTime(). - - @see getCurrentTime - */ - Time() noexcept; - - /** Creates a time based on a number of milliseconds. - - The internal millisecond count is set to 0 (1st January 1970). To create a - time object set to the current time, use getCurrentTime(). - - @param millisecondsSinceEpoch the number of milliseconds since the unix - 'epoch' (midnight Jan 1st 1970). - @see getCurrentTime, currentTimeMillis - */ - explicit Time (int64 millisecondsSinceEpoch) noexcept; - - /** Creates a time from a set of date components. - - The timezone is assumed to be whatever the system is using as its locale. - - @param year the year, in 4-digit format, e.g. 2004 - @param month the month, in the range 0 to 11 - @param day the day of the month, in the range 1 to 31 - @param hours hours in 24-hour clock format, 0 to 23 - @param minutes minutes 0 to 59 - @param seconds seconds 0 to 59 - @param milliseconds milliseconds 0 to 999 - @param useLocalTime if true, encode using the current machine's local time; if - false, it will always work in GMT. - */ - Time (int year, - int month, - int day, - int hours, - int minutes, - int seconds = 0, - int milliseconds = 0, - bool useLocalTime = true) noexcept; - - /** Creates a copy of another Time object. */ - Time (const Time& other) noexcept; - - /** Destructor. */ - ~Time() noexcept; - - /** Copies this time from another one. */ - Time& operator= (const Time& other) noexcept; - - //============================================================================== - /** Returns a Time object that is set to the current system time. - - @see currentTimeMillis - */ - static Time BEAST_CALLTYPE getCurrentTime() noexcept; - - /** Returns the time as a number of milliseconds. - - @returns the number of milliseconds this Time object represents, since - midnight jan 1st 1970. - @see getMilliseconds - */ - int64 toMilliseconds() const noexcept { return millisSinceEpoch; } - - /** Returns the year. - - A 4-digit format is used, e.g. 2004. - */ - int getYear() const noexcept; - - /** Returns the number of the month. - - The value returned is in the range 0 to 11. - @see getMonthName - */ - int getMonth() const noexcept; - - /** Returns the name of the month. - - @param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false - it'll return the long form, e.g. "January" - @see getMonth - */ - String getMonthName (bool threeLetterVersion) const; - - /** Returns the day of the month. - The value returned is in the range 1 to 31. - */ - int getDayOfMonth() const noexcept; - - /** Returns the number of the day of the week. - The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc). - */ - int getDayOfWeek() const noexcept; - - /** Returns the number of the day of the year. - The value returned is in the range 0 to 365. - */ - int getDayOfYear() const noexcept; - - /** Returns the name of the weekday. - - @param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if - false, it'll return the full version, e.g. "Tuesday". - */ - String getWeekdayName (bool threeLetterVersion) const; - - /** Returns the number of hours since midnight. - - This is in 24-hour clock format, in the range 0 to 23. - - @see getHoursInAmPmFormat, isAfternoon - */ - int getHours() const noexcept; - - /** Returns true if the time is in the afternoon. - - So it returns true for "PM", false for "AM". - - @see getHoursInAmPmFormat, getHours - */ - bool isAfternoon() const noexcept; - - /** Returns the hours in 12-hour clock format. - - This will return a value 1 to 12 - use isAfternoon() to find out - whether this is in the afternoon or morning. - - @see getHours, isAfternoon - */ - int getHoursInAmPmFormat() const noexcept; - - /** Returns the number of minutes, 0 to 59. */ - int getMinutes() const noexcept; - - /** Returns the number of seconds, 0 to 59. */ - int getSeconds() const noexcept; - - /** Returns the number of milliseconds, 0 to 999. - - Unlike toMilliseconds(), this just returns the position within the - current second rather than the total number since the epoch. - - @see toMilliseconds - */ - int getMilliseconds() const noexcept; - - /** Returns true if the local timezone uses a daylight saving correction. */ - bool isDaylightSavingTime() const noexcept; - - /** Returns a 3-character string to indicate the local timezone. */ - String getTimeZone() const noexcept; - - //============================================================================== - /** Quick way of getting a string version of a date and time. - - For a more powerful way of formatting the date and time, see the formatted() method. - - @param includeDate whether to include the date in the string - @param includeTime whether to include the time in the string - @param includeSeconds if the time is being included, this provides an option not to include - the seconds in it - @param use24HourClock if the time is being included, sets whether to use am/pm or 24 - hour notation. - @see formatted - */ - String toString (bool includeDate, - bool includeTime, - bool includeSeconds = true, - bool use24HourClock = false) const noexcept; - - /** Converts this date/time to a string with a user-defined format. - - This uses the C strftime() function to format this time as a string. To save you - looking it up, these are the escape codes that strftime uses (other codes might - work on some platforms and not others, but these are the common ones): - - %a is replaced by the locale's abbreviated weekday name. - %A is replaced by the locale's full weekday name. - %b is replaced by the locale's abbreviated month name. - %B is replaced by the locale's full month name. - %c is replaced by the locale's appropriate date and time representation. - %d is replaced by the day of the month as a decimal number [01,31]. - %H is replaced by the hour (24-hour clock) as a decimal number [00,23]. - %I is replaced by the hour (12-hour clock) as a decimal number [01,12]. - %j is replaced by the day of the year as a decimal number [001,366]. - %m is replaced by the month as a decimal number [01,12]. - %M is replaced by the minute as a decimal number [00,59]. - %p is replaced by the locale's equivalent of either a.m. or p.m. - %S is replaced by the second as a decimal number [00,61]. - %U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. - %w is replaced by the weekday as a decimal number [0,6], with 0 representing Sunday. - %W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. - %x is replaced by the locale's appropriate date representation. - %X is replaced by the locale's appropriate time representation. - %y is replaced by the year without century as a decimal number [00,99]. - %Y is replaced by the year with century as a decimal number. - %Z is replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. - %% is replaced by %. - - @see toString - */ - String formatted (const String& format) const; - - //============================================================================== - /** Adds a RelativeTime to this time. */ - Time& operator+= (RelativeTime delta); - /** Subtracts a RelativeTime from this time. */ - Time& operator-= (RelativeTime delta); - - //============================================================================== - /** Tries to set the computer's clock. - - @returns true if this succeeds, although depending on the system, the - application might not have sufficient privileges to do this. - */ - bool setSystemTimeToThisTime() const; - - //============================================================================== - /** Returns the name of a day of the week. - - @param dayNumber the day, 0 to 6 (0 = sunday, 1 = monday, etc) - @param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if - false, it'll return the full version, e.g. "Tuesday". - */ - static String getWeekdayName (int dayNumber, - bool threeLetterVersion); - - /** Returns the name of one of the months. - - @param monthNumber the month, 0 to 11 - @param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false - it'll return the long form, e.g. "January" - */ - static String getMonthName (int monthNumber, - bool threeLetterVersion); - - //============================================================================== - // Static methods for getting system timers directly.. - - /** Returns the current system time. - - Returns the number of milliseconds since midnight jan 1st 1970. - - Should be accurate to within a few millisecs, depending on platform, - hardware, etc. - */ - static int64 currentTimeMillis() noexcept; - - /** Returns the number of millisecs since a fixed event (usually system startup). - - This returns a monotonically increasing value which it unaffected by changes to the - system clock. It should be accurate to within a few millisecs, depending on platform, - hardware, etc. - - Being a 32-bit return value, it will of course wrap back to 0 after 2^32 seconds of - uptime, so be careful to take that into account. If you need a 64-bit time, you can - use currentTimeMillis() instead. - - @see getApproximateMillisecondCounter - */ - static uint32 getMillisecondCounter() noexcept; - - /** Returns the number of millisecs since a fixed event (usually system startup). - - This has the same function as getMillisecondCounter(), but returns a more accurate - value, using a higher-resolution timer if one is available. - - @see getMillisecondCounter - */ - static double getMillisecondCounterHiRes() noexcept; - - /** Waits until the getMillisecondCounter() reaches a given value. - - This will make the thread sleep as efficiently as it can while it's waiting. - */ - static void waitForMillisecondCounter (uint32 targetTime) noexcept; - - /** Less-accurate but faster version of getMillisecondCounter(). - - This will return the last value that getMillisecondCounter() returned, so doesn't - need to make a system call, but is less accurate - it shouldn't be more than - 100ms away from the correct time, though, so is still accurate enough for a - lot of purposes. - - @see getMillisecondCounter - */ - static uint32 getApproximateMillisecondCounter() noexcept; - - //============================================================================== - // High-resolution timers.. - - /** Returns the current high-resolution counter's tick-count. - - This is a similar idea to getMillisecondCounter(), but with a higher - resolution. - - @see getHighResolutionTicksPerSecond, highResolutionTicksToSeconds, - secondsToHighResolutionTicks - */ - static int64 getHighResolutionTicks() noexcept; - - /** Returns the resolution of the high-resolution counter in ticks per second. - - @see getHighResolutionTicks, highResolutionTicksToSeconds, - secondsToHighResolutionTicks - */ - static int64 getHighResolutionTicksPerSecond() noexcept; - - /** Converts a number of high-resolution ticks into seconds. - - @see getHighResolutionTicks, getHighResolutionTicksPerSecond, - secondsToHighResolutionTicks - */ - static double highResolutionTicksToSeconds (int64 ticks) noexcept; - - /** Converts a number seconds into high-resolution ticks. - - @see getHighResolutionTicks, getHighResolutionTicksPerSecond, - highResolutionTicksToSeconds - */ - static int64 secondsToHighResolutionTicks (double seconds) noexcept; - - -private: - //============================================================================== - int64 millisSinceEpoch; -}; - -//============================================================================== -/** Adds a RelativeTime to a Time. */ -BEAST_API Time operator+ (Time time, RelativeTime delta); -/** Adds a RelativeTime to a Time. */ -BEAST_API Time operator+ (RelativeTime delta, Time time); - -/** Subtracts a RelativeTime from a Time. */ -BEAST_API Time operator- (Time time, RelativeTime delta); -/** Returns the relative time difference between two times. */ -BEAST_API const RelativeTime operator- (Time time1, Time time2); - -/** Compares two Time objects. */ -BEAST_API bool operator== (Time time1, Time time2); -/** Compares two Time objects. */ -BEAST_API bool operator!= (Time time1, Time time2); -/** Compares two Time objects. */ -BEAST_API bool operator< (Time time1, Time time2); -/** Compares two Time objects. */ -BEAST_API bool operator<= (Time time1, Time time2); -/** Compares two Time objects. */ -BEAST_API bool operator> (Time time1, Time time2); -/** Compares two Time objects. */ -BEAST_API bool operator>= (Time time1, Time time2); - - -#endif // BEAST_TIME_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.cpp b/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.cpp deleted file mode 100644 index 49b96ce72e..0000000000 --- a/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.cpp +++ /dev/null @@ -1,232 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -UnitTest::UnitTest (const String& name_) - : name (name_), runner (nullptr) -{ - getAllTests().add (this); -} - -UnitTest::~UnitTest() -{ - getAllTests().removeFirstMatchingValue (this); -} - -Array& UnitTest::getAllTests() -{ - static Array tests; - return tests; -} - -void UnitTest::initialise() {} -void UnitTest::shutdown() {} - -void UnitTest::performTest (UnitTestRunner* const runner_) -{ - bassert (runner_ != nullptr); - runner = runner_; - - initialise(); - runTest(); - shutdown(); -} - -void UnitTest::logMessage (const String& message) -{ - runner->logMessage (message); -} - -void UnitTest::beginTest (const String& testName) -{ - runner->beginNewTest (this, testName); -} - -void UnitTest::expect (const bool result, const String& failureMessage) -{ - if (result) - runner->addPass(); - else - runner->addFail (failureMessage); -} - -//============================================================================== -UnitTestRunner::UnitTestRunner() - : currentTest (nullptr), - assertOnFailure (true), - logPasses (false) -{ -} - -UnitTestRunner::~UnitTestRunner() -{ -} - -void UnitTestRunner::setAssertOnFailure (bool shouldAssert) noexcept -{ - assertOnFailure = shouldAssert; -} - -void UnitTestRunner::setPassesAreLogged (bool shouldDisplayPasses) noexcept -{ - logPasses = shouldDisplayPasses; -} - -int UnitTestRunner::getNumResults() const noexcept -{ - return results.size(); -} - -const UnitTestRunner::TestResult* UnitTestRunner::getResult (int index) const noexcept -{ - return results [index]; -} - -void UnitTestRunner::resultsUpdated() -{ -} - -void UnitTestRunner::runTests (const Array& tests) -{ - results.clear(); - resultsUpdated(); - - for (int i = 0; i < tests.size(); ++i) - { - if (shouldAbortTests()) - break; - - try - { - tests.getUnchecked(i)->performTest (this); - } - catch (...) - { - addFail ("An unhandled exception was thrown!"); - } - } - - endTest(); -} - -void UnitTestRunner::runAllTests() -{ - runTests (UnitTest::getAllTests()); -} - -void UnitTestRunner::logMessage (const String& message) -{ - Logger::writeToLog (message); -} - -bool UnitTestRunner::shouldAbortTests() -{ - return false; -} - -void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCategory) -{ - endTest(); - currentTest = test; - - TestResult* const r = new TestResult(); - results.add (r); - r->unitTestName = test->getName(); - r->subcategoryName = subCategory; - r->passes = 0; - r->failures = 0; - - logMessage ("-----------------------------------------------------------------"); - logMessage ("Starting test: " + r->unitTestName + " / " + subCategory + "..."); - - resultsUpdated(); -} - -void UnitTestRunner::endTest() -{ - if (results.size() > 0) - { - TestResult* const r = results.getLast(); - - if (r->failures > 0) - { - String m ("FAILED!! "); - m << r->failures << (r->failures == 1 ? " test" : " tests") - << " failed, out of a total of " << (r->passes + r->failures); - - logMessage (String::empty); - logMessage (m); - logMessage (String::empty); - } - else - { - logMessage ("All tests completed successfully"); - } - } -} - -void UnitTestRunner::addPass() -{ - { - const ScopedLock sl (results.getLock()); - - TestResult* const r = results.getLast(); - bassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests! - - r->passes++; - - if (logPasses) - { - String message ("Test "); - message << (r->failures + r->passes) << " passed"; - logMessage (message); - } - } - - resultsUpdated(); -} - -void UnitTestRunner::addFail (const String& failureMessage) -{ - { - const ScopedLock sl (results.getLock()); - - TestResult* const r = results.getLast(); - bassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests! - - r->failures++; - - String message ("!!! Test "); - message << (r->failures + r->passes) << " failed"; - - if (failureMessage.isNotEmpty()) - message << ": " << failureMessage; - - r->messages.add (message); - - logMessage (message); - } - - resultsUpdated(); - - if (assertOnFailure) { bassertfalse; } -} diff --git a/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.h b/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.h deleted file mode 100644 index d155f0d7b5..0000000000 --- a/Subtrees/beast/modules/beast_core/unit_tests/beast_UnitTest.h +++ /dev/null @@ -1,285 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_UNITTEST_BEASTHEADER -#define BEAST_UNITTEST_BEASTHEADER - -#include "../text/beast_StringArray.h" -#include "../containers/beast_OwnedArray.h" -class UnitTestRunner; - - -//============================================================================== -/** - This is a base class for classes that perform a unit test. - - To write a test using this class, your code should look something like this: - - @code - class MyTest : public UnitTest - { - public: - MyTest() : UnitTest ("Foobar testing") {} - - void runTest() - { - beginTest ("Part 1"); - - expect (myFoobar.doesSomething()); - expect (myFoobar.doesSomethingElse()); - - beginTest ("Part 2"); - - expect (myOtherFoobar.doesSomething()); - expect (myOtherFoobar.doesSomethingElse()); - - ...etc.. - } - }; - - // Creating a static instance will automatically add the instance to the array - // returned by UnitTest::getAllTests(), so the test will be included when you call - // UnitTestRunner::runAllTests() - static MyTest test; - @endcode - - To run a test, use the UnitTestRunner class. - - @see UnitTestRunner -*/ -class BEAST_API UnitTest -{ -public: - //============================================================================== - /** Creates a test with the given name. */ - explicit UnitTest (const String& name); - - /** Destructor. */ - virtual ~UnitTest(); - - /** Returns the name of the test. */ - const String& getName() const noexcept { return name; } - - /** Runs the test, using the specified UnitTestRunner. - You shouldn't need to call this method directly - use - UnitTestRunner::runTests() instead. - */ - void performTest (UnitTestRunner* runner); - - /** Returns the set of all UnitTest objects that currently exist. */ - static Array& getAllTests(); - - //============================================================================== - /** You can optionally implement this method to set up your test. - This method will be called before runTest(). - */ - virtual void initialise(); - - /** You can optionally implement this method to clear up after your test has been run. - This method will be called after runTest() has returned. - */ - virtual void shutdown(); - - /** Implement this method in your subclass to actually run your tests. - - The content of your implementation should call beginTest() and expect() - to perform the tests. - */ - virtual void runTest() = 0; - - //============================================================================== - /** Tells the system that a new subsection of tests is beginning. - This should be called from your runTest() method, and may be called - as many times as you like, to demarcate different sets of tests. - */ - void beginTest (const String& testName); - - //============================================================================== - /** Checks that the result of a test is true, and logs this result. - - In your runTest() method, you should call this method for each condition that - you want to check, e.g. - - @code - void runTest() - { - beginTest ("basic tests"); - expect (x + y == 2); - expect (getThing() == someThing); - ...etc... - } - @endcode - - If testResult is true, a pass is logged; if it's false, a failure is logged. - If the failure message is specified, it will be written to the log if the test fails. - */ - void expect (bool testResult, const String& failureMessage = String::empty); - - /** Compares two values, and if they don't match, prints out a message containing the - expected and actual result values. - */ - template - void expectEquals (ValueType actual, ValueType expected, String failureMessage = String::empty) - { - const bool result = (actual == expected); - - if (! result) - { - if (failureMessage.isNotEmpty()) - failureMessage << " -- "; - - failureMessage << "Expected value: " << expected << ", Actual value: " << actual; - } - - expect (result, failureMessage); - } - - //============================================================================== - /** Writes a message to the test log. - This can only be called from within your runTest() method. - */ - void logMessage (const String& message); - -private: - //============================================================================== - const String name; - UnitTestRunner* runner; - - BEAST_DECLARE_NON_COPYABLE (UnitTest) -}; - - -//============================================================================== -/** - Runs a set of unit tests. - - You can instantiate one of these objects and use it to invoke tests on a set of - UnitTest objects. - - By using a subclass of UnitTestRunner, you can intercept logging messages and - perform custom behaviour when each test completes. - - @see UnitTest -*/ -class BEAST_API UnitTestRunner -{ -public: - //============================================================================== - /** */ - UnitTestRunner(); - - /** Destructor. */ - virtual ~UnitTestRunner(); - - /** Runs a set of tests. - - The tests are performed in order, and the results are logged. To run all the - registered UnitTest objects that exist, use runAllTests(). - */ - void runTests (const Array& tests); - - /** Runs all the UnitTest objects that currently exist. - This calls runTests() for all the objects listed in UnitTest::getAllTests(). - */ - void runAllTests(); - - /** Sets a flag to indicate whether an assertion should be triggered if a test fails. - This is true by default. - */ - void setAssertOnFailure (bool shouldAssert) noexcept; - - /** Sets a flag to indicate whether successful tests should be logged. - By default, this is set to false, so that only failures will be displayed in the log. - */ - void setPassesAreLogged (bool shouldDisplayPasses) noexcept; - - //============================================================================== - /** Contains the results of a test. - - One of these objects is instantiated each time UnitTest::beginTest() is called, and - it contains details of the number of subsequent UnitTest::expect() calls that are - made. - */ - struct TestResult - { - /** The main name of this test (i.e. the name of the UnitTest object being run). */ - String unitTestName; - /** The name of the current subcategory (i.e. the name that was set when UnitTest::beginTest() was called). */ - String subcategoryName; - - /** The number of UnitTest::expect() calls that succeeded. */ - int passes; - /** The number of UnitTest::expect() calls that failed. */ - int failures; - - /** A list of messages describing the failed tests. */ - StringArray messages; - }; - - /** Returns the number of TestResult objects that have been performed. - @see getResult - */ - int getNumResults() const noexcept; - - /** Returns one of the TestResult objects that describes a test that has been run. - @see getNumResults - */ - const TestResult* getResult (int index) const noexcept; - -protected: - /** Called when the list of results changes. - You can override this to perform some sort of behaviour when results are added. - */ - virtual void resultsUpdated(); - - /** Logs a message about the current test progress. - By default this just writes the message to the Logger class, but you could override - this to do something else with the data. - */ - virtual void logMessage (const String& message); - - /** This can be overridden to let the runner know that it should abort the tests - as soon as possible, e.g. because the thread needs to stop. - */ - virtual bool shouldAbortTests(); - -private: - //============================================================================== - friend class UnitTest; - - UnitTest* currentTest; - String currentSubCategory; - OwnedArray results; - bool assertOnFailure, logPasses; - - void beginNewTest (UnitTest* test, const String& subCategory); - void endTest(); - - void addPass(); - void addFail (const String& failureMessage); - - BEAST_DECLARE_NON_COPYABLE (UnitTestRunner) -}; - - -#endif // BEAST_UNITTEST_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.cpp b/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.cpp deleted file mode 100644 index 657a47cbc8..0000000000 --- a/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.cpp +++ /dev/null @@ -1,848 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -XmlDocument::XmlDocument (const String& documentText) - : originalText (documentText), - input (nullptr), - ignoreEmptyTextElements (true) -{ -} - -XmlDocument::XmlDocument (const File& file) - : input (nullptr), - ignoreEmptyTextElements (true), - inputSource (new FileInputSource (file)) -{ -} - -XmlDocument::~XmlDocument() -{ -} - -XmlElement* XmlDocument::parse (const File& file) -{ - XmlDocument doc (file); - return doc.getDocumentElement(); -} - -XmlElement* XmlDocument::parse (const String& xmlData) -{ - XmlDocument doc (xmlData); - return doc.getDocumentElement(); -} - -void XmlDocument::setInputSource (InputSource* const newSource) noexcept -{ - inputSource = newSource; -} - -void XmlDocument::setEmptyTextElementsIgnored (const bool shouldBeIgnored) noexcept -{ - ignoreEmptyTextElements = shouldBeIgnored; -} - -namespace XmlIdentifierChars -{ - static bool isIdentifierCharSlow (const beast_wchar c) noexcept - { - return CharacterFunctions::isLetterOrDigit (c) - || c == '_' || c == '-' || c == ':' || c == '.'; - } - - static bool isIdentifierChar (const beast_wchar c) noexcept - { - static const uint32 legalChars[] = { 0, 0x7ff6000, 0x87fffffe, 0x7fffffe, 0 }; - - return ((int) c < (int) numElementsInArray (legalChars) * 32) ? ((legalChars [c >> 5] & (1 << (c & 31))) != 0) - : isIdentifierCharSlow (c); - } - - /*static void generateIdentifierCharConstants() - { - uint32 n[8] = { 0 }; - for (int i = 0; i < 256; ++i) - if (isIdentifierCharSlow (i)) - n[i >> 5] |= (1 << (i & 31)); - - String s; - for (int i = 0; i < 8; ++i) - s << "0x" << String::toHexString ((int) n[i]) << ", "; - - DBG (s); - }*/ -} - -XmlElement* XmlDocument::getDocumentElement (const bool onlyReadOuterDocumentElement) -{ - String textToParse (originalText); - - if (textToParse.isEmpty() && inputSource != nullptr) - { - ScopedPointer in (inputSource->createInputStream()); - - if (in != nullptr) - { - MemoryOutputStream data; - data.writeFromInputStream (*in, onlyReadOuterDocumentElement ? 8192 : -1); - textToParse = data.toString(); - - if (! onlyReadOuterDocumentElement) - originalText = textToParse; - } - } - - input = textToParse.getCharPointer(); - lastError = String::empty; - errorOccurred = false; - outOfData = false; - needToLoadDTD = true; - - if (textToParse.isEmpty()) - { - lastError = "not enough input"; - } - else - { - skipHeader(); - - if (input.getAddress() != nullptr) - { - ScopedPointer result (readNextElement (! onlyReadOuterDocumentElement)); - - if (! errorOccurred) - return result.release(); - } - else - { - lastError = "incorrect xml header"; - } - } - - return nullptr; -} - -const String& XmlDocument::getLastParseError() const noexcept -{ - return lastError; -} - -void XmlDocument::setLastError (const String& desc, const bool carryOn) -{ - lastError = desc; - errorOccurred = ! carryOn; -} - -String XmlDocument::getFileContents (const String& filename) const -{ - if (inputSource != nullptr) - { - const ScopedPointer in (inputSource->createInputStreamFor (filename.trim().unquoted())); - - if (in != nullptr) - return in->readEntireStreamAsString(); - } - - return String::empty; -} - -beast_wchar XmlDocument::readNextChar() noexcept -{ - const beast_wchar c = input.getAndAdvance(); - - if (c == 0) - { - outOfData = true; - --input; - } - - return c; -} - -int XmlDocument::findNextTokenLength() noexcept -{ - int len = 0; - beast_wchar c = *input; - - while (XmlIdentifierChars::isIdentifierChar (c)) - c = input [++len]; - - return len; -} - -void XmlDocument::skipHeader() -{ - const int headerStart = input.indexOf (CharPointer_UTF8 ("= 0) - { - const int headerEnd = (input + headerStart).indexOf (CharPointer_UTF8 ("?>")); - if (headerEnd < 0) - return; - - #if BEAST_DEBUG - const String header (input + headerStart, (size_t) (headerEnd - headerStart)); - const String encoding (header.fromFirstOccurrenceOf ("encoding", false, true) - .fromFirstOccurrenceOf ("=", false, false) - .fromFirstOccurrenceOf ("\"", false, false) - .upToFirstOccurrenceOf ("\"", false, false).trim()); - - /* If you load an XML document with a non-UTF encoding type, it may have been - loaded wrongly.. Since all the files are read via the normal beast file streams, - they're treated as UTF-8, so by the time it gets to the parser, the encoding will - have been lost. Best plan is to stick to utf-8 or if you have specific files to - read, use your own code to convert them to a unicode String, and pass that to the - XML parser. - */ - bassert (encoding.isEmpty() || encoding.startsWithIgnoreCase ("utf-")); - #endif - - input += headerEnd + 2; - } - - skipNextWhiteSpace(); - - const int docTypeIndex = input.indexOf (CharPointer_UTF8 (" 0) - { - const beast_wchar c = readNextChar(); - - if (outOfData) - return; - - if (c == '<') - ++n; - else if (c == '>') - --n; - } - - dtdText = String (docType, (size_t) (input.getAddress() - (docType.getAddress() + 1))).trim(); -} - -void XmlDocument::skipNextWhiteSpace() -{ - for (;;) - { - beast_wchar c = *input; - - while (CharacterFunctions::isWhitespace (c)) - c = *++input; - - if (c == 0) - { - outOfData = true; - break; - } - else if (c == '<') - { - if (input[1] == '!' - && input[2] == '-' - && input[3] == '-') - { - input += 4; - const int closeComment = input.indexOf (CharPointer_UTF8 ("-->")); - - if (closeComment < 0) - { - outOfData = true; - break; - } - - input += closeComment + 3; - continue; - } - else if (input[1] == '?') - { - input += 2; - const int closeBracket = input.indexOf (CharPointer_UTF8 ("?>")); - - if (closeBracket < 0) - { - outOfData = true; - break; - } - - input += closeBracket + 2; - continue; - } - } - - break; - } -} - -void XmlDocument::readQuotedString (String& result) -{ - const beast_wchar quote = readNextChar(); - - while (! outOfData) - { - const beast_wchar c = readNextChar(); - - if (c == quote) - break; - - --input; - - if (c == '&') - { - readEntity (result); - } - else - { - const String::CharPointerType start (input); - size_t numChars = 0; - - for (;;) - { - const beast_wchar character = *input; - - if (character == quote) - { - result.appendCharPointer (start, numChars); - ++input; - return; - } - else if (character == '&') - { - result.appendCharPointer (start, numChars); - break; - } - else if (character == 0) - { - outOfData = true; - setLastError ("unmatched quotes", false); - break; - } - - ++input; - ++numChars; - } - } - } -} - -XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) -{ - XmlElement* node = nullptr; - - skipNextWhiteSpace(); - if (outOfData) - return nullptr; - - const int openBracket = input.indexOf ((beast_wchar) '<'); - - if (openBracket >= 0) - { - input += openBracket + 1; - int tagLen = findNextTokenLength(); - - if (tagLen == 0) - { - // no tag name - but allow for a gap after the '<' before giving an error - skipNextWhiteSpace(); - tagLen = findNextTokenLength(); - - if (tagLen == 0) - { - setLastError ("tag name missing", false); - return node; - } - } - - node = new XmlElement (String (input, (size_t) tagLen)); - input += tagLen; - LinkedListPointer::Appender attributeAppender (node->attributes); - - // look for attributes - for (;;) - { - skipNextWhiteSpace(); - - const beast_wchar c = *input; - - // empty tag.. - if (c == '/' && input[1] == '>') - { - input += 2; - break; - } - - // parse the guts of the element.. - if (c == '>') - { - ++input; - - if (alsoParseSubElements) - readChildElements (node); - - break; - } - - // get an attribute.. - if (XmlIdentifierChars::isIdentifierChar (c)) - { - const int attNameLen = findNextTokenLength(); - - if (attNameLen > 0) - { - const String::CharPointerType attNameStart (input); - input += attNameLen; - - skipNextWhiteSpace(); - - if (readNextChar() == '=') - { - skipNextWhiteSpace(); - - const beast_wchar nextChar = *input; - - if (nextChar == '"' || nextChar == '\'') - { - XmlElement::XmlAttributeNode* const newAtt - = new XmlElement::XmlAttributeNode (String (attNameStart, (size_t) attNameLen), - String::empty); - - readQuotedString (newAtt->value); - attributeAppender.append (newAtt); - continue; - } - } - } - } - else - { - if (! outOfData) - setLastError ("illegal character found in " + node->getTagName() + ": '" + c + "'", false); - } - - break; - } - } - - return node; -} - -void XmlDocument::readChildElements (XmlElement* parent) -{ - LinkedListPointer::Appender childAppender (parent->firstChildElement); - - for (;;) - { - const String::CharPointerType preWhitespaceInput (input); - skipNextWhiteSpace(); - - if (outOfData) - { - setLastError ("unmatched tags", false); - break; - } - - if (*input == '<') - { - if (input[1] == '/') - { - // our close tag.. - const int closeTag = input.indexOf ((beast_wchar) '>'); - - if (closeTag >= 0) - input += closeTag + 1; - - break; - } - else if (input[1] == '!' - && input[2] == '[' - && input[3] == 'C' - && input[4] == 'D' - && input[5] == 'A' - && input[6] == 'T' - && input[7] == 'A' - && input[8] == '[') - { - input += 9; - const String::CharPointerType inputStart (input); - - size_t len = 0; - - for (;;) - { - if (*input == 0) - { - setLastError ("unterminated CDATA section", false); - outOfData = true; - break; - } - else if (input[0] == ']' - && input[1] == ']' - && input[2] == '>') - { - input += 3; - break; - } - - ++input; - ++len; - } - - childAppender.append (XmlElement::createTextElement (String (inputStart, len))); - } - else - { - // this is some other element, so parse and add it.. - if (XmlElement* const n = readNextElement (true)) - childAppender.append (n); - else - break; - } - } - else // must be a character block - { - input = preWhitespaceInput; // roll back to include the leading whitespace - String textElementContent; - - for (;;) - { - const beast_wchar c = *input; - - if (c == '<') - break; - - if (c == 0) - { - setLastError ("unmatched tags", false); - outOfData = true; - return; - } - - if (c == '&') - { - String entity; - readEntity (entity); - - if (entity.startsWithChar ('<') && entity [1] != 0) - { - const String::CharPointerType oldInput (input); - const bool oldOutOfData = outOfData; - - input = entity.getCharPointer(); - outOfData = false; - - for (;;) - { - XmlElement* const n = readNextElement (true); - - if (n == nullptr) - break; - - childAppender.append (n); - } - - input = oldInput; - outOfData = oldOutOfData; - } - else - { - textElementContent += entity; - } - } - else - { - const String::CharPointerType start (input); - size_t len = 0; - - for (;;) - { - const beast_wchar nextChar = *input; - - if (nextChar == '<' || nextChar == '&') - { - break; - } - else if (nextChar == 0) - { - setLastError ("unmatched tags", false); - outOfData = true; - return; - } - - ++input; - ++len; - } - - textElementContent.appendCharPointer (start, len); - } - } - - if ((! ignoreEmptyTextElements) || textElementContent.containsNonWhitespaceChars()) - { - childAppender.append (XmlElement::createTextElement (textElementContent)); - } - } - } -} - -void XmlDocument::readEntity (String& result) -{ - // skip over the ampersand - ++input; - - if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("amp;"), 4) == 0) - { - input += 4; - result += '&'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("quot;"), 5) == 0) - { - input += 5; - result += '"'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("apos;"), 5) == 0) - { - input += 5; - result += '\''; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("lt;"), 3) == 0) - { - input += 3; - result += '<'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("gt;"), 3) == 0) - { - input += 3; - result += '>'; - } - else if (*input == '#') - { - int charCode = 0; - ++input; - - if (*input == 'x' || *input == 'X') - { - ++input; - int numChars = 0; - - while (input[0] != ';') - { - const int hexValue = CharacterFunctions::getHexDigitValue (input[0]); - - if (hexValue < 0 || ++numChars > 8) - { - setLastError ("illegal escape sequence", true); - break; - } - - charCode = (charCode << 4) | hexValue; - ++input; - } - - ++input; - } - else if (input[0] >= '0' && input[0] <= '9') - { - int numChars = 0; - - while (input[0] != ';') - { - if (++numChars > 12) - { - setLastError ("illegal escape sequence", true); - break; - } - - charCode = charCode * 10 + ((int) input[0] - '0'); - ++input; - } - - ++input; - } - else - { - setLastError ("illegal escape sequence", true); - result += '&'; - return; - } - - result << (beast_wchar) charCode; - } - else - { - const String::CharPointerType entityNameStart (input); - const int closingSemiColon = input.indexOf ((beast_wchar) ';'); - - if (closingSemiColon < 0) - { - outOfData = true; - result += '&'; - } - else - { - input += closingSemiColon + 1; - - result += expandExternalEntity (String (entityNameStart, (size_t) closingSemiColon)); - } - } -} - -String XmlDocument::expandEntity (const String& ent) -{ - if (ent.equalsIgnoreCase ("amp")) return String::charToString ('&'); - if (ent.equalsIgnoreCase ("quot")) return String::charToString ('"'); - if (ent.equalsIgnoreCase ("apos")) return String::charToString ('\''); - if (ent.equalsIgnoreCase ("lt")) return String::charToString ('<'); - if (ent.equalsIgnoreCase ("gt")) return String::charToString ('>'); - - if (ent[0] == '#') - { - const beast_wchar char1 = ent[1]; - - if (char1 == 'x' || char1 == 'X') - return String::charToString (static_cast (ent.substring (2).getHexValue32())); - - if (char1 >= '0' && char1 <= '9') - return String::charToString (static_cast (ent.substring (1).getIntValue())); - - setLastError ("illegal escape sequence", false); - return String::charToString ('&'); - } - - return expandExternalEntity (ent); -} - -String XmlDocument::expandExternalEntity (const String& entity) -{ - if (needToLoadDTD) - { - if (dtdText.isNotEmpty()) - { - dtdText = dtdText.trimCharactersAtEnd (">"); - tokenisedDTD.addTokens (dtdText, true); - - if (tokenisedDTD [tokenisedDTD.size() - 2].equalsIgnoreCase ("system") - && tokenisedDTD [tokenisedDTD.size() - 1].isQuotedString()) - { - const String fn (tokenisedDTD [tokenisedDTD.size() - 1]); - - tokenisedDTD.clear(); - tokenisedDTD.addTokens (getFileContents (fn), true); - } - else - { - tokenisedDTD.clear(); - const int openBracket = dtdText.indexOfChar ('['); - - if (openBracket > 0) - { - const int closeBracket = dtdText.lastIndexOfChar (']'); - - if (closeBracket > openBracket) - tokenisedDTD.addTokens (dtdText.substring (openBracket + 1, - closeBracket), true); - } - } - - for (int i = tokenisedDTD.size(); --i >= 0;) - { - if (tokenisedDTD[i].startsWithChar ('%') - && tokenisedDTD[i].endsWithChar (';')) - { - const String parsed (getParameterEntity (tokenisedDTD[i].substring (1, tokenisedDTD[i].length() - 1))); - StringArray newToks; - newToks.addTokens (parsed, true); - - tokenisedDTD.remove (i); - - for (int j = newToks.size(); --j >= 0;) - tokenisedDTD.insert (i, newToks[j]); - } - } - } - - needToLoadDTD = false; - } - - for (int i = 0; i < tokenisedDTD.size(); ++i) - { - if (tokenisedDTD[i] == entity) - { - if (tokenisedDTD[i - 1].equalsIgnoreCase ("").trim().unquoted()); - - // check for sub-entities.. - int ampersand = ent.indexOfChar ('&'); - - while (ampersand >= 0) - { - const int semiColon = ent.indexOf (i + 1, ";"); - - if (semiColon < 0) - { - setLastError ("entity without terminating semi-colon", false); - break; - } - - const String resolved (expandEntity (ent.substring (i + 1, semiColon))); - - ent = ent.substring (0, ampersand) - + resolved - + ent.substring (semiColon + 1); - - ampersand = ent.indexOfChar (semiColon + 1, '&'); - } - - return ent; - } - } - } - - setLastError ("unknown entity", true); - - return entity; -} - -String XmlDocument::getParameterEntity (const String& entity) -{ - for (int i = 0; i < tokenisedDTD.size(); ++i) - { - if (tokenisedDTD[i] == entity - && tokenisedDTD [i - 1] == "%" - && tokenisedDTD [i - 2].equalsIgnoreCase ("")); - - if (ent.equalsIgnoreCase ("system")) - return getFileContents (tokenisedDTD [i + 2].trimCharactersAtEnd (">")); - - return ent.trim().unquoted(); - } - } - - return entity; -} diff --git a/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.h b/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.h deleted file mode 100644 index 443902225e..0000000000 --- a/Subtrees/beast/modules/beast_core/xml/beast_XmlDocument.h +++ /dev/null @@ -1,181 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_XMLDOCUMENT_BEASTHEADER -#define BEAST_XMLDOCUMENT_BEASTHEADER - -#include "beast_XmlElement.h" -#include "../text/beast_StringArray.h" -#include "../files/beast_File.h" -#include "../memory/beast_ScopedPointer.h" -class InputSource; - - -//============================================================================== -/** - Parses a text-based XML document and creates an XmlElement object from it. - - The parser will parse DTDs to load external entities but won't - check the document for validity against the DTD. - - e.g. - @code - - XmlDocument myDocument (File ("myfile.xml")); - XmlElement* mainElement = myDocument.getDocumentElement(); - - if (mainElement == nullptr) - { - String error = myDocument.getLastParseError(); - } - else - { - ..use the element - } - - @endcode - - Or you can use the static helper methods for quick parsing.. - - @code - XmlElement* xml = XmlDocument::parse (myXmlFile); - - if (xml != nullptr && xml->hasTagName ("foobar")) - { - ...etc - @endcode - - @see XmlElement -*/ -class BEAST_API XmlDocument -{ -public: - //============================================================================== - /** Creates an XmlDocument from the xml text. - The text doesn't actually get parsed until the getDocumentElement() method is called. - */ - XmlDocument (const String& documentText); - - /** Creates an XmlDocument from a file. - The text doesn't actually get parsed until the getDocumentElement() method is called. - */ - XmlDocument (const File& file); - - /** Destructor. */ - ~XmlDocument(); - - //============================================================================== - /** Creates an XmlElement object to represent the main document node. - - This method will do the actual parsing of the text, and if there's a - parse error, it may returns nullptr (and you can find out the error using - the getLastParseError() method). - - See also the parse() methods, which provide a shorthand way to quickly - parse a file or string. - - @param onlyReadOuterDocumentElement if true, the parser will only read the - first section of the file, and will only - return the outer document element - this - allows quick checking of large files to - see if they contain the correct type of - tag, without having to parse the entire file - @returns a new XmlElement which the caller will need to delete, or null if - there was an error. - @see getLastParseError - */ - XmlElement* getDocumentElement (bool onlyReadOuterDocumentElement = false); - - /** Returns the parsing error that occurred the last time getDocumentElement was called. - - @returns the error, or an empty string if there was no error. - */ - const String& getLastParseError() const noexcept; - - /** Sets an input source object to use for parsing documents that reference external entities. - - If the document has been created from a file, this probably won't be needed, but - if you're parsing some text and there might be a DTD that references external - files, you may need to create a custom input source that can retrieve the - other files it needs. - - The object that is passed-in will be deleted automatically when no longer needed. - - @see InputSource - */ - void setInputSource (InputSource* newSource) noexcept; - - /** Sets a flag to change the treatment of empty text elements. - - If this is true (the default state), then any text elements that contain only - whitespace characters will be ingored during parsing. If you need to catch - whitespace-only text, then you should set this to false before calling the - getDocumentElement() method. - */ - void setEmptyTextElementsIgnored (bool shouldBeIgnored) noexcept; - - //============================================================================== - /** A handy static method that parses a file. - This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it. - @returns a new XmlElement which the caller will need to delete, or null if there was an error. - */ - static XmlElement* parse (const File& file); - - /** A handy static method that parses some XML data. - This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it. - @returns a new XmlElement which the caller will need to delete, or null if there was an error. - */ - static XmlElement* parse (const String& xmlData); - - - //============================================================================== -private: - String originalText; - String::CharPointerType input; - bool outOfData, errorOccurred; - - String lastError, dtdText; - StringArray tokenisedDTD; - bool needToLoadDTD, ignoreEmptyTextElements; - ScopedPointer inputSource; - - void setLastError (const String& desc, bool carryOn); - void skipHeader(); - void skipNextWhiteSpace(); - beast_wchar readNextChar() noexcept; - XmlElement* readNextElement (bool alsoParseSubElements); - void readChildElements (XmlElement* parent); - int findNextTokenLength() noexcept; - void readQuotedString (String& result); - void readEntity (String& result); - - String getFileContents (const String& filename) const; - String expandEntity (const String& entity); - String expandExternalEntity (const String& entity); - String getParameterEntity (const String& entity); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument) -}; - - -#endif // BEAST_XMLDOCUMENT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.cpp b/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.cpp deleted file mode 100644 index 9c992c9c6b..0000000000 --- a/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.cpp +++ /dev/null @@ -1,824 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -XmlElement::XmlAttributeNode::XmlAttributeNode (const XmlAttributeNode& other) noexcept - : name (other.name), - value (other.value) -{ -} - -XmlElement::XmlAttributeNode::XmlAttributeNode (const String& n, const String& v) noexcept - : name (n), value (v) -{ - #if BEAST_DEBUG - // this checks whether the attribute name string contains any illegal characters.. - for (String::CharPointerType t (name.getCharPointer()); ! t.isEmpty(); ++t) - bassert (t.isLetterOrDigit() || *t == '_' || *t == '-' || *t == ':'); - #endif -} - -inline bool XmlElement::XmlAttributeNode::hasName (const String& nameToMatch) const noexcept -{ - return name.equalsIgnoreCase (nameToMatch); -} - -//============================================================================== -XmlElement::XmlElement (const String& tag) noexcept - : tagName (tag) -{ - // the tag name mustn't be empty, or it'll look like a text element! - bassert (tag.containsNonWhitespaceChars()) - - // The tag can't contain spaces or other characters that would create invalid XML! - bassert (! tag.containsAnyOf (" <>/&")); -} - -XmlElement::XmlElement (int /*dummy*/) noexcept -{ -} - -XmlElement::XmlElement (const XmlElement& other) - : tagName (other.tagName) -{ - copyChildrenAndAttributesFrom (other); -} - -XmlElement& XmlElement::operator= (const XmlElement& other) -{ - if (this != &other) - { - removeAllAttributes(); - deleteAllChildElements(); - - tagName = other.tagName; - - copyChildrenAndAttributesFrom (other); - } - - return *this; -} - -#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS -XmlElement::XmlElement (XmlElement&& other) noexcept - : nextListItem (static_cast &&> (other.nextListItem)), - firstChildElement (static_cast &&> (other.firstChildElement)), - attributes (static_cast &&> (other.attributes)), - tagName (static_cast (other.tagName)) -{ -} - -XmlElement& XmlElement::operator= (XmlElement&& other) noexcept -{ - bassert (this != &other); // hopefully the compiler should make this situation impossible! - - removeAllAttributes(); - deleteAllChildElements(); - - nextListItem = static_cast &&> (other.nextListItem); - firstChildElement = static_cast &&> (other.firstChildElement); - attributes = static_cast &&> (other.attributes); - tagName = static_cast (other.tagName); - - return *this; -} -#endif - -void XmlElement::copyChildrenAndAttributesFrom (const XmlElement& other) -{ - bassert (firstChildElement.get() == nullptr); - firstChildElement.addCopyOfList (other.firstChildElement); - - bassert (attributes.get() == nullptr); - attributes.addCopyOfList (other.attributes); -} - -XmlElement::~XmlElement() noexcept -{ - firstChildElement.deleteAll(); - attributes.deleteAll(); -} - -//============================================================================== -namespace XmlOutputFunctions -{ - #if 0 // (These functions are just used to generate the lookup table used below) - bool isLegalXmlCharSlow (const beast_wchar character) noexcept - { - if ((character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z') - || (character >= '0' && character <= '9')) - return true; - - const char* t = " .,;:-()_+=?!'#@[]/\\*%~{}$|"; - - do - { - if (((beast_wchar) (uint8) *t) == character) - return true; - } - while (*++t != 0); - - return false; - } - - void generateLegalCharLookupTable() - { - uint8 n[32] = { 0 }; - for (int i = 0; i < 256; ++i) - if (isLegalXmlCharSlow (i)) - n[i >> 3] |= (1 << (i & 7)); - - String s; - for (int i = 0; i < 32; ++i) - s << (int) n[i] << ", "; - - DBG (s); - } - #endif - - static bool isLegalXmlChar (const uint32 c) noexcept - { - static const unsigned char legalChars[] = { 0, 0, 0, 0, 187, 255, 255, 175, 255, 255, 255, 191, 254, 255, 255, 127 }; - - return c < sizeof (legalChars) * 8 - && (legalChars [c >> 3] & (1 << (c & 7))) != 0; - } - - static void escapeIllegalXmlChars (OutputStream& outputStream, const String& text, const bool changeNewLines) - { - String::CharPointerType t (text.getCharPointer()); - - for (;;) - { - const uint32 character = (uint32) t.getAndAdvance(); - - if (character == 0) - break; - - if (isLegalXmlChar (character)) - { - outputStream << (char) character; - } - else - { - switch (character) - { - case '&': outputStream << "&"; break; - case '"': outputStream << """; break; - case '>': outputStream << ">"; break; - case '<': outputStream << "<"; break; - - case '\n': - case '\r': - if (! changeNewLines) - { - outputStream << (char) character; - break; - } - // Note: deliberate fall-through here! - default: - outputStream << "&#" << ((int) character) << ';'; - break; - } - } - } - } - - static void writeSpaces (OutputStream& out, const int numSpaces) - { - out.writeRepeatedByte (' ', numSpaces); - } -} - -void XmlElement::writeElementAsText (OutputStream& outputStream, - const int indentationLevel, - const int lineWrapLength) const -{ - using namespace XmlOutputFunctions; - - if (indentationLevel >= 0) - writeSpaces (outputStream, indentationLevel); - - if (! isTextElement()) - { - outputStream.writeByte ('<'); - outputStream << tagName; - - { - const int attIndent = indentationLevel + tagName.length() + 1; - int lineLen = 0; - - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (lineLen > lineWrapLength && indentationLevel >= 0) - { - outputStream << newLine; - writeSpaces (outputStream, attIndent); - lineLen = 0; - } - - const int64 startPos = outputStream.getPosition(); - outputStream.writeByte (' '); - outputStream << att->name; - outputStream.write ("=\"", 2); - escapeIllegalXmlChars (outputStream, att->value, true); - outputStream.writeByte ('"'); - lineLen += (int) (outputStream.getPosition() - startPos); - } - } - - if (firstChildElement != nullptr) - { - outputStream.writeByte ('>'); - - bool lastWasTextNode = false; - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - { - if (child->isTextElement()) - { - escapeIllegalXmlChars (outputStream, child->getText(), false); - lastWasTextNode = true; - } - else - { - if (indentationLevel >= 0 && ! lastWasTextNode) - outputStream << newLine; - - child->writeElementAsText (outputStream, - lastWasTextNode ? 0 : (indentationLevel + (indentationLevel >= 0 ? 2 : 0)), lineWrapLength); - lastWasTextNode = false; - } - } - - if (indentationLevel >= 0 && ! lastWasTextNode) - { - outputStream << newLine; - writeSpaces (outputStream, indentationLevel); - } - - outputStream.write ("'); - } - else - { - outputStream.write ("/>", 2); - } - } - else - { - escapeIllegalXmlChars (outputStream, getText(), false); - } -} - -String XmlElement::createDocument (const String& dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - const String& encodingType, - const int lineWrapLength) const -{ - MemoryOutputStream mem (2048); - writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength); - - return mem.toUTF8(); -} - -void XmlElement::writeToStream (OutputStream& output, - const String& dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - const String& encodingType, - const int lineWrapLength) const -{ - using namespace XmlOutputFunctions; - - if (includeXmlHeader) - { - output << ""; - - if (allOnOneLine) - output.writeByte (' '); - else - output << newLine << newLine; - } - - if (dtdToUse.isNotEmpty()) - { - output << dtdToUse; - - if (allOnOneLine) - output.writeByte (' '); - else - output << newLine; - } - - writeElementAsText (output, allOnOneLine ? -1 : 0, lineWrapLength); - - if (! allOnOneLine) - output << newLine; -} - -bool XmlElement::writeToFile (const File& file, - const String& dtdToUse, - const String& encodingType, - const int lineWrapLength) const -{ - TemporaryFile tempFile (file); - - { - FileOutputStream out (tempFile.getFile()); - - if (! out.openedOk()) - return false; - - writeToStream (out, dtdToUse, false, true, encodingType, lineWrapLength); - } - - return tempFile.overwriteTargetFileWithTemporary(); -} - -//============================================================================== -bool XmlElement::hasTagName (const String& possibleTagName) const noexcept -{ - const bool matches = tagName.equalsIgnoreCase (possibleTagName); - - // XML tags should be case-sensitive, so although this method allows a - // case-insensitive match to pass, you should try to avoid this. - bassert ((! matches) || tagName == possibleTagName); - - return matches; -} - -String XmlElement::getNamespace() const -{ - return tagName.upToFirstOccurrenceOf (":", false, false); -} - -String XmlElement::getTagNameWithoutNamespace() const -{ - return tagName.fromLastOccurrenceOf (":", false, false); -} - -bool XmlElement::hasTagNameIgnoringNamespace (const String& possibleTagName) const -{ - return hasTagName (possibleTagName) || getTagNameWithoutNamespace() == possibleTagName; -} - -XmlElement* XmlElement::getNextElementWithTagName (const String& requiredTagName) const -{ - XmlElement* e = nextListItem; - - while (e != nullptr && ! e->hasTagName (requiredTagName)) - e = e->nextListItem; - - return e; -} - -//============================================================================== -int XmlElement::getNumAttributes() const noexcept -{ - return attributes.size(); -} - -const String& XmlElement::getAttributeName (const int index) const noexcept -{ - const XmlAttributeNode* const att = attributes [index]; - return att != nullptr ? att->name : String::empty; -} - -const String& XmlElement::getAttributeValue (const int index) const noexcept -{ - const XmlAttributeNode* const att = attributes [index]; - return att != nullptr ? att->value : String::empty; -} - -bool XmlElement::hasAttribute (const String& attributeName) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return true; - - return false; -} - -//============================================================================== -const String& XmlElement::getStringAttribute (const String& attributeName) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value; - - return String::empty; -} - -String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value; - - return defaultReturnValue; -} - -int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value.getIntValue(); - - return defaultReturnValue; -} - -double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value.getDoubleValue(); - - return defaultReturnValue; -} - -bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (att->hasName (attributeName)) - { - beast_wchar firstChar = att->value[0]; - - if (CharacterFunctions::isWhitespace (firstChar)) - firstChar = att->value.trimStart() [0]; - - return firstChar == '1' - || firstChar == 't' - || firstChar == 'y' - || firstChar == 'T' - || firstChar == 'Y'; - } - } - - return defaultReturnValue; -} - -bool XmlElement::compareAttribute (const String& attributeName, - const String& stringToCompareAgainst, - const bool ignoreCase) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return ignoreCase ? att->value.equalsIgnoreCase (stringToCompareAgainst) - : att->value == stringToCompareAgainst; - - return false; -} - -//============================================================================== -void XmlElement::setAttribute (const String& attributeName, const String& value) -{ - if (attributes == nullptr) - { - attributes = new XmlAttributeNode (attributeName, value); - } - else - { - for (XmlAttributeNode* att = attributes; ; att = att->nextListItem) - { - if (att->hasName (attributeName)) - { - att->value = value; - break; - } - - if (att->nextListItem == nullptr) - { - att->nextListItem = new XmlAttributeNode (attributeName, value); - break; - } - } - } -} - -void XmlElement::setAttribute (const String& attributeName, const int number) -{ - setAttribute (attributeName, String (number)); -} - -void XmlElement::setAttribute (const String& attributeName, const double number) -{ - setAttribute (attributeName, String (number)); -} - -void XmlElement::removeAttribute (const String& attributeName) noexcept -{ - for (LinkedListPointer* att = &attributes; - att->get() != nullptr; - att = &(att->get()->nextListItem)) - { - if (att->get()->hasName (attributeName)) - { - delete att->removeNext(); - break; - } - } -} - -void XmlElement::removeAllAttributes() noexcept -{ - attributes.deleteAll(); -} - -//============================================================================== -int XmlElement::getNumChildElements() const noexcept -{ - return firstChildElement.size(); -} - -XmlElement* XmlElement::getChildElement (const int index) const noexcept -{ - return firstChildElement [index].get(); -} - -XmlElement* XmlElement::getChildByName (const String& childName) const noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - if (child->hasTagName (childName)) - return child; - - return nullptr; -} - -void XmlElement::addChildElement (XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - firstChildElement.append (newNode); -} - -void XmlElement::insertChildElement (XmlElement* const newNode, - int indexToInsertAt) noexcept -{ - if (newNode != nullptr) - { - removeChildElement (newNode, false); - firstChildElement.insertAtIndex (indexToInsertAt, newNode); - } -} - -XmlElement* XmlElement::createNewChildElement (const String& childTagName) -{ - XmlElement* const newElement = new XmlElement (childTagName); - addChildElement (newElement); - return newElement; -} - -bool XmlElement::replaceChildElement (XmlElement* const currentChildElement, - XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - { - if (LinkedListPointer* const p = firstChildElement.findPointerTo (currentChildElement)) - { - if (currentChildElement != newNode) - delete p->replaceNext (newNode); - - return true; - } - } - - return false; -} - -void XmlElement::removeChildElement (XmlElement* const childToRemove, - const bool shouldDeleteTheChild) noexcept -{ - if (childToRemove != nullptr) - { - firstChildElement.remove (childToRemove); - - if (shouldDeleteTheChild) - delete childToRemove; - } -} - -bool XmlElement::isEquivalentTo (const XmlElement* const other, - const bool ignoreOrderOfAttributes) const noexcept -{ - if (this != other) - { - if (other == nullptr || tagName != other->tagName) - return false; - - if (ignoreOrderOfAttributes) - { - int totalAtts = 0; - - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (! other->compareAttribute (att->name, att->value)) - return false; - - ++totalAtts; - } - - if (totalAtts != other->getNumAttributes()) - return false; - } - else - { - const XmlAttributeNode* thisAtt = attributes; - const XmlAttributeNode* otherAtt = other->attributes; - - for (;;) - { - if (thisAtt == nullptr || otherAtt == nullptr) - { - if (thisAtt == otherAtt) // both 0, so it's a match - break; - - return false; - } - - if (thisAtt->name != otherAtt->name - || thisAtt->value != otherAtt->value) - { - return false; - } - - thisAtt = thisAtt->nextListItem; - otherAtt = otherAtt->nextListItem; - } - } - - const XmlElement* thisChild = firstChildElement; - const XmlElement* otherChild = other->firstChildElement; - - for (;;) - { - if (thisChild == nullptr || otherChild == nullptr) - { - if (thisChild == otherChild) // both 0, so it's a match - break; - - return false; - } - - if (! thisChild->isEquivalentTo (otherChild, ignoreOrderOfAttributes)) - return false; - - thisChild = thisChild->nextListItem; - otherChild = otherChild->nextListItem; - } - } - - return true; -} - -void XmlElement::deleteAllChildElements() noexcept -{ - firstChildElement.deleteAll(); -} - -void XmlElement::deleteAllChildElementsWithTagName (const String& name) noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr;) - { - XmlElement* const nextChild = child->nextListItem; - - if (child->hasTagName (name)) - removeChildElement (child, true); - - child = nextChild; - } -} - -bool XmlElement::containsChildElement (const XmlElement* const possibleChild) const noexcept -{ - return firstChildElement.contains (possibleChild); -} - -XmlElement* XmlElement::findParentElementOf (const XmlElement* const elementToLookFor) noexcept -{ - if (this == elementToLookFor || elementToLookFor == nullptr) - return nullptr; - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - { - if (elementToLookFor == child) - return this; - - if (XmlElement* const found = child->findParentElementOf (elementToLookFor)) - return found; - } - - return nullptr; -} - -void XmlElement::getChildElementsAsArray (XmlElement** elems) const noexcept -{ - firstChildElement.copyToArray (elems); -} - -void XmlElement::reorderChildElements (XmlElement** const elems, const int num) noexcept -{ - XmlElement* e = firstChildElement = elems[0]; - - for (int i = 1; i < num; ++i) - { - e->nextListItem = elems[i]; - e = e->nextListItem; - } - - e->nextListItem = nullptr; -} - -//============================================================================== -bool XmlElement::isTextElement() const noexcept -{ - return tagName.isEmpty(); -} - -static const String beast_xmltextContentAttributeName ("text"); - -const String& XmlElement::getText() const noexcept -{ - bassert (isTextElement()); // you're trying to get the text from an element that - // isn't actually a text element.. If this contains text sub-nodes, you - // probably want to use getAllSubText instead. - - return getStringAttribute (beast_xmltextContentAttributeName); -} - -void XmlElement::setText (const String& newText) -{ - if (isTextElement()) - setAttribute (beast_xmltextContentAttributeName, newText); - else - bassertfalse; // you can only change the text in a text element, not a normal one. -} - -String XmlElement::getAllSubText() const -{ - if (isTextElement()) - return getText(); - - MemoryOutputStream mem (1024); - - for (const XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - mem << child->getAllSubText(); - - return mem.toString(); -} - -String XmlElement::getChildElementAllSubText (const String& childTagName, - const String& defaultReturnValue) const -{ - if (const XmlElement* const child = getChildByName (childTagName)) - return child->getAllSubText(); - - return defaultReturnValue; -} - -XmlElement* XmlElement::createTextElement (const String& text) -{ - XmlElement* const e = new XmlElement ((int) 0); - e->setAttribute (beast_xmltextContentAttributeName, text); - return e; -} - -void XmlElement::addTextElement (const String& text) -{ - addChildElement (createTextElement (text)); -} - -void XmlElement::deleteAllTextElements() noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr;) - { - XmlElement* const next = child->nextListItem; - - if (child->isTextElement()) - removeChildElement (child, true); - - child = next; - } -} diff --git a/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.h b/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.h deleted file mode 100644 index 9705b78ea8..0000000000 --- a/Subtrees/beast/modules/beast_core/xml/beast_XmlElement.h +++ /dev/null @@ -1,734 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Portions of this file are from JUCE. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, 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. -*/ -//============================================================================== - -#ifndef BEAST_XMLELEMENT_BEASTHEADER -#define BEAST_XMLELEMENT_BEASTHEADER - -#include "../text/beast_String.h" -#include "../streams/beast_OutputStream.h" -#include "../files/beast_File.h" -#include "../containers/beast_LinkedListPointer.h" - - -//============================================================================== -/** A handy macro to make it easy to iterate all the child elements in an XmlElement. - - The parentXmlElement should be a reference to the parent XML, and the childElementVariableName - will be the name of a pointer to each child element. - - E.g. @code - XmlElement* myParentXml = createSomeKindOfXmlDocument(); - - forEachXmlChildElement (*myParentXml, child) - { - if (child->hasTagName ("FOO")) - doSomethingWithXmlElement (child); - } - - @endcode - - @see forEachXmlChildElementWithTagName -*/ -#define forEachXmlChildElement(parentXmlElement, childElementVariableName) \ -\ - for (beast::XmlElement* childElementVariableName = (parentXmlElement).getFirstChildElement(); \ - childElementVariableName != nullptr; \ - childElementVariableName = childElementVariableName->getNextElement()) - -/** A macro that makes it easy to iterate all the child elements of an XmlElement - which have a specified tag. - - This does the same job as the forEachXmlChildElement macro, but only for those - elements that have a particular tag name. - - The parentXmlElement should be a reference to the parent XML, and the childElementVariableName - will be the name of a pointer to each child element. The requiredTagName is the - tag name to match. - - E.g. @code - XmlElement* myParentXml = createSomeKindOfXmlDocument(); - - forEachXmlChildElementWithTagName (*myParentXml, child, "MYTAG") - { - // the child object is now guaranteed to be a element.. - doSomethingWithMYTAGElement (child); - } - - @endcode - - @see forEachXmlChildElement -*/ -#define forEachXmlChildElementWithTagName(parentXmlElement, childElementVariableName, requiredTagName) \ -\ - for (beast::XmlElement* childElementVariableName = (parentXmlElement).getChildByName (requiredTagName); \ - childElementVariableName != nullptr; \ - childElementVariableName = childElementVariableName->getNextElementWithTagName (requiredTagName)) - - -//============================================================================== -/** Used to build a tree of elements representing an XML document. - - An XML document can be parsed into a tree of XmlElements, each of which - represents an XML tag structure, and which may itself contain other - nested elements. - - An XmlElement can also be converted back into a text document, and has - lots of useful methods for manipulating its attributes and sub-elements, - so XmlElements can actually be used as a handy general-purpose data - structure. - - Here's an example of parsing some elements: @code - // check we're looking at the right kind of document.. - if (myElement->hasTagName ("ANIMALS")) - { - // now we'll iterate its sub-elements looking for 'giraffe' elements.. - forEachXmlChildElement (*myElement, e) - { - if (e->hasTagName ("GIRAFFE")) - { - // found a giraffe, so use some of its attributes.. - - String giraffeName = e->getStringAttribute ("name"); - int giraffeAge = e->getIntAttribute ("age"); - bool isFriendly = e->getBoolAttribute ("friendly"); - } - } - } - @endcode - - And here's an example of how to create an XML document from scratch: @code - // create an outer node called "ANIMALS" - XmlElement animalsList ("ANIMALS"); - - for (int i = 0; i < numAnimals; ++i) - { - // create an inner element.. - XmlElement* giraffe = new XmlElement ("GIRAFFE"); - - giraffe->setAttribute ("name", "nigel"); - giraffe->setAttribute ("age", 10); - giraffe->setAttribute ("friendly", true); - - // ..and add our new element to the parent node - animalsList.addChildElement (giraffe); - } - - // now we can turn the whole thing into a text document.. - String myXmlDoc = animalsList.createDocument (String::empty); - @endcode - - @see XmlDocument -*/ -class BEAST_API XmlElement -{ -public: - //============================================================================== - /** Creates an XmlElement with this tag name. */ - explicit XmlElement (const String& tagName) noexcept; - - /** Creates a (deep) copy of another element. */ - XmlElement (const XmlElement& other); - - /** Creates a (deep) copy of another element. */ - XmlElement& operator= (const XmlElement& other); - - #if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS - XmlElement (XmlElement&& other) noexcept; - XmlElement& operator= (XmlElement&& other) noexcept; - #endif - - /** Deleting an XmlElement will also delete all its child elements. */ - ~XmlElement() noexcept; - - //============================================================================== - /** Compares two XmlElements to see if they contain the same text and attiributes. - - The elements are only considered equivalent if they contain the same attiributes - with the same values, and have the same sub-nodes. - - @param other the other element to compare to - @param ignoreOrderOfAttributes if true, this means that two elements with the - same attributes in a different order will be - considered the same; if false, the attributes must - be in the same order as well - */ - bool isEquivalentTo (const XmlElement* other, - bool ignoreOrderOfAttributes) const noexcept; - - //============================================================================== - /** Returns an XML text document that represents this element. - - The string returned can be parsed to recreate the same XmlElement that - was used to create it. - - @param dtdToUse the DTD to add to the document - @param allOnOneLine if true, this means that the document will not contain any - linefeeds, so it'll be smaller but not very easy to read. - @param includeXmlHeader whether to add the ", this would return "MOOSE". - @see hasTagName - */ - inline const String& getTagName() const noexcept { return tagName; } - - /** Returns the namespace portion of the tag-name, or an empty string if none is specified. */ - String getNamespace() const; - - /** Returns the part of the tag-name that follows any namespace declaration. */ - String getTagNameWithoutNamespace() const; - - /** Tests whether this element has a particular tag name. - @param possibleTagName the tag name you're comparing it with - @see getTagName - */ - bool hasTagName (const String& possibleTagName) const noexcept; - - /** Tests whether this element has a particular tag name, ignoring any XML namespace prefix. - So a test for e.g. "xyz" will return true for "xyz" and also "foo:xyz", "bar::xyz", etc. - @see getTagName - */ - bool hasTagNameIgnoringNamespace (const String& possibleTagName) const; - - //============================================================================== - /** Returns the number of XML attributes this element contains. - - E.g. for an element such as \, this would - return 2. - */ - int getNumAttributes() const noexcept; - - /** Returns the name of one of the elements attributes. - - E.g. for an element such as \, then - getAttributeName(1) would return "antlers". - - @see getAttributeValue, getStringAttribute - */ - const String& getAttributeName (int attributeIndex) const noexcept; - - /** Returns the value of one of the elements attributes. - - E.g. for an element such as \, then - getAttributeName(1) would return "2". - - @see getAttributeName, getStringAttribute - */ - const String& getAttributeValue (int attributeIndex) const noexcept; - - //============================================================================== - // Attribute-handling methods.. - - /** Checks whether the element contains an attribute with a certain name. */ - bool hasAttribute (const String& attributeName) const noexcept; - - /** Returns the value of a named attribute. - - @param attributeName the name of the attribute to look up - */ - const String& getStringAttribute (const String& attributeName) const noexcept; - - /** Returns the value of a named attribute. - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - */ - String getStringAttribute (const String& attributeName, - const String& defaultReturnValue) const; - - /** Compares the value of a named attribute with a value passed-in. - - @param attributeName the name of the attribute to look up - @param stringToCompareAgainst the value to compare it with - @param ignoreCase whether the comparison should be case-insensitive - @returns true if the value of the attribute is the same as the string passed-in; - false if it's different (or if no such attribute exists) - */ - bool compareAttribute (const String& attributeName, - const String& stringToCompareAgainst, - bool ignoreCase = false) const noexcept; - - /** Returns the value of a named attribute as an integer. - - This will try to find the attribute and convert it to an integer (using - the String::getIntValue() method). - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - @see setAttribute - */ - int getIntAttribute (const String& attributeName, - int defaultReturnValue = 0) const; - - /** Returns the value of a named attribute as floating-point. - - This will try to find the attribute and convert it to an integer (using - the String::getDoubleValue() method). - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - @see setAttribute - */ - double getDoubleAttribute (const String& attributeName, - double defaultReturnValue = 0.0) const; - - /** Returns the value of a named attribute as a boolean. - - This will try to find the attribute and interpret it as a boolean. To do this, - it'll return true if the value is "1", "true", "y", etc, or false for other - values. - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - */ - bool getBoolAttribute (const String& attributeName, - bool defaultReturnValue = false) const; - - /** Adds a named attribute to the element. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - @see removeAttribute - */ - void setAttribute (const String& attributeName, - const String& newValue); - - /** Adds a named attribute to the element, setting it to an integer value. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - */ - void setAttribute (const String& attributeName, - int newValue); - - /** Adds a named attribute to the element, setting it to a floating-point value. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - */ - void setAttribute (const String& attributeName, - double newValue); - - /** Removes a named attribute from the element. - - @param attributeName the name of the attribute to remove - @see removeAllAttributes - */ - void removeAttribute (const String& attributeName) noexcept; - - /** Removes all attributes from this element. - */ - void removeAllAttributes() noexcept; - - //============================================================================== - // Child element methods.. - - /** Returns the first of this element's sub-elements. - - see getNextElement() for an example of how to iterate the sub-elements. - - @see forEachXmlChildElement - */ - XmlElement* getFirstChildElement() const noexcept { return firstChildElement; } - - /** Returns the next of this element's siblings. - - This can be used for iterating an element's sub-elements, e.g. - @code - XmlElement* child = myXmlDocument->getFirstChildElement(); - - while (child != nullptr) - { - ...do stuff with this child.. - - child = child->getNextElement(); - } - @endcode - - Note that when iterating the child elements, some of them might be - text elements as well as XML tags - use isTextElement() to work this - out. - - Also, it's much easier and neater to use this method indirectly via the - forEachXmlChildElement macro. - - @returns the sibling element that follows this one, or zero if this is the last - element in its parent - - @see getNextElement, isTextElement, forEachXmlChildElement - */ - inline XmlElement* getNextElement() const noexcept { return nextListItem; } - - /** Returns the next of this element's siblings which has the specified tag - name. - - This is like getNextElement(), but will scan through the list until it - finds an element with the given tag name. - - @see getNextElement, forEachXmlChildElementWithTagName - */ - XmlElement* getNextElementWithTagName (const String& requiredTagName) const; - - /** Returns the number of sub-elements in this element. - - @see getChildElement - */ - int getNumChildElements() const noexcept; - - /** Returns the sub-element at a certain index. - - It's not very efficient to iterate the sub-elements by index - see - getNextElement() for an example of how best to iterate. - - @returns the n'th child of this element, or nullptr if the index is out-of-range - @see getNextElement, isTextElement, getChildByName - */ - XmlElement* getChildElement (int index) const noexcept; - - /** Returns the first sub-element with a given tag-name. - - @param tagNameToLookFor the tag name of the element you want to find - @returns the first element with this tag name, or nullptr if none is found - @see getNextElement, isTextElement, getChildElement - */ - XmlElement* getChildByName (const String& tagNameToLookFor) const noexcept; - - //============================================================================== - /** Appends an element to this element's list of children. - - Child elements are deleted automatically when their parent is deleted, so - make sure the object that you pass in will not be deleted by anything else, - and make sure it's not already the child of another element. - - @see getFirstChildElement, getNextElement, getNumChildElements, - getChildElement, removeChildElement - */ - void addChildElement (XmlElement* newChildElement) noexcept; - - /** Inserts an element into this element's list of children. - - Child elements are deleted automatically when their parent is deleted, so - make sure the object that you pass in will not be deleted by anything else, - and make sure it's not already the child of another element. - - @param newChildNode the element to add - @param indexToInsertAt the index at which to insert the new element - if this is - below zero, it will be added to the end of the list - @see addChildElement, insertChildElement - */ - void insertChildElement (XmlElement* newChildNode, - int indexToInsertAt) noexcept; - - /** Creates a new element with the given name and returns it, after adding it - as a child element. - - This is a handy method that means that instead of writing this: - @code - XmlElement* newElement = new XmlElement ("foobar"); - myParentElement->addChildElement (newElement); - @endcode - - ..you could just write this: - @code - XmlElement* newElement = myParentElement->createNewChildElement ("foobar"); - @endcode - */ - XmlElement* createNewChildElement (const String& tagName); - - /** Replaces one of this element's children with another node. - - If the current element passed-in isn't actually a child of this element, - this will return false and the new one won't be added. Otherwise, the - existing element will be deleted, replaced with the new one, and it - will return true. - */ - bool replaceChildElement (XmlElement* currentChildElement, - XmlElement* newChildNode) noexcept; - - /** Removes a child element. - - @param childToRemove the child to look for and remove - @param shouldDeleteTheChild if true, the child will be deleted, if false it'll - just remove it - */ - void removeChildElement (XmlElement* childToRemove, - bool shouldDeleteTheChild) noexcept; - - /** Deletes all the child elements in the element. - - @see removeChildElement, deleteAllChildElementsWithTagName - */ - void deleteAllChildElements() noexcept; - - /** Deletes all the child elements with a given tag name. - - @see removeChildElement - */ - void deleteAllChildElementsWithTagName (const String& tagName) noexcept; - - /** Returns true if the given element is a child of this one. */ - bool containsChildElement (const XmlElement* possibleChild) const noexcept; - - /** Recursively searches all sub-elements to find one that contains the specified - child element. - */ - XmlElement* findParentElementOf (const XmlElement* elementToLookFor) noexcept; - - //============================================================================== - /** Sorts the child elements using a comparator. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (const XmlElement* first, const XmlElement* second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items which the comparator - says are equivalent will be kept in the order in which they - currently appear in the array. This is slower to perform, but - may be important in some cases. If it's false, a faster algorithm - is used, but equivalent elements may be rearranged. - */ - template - void sortChildElements (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) - { - const int num = getNumChildElements(); - - if (num > 1) - { - HeapBlock elems ((size_t) num); - getChildElementsAsArray (elems); - sortArray (comparator, (XmlElement**) elems, 0, num - 1, retainOrderOfEquivalentItems); - reorderChildElements (elems, num); - } - } - - //============================================================================== - /** Returns true if this element is a section of text. - - Elements can either be an XML tag element or a secton of text, so this - is used to find out what kind of element this one is. - - @see getAllText, addTextElement, deleteAllTextElements - */ - bool isTextElement() const noexcept; - - /** Returns the text for a text element. - - Note that if you have an element like this: - - @codehello@endcode - - then calling getText on the "xyz" element won't return "hello", because that is - actually stored in a special text sub-element inside the xyz element. To get the - "hello" string, you could either call getText on the (unnamed) sub-element, or - use getAllSubText() to do this automatically. - - Note that leading and trailing whitespace will be included in the string - to remove - if, just call String::trim() on the result. - - @see isTextElement, getAllSubText, getChildElementAllSubText - */ - const String& getText() const noexcept; - - /** Sets the text in a text element. - - Note that this is only a valid call if this element is a text element. If it's - not, then no action will be performed. If you're trying to add text inside a normal - element, you probably want to use addTextElement() instead. - */ - void setText (const String& newText); - - /** Returns all the text from this element's child nodes. - - This iterates all the child elements and when it finds text elements, - it concatenates their text into a big string which it returns. - - E.g. @codehello there world@endcode - if you called getAllSubText on the "xyz" element, it'd return "hello there world". - - Note that leading and trailing whitespace will be included in the string - to remove - if, just call String::trim() on the result. - - @see isTextElement, getChildElementAllSubText, getText, addTextElement - */ - String getAllSubText() const; - - /** Returns all the sub-text of a named child element. - - If there is a child element with the given tag name, this will return - all of its sub-text (by calling getAllSubText() on it). If there is - no such child element, this will return the default string passed-in. - - @see getAllSubText - */ - String getChildElementAllSubText (const String& childTagName, - const String& defaultReturnValue) const; - - /** Appends a section of text to this element. - - @see isTextElement, getText, getAllSubText - */ - void addTextElement (const String& text); - - /** Removes all the text elements from this element. - - @see isTextElement, getText, getAllSubText, addTextElement - */ - void deleteAllTextElements() noexcept; - - /** Creates a text element that can be added to a parent element. - */ - static XmlElement* createTextElement (const String& text); - - //============================================================================== -private: - struct XmlAttributeNode - { - XmlAttributeNode (const XmlAttributeNode&) noexcept; - XmlAttributeNode (const String& name, const String& value) noexcept; - - LinkedListPointer nextListItem; - String name, value; - - bool hasName (const String&) const noexcept; - - private: - XmlAttributeNode& operator= (const XmlAttributeNode&); - }; - - friend class XmlDocument; - friend class LinkedListPointer ; - friend class LinkedListPointer ; - friend class LinkedListPointer ::Appender; - - LinkedListPointer nextListItem; - LinkedListPointer firstChildElement; - LinkedListPointer attributes; - String tagName; - - XmlElement (int) noexcept; - void copyChildrenAndAttributesFrom (const XmlElement&); - void writeElementAsText (OutputStream&, int indentationLevel, int lineWrapLength) const; - void getChildElementsAsArray (XmlElement**) const noexcept; - void reorderChildElements (XmlElement**, int) noexcept; - - BEAST_LEAK_DETECTOR (XmlElement) -}; - - -#endif // BEAST_XMLELEMENT_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.cpp b/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.cpp deleted file mode 100644 index a2467d15f8..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -class GZIPCompressorOutputStream::GZIPCompressorHelper -{ -public: - GZIPCompressorHelper (const int compressionLevel, const int windowBits) - : compLevel ((compressionLevel < 1 || compressionLevel > 9) ? -1 : compressionLevel), - isFirstDeflate (true), - streamIsValid (false), - finished (false) - { - using namespace zlibNamespace; - zerostruct (stream); - - streamIsValid = (deflateInit2 (&stream, compLevel, Z_DEFLATED, - windowBits != 0 ? windowBits : MAX_WBITS, - 8, strategy) == Z_OK); - } - - ~GZIPCompressorHelper() - { - if (streamIsValid) - zlibNamespace::deflateEnd (&stream); - } - - bool write (const uint8* data, size_t dataSize, OutputStream& out) - { - // When you call flush() on a gzip stream, the stream is closed, and you can - // no longer continue to write data to it! - bassert (! finished); - - while (dataSize > 0) - if (! doNextBlock (data, dataSize, out, Z_NO_FLUSH)) - return false; - - return true; - } - - void finish (OutputStream& out) - { - const uint8* data = nullptr; - size_t dataSize = 0; - - while (! finished) - doNextBlock (data, dataSize, out, Z_FINISH); - } - -private: - enum { strategy = 0 }; - - zlibNamespace::z_stream stream; - const int compLevel; - bool isFirstDeflate, streamIsValid, finished; - zlibNamespace::Bytef buffer[32768]; - - bool doNextBlock (const uint8*& data, size_t& dataSize, OutputStream& out, const int flushMode) - { - using namespace zlibNamespace; - - if (streamIsValid) - { - stream.next_in = const_cast (data); - stream.next_out = buffer; - stream.avail_in = (z_uInt) dataSize; - stream.avail_out = (z_uInt) sizeof (buffer); - - const int result = isFirstDeflate ? deflateParams (&stream, compLevel, strategy) - : deflate (&stream, flushMode); - isFirstDeflate = false; - - switch (result) - { - case Z_STREAM_END: - finished = true; - // Deliberate fall-through.. - case Z_OK: - { - data += dataSize - stream.avail_in; - dataSize = stream.avail_in; - const ssize_t bytesDone = sizeof (buffer) - (ssize_t) stream.avail_out; - return bytesDone <= 0 || out.write (buffer, (size_t) bytesDone); - } - - default: - break; - } - } - - return false; - } - - BEAST_DECLARE_NON_COPYABLE (GZIPCompressorHelper) -}; - -//============================================================================== -GZIPCompressorOutputStream::GZIPCompressorOutputStream (OutputStream* const out, - const int compressionLevel, - const bool deleteDestStream, - const int windowBits) - : destStream (out, deleteDestStream), - helper (new GZIPCompressorHelper (compressionLevel, windowBits)) -{ - bassert (out != nullptr); -} - -GZIPCompressorOutputStream::~GZIPCompressorOutputStream() -{ - flush(); -} - -void GZIPCompressorOutputStream::flush() -{ - helper->finish (*destStream); - destStream->flush(); -} - -bool GZIPCompressorOutputStream::write (const void* destBuffer, size_t howMany) -{ - bassert (destBuffer != nullptr && (ssize_t) howMany >= 0); - - return helper->write (static_cast (destBuffer), howMany, *destStream); -} - -int64 GZIPCompressorOutputStream::getPosition() -{ - return destStream->getPosition(); -} - -bool GZIPCompressorOutputStream::setPosition (int64 /*newPosition*/) -{ - bassertfalse; // can't do it! - return false; -} - -//============================================================================== -#if BEAST_UNIT_TESTS - -class GZIPTests : public UnitTest -{ -public: - GZIPTests() : UnitTest ("GZIP") {} - - void runTest() - { - beginTest ("GZIP"); - Random rng; - - for (int i = 100; --i >= 0;) - { - MemoryOutputStream original, compressed, uncompressed; - - { - GZIPCompressorOutputStream zipper (&compressed, rng.nextInt (10), false); - - for (int j = rng.nextInt (100); --j >= 0;) - { - MemoryBlock data ((unsigned int) (rng.nextInt (2000) + 1)); - - for (int k = (int) data.getSize(); --k >= 0;) - data[k] = (char) rng.nextInt (255); - - original << data; - zipper << data; - } - } - - { - MemoryInputStream compressedInput (compressed.getData(), compressed.getDataSize(), false); - GZIPDecompressorInputStream unzipper (compressedInput); - - uncompressed << unzipper; - } - - expectEquals ((int) uncompressed.getDataSize(), - (int) original.getDataSize()); - - if (original.getDataSize() == uncompressed.getDataSize()) - expect (memcmp (uncompressed.getData(), - original.getData(), - original.getDataSize()) == 0); - } - } -}; - -static GZIPTests gzipTests; - -#endif diff --git a/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h b/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h deleted file mode 100644 index 6d7a66d6f5..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -#ifndef BEAST_GZIPCOMPRESSOROUTPUTSTREAM_BEASTHEADER -#define BEAST_GZIPCOMPRESSOROUTPUTSTREAM_BEASTHEADER - -#include "../streams/beast_OutputStream.h" -#include "../memory/beast_OptionalScopedPointer.h" -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** - A stream which uses zlib to compress the data written into it. - - Important note: When you call flush() on a GZIPCompressorOutputStream, - the gzip data is closed - this means that no more data can be written to - it, and any subsequent attempts to call write() will cause an assertion. - - @see GZIPDecompressorInputStream -*/ -class BEAST_API GZIPCompressorOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates a compression stream. - - @param destStream the stream into which the compressed data should - be written - @param compressionLevel how much to compress the data, between 1 and 9, where - 1 is the fastest/lowest compression, and 9 is the - slowest/highest compression. Any value outside this range - indicates that a default compression level should be used. - @param deleteDestStreamWhenDestroyed whether or not to delete the destStream object when - this stream is destroyed - @param windowBits this is used internally to change the window size used - by zlib - leave it as 0 unless you specifically need to set - its value for some reason - */ - GZIPCompressorOutputStream (OutputStream* destStream, - int compressionLevel = 0, - bool deleteDestStreamWhenDestroyed = false, - int windowBits = 0); - - /** Destructor. */ - ~GZIPCompressorOutputStream(); - - //============================================================================== - /** Flushes and closes the stream. - Note that unlike most streams, when you call flush() on a GZIPCompressorOutputStream, - the stream is closed - this means that no more data can be written to it, and any - subsequent attempts to call write() will cause an assertion. - */ - void flush(); - - int64 getPosition(); - bool setPosition (int64 newPosition); - bool write (const void* destBuffer, size_t howMany); - - /** These are preset values that can be used for the constructor's windowBits paramter. - For more info about this, see the zlib documentation for its windowBits parameter. - */ - enum WindowBitsValues - { - windowBitsRaw = -15, - windowBitsGZIP = 15 + 16 - }; - -private: - //============================================================================== - OptionalScopedPointer destStream; - - class GZIPCompressorHelper; - friend class ScopedPointer ; - ScopedPointer helper; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPCompressorOutputStream) -}; - -#endif // BEAST_GZIPCOMPRESSOROUTPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.cpp b/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.cpp deleted file mode 100644 index ad1c8d4dd0..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -#if BEAST_MSVC - #pragma warning (push) - #pragma warning (disable: 4309 4305 4365) -#endif - -namespace zlibNamespace -{ - #if BEAST_INCLUDE_ZLIB_CODE - #if BEAST_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #endif - - #undef OS_CODE - #undef fdopen - #define ZLIB_INTERNAL - #define NO_DUMMY_DECL - #include "zlib/zlib.h" - #include "zlib/adler32.c" - #include "zlib/compress.c" - #undef DO1 - #undef DO8 - #include "zlib/crc32.c" - #include "zlib/deflate.c" - #include "zlib/inffast.c" - #undef PULLBYTE - #undef LOAD - #undef RESTORE - #undef INITBITS - #undef NEEDBITS - #undef DROPBITS - #undef BYTEBITS - #include "zlib/inflate.c" - #include "zlib/inftrees.c" - #include "zlib/trees.c" - #include "zlib/zutil.c" - #undef Byte - #undef fdopen - #undef local - - #if BEAST_CLANG - #pragma clang diagnostic pop - #endif - #else - #include BEAST_ZLIB_INCLUDE_PATH - #endif -} - -#if BEAST_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -// internal helper object that holds the zlib structures so they don't have to be -// included publicly. -class GZIPDecompressorInputStream::GZIPDecompressHelper -{ -public: - GZIPDecompressHelper (const bool dontWrap) - : finished (true), - needsDictionary (false), - error (true), - streamIsValid (false), - data (nullptr), - dataSize (0) - { - using namespace zlibNamespace; - zerostruct (stream); - streamIsValid = (inflateInit2 (&stream, dontWrap ? -MAX_WBITS : MAX_WBITS) == Z_OK); - finished = error = ! streamIsValid; - } - - ~GZIPDecompressHelper() - { - using namespace zlibNamespace; - if (streamIsValid) - inflateEnd (&stream); - } - - bool needsInput() const noexcept { return dataSize <= 0; } - - void setInput (uint8* const data_, const size_t size) noexcept - { - data = data_; - dataSize = size; - } - - int doNextBlock (uint8* const dest, const unsigned int destSize) - { - using namespace zlibNamespace; - if (streamIsValid && data != nullptr && ! finished) - { - stream.next_in = data; - stream.next_out = dest; - stream.avail_in = (z_uInt) dataSize; - stream.avail_out = (z_uInt) destSize; - - switch (inflate (&stream, Z_PARTIAL_FLUSH)) - { - case Z_STREAM_END: - finished = true; - // deliberate fall-through - case Z_OK: - data += dataSize - stream.avail_in; - dataSize = (z_uInt) stream.avail_in; - return (int) (destSize - stream.avail_out); - - case Z_NEED_DICT: - needsDictionary = true; - data += dataSize - stream.avail_in; - dataSize = (size_t) stream.avail_in; - break; - - case Z_DATA_ERROR: - case Z_MEM_ERROR: - error = true; - - default: - break; - } - } - - return 0; - } - - bool finished, needsDictionary, error, streamIsValid; - - enum { gzipDecompBufferSize = 32768 }; - -private: - zlibNamespace::z_stream stream; - uint8* data; - size_t dataSize; - - BEAST_DECLARE_NON_COPYABLE (GZIPDecompressHelper) -}; - -//============================================================================== -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream* const sourceStream_, - const bool deleteSourceWhenDestroyed, - const bool noWrap_, - const int64 uncompressedStreamLength_) - : sourceStream (sourceStream_, deleteSourceWhenDestroyed), - uncompressedStreamLength (uncompressedStreamLength_), - noWrap (noWrap_), - isEof (false), - activeBufferSize (0), - originalSourcePos (sourceStream_->getPosition()), - currentPos (0), - buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (noWrap_)) -{ -} - -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream& sourceStream_) - : sourceStream (&sourceStream_, false), - uncompressedStreamLength (-1), - noWrap (false), - isEof (false), - activeBufferSize (0), - originalSourcePos (sourceStream_.getPosition()), - currentPos (0), - buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (false)) -{ -} - -GZIPDecompressorInputStream::~GZIPDecompressorInputStream() -{ -} - -int64 GZIPDecompressorInputStream::getTotalLength() -{ - return uncompressedStreamLength; -} - -int GZIPDecompressorInputStream::read (void* destBuffer, int howMany) -{ - bassert (destBuffer != nullptr && howMany >= 0); - - if (howMany > 0 && ! isEof) - { - int numRead = 0; - uint8* d = static_cast (destBuffer); - - while (! helper->error) - { - const int n = helper->doNextBlock (d, (unsigned int) howMany); - currentPos += n; - - if (n == 0) - { - if (helper->finished || helper->needsDictionary) - { - isEof = true; - return numRead; - } - - if (helper->needsInput()) - { - activeBufferSize = sourceStream->read (buffer, (int) GZIPDecompressHelper::gzipDecompBufferSize); - - if (activeBufferSize > 0) - { - helper->setInput (buffer, (size_t) activeBufferSize); - } - else - { - isEof = true; - return numRead; - } - } - } - else - { - numRead += n; - howMany -= n; - d += n; - - if (howMany <= 0) - return numRead; - } - } - } - - return 0; -} - -bool GZIPDecompressorInputStream::isExhausted() -{ - return helper->error || isEof; -} - -int64 GZIPDecompressorInputStream::getPosition() -{ - return currentPos; -} - -bool GZIPDecompressorInputStream::setPosition (int64 newPos) -{ - if (newPos < currentPos) - { - // to go backwards, reset the stream and start again.. - isEof = false; - activeBufferSize = 0; - currentPos = 0; - helper = new GZIPDecompressHelper (noWrap); - - sourceStream->setPosition (originalSourcePos); - } - - skipNextBytes (newPos - currentPos); - return true; -} - -// (This is used as a way for the zip file code to use the crc32 function without including zlib) -unsigned long beast_crc32 (unsigned long, const unsigned char*, unsigned); -unsigned long beast_crc32 (unsigned long crc, const unsigned char* buf, unsigned len) -{ - return zlibNamespace::crc32 (crc, buf, len); -} diff --git a/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.h b/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.h deleted file mode 100644 index 8dfc79cff7..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_GZIPDecompressorInputStream.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -#ifndef BEAST_GZIPDECOMPRESSORINPUTSTREAM_BEASTHEADER -#define BEAST_GZIPDECOMPRESSORINPUTSTREAM_BEASTHEADER - -#include "../streams/beast_InputStream.h" -#include "../memory/beast_OptionalScopedPointer.h" -#include "../memory/beast_HeapBlock.h" - - -//============================================================================== -/** - This stream will decompress a source-stream using zlib. - - Tip: if you're reading lots of small items from one of these streams, you - can increase the performance enormously by passing it through a - BufferedInputStream, so that it has to read larger blocks less often. - - @see GZIPCompressorOutputStream -*/ -class BEAST_API GZIPDecompressorInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a decompressor stream. - - @param sourceStream the stream to read from - @param deleteSourceWhenDestroyed whether or not to delete the source stream - when this object is destroyed - @param noWrap this is used internally by the ZipFile class - and should be ignored by user applications - @param uncompressedStreamLength if the creator knows the length that the - uncompressed stream will be, then it can supply this - value, which will be returned by getTotalLength() - */ - GZIPDecompressorInputStream (InputStream* sourceStream, - bool deleteSourceWhenDestroyed, - bool noWrap = false, - int64 uncompressedStreamLength = -1); - - /** Creates a decompressor stream. - - @param sourceStream the stream to read from - the source stream must not be - deleted until this object has been destroyed - */ - GZIPDecompressorInputStream (InputStream& sourceStream); - - /** Destructor. */ - ~GZIPDecompressorInputStream(); - - //============================================================================== - int64 getPosition(); - bool setPosition (int64 pos); - int64 getTotalLength(); - bool isExhausted(); - int read (void* destBuffer, int maxBytesToRead); - - - //============================================================================== -private: - OptionalScopedPointer sourceStream; - const int64 uncompressedStreamLength; - const bool noWrap; - bool isEof; - int activeBufferSize; - int64 originalSourcePos, currentPos; - HeapBlock buffer; - - class GZIPDecompressHelper; - friend class ScopedPointer ; - ScopedPointer helper; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPDecompressorInputStream) -}; - -#endif // BEAST_GZIPDECOMPRESSORINPUTSTREAM_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.cpp b/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.cpp deleted file mode 100644 index 66bdf071ed..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.cpp +++ /dev/null @@ -1,597 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -class ZipFile::ZipEntryHolder -{ -public: - ZipEntryHolder (const char* const buffer, const int fileNameLen) - { - entry.filename = String::fromUTF8 (buffer + 46, fileNameLen); - - const int time = ByteOrder::littleEndianShort (buffer + 12); - const int date = ByteOrder::littleEndianShort (buffer + 14); - entry.fileTime = getFileTimeFromRawEncodings (time, date); - - compressed = ByteOrder::littleEndianShort (buffer + 10) != 0; - compressedSize = (size_t) ByteOrder::littleEndianInt (buffer + 20); - entry.uncompressedSize = ByteOrder::littleEndianInt (buffer + 24); - - streamOffset = ByteOrder::littleEndianInt (buffer + 42); - } - - struct FileNameComparator - { - static int compareElements (const ZipEntryHolder* first, const ZipEntryHolder* second) - { - return first->entry.filename.compare (second->entry.filename); - } - }; - - ZipEntry entry; - size_t streamOffset; - size_t compressedSize; - bool compressed; - -private: - static Time getFileTimeFromRawEncodings (int time, int date) - { - const int year = 1980 + (date >> 9); - const int month = ((date >> 5) & 15) - 1; - const int day = date & 31; - const int hours = time >> 11; - const int minutes = (time >> 5) & 63; - const int seconds = (time & 31) << 1; - - return Time (year, month, day, hours, minutes, seconds); - } -}; - -//============================================================================== -namespace -{ - int findEndOfZipEntryTable (InputStream& input, int& numEntries) - { - BufferedInputStream in (input, 8192); - - in.setPosition (in.getTotalLength()); - int64 pos = in.getPosition(); - const int64 lowestPos = bmax ((int64) 0, pos - 1024); - - char buffer [32] = { 0 }; - - while (pos > lowestPos) - { - in.setPosition (pos - 22); - pos = in.getPosition(); - memcpy (buffer + 22, buffer, 4); - - if (in.read (buffer, 22) != 22) - return 0; - - for (int i = 0; i < 22; ++i) - { - if (ByteOrder::littleEndianInt (buffer + i) == 0x06054b50) - { - in.setPosition (pos + i); - in.read (buffer, 22); - numEntries = ByteOrder::littleEndianShort (buffer + 10); - - return (int) ByteOrder::littleEndianInt (buffer + 16); - } - } - } - - return 0; - } -} - -//============================================================================== -class ZipFile::ZipInputStream : public InputStream -{ -public: - ZipInputStream (ZipFile& zf, ZipFile::ZipEntryHolder& zei) - : file (zf), - zipEntryHolder (zei), - pos (0), - headerSize (0), - inputStream (zf.inputStream) - { - if (zf.inputSource != nullptr) - { - inputStream = streamToDelete = file.inputSource->createInputStream(); - } - else - { - #if BEAST_DEBUG - zf.streamCounter.numOpenStreams++; - #endif - } - - char buffer [30]; - - if (inputStream != nullptr - && inputStream->setPosition (zei.streamOffset) - && inputStream->read (buffer, 30) == 30 - && ByteOrder::littleEndianInt (buffer) == 0x04034b50) - { - headerSize = 30 + ByteOrder::littleEndianShort (buffer + 26) - + ByteOrder::littleEndianShort (buffer + 28); - } - } - - ~ZipInputStream() - { - #if BEAST_DEBUG - if (inputStream != nullptr && inputStream == file.inputStream) - file.streamCounter.numOpenStreams--; - #endif - } - - int64 getTotalLength() - { - return zipEntryHolder.compressedSize; - } - - int read (void* buffer, int howMany) - { - if (headerSize <= 0) - return 0; - - howMany = (int) bmin ((int64) howMany, (int64) (zipEntryHolder.compressedSize - pos)); - - if (inputStream == nullptr) - return 0; - - int num; - - if (inputStream == file.inputStream) - { - const ScopedLock sl (file.lock); - inputStream->setPosition (pos + zipEntryHolder.streamOffset + headerSize); - num = inputStream->read (buffer, howMany); - } - else - { - inputStream->setPosition (pos + zipEntryHolder.streamOffset + headerSize); - num = inputStream->read (buffer, howMany); - } - - pos += num; - return num; - } - - bool isExhausted() - { - return headerSize <= 0 || pos >= (int64) zipEntryHolder.compressedSize; - } - - int64 getPosition() - { - return pos; - } - - bool setPosition (int64 newPos) - { - pos = blimit ((int64) 0, (int64) zipEntryHolder.compressedSize, newPos); - return true; - } - -private: - ZipFile& file; - ZipEntryHolder zipEntryHolder; - int64 pos; - int headerSize; - InputStream* inputStream; - ScopedPointer streamToDelete; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ZipInputStream) -}; - - -//============================================================================== -ZipFile::ZipFile (InputStream* const stream, const bool deleteStreamWhenDestroyed) - : inputStream (stream) -{ - if (deleteStreamWhenDestroyed) - streamToDelete = inputStream; - - init(); -} - -ZipFile::ZipFile (InputStream& stream) - : inputStream (&stream) -{ - init(); -} - -ZipFile::ZipFile (const File& file) - : inputStream (nullptr), - inputSource (new FileInputSource (file)) -{ - init(); -} - -ZipFile::ZipFile (InputSource* const source) - : inputStream (nullptr), - inputSource (source) -{ - init(); -} - -ZipFile::~ZipFile() -{ - entries.clear(); -} - -#if BEAST_DEBUG -ZipFile::OpenStreamCounter::~OpenStreamCounter() -{ - /* If you hit this assertion, it means you've created a stream to read one of the items in the - zipfile, but you've forgotten to delete that stream object before deleting the file.. - Streams can't be kept open after the file is deleted because they need to share the input - stream that is managed by the ZipFile object. - */ - bassert (numOpenStreams == 0); -} -#endif - -//============================================================================== -int ZipFile::getNumEntries() const noexcept -{ - return entries.size(); -} - -const ZipFile::ZipEntry* ZipFile::getEntry (const int index) const noexcept -{ - if (ZipEntryHolder* const zei = entries [index]) - return &(zei->entry); - - return nullptr; -} - -int ZipFile::getIndexOfFileName (const String& fileName) const noexcept -{ - for (int i = 0; i < entries.size(); ++i) - if (entries.getUnchecked (i)->entry.filename == fileName) - return i; - - return -1; -} - -const ZipFile::ZipEntry* ZipFile::getEntry (const String& fileName) const noexcept -{ - return getEntry (getIndexOfFileName (fileName)); -} - -InputStream* ZipFile::createStreamForEntry (const int index) -{ - InputStream* stream = nullptr; - - if (ZipEntryHolder* const zei = entries[index]) - { - stream = new ZipInputStream (*this, *zei); - - if (zei->compressed) - { - stream = new GZIPDecompressorInputStream (stream, true, true, - zei->entry.uncompressedSize); - - // (much faster to unzip in big blocks using a buffer..) - stream = new BufferedInputStream (stream, 32768, true); - } - } - - return stream; -} - -InputStream* ZipFile::createStreamForEntry (const ZipEntry& entry) -{ - for (int i = 0; i < entries.size(); ++i) - if (&entries.getUnchecked (i)->entry == &entry) - return createStreamForEntry (i); - - return nullptr; -} - -void ZipFile::sortEntriesByFilename() -{ - ZipEntryHolder::FileNameComparator sorter; - entries.sort (sorter); -} - -//============================================================================== -void ZipFile::init() -{ - ScopedPointer toDelete; - InputStream* in = inputStream; - - if (inputSource != nullptr) - { - in = inputSource->createInputStream(); - toDelete = in; - } - - if (in != nullptr) - { - int numEntries = 0; - int pos = findEndOfZipEntryTable (*in, numEntries); - - if (pos >= 0 && pos < in->getTotalLength()) - { - const int size = (int) (in->getTotalLength() - pos); - - in->setPosition (pos); - MemoryBlock headerData; - - if (in->readIntoMemoryBlock (headerData, size) == size) - { - pos = 0; - - for (int i = 0; i < numEntries; ++i) - { - if (pos + 46 > size) - break; - - const char* const buffer = static_cast (headerData.getData()) + pos; - - const int fileNameLen = ByteOrder::littleEndianShort (buffer + 28); - - if (pos + 46 + fileNameLen > size) - break; - - entries.add (new ZipEntryHolder (buffer, fileNameLen)); - - pos += 46 + fileNameLen - + ByteOrder::littleEndianShort (buffer + 30) - + ByteOrder::littleEndianShort (buffer + 32); - } - } - } - } -} - -Result ZipFile::uncompressTo (const File& targetDirectory, - const bool shouldOverwriteFiles) -{ - for (int i = 0; i < entries.size(); ++i) - { - Result result (uncompressEntry (i, targetDirectory, shouldOverwriteFiles)); - if (result.failed()) - return result; - } - - return Result::ok(); -} - -Result ZipFile::uncompressEntry (const int index, - const File& targetDirectory, - bool shouldOverwriteFiles) -{ - const ZipEntryHolder* zei = entries.getUnchecked (index); - - #if BEAST_WINDOWS - const String entryPath (zei->entry.filename); - #else - const String entryPath (zei->entry.filename.replaceCharacter ('\\', '/')); - #endif - - const File targetFile (targetDirectory.getChildFile (entryPath)); - - if (entryPath.endsWithChar ('/') || entryPath.endsWithChar ('\\')) - return targetFile.createDirectory(); // (entry is a directory, not a file) - - ScopedPointer in (createStreamForEntry (index)); - - if (in == nullptr) - return Result::fail ("Failed to open the zip file for reading"); - - if (targetFile.exists()) - { - if (! shouldOverwriteFiles) - return Result::ok(); - - if (! targetFile.deleteFile()) - return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName()); - } - - if (! targetFile.getParentDirectory().createDirectory()) - return Result::fail ("Failed to create target folder: " + targetFile.getParentDirectory().getFullPathName()); - - { - FileOutputStream out (targetFile); - - if (out.failedToOpen()) - return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName()); - - out << *in; - } - - targetFile.setCreationTime (zei->entry.fileTime); - targetFile.setLastModificationTime (zei->entry.fileTime); - targetFile.setLastAccessTime (zei->entry.fileTime); - - return Result::ok(); -} - - -//============================================================================= -extern unsigned long beast_crc32 (unsigned long crc, const unsigned char*, unsigned len); - -class ZipFile::Builder::Item -{ -public: - Item (const File& f, const int compression, const String& storedPath) - : file (f), - storedPathname (storedPath.isEmpty() ? f.getFileName() : storedPath), - compressionLevel (compression), - compressedSize (0), - headerStart (0) - { - } - - bool writeData (OutputStream& target, const int64 overallStartPosition) - { - MemoryOutputStream compressedData; - - if (compressionLevel > 0) - { - GZIPCompressorOutputStream compressor (&compressedData, compressionLevel, false, - GZIPCompressorOutputStream::windowBitsRaw); - if (! writeSource (compressor)) - return false; - } - else - { - if (! writeSource (compressedData)) - return false; - } - - compressedSize = (int) compressedData.getDataSize(); - headerStart = (int) (target.getPosition() - overallStartPosition); - - target.writeInt (0x04034b50); - writeFlagsAndSizes (target); - target << storedPathname - << compressedData; - - return true; - } - - bool writeDirectoryEntry (OutputStream& target) - { - target.writeInt (0x02014b50); - target.writeShort (20); // version written - writeFlagsAndSizes (target); - target.writeShort (0); // comment length - target.writeShort (0); // start disk num - target.writeShort (0); // internal attributes - target.writeInt (0); // external attributes - target.writeInt (headerStart); - target << storedPathname; - - return true; - } - -private: - const File file; - String storedPathname; - int compressionLevel, compressedSize, headerStart; - unsigned long checksum; - - void writeTimeAndDate (OutputStream& target) const - { - const Time t (file.getLastModificationTime()); - target.writeShort ((short) (t.getSeconds() + (t.getMinutes() << 5) + (t.getHours() << 11))); - target.writeShort ((short) (t.getDayOfMonth() + ((t.getMonth() + 1) << 5) + ((t.getYear() - 1980) << 9))); - } - - bool writeSource (OutputStream& target) - { - checksum = 0; - FileInputStream input (file); - - if (input.failedToOpen()) - return false; - - const int bufferSize = 2048; - HeapBlock buffer (bufferSize); - - while (! input.isExhausted()) - { - const int bytesRead = input.read (buffer, bufferSize); - - if (bytesRead < 0) - return false; - - checksum = beast_crc32 (checksum, buffer, (unsigned int) bytesRead); - target.write (buffer, (size_t) bytesRead); - } - - return true; - } - - void writeFlagsAndSizes (OutputStream& target) const - { - target.writeShort (10); // version needed - target.writeShort (0); // flags - target.writeShort (compressionLevel > 0 ? (short) 8 : (short) 0); - writeTimeAndDate (target); - target.writeInt ((int) checksum); - target.writeInt (compressedSize); - target.writeInt ((int) file.getSize()); - target.writeShort ((short) storedPathname.toUTF8().sizeInBytes() - 1); - target.writeShort (0); // extra field length - } - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Item) -}; - -//============================================================================= -ZipFile::Builder::Builder() {} -ZipFile::Builder::~Builder() {} - -void ZipFile::Builder::addFile (const File& fileToAdd, const int compressionLevel, const String& storedPathName) -{ - items.add (new Item (fileToAdd, compressionLevel, storedPathName)); -} - -bool ZipFile::Builder::writeToStream (OutputStream& target, double* const progress) const -{ - const int64 fileStart = target.getPosition(); - - for (int i = 0; i < items.size(); ++i) - { - if (progress != nullptr) - *progress = (i + 0.5) / items.size(); - - if (! items.getUnchecked (i)->writeData (target, fileStart)) - return false; - } - - const int64 directoryStart = target.getPosition(); - - for (int i = 0; i < items.size(); ++i) - if (! items.getUnchecked (i)->writeDirectoryEntry (target)) - return false; - - const int64 directoryEnd = target.getPosition(); - - target.writeInt (0x06054b50); - target.writeShort (0); - target.writeShort (0); - target.writeShort ((short) items.size()); - target.writeShort ((short) items.size()); - target.writeInt ((int) (directoryEnd - directoryStart)); - target.writeInt ((int) (directoryStart - fileStart)); - target.writeShort (0); - - if (progress != nullptr) - *progress = 1.0; - - return true; -} diff --git a/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.h b/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.h deleted file mode 100644 index eabedab4c9..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/beast_ZipFile.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - ============================================================================== - - This file is part of the beast_core module of the BEAST library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the beast_core module! - All other BEAST modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.beast.com - - ============================================================================== -*/ - -#ifndef BEAST_ZIPFILE_BEASTHEADER -#define BEAST_ZIPFILE_BEASTHEADER - -#include "../files/beast_File.h" -#include "../streams/beast_InputSource.h" -#include "../threads/beast_CriticalSection.h" -#include "../containers/beast_OwnedArray.h" - - -//============================================================================== -/** - Decodes a ZIP file from a stream. - - This can enumerate the items in a ZIP file and can create suitable stream objects - to read each one. -*/ -class BEAST_API ZipFile -{ -public: - /** Creates a ZipFile based for a file. */ - explicit ZipFile (const File& file); - - //============================================================================== - /** Creates a ZipFile for a given stream. - - @param inputStream the stream to read from - @param deleteStreamWhenDestroyed if set to true, the object passed-in - will be deleted when this ZipFile object is deleted - */ - ZipFile (InputStream* inputStream, bool deleteStreamWhenDestroyed); - - /** Creates a ZipFile for a given stream. - The stream will not be owned or deleted by this class - if you want the ZipFile to - manage the stream's lifetime, use the other constructor. - */ - explicit ZipFile (InputStream& inputStream); - - /** Creates a ZipFile for an input source. - - The inputSource object will be owned by the zip file, which will delete - it later when not needed. - */ - explicit ZipFile (InputSource* inputSource); - - /** Destructor. */ - ~ZipFile(); - - //============================================================================== - /** - Contains information about one of the entries in a ZipFile. - - @see ZipFile::getEntry - */ - struct ZipEntry - { - /** The name of the file, which may also include a partial pathname. */ - String filename; - - /** The file's original size. */ - unsigned int uncompressedSize; - - /** The last time the file was modified. */ - Time fileTime; - }; - - //============================================================================== - /** Returns the number of items in the zip file. */ - int getNumEntries() const noexcept; - - /** Returns a structure that describes one of the entries in the zip file. - - This may return zero if the index is out of range. - - @see ZipFile::ZipEntry - */ - const ZipEntry* getEntry (int index) const noexcept; - - /** Returns the index of the first entry with a given filename. - - This uses a case-sensitive comparison to look for a filename in the - list of entries. It might return -1 if no match is found. - - @see ZipFile::ZipEntry - */ - int getIndexOfFileName (const String& fileName) const noexcept; - - /** Returns a structure that describes one of the entries in the zip file. - - This uses a case-sensitive comparison to look for a filename in the - list of entries. It might return 0 if no match is found. - - @see ZipFile::ZipEntry - */ - const ZipEntry* getEntry (const String& fileName) const noexcept; - - /** Sorts the list of entries, based on the filename. - */ - void sortEntriesByFilename(); - - //============================================================================== - /** Creates a stream that can read from one of the zip file's entries. - - The stream that is returned must be deleted by the caller (and - zero might be returned if a stream can't be opened for some reason). - - The stream must not be used after the ZipFile object that created - has been deleted. - */ - InputStream* createStreamForEntry (int index); - - /** Creates a stream that can read from one of the zip file's entries. - - The stream that is returned must be deleted by the caller (and - zero might be returned if a stream can't be opened for some reason). - - The stream must not be used after the ZipFile object that created - has been deleted. - */ - InputStream* createStreamForEntry (const ZipEntry& entry); - - //============================================================================== - /** Uncompresses all of the files in the zip file. - - This will expand all the entries into a target directory. The relative - paths of the entries are used. - - @param targetDirectory the root folder to uncompress to - @param shouldOverwriteFiles whether to overwrite existing files with similarly-named ones - @returns success if the file is successfully unzipped - */ - Result uncompressTo (const File& targetDirectory, - bool shouldOverwriteFiles = true); - - /** Uncompresses one of the entries from the zip file. - - This will expand the entry and write it in a target directory. The entry's path is used to - determine which subfolder of the target should contain the new file. - - @param index the index of the entry to uncompress - this must be a valid index - between 0 and (getNumEntries() - 1). - @param targetDirectory the root folder to uncompress into - @param shouldOverwriteFiles whether to overwrite existing files with similarly-named ones - @returns success if all the files are successfully unzipped - */ - Result uncompressEntry (int index, - const File& targetDirectory, - bool shouldOverwriteFiles = true); - - - //============================================================================== - /** Used to create a new zip file. - - Create a ZipFile::Builder object, and call its addFile() method to add some files, - then you can write it to a stream with write(). - - Currently this just stores the files with no compression.. That will be added - soon! - */ - class Builder - { - public: - Builder(); - ~Builder(); - - /** Adds a file while should be added to the archive. - The file isn't read immediately, all the files will be read later when the writeToStream() - method is called. - - The compressionLevel can be between 0 (no compression), and 9 (maximum compression). - If the storedPathName parameter is specified, you can customise the partial pathname that - will be stored for this file. - */ - void addFile (const File& fileToAdd, int compressionLevel, - const String& storedPathName = String::empty); - - /** Generates the zip file, writing it to the specified stream. - If the progress parameter is non-null, it will be updated with an approximate - progress status between 0 and 1.0 - */ - bool writeToStream (OutputStream& target, double* progress) const; - - //============================================================================== - private: - class Item; - friend class OwnedArray; - OwnedArray items; - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Builder) - }; - -private: - //============================================================================== - class ZipInputStream; - class ZipEntryHolder; - friend class ZipInputStream; - friend class ZipEntryHolder; - - OwnedArray entries; - CriticalSection lock; - InputStream* inputStream; - ScopedPointer streamToDelete; - ScopedPointer inputSource; - - #if BEAST_DEBUG - struct OpenStreamCounter - { - OpenStreamCounter() : numOpenStreams (0) {} - ~OpenStreamCounter(); - - int numOpenStreams; - }; - - OpenStreamCounter streamCounter; - #endif - - void init(); - - BEAST_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ZipFile) -}; - -#endif // BEAST_ZIPFILE_BEASTHEADER diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/README b/Subtrees/beast/modules/beast_core/zip/zlib/README deleted file mode 100644 index 758cc50020..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/README +++ /dev/null @@ -1,125 +0,0 @@ -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.3 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). These documents are also available in other -formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile. In short "make test; make install" should work for most -machines. For Unix: "./configure; make test; make install". For MSDOS, use one -of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. - -Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, -please check this site to verify that you have the latest version of zlib; -otherwise get the latest version and check whether the problem still exists or -not. - -PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking -for help. - -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available in -http://dogma.net/markn/articles/zlibtool/zlibtool.htm - -The changes made in version 1.2.3 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory "contrib". - -A Java implementation of zlib is available in the Java Development Kit -http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html -See the zlib home page http://www.zlib.org for details. - -A Perl interface to zlib written by Paul Marquess is in the -CPAN (Comprehensive Perl Archive Network) sites -http://www.cpan.org/modules/by-module/Compress/ - -A Python interface to zlib written by A.M. Kuchling is -available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html - -A zlib binding for TCL written by Andreas Kupries is -availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant , is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - -- When building a shared, i.e. dynamic library on Mac OS X, the library must be - installed before testing (do "make install" before "make test"), since the - library location is specified in the library. - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate - and zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; - they are too numerous to cite here. - -Copyright notice: - - (C) 1995-2004 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* -receiving lengthy legal documents to sign. The sources are provided -for free but without warranty of any kind. The library has been -entirely written by Jean-loup Gailly and Mark Adler; it does not -include third-party code. - -If you redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. Please -read the FAQ for more information on the distribution of modified source -versions. diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/adler32.c b/Subtrees/beast/modules/beast_core/zip/zlib/adler32.c deleted file mode 100644 index 47ba65a76b..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/adler32.c +++ /dev/null @@ -1,143 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: adler32.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware */ -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD4(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/compress.c b/Subtrees/beast/modules/beast_core/zip/zlib/compress.c deleted file mode 100644 index edcd9940e3..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/compress.c +++ /dev/null @@ -1,70 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: compress.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen, int level) -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (uLong sourceLen) -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/crc32.c b/Subtrees/beast/modules/beast_core/zip/zlib/crc32.c deleted file mode 100644 index 75c6203bb2..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/crc32.c +++ /dev/null @@ -1,407 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id: crc32.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32 (unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big (unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times (unsigned long *mat, unsigned long vec) -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square (unsigned long *square, unsigned long *mat) -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine (uLong crc1, uLong crc2, z_off_t len2) -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case */ - if (len2 == 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/crc32.h b/Subtrees/beast/modules/beast_core/zip/zlib/crc32.h deleted file mode 100644 index 8053b6117c..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/deflate.c b/Subtrees/beast/modules/beast_core/zip/zlib/deflate.c deleted file mode 100644 index 66a34dc3b0..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/deflate.c +++ /dev/null @@ -1,1679 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id: deflate.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, int stream_size) -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_ (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size) -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength) -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) - return Z_STREAM_ERROR; - - s = strm->state; - if (s->wrap) - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); - dictionary += dictLength - length; /* use the tail of the dictionary */ - } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); - } - - (void) hash_head; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (z_streamp strm) -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (z_streamp strm, gz_headerp head) -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (z_streamp strm, int bits, int value) -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams (z_streamp strm, int level, int strategy) -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if (func != configuration_table[level].func && strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune (z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain) -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. - */ -uLong ZEXPORT deflateBound (z_streamp strm, uLong sourceLen) -{ - deflate_state *s; - uLong destLen; - - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; - - /* if can't get parameters, return conservative bound */ - if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; - - /* if not default parameters, return conservative bound */ - s = strm->state; - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; - - /* default settings: return tight bound for that case */ - return compressBound(sourceLen); -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (deflate_state *s, uInt b) -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending (z_streamp strm) -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (z_streamp strm, int flush) -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (z_streamp strm) -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (z_streamp dest, z_streamp source) -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy(dest, source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf (z_streamp strm, Bytef *buf, unsigned size) -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); - } -#endif - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (deflate_state *s) -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(deflate_state *s, IPos cur_match) -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ -#endif /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only - */ -local uInt longest_match_fast (deflate_state *s, IPos cur_match) -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(deflate_state *s, IPos start, IPos match, int length) -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window (deflate_state *s) -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - /* %%% avoid this when Z_RLE */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(deflate_state *s, int flush) -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(deflate_state *s, int flush) -{ - IPos hash_head = NIL; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(deflate_state *s, int flush) -{ - IPos hash_head = NIL; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif /* FASTEST */ - -#if 0 -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. - */ - if (s->lookahead < MAX_MATCH) { - fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; - scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/deflate.h b/Subtrees/beast/modules/beast_core/zip/zlib/deflate.h deleted file mode 100644 index 1d2f1548ca..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/deflate.h +++ /dev/null @@ -1,333 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: deflate.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -#define NO_DUMMY_DECL - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - - /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; -#else - extern const uch _length_code[]; - extern const uch _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/infback.c b/Subtrees/beast/modules/beast_core/zip/zlib/infback.c deleted file mode 100644 index 7d7990e315..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/infback.c +++ /dev/null @@ -1,611 +0,0 @@ -/* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - This code is largely copied from inflate.c. Normally either infback.o or - inflate.o would be linked into an application--not both. The interface - with inffast.c is retained so that optimized assembler-coded versions of - inflate_fast() can be used with either inflate.c or infback.c. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* function prototypes */ -local void fixedtables1 OF((struct inflate_state FAR *state)); - -/* - strm provides memory allocation functions in zalloc and zfree, or - Z_NULL to use the library memory allocation functions. - - windowBits is in the range 8..15, and window is a user-supplied - window and output buffer that is 2**windowBits bytes. - */ -int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size) -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL || window == Z_NULL || - windowBits < 8 || windowBits > 15) - return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *)ZALLOC(strm, 1, - sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->dmax = 32768U; - state->wbits = windowBits; - state->wsize = 1U << windowBits; - state->window = window; - state->write = 0; - state->whave = 0; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables1 (struct inflate_state FAR *state) -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Assure that some input is available. If input is requested, but denied, - then return a Z_BUF_ERROR from inflateBack(). */ -#define PULL() \ - do { \ - if (have == 0) { \ - have = in(in_desc, &next); \ - if (have == 0) { \ - next = Z_NULL; \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflateBack() - with an error if there is no input available. */ -#define PULLBYTE() \ - do { \ - PULL(); \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Assure that some output space is available, by writing out the window - if it's full. If the write fails, return from inflateBack() with a - Z_BUF_ERROR. */ -#define ROOM() \ - do { \ - if (left == 0) { \ - put = state->window; \ - left = state->wsize; \ - state->whave = left; \ - if (out(out_desc, put, left)) { \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* - strm provides the memory allocation functions and window buffer on input, - and provides information on the unused input on return. For Z_DATA_ERROR - returns, strm will also provide an error message. - - in() and out() are the call-back input and output functions. When - inflateBack() needs more input, it calls in(). When inflateBack() has - filled the window with output, or when it completes with data in the - window, it calls out() to write out the data. The application must not - change the provided input until in() is called again or inflateBack() - returns. The application must not change the window/output buffer until - inflateBack() returns. - - in() and out() are called with a descriptor parameter provided in the - inflateBack() call. This parameter can be a structure that provides the - information required to do the read or write, as well as accumulated - information on the input and output such as totals and check values. - - in() should return zero on failure. out() should return non-zero on - failure. If either in() or out() fails, than inflateBack() returns a - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format - error, or Z_MEM_ERROR if it could not allocate memory for the state. - inflateBack() can also return Z_STREAM_ERROR if the input parameters - are not correct, i.e. strm is Z_NULL or the state was not initialized. - */ -int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc) -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code thisx; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - /* Check that the strm exists and that the state was initialized */ - if (strm == Z_NULL || strm->state == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* Reset the state */ - strm->msg = Z_NULL; - state->mode = TYPE; - state->last = 0; - state->whave = 0; - next = strm->next_in; - have = next != Z_NULL ? strm->avail_in : 0; - hold = 0; - bits = 0; - put = state->window; - left = state->wsize; - - /* Inflate until end of block marked as last */ - for (;;) - switch (state->mode) { - case TYPE: - /* determine and dispatch block type */ - if (state->last) { - BYTEBITS(); - state->mode = DONE; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables1(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - - case STORED: - /* get and verify stored block length */ - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - - /* copy stored block from input to output */ - while (state->length != 0) { - copy = state->length; - PULL(); - ROOM(); - if (copy > have) copy = have; - if (copy > left) copy = left; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - - case TABLE: - /* get dynamic table entries descriptor */ - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - - /* get code length code lengths (not a typo) */ - state->have = 0; - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - - /* get length and distance code code lengths */ - state->have = 0; - while (state->have < state->nlen + state->ndist) { - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.val < 16) { - NEEDBITS(thisx.bits); - DROPBITS(thisx.bits); - state->lens[state->have++] = thisx.val; - } - else { - if (thisx.val == 16) { - NEEDBITS(thisx.bits + 2); - DROPBITS(thisx.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = (unsigned)(state->lens[state->have - 1]); - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (thisx.val == 17) { - NEEDBITS(thisx.bits + 3); - DROPBITS(thisx.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(thisx.bits + 7); - DROPBITS(thisx.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - - case LEN: - /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { - RESTORE(); - if (state->whave < state->wsize) - state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); - LOAD(); - break; - } - - /* get a literal, length, or end-of-block code */ - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.op && (thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - state->length = (unsigned)thisx.val; - - /* process literal */ - if (thisx.op == 0) { - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - ROOM(); - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - } - - /* process end of block */ - if (thisx.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - - /* invalid code */ - if (thisx.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - - /* length code -- get extra bits, if any */ - state->extra = (unsigned)(thisx.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - - /* get distance code */ - for (;;) { - thisx = state->distcode[BITS(state->distbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if ((thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - if (thisx.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)thisx.val; - - /* get distance extra bits, if any */ - state->extra = (unsigned)(thisx.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->wsize - (state->whave < state->wsize ? - left : 0)) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - - /* copy match from window to output */ - do { - ROOM(); - copy = state->wsize - state->offset; - if (copy < left) { - from = put + copy; - copy = left - copy; - } - else { - from = put - state->offset; - copy = left; - } - if (copy > state->length) copy = state->length; - state->length -= copy; - left -= copy; - do { - *put++ = *from++; - } while (--copy); - } while (state->length != 0); - break; - - case DONE: - /* inflate stream terminated properly -- write leftover output */ - ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } - goto inf_leave; - - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - - default: /* can't happen, but makes compilers happy */ - ret = Z_STREAM_ERROR; - goto inf_leave; - } - - /* Return unused input */ - inf_leave: - strm->next_in = next; - strm->avail_in = have; - return ret; -} - -int ZEXPORT inflateBackEnd (z_streamp strm) -{ - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inffast.c b/Subtrees/beast/modules/beast_core/zip/zlib/inffast.c deleted file mode 100644 index 0ccbdb6bc5..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inffast.c +++ /dev/null @@ -1,316 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast (z_streamp strm, unsigned start) -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code thisx; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - write = state->write; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - thisx = lcode[hold & lmask]; - dolen: - op = (unsigned)(thisx.bits); - hold >>= op; - bits -= op; - op = (unsigned)(thisx.op); - if (op == 0) { /* literal */ - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - PUP(out) = (unsigned char)(thisx.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(thisx.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - thisx = dcode[hold & dmask]; - dodist: - op = (unsigned)(thisx.bits); - hold >>= op; - bits -= op; - op = (unsigned)(thisx.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(thisx.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - from = window - OFF; - if (write == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += write - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - thisx = dcode[thisx.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - thisx = lcode[thisx.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inffast.h b/Subtrees/beast/modules/beast_core/zip/zlib/inffast.h deleted file mode 100644 index 1e88d2d97b..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inffixed.h b/Subtrees/beast/modules/beast_core/zip/zlib/inffixed.h deleted file mode 100644 index 75ed4b5978..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inflate.c b/Subtrees/beast/modules/beast_core/zip/zlib/inflate.c deleted file mode 100644 index eccaf41b3b..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inflate.c +++ /dev/null @@ -1,1339 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset (z_streamp strm) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->write = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflatePrime (z_streamp strm, int bits, int value) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version, int stream_size) -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_ (z_streamp strm, const char *version, int stream_size) -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables (struct inflate_state FAR *state) -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow (z_streamp strm, unsigned out) -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->write = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->write; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; - state->whave = state->wsize; - } - else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate (z_streamp strm, int flush) -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code thisx; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.val < 16) { - NEEDBITS(thisx.bits); - DROPBITS(thisx.bits); - state->lens[state->have++] = thisx.val; - } - else { - if (thisx.val == 16) { - NEEDBITS(thisx.bits + 2); - DROPBITS(thisx.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (thisx.val == 17) { - NEEDBITS(thisx.bits + 3); - DROPBITS(thisx.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(thisx.bits + 7); - DROPBITS(thisx.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - break; - } - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.op && (thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - state->length = (unsigned)thisx.val; - if ((int)(thisx.op) == 0) { - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - state->mode = LIT; - break; - } - if (thisx.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - if (thisx.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(thisx.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->mode = DIST; - case DIST: - for (;;) { - thisx = state->distcode[BITS(state->distbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if ((thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - if (thisx.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)thisx.val; - state->extra = (unsigned)(thisx.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->write - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd (z_streamp strm) -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength) -{ - struct inflate_state FAR *state; - unsigned long id_; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - if (state->mode == DICT) { - id_ = adler32(0L, Z_NULL, 0); - id_ = adler32(id_, dictionary, dictLength); - if (id_ != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader (z_streamp strm, gz_headerp head) -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch (unsigned FAR *have, unsigned char FAR *buf, unsigned len) -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync (z_streamp strm) -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint (z_streamp strm) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inflate.h b/Subtrees/beast/modules/beast_core/zip/zlib/inflate.h deleted file mode 100644 index 721caa6efc..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inflate.h +++ /dev/null @@ -1,121 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFLATE_H_ -#define _INFLATE_H_ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to the BAD or MEM mode -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 7K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ -}; - - -#endif diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.c b/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.c deleted file mode 100644 index 7afbb3888d..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.c +++ /dev/null @@ -1,328 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int inflate_table (codetype type, - unsigned short FAR *lens, - unsigned codes, - code FAR * FAR *table, - unsigned FAR *bits, - unsigned short FAR *work) -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code thisx; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - thisx.op = (unsigned char)64; /* invalid code marker */ - thisx.bits = (unsigned char)1; - thisx.val = (unsigned short)0; - *(*table)++ = thisx; /* make a table to force an error */ - *(*table)++ = thisx; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min <= MAXBITS; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - thisx.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - thisx.op = (unsigned char)0; - thisx.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - thisx.op = (unsigned char)(extra[work[sym]]); - thisx.val = base[work[sym]]; - } - else { - thisx.op = (unsigned char)(32 + 64); /* end of block */ - thisx.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = thisx; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - thisx.op = (unsigned char)64; /* invalid code marker */ - thisx.bits = (unsigned char)(len - drop); - thisx.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - thisx.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = thisx; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.h b/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.h deleted file mode 100644 index 97b5ab3e4f..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/inftrees.h +++ /dev/null @@ -1,61 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFTREES_H_ -#define _INFTREES_H_ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 - -/* Type of code to build for inftable() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -extern int inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); - - -#endif diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/trees.c b/Subtrees/beast/modules/beast_core/zip/zlib/trees.c deleted file mode 100644 index d5bd6c965a..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/trees.c +++ /dev/null @@ -1,1191 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id: trees.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits (deflate_state *s, int value, int length) -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void _tr_init(deflate_state *s) -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block (deflate_state *s) -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap (deflate_state *s, - ct_data *tree, /* the tree to restore */ - int k) /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen (deflate_state *s, tree_desc *desc) -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (ct_data *tree, /* the tree to decorate */ - int max_code, /* largest code with non zero frequency */ - ushf *bl_count) /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (deflate_state *s, - ct_data *tree, /* the tree to be scanned */ - int max_code) /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (deflate_state *s, - ct_data *tree, /* the tree to be scanned */ - int max_code) /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree (deflate_state *s) -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees (deflate_state *s, - int lcodes, int dcodes, int blcodes) /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void _tr_stored_block (deflate_state *s, charf *buf, ulg stored_len, int eof) -{ - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. - */ -void _tr_align (deflate_state *s) -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void _tr_flush_block (deflate_state *s, - charf *buf, /* input block, or NULL if too old */ - ulg stored_len, /* length of input block */ - int eof) /* true if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, eof); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (eof) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int _tr_tally (deflate_state *s, - unsigned dist, /* distance of matched string */ - unsigned lc) /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block (deflate_state *s, - ct_data *ltree, /* literal tree */ - ct_data *dtree) /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local void set_data_type (deflate_state *s) -{ - int n; - - for (n = 0; n < 9; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse (unsigned code, int len) -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush (deflate_state *s) -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup (deflate_state *s) -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(deflate_state *s, - charf *buf, /* the input data */ - unsigned len, /* its length */ - int header) /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/trees.h b/Subtrees/beast/modules/beast_core/zip/zlib/trees.h deleted file mode 100644 index aadfa16dea..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/trees.h +++ /dev/null @@ -1,127 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/uncompr.c b/Subtrees/beast/modules/beast_core/zip/zlib/uncompr.c deleted file mode 100644 index 032bd0eb54..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/uncompr.c +++ /dev/null @@ -1,60 +0,0 @@ -/* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: uncompr.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ -int ZEXPORT uncompress (Bytef *dest, - uLongf *destLen, - const Bytef *source, - uLong sourceLen) -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/zconf.h b/Subtrees/beast/modules/beast_core/zip/zlib/zconf.h deleted file mode 100644 index 76298b7838..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/zconf.h +++ /dev/null @@ -1,345 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZCONF_H -#define ZCONF_H - -// *** Just a few hacks here to make it compile nicely with Beast.. -#define Z_PREFIX 1 -#undef __MACTYPES__ - -#ifdef _MSC_VER - #pragma warning (disable : 4131 4127 4244 4267) -#endif - - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define inflatePrime z_inflatePrime -# define inflateGetHeader z_inflateGetHeader -# define adler32_combine z_adler32_combine -# define crc32_combine z_crc32_combine -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/zconf.in.h b/Subtrees/beast/modules/beast_core/zip/zlib/zconf.in.h deleted file mode 100644 index 7128a2dc0c..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/zconf.in.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.in.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/zlib.h b/Subtrees/beast/modules/beast_core/zip/zlib/zlib.h deleted file mode 100644 index 9a7307a513..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/zlib.h +++ /dev/null @@ -1,1358 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -//extern "C" { -#endif - -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 - - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -//ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -//ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns 1 if file is being read directly without decompression, otherwise - zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); -/* - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - -/* - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -//} -#endif - -#endif /* ZLIB_H */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/zutil.c b/Subtrees/beast/modules/beast_core/zip/zlib/zutil.c deleted file mode 100644 index 26f889583a..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/zutil.c +++ /dev/null @@ -1,311 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zutil.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -/*const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch (sizeof(uInt)) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch (sizeof(uLong)) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch (sizeof(voidpf)) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch (sizeof(z_off_t)) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#ifdef STDC -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -}*/ - -#if 0 - -# ifndef verbose -# define verbose 0 -# endif -int z_verbose = verbose; - -void z_error (const char *m) -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(int err) -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/Subtrees/beast/modules/beast_core/zip/zlib/zutil.h b/Subtrees/beast/modules/beast_core/zip/zlib/zutil.h deleted file mode 100644 index 6ec0552fd1..0000000000 --- a/Subtrees/beast/modules/beast_core/zip/zlib/zutil.h +++ /dev/null @@ -1,271 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: zutil.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#define ZLIB_INTERNAL -#include "zlib.h" - -#ifdef STDC -# ifndef _WIN32_WCE -# include -# endif -# include -# include -#endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# ifdef M_I86 - #include -# endif -#endif - -#if defined(MACOS) || TARGET_OS_MAC -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#if 0 -# include - extern int z_verbose; - extern void z_error OF((const char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -# define z_error(x) -# define z_verbose 0 -#endif - - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */ diff --git a/Subtrees/leveldb/.gitignore b/Subtrees/leveldb/.gitignore deleted file mode 100644 index 55ba072e0e..0000000000 --- a/Subtrees/leveldb/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -build_config.mk -*.a -*.o -*.dylib* -*.so -*.so.* -*_test -db_bench -Release -Debug -Benchmark -vs2010.* diff --git a/Subtrees/leveldb/LICENSE b/Subtrees/leveldb/LICENSE deleted file mode 100644 index 8e80208cd72b3225c87d9111c4d7cab13af1c2ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 zcmbtS%WmT~6y5VHE@m|;1h>;=yP_r9CLoJ0NyX!(BGEAcOAI7BLH@pniZgLA1-h7x zO^Cebbx$6iUPu3UiuAR;qd))n_KobxQR$xDxmXgv#8Vij1@ZHl=64f~ZgS(Z>lTb@ z*ZC=q{^1gR7^oRKx=fDzKvTGkt((6*_@NnJ=@`a-%IL+%6NPd950}XL(D|cpn*@+i zGdg;5WA9^h9X*ZV*>^a^Qxoyy0CGNu7e72w8-~uOp(zcq-o?KdBck8vv#5!}@m)YM0B-<+q9i08fFlHG3f>Zfv8 z8pe{+q3K;pWF5le*^wOD1=N1r&3XGc!OZa14D<(tuk_$jIS^hTH+1+4oG}ULL&VnS zG~z@Zl%ZX8#08s|Fok1$NzF(a(HWYaT$@URA)l%=rn(Go#hE5_0@bt|X~?LR-E%Dn z=bcvfvJeF=4`erja7j7{5Wxn9mfyDQn7RHd$ zB)7X#0u1PyS5^v>k*xBvE@ZXN2mn+m%SySG7SF88X40R>NUdlqbiM%!U&>P2!_2pm zwn|(pr5UFk*H-3r$u;e2y;DX|vQd<5N!*LdlG*UG{OppceI;~~eru7I zf=bDkrAR~|J^)jT+$J|4ryRjSUYRko6S>3zSqMbH^&z`r8u3q!N4TVdZ~0mn`uabK zU?q92#WqPs45nThD{XBBt(7X~oQ=@;G8g7=Dpg8;MYRzbE4bw|F(8l>uAzQe8#!kt zD=W0FcUG$E4(r_`75L^DE#`1lm8_y8Lg_;SO&QGDXSCl4e8+~Xx1@Lq!=Mzoy?q8g zbi}d`k5q|uDc7RPMN*>@%3d0AhgC@^TPMhr@ScMc1p#j=B2=;YcvD#9i$#)L5ijn6 VQM^CK>W#eC1Vg6IH`llq>|YKv(3SuI diff --git a/Subtrees/sqlite/sqlite3.c b/Subtrees/sqlite/sqlite3.c deleted file mode 100644 index b85ecefdd1..0000000000 --- a/Subtrees/sqlite/sqlite3.c +++ /dev/null @@ -1,140461 +0,0 @@ -/****************************************************************************** -** This file is an amalgamation of many separate C source files from SQLite -** version 3.7.17. By combining all the individual C code files into this -** single large file, the entire code can be compiled as a single translation -** unit. This allows many compilers to do optimizations that would not be -** possible if the files were compiled separately. Performance improvements -** of 5% or more are commonly seen when SQLite is compiled as a single -** translation unit. -** -** This file is all you need to compile SQLite. To use SQLite in other -** programs, you need this file and the "sqlite3.h" header file that defines -** the programming interface to the SQLite library. (If you do not have -** the "sqlite3.h" header file at hand, you will find a copy embedded within -** the text of this file. Search for "Begin file sqlite3.h" to find the start -** of the embedded sqlite3.h header file.) Additional code files may be needed -** if you want a wrapper to interface SQLite with your choice of programming -** language. The code for the "sqlite3" command-line shell is also in a -** separate file. This file contains only code for the core SQLite library. -*/ -#define SQLITE_CORE 1 -#define SQLITE_AMALGAMATION 1 -#ifndef SQLITE_PRIVATE -# define SQLITE_PRIVATE static -#endif -#ifndef SQLITE_API -# define SQLITE_API -#endif -/************** Begin file sqliteInt.h ***************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Internal interface definitions for SQLite. -** -*/ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ - -/* -** These #defines should enable >2GB file support on POSIX if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any -** system #includes. Hence, this block of code must be the very first -** code in all source files. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: Red Hat 7.2) but you want your code to work -** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in Red Hat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -/* -** Include the configuration header output by 'configure' if we're using the -** autoconf-based build -*/ -#ifdef _HAVE_SQLITE_CONFIG_H -#include "config.h" -#endif - -/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ -/************** Begin file sqliteLimit.h *************************************/ -/* -** 2007 May 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file defines various limits of what SQLite can process. -*/ - -/* -** The maximum length of a TEXT or BLOB in bytes. This also -** limits the size of a row in a table or index. -** -** The hard limit is the ability of a 32-bit signed integer -** to count the size: 2^31-1 or 2147483647. -*/ -#ifndef SQLITE_MAX_LENGTH -# define SQLITE_MAX_LENGTH 1000000000 -#endif - -/* -** This is the maximum number of -** -** * Columns in a table -** * Columns in an index -** * Columns in a view -** * Terms in the SET clause of an UPDATE statement -** * Terms in the result set of a SELECT statement -** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. -** * Terms in the VALUES clause of an INSERT statement -** -** The hard upper limit here is 32676. Most database people will -** tell you that in a well-normalized database, you usually should -** not have more than a dozen or so columns in any table. And if -** that is the case, there is no point in having more than a few -** dozen values in any of the other situations described above. -*/ -#ifndef SQLITE_MAX_COLUMN -# define SQLITE_MAX_COLUMN 2000 -#endif - -/* -** The maximum length of a single SQL statement in bytes. -** -** It used to be the case that setting this value to zero would -** turn the limit off. That is no longer true. It is not possible -** to turn this limit off. -*/ -#ifndef SQLITE_MAX_SQL_LENGTH -# define SQLITE_MAX_SQL_LENGTH 1000000000 -#endif - -/* -** The maximum depth of an expression tree. This is limited to -** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might -** want to place more severe limits on the complexity of an -** expression. -** -** A value of 0 used to mean that the limit was not enforced. -** But that is no longer true. The limit is now strictly enforced -** at all times. -*/ -#ifndef SQLITE_MAX_EXPR_DEPTH -# define SQLITE_MAX_EXPR_DEPTH 1000 -#endif - -/* -** The maximum number of terms in a compound SELECT statement. -** The code generator for compound SELECT statements does one -** level of recursion for each term. A stack overflow can result -** if the number of terms is too large. In practice, most SQL -** never has more than 3 or 4 terms. Use a value of 0 to disable -** any limit on the number of terms in a compount SELECT. -*/ -#ifndef SQLITE_MAX_COMPOUND_SELECT -# define SQLITE_MAX_COMPOUND_SELECT 500 -#endif - -/* -** The maximum number of opcodes in a VDBE program. -** Not currently enforced. -*/ -#ifndef SQLITE_MAX_VDBE_OP -# define SQLITE_MAX_VDBE_OP 25000 -#endif - -/* -** The maximum number of arguments to an SQL function. -*/ -#ifndef SQLITE_MAX_FUNCTION_ARG -# define SQLITE_MAX_FUNCTION_ARG 127 -#endif - -/* -** The maximum number of in-memory pages to use for the main database -** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE -*/ -#ifndef SQLITE_DEFAULT_CACHE_SIZE -# define SQLITE_DEFAULT_CACHE_SIZE 2000 -#endif -#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE -# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 -#endif - -/* -** The default number of frames to accumulate in the log file before -** checkpointing the database in WAL mode. -*/ -#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT -# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 -#endif - -/* -** The maximum number of attached databases. This must be between 0 -** and 62. The upper bound on 62 is because a 64-bit integer bitmap -** is used internally to track attached databases. -*/ -#ifndef SQLITE_MAX_ATTACHED -# define SQLITE_MAX_ATTACHED 10 -#endif - - -/* -** The maximum value of a ?nnn wildcard that the parser will accept. -*/ -#ifndef SQLITE_MAX_VARIABLE_NUMBER -# define SQLITE_MAX_VARIABLE_NUMBER 999 -#endif - -/* Maximum page size. The upper bound on this value is 65536. This a limit -** imposed by the use of 16-bit offsets within each page. -** -** Earlier versions of SQLite allowed the user to change this value at -** compile time. This is no longer permitted, on the grounds that it creates -** a library that is technically incompatible with an SQLite library -** compiled with a different limit. If a process operating on a database -** with a page-size of 65536 bytes crashes, then an instance of SQLite -** compiled with the default page-size limit will not be able to rollback -** the aborted transaction. This could lead to database corruption. -*/ -#ifdef SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_PAGE_SIZE -#endif -#define SQLITE_MAX_PAGE_SIZE 65536 - - -/* -** The default size of a database page. -*/ -#ifndef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE 1024 -#endif -#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - -/* -** Ordinarily, if no value is explicitly provided, SQLite creates databases -** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain -** device characteristics (sector-size and atomic write() support), -** SQLite may choose a larger value. This constant is the maximum value -** SQLite will choose on its own. -*/ -#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 -#endif -#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - - -/* -** Maximum number of pages in one database file. -** -** This is really just the default value for the max_page_count pragma. -** This value can be lowered (or raised) at run-time using that the -** max_page_count macro. -*/ -#ifndef SQLITE_MAX_PAGE_COUNT -# define SQLITE_MAX_PAGE_COUNT 1073741823 -#endif - -/* -** Maximum length (in bytes) of the pattern in a LIKE or GLOB -** operator. -*/ -#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 -#endif - -/* -** Maximum depth of recursion for triggers. -** -** A value of 1 means that a trigger program will not be able to itself -** fire any triggers. A value of 0 means that no trigger programs at all -** may be executed. -*/ -#ifndef SQLITE_MAX_TRIGGER_DEPTH -# define SQLITE_MAX_TRIGGER_DEPTH 1000 -#endif - -/************** End of sqliteLimit.h *****************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/* Disable nuisance warnings on Borland compilers */ -#if defined(__BORLANDC__) -#pragma warn -rch /* unreachable code */ -#pragma warn -ccc /* Condition is always true or false */ -#pragma warn -aus /* Assigned value is never used */ -#pragma warn -csu /* Comparing signed and unsigned */ -#pragma warn -spa /* Suspicious pointer arithmetic */ -#endif - -/* Needed for various definitions... */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -#if defined(__OpenBSD__) && !defined(_BSD_SOURCE) -# define _BSD_SOURCE -#endif - -/* -** Include standard header files as necessary -*/ -#ifdef HAVE_STDINT_H -#include -#endif -#ifdef HAVE_INTTYPES_H -#include -#endif - -/* -** The following macros are used to cast pointers to integers and -** integers to pointers. The way you do this varies from one compiler -** to the next, so we have developed the following set of #if statements -** to generate appropriate macros for a wide range of compilers. -** -** The correct "ANSI" way to do this is to use the intptr_t type. -** Unfortunately, that typedef is not available on all compilers, or -** if it is available, it requires an #include of specific headers -** that vary from one machine to the next. -** -** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on -** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). -** So we have to define the macros in different ways depending on the -** compiler. -*/ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ -# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) -#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ -# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) -# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) -#else /* Generates a warning - but it always works */ -# define SQLITE_INT_TO_PTR(X) ((void*)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(X)) -#endif - -/* -** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. -** 0 means mutexes are permanently disable and the library is never -** threadsafe. 1 means the library is serialized which is the highest -** level of threadsafety. 2 means the libary is multithreaded - multiple -** threads can use SQLite as long as no two threads try to use the same -** database connection at the same time. -** -** Older versions of SQLite used an optional THREADSAFE macro. -** We support that for legacy. -*/ -#if !defined(SQLITE_THREADSAFE) -# if defined(THREADSAFE) -# define SQLITE_THREADSAFE THREADSAFE -# else -# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ -# endif -#endif - -/* -** Powersafe overwrite is on by default. But can be turned off using -** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. -*/ -#ifndef SQLITE_POWERSAFE_OVERWRITE -# define SQLITE_POWERSAFE_OVERWRITE 1 -#endif - -/* -** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. -** It determines whether or not the features related to -** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can -** be overridden at runtime using the sqlite3_config() API. -*/ -#if !defined(SQLITE_DEFAULT_MEMSTATUS) -# define SQLITE_DEFAULT_MEMSTATUS 1 -#endif - -/* -** Exactly one of the following macros must be defined in order to -** specify which memory allocation subsystem to use. -** -** SQLITE_SYSTEM_MALLOC // Use normal system malloc() -** SQLITE_WIN32_MALLOC // Use Win32 native heap API -** SQLITE_ZERO_MALLOC // Use a stub allocator that always fails -** SQLITE_MEMDEBUG // Debugging version of system malloc() -** -** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the -** assert() macro is enabled, each call into the Win32 native heap subsystem -** will cause HeapValidate to be called. If heap validation should fail, an -** assertion will be triggered. -** -** (Historical note: There used to be several other options, but we've -** pared it down to just these three.) -** -** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as -** the default. -*/ -#if defined(SQLITE_SYSTEM_MALLOC) \ - + defined(SQLITE_WIN32_MALLOC) \ - + defined(SQLITE_ZERO_MALLOC) \ - + defined(SQLITE_MEMDEBUG)>1 -# error "Two or more of the following compile-time configuration options\ - are defined but at most one is allowed:\ - SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG,\ - SQLITE_ZERO_MALLOC" -#endif -#if defined(SQLITE_SYSTEM_MALLOC) \ - + defined(SQLITE_WIN32_MALLOC) \ - + defined(SQLITE_ZERO_MALLOC) \ - + defined(SQLITE_MEMDEBUG)==0 -# define SQLITE_SYSTEM_MALLOC 1 -#endif - -/* -** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the -** sizes of memory allocations below this value where possible. -*/ -#if !defined(SQLITE_MALLOC_SOFT_LIMIT) -# define SQLITE_MALLOC_SOFT_LIMIT 1024 -#endif - -/* -** We need to define _XOPEN_SOURCE as follows in order to enable -** recursive mutexes on most Unix systems. But Mac OS X is different. -** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, -** so it is omitted there. See ticket #2673. -** -** Later we learn that _XOPEN_SOURCE is poorly or incorrectly -** implemented on some systems. So we avoid defining it at all -** if it is already defined or if it is unneeded because we are -** not doing a threadsafe build. Ticket #2681. -** -** See also ticket #2741. -*/ -#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) \ - && !defined(__APPLE__) && SQLITE_THREADSAFE -# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ -#endif - -/* -** The TCL headers are only needed when compiling the TCL bindings. -*/ -#if defined(SQLITE_TCL) || defined(TCLSH) -# include -#endif - -/* -** NDEBUG and SQLITE_DEBUG are opposites. It should always be true that -** defined(NDEBUG)==!defined(SQLITE_DEBUG). If this is not currently true, -** make it true by defining or undefining NDEBUG. -** -** Setting NDEBUG makes the code smaller and run faster by disabling the -** number assert() statements in the code. So we want the default action -** to be for NDEBUG to be set and NDEBUG to be undefined only if SQLITE_DEBUG -** is set. Thus NDEBUG becomes an opt-in rather than an opt-out -** feature. -*/ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif -#if defined(NDEBUG) && defined(SQLITE_DEBUG) -# undef NDEBUG -#endif - -/* -** The testcase() macro is used to aid in coverage testing. When -** doing coverage testing, the condition inside the argument to -** testcase() must be evaluated both true and false in order to -** get full branch coverage. The testcase() macro is inserted -** to help ensure adequate test coverage in places where simple -** condition/decision coverage is inadequate. For example, testcase() -** can be used to make sure boundary values are tested. For -** bitmask tests, testcase() can be used to make sure each bit -** is significant and used at least once. On switch statements -** where multiple cases go to the same block of code, testcase() -** can insure that all cases are evaluated. -** -*/ -#ifdef SQLITE_COVERAGE_TEST -SQLITE_PRIVATE void sqlite3Coverage(int); -# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } -#else -# define testcase(X) -#endif - -/* -** The TESTONLY macro is used to enclose variable declarations or -** other bits of code that are needed to support the arguments -** within testcase() and assert() macros. -*/ -#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) -# define TESTONLY(X) X -#else -# define TESTONLY(X) -#endif - -/* -** Sometimes we need a small amount of code such as a variable initialization -** to setup for a later assert() statement. We do not want this code to -** appear when assert() is disabled. The following macro is therefore -** used to contain that setup code. The "VVA" acronym stands for -** "Verification, Validation, and Accreditation". In other words, the -** code within VVA_ONLY() will only run during verification processes. -*/ -#ifndef NDEBUG -# define VVA_ONLY(X) X -#else -# define VVA_ONLY(X) -#endif - -/* -** The ALWAYS and NEVER macros surround boolean expressions which -** are intended to always be true or false, respectively. Such -** expressions could be omitted from the code completely. But they -** are included in a few cases in order to enhance the resilience -** of SQLite to unexpected behavior - to make the code "self-healing" -** or "ductile" rather than being "brittle" and crashing at the first -** hint of unplanned behavior. -** -** In other words, ALWAYS and NEVER are added for defensive code. -** -** When doing coverage testing ALWAYS and NEVER are hard-coded to -** be true and false so that the unreachable code then specify will -** not be counted as untested code. -*/ -#if defined(SQLITE_COVERAGE_TEST) -# define ALWAYS(X) (1) -# define NEVER(X) (0) -#elif !defined(NDEBUG) -# define ALWAYS(X) ((X)?1:(assert(0),0)) -# define NEVER(X) ((X)?(assert(0),1):0) -#else -# define ALWAYS(X) (X) -# define NEVER(X) (X) -#endif - -/* -** Return true (non-zero) if the input is a integer that is too large -** to fit in 32-bits. This macro is used inside of various testcase() -** macros to verify that we have tested SQLite for large-file support. -*/ -#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) - -/* -** The macro unlikely() is a hint that surrounds a boolean -** expression that is usually false. Macro likely() surrounds -** a boolean expression that is usually true. GCC is able to -** use these hints to generate better code, sometimes. -*/ -#if defined(__GNUC__) && 0 -# define likely(X) __builtin_expect((X),1) -# define unlikely(X) __builtin_expect((X),0) -#else -# define likely(X) !!(X) -# define unlikely(X) !!(X) -#endif - -/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ -/************** Begin file sqlite3.h *****************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the SQLite library -** presents to client programs. If a C-function, structure, datatype, -** or constant definition does not appear in this file, then it is -** not a published API of SQLite, is subject to change without -** notice, and should not be referenced by programs that use SQLite. -** -** Some of the definitions that are in this file are marked as -** "experimental". Experimental interfaces are normally new -** features recently added to SQLite. We do not anticipate changes -** to experimental interfaces but reserve the right to make minor changes -** if experience from use "in the wild" suggest such changes are prudent. -** -** The official C-language API documentation for SQLite is derived -** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. -** -** The name of this file under configuration management is "sqlite.h.in". -** The makefile makes some minor changes to this file (such as inserting -** the version number) and changes its name to "sqlite3.h" as -** part of the build process. -*/ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ -#include /* Needed for the definition of va_list */ - -/* -** Make sure we can call this stuff from C++. -*/ -#if 0 -extern "C" { -#endif - - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -#ifndef SQLITE_API -# define SQLITE_API -#endif - - -/* -** These no-op macros are used in front of interfaces to mark those -** interfaces as either deprecated or experimental. New applications -** should not use deprecated interfaces - they are support for backwards -** compatibility only. Application writers should be aware that -** experimental interfaces are subject to change in point releases. -** -** These macros used to resolve to various kinds of compiler magic that -** would generate warning messages when they were used. But that -** compiler magic ended up generating such a flurry of bug reports -** that we have taken it all out and gone back to using simple -** noop macros. -*/ -#define SQLITE_DEPRECATED -#define SQLITE_EXPERIMENTAL - -/* -** Ensure these symbols were not defined by some previous header file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers -** -** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header -** evaluates to a string literal that is the SQLite version in the -** format "X.Y.Z" where X is the major version number (always 3 for -** SQLite3) and Y is the minor version number and Z is the release number.)^ -** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer -** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same -** numbers used in [SQLITE_VERSION].)^ -** The SQLITE_VERSION_NUMBER for any given release of SQLite will also -** be larger than the release from which it is derived. Either Y will -** be held constant and Z will be incremented or else Y will be incremented -** and Z will be reset to zero. -** -** Since version 3.6.18, SQLite source code has been stored in the -** Fossil configuration management -** system. ^The SQLITE_SOURCE_ID macro evaluates to -** a string which identifies a particular check-in of SQLite -** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. -** -** See also: [sqlite3_libversion()], -** [sqlite3_libversion_number()], [sqlite3_sourceid()], -** [sqlite_version()] and [sqlite_source_id()]. -*/ -#define SQLITE_VERSION "3.7.17" -#define SQLITE_VERSION_NUMBER 3007017 -#define SQLITE_SOURCE_ID "2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668" - -/* -** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid -** -** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros -** but are associated with the library instead of the header file. ^(Cautious -** programmers might include assert() statements in their application to -** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is -** compiled with matching library and header files. -** -**
-** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
-** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
-** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
-** 
)^ -** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() -** function is provided for use in DLLs since DLL users usually do not have -** direct access to string constants within the DLL. ^The -** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns -** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. -** -** See also: [sqlite_version()] and [sqlite_source_id()]. -*/ -SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; -SQLITE_API const char *sqlite3_libversion(void); -SQLITE_API const char *sqlite3_sourceid(void); -SQLITE_API int sqlite3_libversion_number(void); - -/* -** CAPI3REF: Run-Time Library Compilation Options Diagnostics -** -** ^The sqlite3_compileoption_used() function returns 0 or 1 -** indicating whether the specified option was defined at -** compile time. ^The SQLITE_ prefix may be omitted from the -** option name passed to sqlite3_compileoption_used(). -** -** ^The sqlite3_compileoption_get() function allows iterating -** over the list of options that were defined at compile time by -** returning the N-th compile time option string. ^If N is out of range, -** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ -** prefix is omitted from any strings returned by -** sqlite3_compileoption_get(). -** -** ^Support for the diagnostic functions sqlite3_compileoption_used() -** and sqlite3_compileoption_get() may be omitted by specifying the -** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. -** -** See also: SQL functions [sqlite_compileoption_used()] and -** [sqlite_compileoption_get()] and the [compile_options pragma]. -*/ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS -SQLITE_API int sqlite3_compileoption_used(const char *zOptName); -SQLITE_API const char *sqlite3_compileoption_get(int N); -#endif - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe -** -** ^The sqlite3_threadsafe() function returns zero if and only if -** SQLite was compiled with mutexing code omitted due to the -** [SQLITE_THREADSAFE] compile-time option being set to 0. -** -** SQLite can be compiled with or without mutexes. When -** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes -** are enabled and SQLite is threadsafe. When the -** [SQLITE_THREADSAFE] macro is 0, -** the mutexes are omitted. Without the mutexes, it is not safe -** to use SQLite concurrently from more than one thread. -** -** Enabling mutexes incurs a measurable performance penalty. -** So if speed is of utmost importance, it makes sense to disable -** the mutexes. But for maximum safety, mutexes should be enabled. -** ^The default behavior is for mutexes to be enabled. -** -** This interface can be used by an application to make sure that the -** version of SQLite that it is linking against was compiled with -** the desired setting of the [SQLITE_THREADSAFE] macro. -** -** This interface only reports on the compile-time mutex setting -** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but -** can be fully or partially disabled using a call to [sqlite3_config()] -** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the -** sqlite3_threadsafe() function shows only the compile-time setting of -** thread safety, not any run-time changes to that setting made by -** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() -** is unchanged by calls to sqlite3_config().)^ -** -** See the [threading mode] documentation for additional information. -*/ -SQLITE_API int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle -** KEYWORDS: {database connection} {database connections} -** -** Each open SQLite database is represented by a pointer to an instance of -** the opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] -** and [sqlite3_close_v2()] are its destructors. There are many other -** interfaces (such as -** [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on an -** sqlite3 object. -*/ -typedef struct sqlite3 sqlite3; - -/* -** CAPI3REF: 64-Bit Integer Types -** KEYWORDS: sqlite_int64 sqlite_uint64 -** -** Because there is no cross-platform way to specify 64-bit integer types -** SQLite includes typedefs for 64-bit signed and unsigned integers. -** -** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. -** The sqlite_int64 and sqlite_uint64 types are supported for backwards -** compatibility only. -** -** ^The sqlite3_int64 and sqlite_int64 types can store integer values -** between -9223372036854775808 and +9223372036854775807 inclusive. ^The -** sqlite3_uint64 and sqlite_uint64 types can store integer values -** between 0 and +18446744073709551615 inclusive. -*/ -#ifdef SQLITE_INT64_TYPE - typedef SQLITE_INT64_TYPE sqlite_int64; - typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) - typedef __int64 sqlite_int64; - typedef unsigned __int64 sqlite_uint64; -#else - typedef long long int sqlite_int64; - typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection -** -** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors -** for the [sqlite3] object. -** ^Calls to sqlite3_close() and sqlite3_close_v2() return SQLITE_OK if -** the [sqlite3] object is successfully destroyed and all associated -** resources are deallocated. -** -** ^If the database connection is associated with unfinalized prepared -** statements or unfinished sqlite3_backup objects then sqlite3_close() -** will leave the database connection open and return [SQLITE_BUSY]. -** ^If sqlite3_close_v2() is called with unfinalized prepared statements -** and unfinished sqlite3_backups, then the database connection becomes -** an unusable "zombie" which will automatically be deallocated when the -** last prepared statement is finalized or the last sqlite3_backup is -** finished. The sqlite3_close_v2() interface is intended for use with -** host languages that are garbage collected, and where the order in which -** destructors are called is arbitrary. -** -** Applications should [sqlite3_finalize | finalize] all [prepared statements], -** [sqlite3_blob_close | close] all [BLOB handles], and -** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated -** with the [sqlite3] object prior to attempting to close the object. ^If -** sqlite3_close_v2() is called on a [database connection] that still has -** outstanding [prepared statements], [BLOB handles], and/or -** [sqlite3_backup] objects then it returns SQLITE_OK but the deallocation -** of resources is deferred until all [prepared statements], [BLOB handles], -** and [sqlite3_backup] objects are also destroyed. -** -** ^If an [sqlite3] object is destroyed while a transaction is open, -** the transaction is automatically rolled back. -** -** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] -** must be either a NULL -** pointer or an [sqlite3] object pointer obtained -** from [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()], and not previously closed. -** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer -** argument is a harmless no-op. -*/ -SQLITE_API int sqlite3_close(sqlite3*); -SQLITE_API int sqlite3_close_v2(sqlite3*); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface -** -** The sqlite3_exec() interface is a convenience wrapper around -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], -** that allows an application to run multiple statements of SQL -** without having to use a lot of C code. -** -** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, -** in the context of the [database connection] passed in as its 1st -** argument. ^If the callback function of the 3rd argument to -** sqlite3_exec() is not NULL, then it is invoked for each result row -** coming out of the evaluated SQL statements. ^The 4th argument to -** sqlite3_exec() is relayed through to the 1st argument of each -** callback invocation. ^If the callback pointer to sqlite3_exec() -** is NULL, then no callback is ever invoked and result rows are -** ignored. -** -** ^If an error occurs while evaluating the SQL statements passed into -** sqlite3_exec(), then execution of the current statement stops and -** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() -** is not NULL then any error message is written into memory obtained -** from [sqlite3_malloc()] and passed back through the 5th parameter. -** To avoid memory leaks, the application should invoke [sqlite3_free()] -** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. -** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors -** occur, then sqlite3_exec() sets the pointer in its 5th parameter to -** NULL before returning. -** -** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() -** routine returns SQLITE_ABORT without invoking the callback again and -** without running any subsequent SQL statements. -** -** ^The 2nd argument to the sqlite3_exec() callback function is the -** number of columns in the result. ^The 3rd argument to the sqlite3_exec() -** callback is an array of pointers to strings obtained as if from -** [sqlite3_column_text()], one for each column. ^If an element of a -** result row is NULL then the corresponding string pointer for the -** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the -** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained -** from [sqlite3_column_name()]. -** -** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer -** to an empty string, or a pointer that contains only whitespace and/or -** SQL comments, then no SQL statements are evaluated and the database -** is not changed. -** -** Restrictions: -** -**
    -**
  • The application must insure that the 1st parameter to sqlite3_exec() -** is a valid and open [database connection]. -**
  • The application must not close [database connection] specified by -** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. -**
  • The application must not modify the SQL statement text passed into -** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. -**
-*/ -SQLITE_API int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluated */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes -** KEYWORDS: SQLITE_OK {error code} {error codes} -** KEYWORDS: {result code} {result codes} -** -** Many SQLite functions return an integer result code from the set shown -** here in order to indicate success or failure. -** -** New error codes may be added in future versions of SQLite. -** -** See also: [SQLITE_IOERR_READ | extended result codes], -** [sqlite3_vtab_on_conflict()] [SQLITE_ROLLBACK | result codes]. -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ -#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes -** KEYWORDS: {extended error code} {extended error codes} -** KEYWORDS: {extended result code} {extended result codes} -** -** In its default configuration, SQLite API routines return one of 26 integer -** [SQLITE_OK | result codes]. However, experience has shown that many of -** these result codes are too coarse-grained. They do not provide as -** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. The extended result codes are enabled or disabled -** on a per database connection basis using the -** [sqlite3_extended_result_codes()] API. -** -** Some of the available extended result codes are listed here. -** One may expect the number of extended result codes will be expand -** over time. Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) -#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) -#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) -#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) -#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) -#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) -#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) -#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) -#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) -#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) -#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) -#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) -#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) -#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) -#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) -#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) -#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) -#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) -#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) -#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) -#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) -#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) -#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) -#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) -#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) -#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) -#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) -#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) -#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) -#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) -#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) -#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) -#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) -#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) - -/* -** CAPI3REF: Flags For File Open Operations -** -** These bit values are intended for use in the -** 3rd parameter to the [sqlite3_open_v2()] interface and -** in the 4th parameter to the [sqlite3_vfs.xOpen] method. -*/ -#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ -#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ -#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ -#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ -#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ - -/* Reserved: 0x00F00000 */ - -/* -** CAPI3REF: Device Characteristics -** -** The xDeviceCharacteristics method of the [sqlite3_io_methods] -** object returns an integer which is a vector of these -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that -** after reboot following a crash or power loss, the only bytes in a -** file that were written at the application level might have changed -** and that adjacent bytes, even bytes within the same sector are -** guaranteed to be unchanged. -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 -#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 -#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 - -/* -** CAPI3REF: File Locking Levels -** -** SQLite uses one of these integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags -** -** When SQLite invokes the xSync() method of an -** [sqlite3_io_methods] object it uses a combination of -** these integer values as the second argument. -** -** When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. If the lower four bits of the flag -** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. -** If the lower four bits equal SQLITE_SYNC_FULL, that means -** to use Mac OS X style fullsync instead of fsync(). -** -** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags -** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL -** settings. The [synchronous pragma] determines when calls to the -** xSync VFS method occur and applies uniformly across all platforms. -** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how -** energetic or rigorous or forceful the sync operations are and -** only make a difference on Mac OSX for the default SQLite code. -** (Third-party VFS implementations might also make the distinction -** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the -** operating systems natively supported by SQLite, only Mac OSX -** cares about the difference.) -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - -/* -** CAPI3REF: OS Interface Open File Handle -** -** An [sqlite3_file] object represents an open file in the -** [sqlite3_vfs | OS interface layer]. Individual OS interface -** implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file { - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object -** -** Every file opened by the [sqlite3_vfs.xOpen] method populates an -** [sqlite3_file] object (or, more commonly, a subclass of the -** [sqlite3_file] object) with a pointer to an instance of this object. -** This object defines the methods used to perform various operations -** against the open file represented by the [sqlite3_file] object. -** -** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element -** to a non-NULL pointer, then the sqlite3_io_methods.xClose method -** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The -** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] -** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element -** to NULL. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] -** flag may be ORed in to indicate that only the data of the file -** and not its inode needs to be synced. -** -** The integer values to xLock() and xUnlock() are one of -**
    -**
  • [SQLITE_LOCK_NONE], -**
  • [SQLITE_LOCK_SHARED], -**
  • [SQLITE_LOCK_RESERVED], -**
  • [SQLITE_LOCK_PENDING], or -**
  • [SQLITE_LOCK_EXCLUSIVE]. -**
-** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method checks whether any database connection, -** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument is an -** integer opcode. The third argument is a generic pointer intended to -** point to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves all opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. VFS implementations should -** return [SQLITE_NOTFOUND] for file control opcodes that they do not -** recognize. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
    -**
  • [SQLITE_IOCAP_ATOMIC] -**
  • [SQLITE_IOCAP_ATOMIC512] -**
  • [SQLITE_IOCAP_ATOMIC1K] -**
  • [SQLITE_IOCAP_ATOMIC2K] -**
  • [SQLITE_IOCAP_ATOMIC4K] -**
  • [SQLITE_IOCAP_ATOMIC8K] -**
  • [SQLITE_IOCAP_ATOMIC16K] -**
  • [SQLITE_IOCAP_ATOMIC32K] -**
  • [SQLITE_IOCAP_ATOMIC64K] -**
  • [SQLITE_IOCAP_SAFE_APPEND] -**
  • [SQLITE_IOCAP_SEQUENTIAL] -**
-** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -** -** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill -** in the unread portions of the buffer with zeros. A VFS that -** fails to zero-fill short reads might seem to work. However, -** failure to zero-fill short reads will eventually lead to -** database corruption. -*/ -typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods { - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); - /* Methods above are valid for version 1 */ - int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); - int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); - void (*xShmBarrier)(sqlite3_file*); - int (*xShmUnmap)(sqlite3_file*, int deleteFlag); - /* Methods above are valid for version 2 */ - int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); - int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); - /* Methods above are valid for version 3 */ - /* Additional methods may be added in future releases */ -}; - -/* -** CAPI3REF: Standard File Control Opcodes -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] -** interface. -** -** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode causes the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -**
    -**
  • [[SQLITE_FCNTL_SIZE_HINT]] -** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS -** layer a hint of how large the database file will grow to be during the -** current transaction. This hint is not guaranteed to be accurate but it -** is often close. The underlying VFS might choose to preallocate database -** file space based on this hint in order to help writes to the database -** file run faster. -** -**
  • [[SQLITE_FCNTL_CHUNK_SIZE]] -** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS -** extends and truncates the database file in chunks of a size specified -** by the user. The fourth argument to [sqlite3_file_control()] should -** point to an integer (type int) containing the new chunk-size to use -** for the nominated database. Allocating database file space in large -** chunks (say 1MB at a time), may reduce file-system fragmentation and -** improve performance on some systems. -** -**
  • [[SQLITE_FCNTL_FILE_POINTER]] -** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer -** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. -** -**
  • [[SQLITE_FCNTL_SYNC_OMITTED]] -** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by -** SQLite and sent to all VFSes in place of a call to the xSync method -** when the database connection has [PRAGMA synchronous] set to OFF.)^ -** Some specialized VFSes need this signal in order to operate correctly -** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most -** VFSes do not need this signal and should silently ignore this opcode. -** Applications should not call [sqlite3_file_control()] with this -** opcode as doing so may disrupt the operation of the specialized VFSes -** that do require it. -** -**
  • [[SQLITE_FCNTL_WIN32_AV_RETRY]] -** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic -** retry counts and intervals for certain disk I/O operations for the -** windows [VFS] in order to provide robustness in the presence of -** anti-virus programs. By default, the windows VFS will retry file read, -** file write, and file delete operations up to 10 times, with a delay -** of 25 milliseconds before the first retry and with the delay increasing -** by an additional 25 milliseconds with each subsequent retry. This -** opcode allows these two values (10 retries and 25 milliseconds of delay) -** to be adjusted. The values are changed for all database connections -** within the same process. The argument is a pointer to an array of two -** integers where the first integer i the new retry count and the second -** integer is the delay. If either integer is negative, then the setting -** is not changed but instead the prior value of that setting is written -** into the array entry, allowing the current retry settings to be -** interrogated. The zDbName parameter is ignored. -** -**
  • [[SQLITE_FCNTL_PERSIST_WAL]] -** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the -** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary -** write ahead log and shared memory files used for transaction control -** are automatically deleted when the latest connection to the database -** closes. Setting persistent WAL mode causes those files to persist after -** close. Persisting the files is useful when other processes that do not -** have write permission on the directory containing the database file want -** to read the database file, as the WAL and shared memory files must exist -** in order for the database to be readable. The fourth parameter to -** [sqlite3_file_control()] for this opcode should be a pointer to an integer. -** That integer is 0 to disable persistent WAL mode or 1 to enable persistent -** WAL mode. If the integer is -1, then it is overwritten with the current -** WAL persistence setting. -** -**
  • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] -** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the -** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting -** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the -** xDeviceCharacteristics methods. The fourth parameter to -** [sqlite3_file_control()] for this opcode should be a pointer to an integer. -** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage -** mode. If the integer is -1, then it is overwritten with the current -** zero-damage mode setting. -** -**
  • [[SQLITE_FCNTL_OVERWRITE]] -** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening -** a write transaction to indicate that, unless it is rolled back for some -** reason, the entire database file will be overwritten by the current -** transaction. This is used by VACUUM operations. -** -**
  • [[SQLITE_FCNTL_VFSNAME]] -** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of -** all [VFSes] in the VFS stack. The names are of all VFS shims and the -** final bottom-level VFS are written into memory obtained from -** [sqlite3_malloc()] and the result is stored in the char* variable -** that the fourth parameter of [sqlite3_file_control()] points to. -** The caller is responsible for freeing the memory when done. As with -** all file-control actions, there is no guarantee that this will actually -** do anything. Callers should initialize the char* variable to a NULL -** pointer in case this file-control is not implemented. This file-control -** is intended for diagnostic use only. -** -**
  • [[SQLITE_FCNTL_PRAGMA]] -** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] -** file control is sent to the open [sqlite3_file] object corresponding -** to the database file to which the pragma statement refers. ^The argument -** to the [SQLITE_FCNTL_PRAGMA] file control is an array of -** pointers to strings (char**) in which the second element of the array -** is the name of the pragma and the third element is the argument to the -** pragma or NULL if the pragma has no argument. ^The handler for an -** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element -** of the char** argument point to a string obtained from [sqlite3_mprintf()] -** or the equivalent and that string will become the result of the pragma or -** the error message if the pragma fails. ^If the -** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal -** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] -** file control returns [SQLITE_OK], then the parser assumes that the -** VFS has handled the PRAGMA itself and the parser generates a no-op -** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns -** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means -** that the VFS encountered an error while handling the [PRAGMA] and the -** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] -** file control occurs at the beginning of pragma statement analysis and so -** it is able to override built-in [PRAGMA] statements. -** -**
  • [[SQLITE_FCNTL_BUSYHANDLER]] -** ^The [SQLITE_FCNTL_BUSYHANDLER] -** file-control may be invoked by SQLite on the database file handle -** shortly after it is opened in order to provide a custom VFS with access -** to the connections busy-handler callback. The argument is of type (void **) -** - an array of two (void *) values. The first (void *) actually points -** to a function of type (int (*)(void *)). In order to invoke the connections -** busy-handler, this function should be invoked with the second (void *) in -** the array as the only argument. If it returns non-zero, then the operation -** should be retried. If it returns zero, the custom VFS should abandon the -** current operation. -** -**
  • [[SQLITE_FCNTL_TEMPFILENAME]] -** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control -** to have SQLite generate a -** temporary filename using the same algorithm that is followed to generate -** temporary filenames for TEMP tables and other internal uses. The -** argument should be a char** which will be filled with the filename -** written into memory obtained from [sqlite3_malloc()]. The caller should -** invoke [sqlite3_free()] on the result to avoid a memory leak. -** -**
  • [[SQLITE_FCNTL_MMAP_SIZE]] -** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the -** maximum number of bytes that will be used for memory-mapped I/O. -** The argument is a pointer to a value of type sqlite3_int64 that -** is an advisory maximum number of bytes in the file to memory map. The -** pointer is overwritten with the old value. The limit is not changed if -** the value originally pointed to is negative, and so the current limit -** can be queried by passing in a pointer to a negative number. This -** file-control is used internally to implement [PRAGMA mmap_size]. -** -**
-*/ -#define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 -#define SQLITE_FCNTL_SIZE_HINT 5 -#define SQLITE_FCNTL_CHUNK_SIZE 6 -#define SQLITE_FCNTL_FILE_POINTER 7 -#define SQLITE_FCNTL_SYNC_OMITTED 8 -#define SQLITE_FCNTL_WIN32_AV_RETRY 9 -#define SQLITE_FCNTL_PERSIST_WAL 10 -#define SQLITE_FCNTL_OVERWRITE 11 -#define SQLITE_FCNTL_VFSNAME 12 -#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 -#define SQLITE_FCNTL_PRAGMA 14 -#define SQLITE_FCNTL_BUSYHANDLER 15 -#define SQLITE_FCNTL_TEMPFILENAME 16 -#define SQLITE_FCNTL_MMAP_SIZE 18 - -/* -** CAPI3REF: Mutex Handle -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object -** -** An instance of the sqlite3_vfs object defines the interface between -** the SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". See -** the [VFS | VFS documentation] for further information. -** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered sqlite3_vfs objects are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. Neither the application code nor the VFS -** implementation should use the pNext pointer. -** -** The pNext field is the only field in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** [[sqlite3_vfs.xOpen]] -** ^SQLite guarantees that the zFilename parameter to xOpen -** is either a NULL pointer or string obtained -** from xFullPathname() with an optional suffix added. -** ^If a suffix is added to the zFilename parameter, it will -** consist of a single "-" character followed by no more than -** 11 alphanumeric and/or "-" characters. -** ^SQLite further guarantees that -** the string will be valid and unchanged until xClose() is -** called. Because of the previous sentence, -** the [sqlite3_file] can safely store a pointer to the -** filename if it needs to remember the filename for some reason. -** If the zFilename parameter to xOpen is a NULL pointer then xOpen -** must invent its own temporary name for the file. ^Whenever the -** xFilename parameter is NULL it will also be the case that the -** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. -** -** The flags argument to xOpen() includes all bits set in -** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] -** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. -** -** ^(SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
    -**
  • [SQLITE_OPEN_MAIN_DB] -**
  • [SQLITE_OPEN_MAIN_JOURNAL] -**
  • [SQLITE_OPEN_TEMP_DB] -**
  • [SQLITE_OPEN_TEMP_JOURNAL] -**
  • [SQLITE_OPEN_TRANSIENT_DB] -**
  • [SQLITE_OPEN_SUBJOURNAL] -**
  • [SQLITE_OPEN_MASTER_JOURNAL] -**
  • [SQLITE_OPEN_WAL] -**
)^ -** -** The file I/O implementation can use the object type flags to -** change the way it deals with files. For example, an application -** that does not care about crash recovery or rollback might make -** the open of a journal file a no-op. Writes to this journal would -** also be no-ops, and any attempt to read the journal would return -** SQLITE_IOERR. Or the implementation might recognize that a database -** file will be doing page-aligned sector reads and writes in a random -** order and set up its I/O subsystem accordingly. -** -** SQLite might also add one of the following flags to the xOpen method: -** -**
    -**
  • [SQLITE_OPEN_DELETEONCLOSE] -**
  • [SQLITE_OPEN_EXCLUSIVE] -**
-** -** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] -** will be set for TEMP databases and their journals, transient -** databases, and subjournals. -** -** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction -** with the [SQLITE_OPEN_CREATE] flag, which are both directly -** analogous to the O_EXCL and O_CREAT flags of the POSIX open() -** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the -** SQLITE_OPEN_CREATE, is used to indicate that file should always -** be created, and that it is an error if it already exists. -** It is not used to indicate the file should be opened -** for exclusive access. -** -** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third -** argument to xOpen. The xOpen method does not have to -** allocate the structure; it should just fill it in. Note that -** the xOpen method must set the sqlite3_file.pMethods to either -** a valid [sqlite3_io_methods] object or to NULL. xOpen must do -** this even if the open fails. SQLite expects that the sqlite3_file.pMethods -** element will be valid after xOpen returns regardless of the success -** or failure of the xOpen call. -** -** [[sqlite3_vfs.xAccess]] -** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to -** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. -** -** ^SQLite will always allocate at least mxPathname+1 bytes for the -** output buffer xFullPathname. The exact size of the output buffer -** is also passed as a parameter to both methods. If the output buffer -** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is -** handled as a fatal error by SQLite, vfs implementations should endeavor -** to prevent this by setting mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() -** interfaces are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. -** The xSleep() method causes the calling thread to sleep for at -** least the number of microseconds given. ^The xCurrentTime() -** method returns a Julian Day Number for the current date and time as -** a floating point value. -** ^The xCurrentTimeInt64() method returns, as an integer, the Julian -** Day Number multiplied by 86400000 (the number of milliseconds in -** a 24-hour day). -** ^SQLite will use the xCurrentTimeInt64() method to get the current -** date and time if that method is available (if iVersion is 2 or -** greater and the function pointer is not NULL) and will fall back -** to xCurrentTime() if xCurrentTimeInt64() is unavailable. -** -** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces -** are not used by the SQLite core. These optional interfaces are provided -** by some VFSes to facilitate testing of the VFS code. By overriding -** system calls with functions under its control, a test program can -** simulate faults and error conditions that would otherwise be difficult -** or impossible to induce. The set of system calls that can be overridden -** varies from one VFS to another, and from one version of the same VFS to the -** next. Applications that use these interfaces must be prepared for any -** or all of these interfaces to be NULL or for their behavior to change -** from one release to the next. Applications must not attempt to access -** any of these methods if the iVersion of the VFS is less than 3. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -typedef void (*sqlite3_syscall_ptr)(void); -struct sqlite3_vfs { - int iVersion; /* Structure version number (currently 3) */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ - int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*); - int (*xGetLastError)(sqlite3_vfs*, int, char *); - /* - ** The methods above are in version 1 of the sqlite_vfs object - ** definition. Those that follow are added in version 2 or later - */ - int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); - /* - ** The methods above are in versions 1 and 2 of the sqlite_vfs object. - ** Those below are for version 3 and greater. - */ - int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); - sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); - const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); - /* - ** The methods above are in versions 1 through 3 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. - */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method -** -** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. They determine -** what kind of permissions the xAccess method is looking for. -** With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks whether the file exists. -** With SQLITE_ACCESS_READWRITE, the xAccess method -** checks whether the named directory is both readable and writable -** (in other words, if files can be added, removed, and renamed within -** the directory). -** The SQLITE_ACCESS_READWRITE constant is currently used only by the -** [temp_store_directory pragma], though this could change in a future -** release of SQLite. -** With SQLITE_ACCESS_READ, the xAccess method -** checks whether the file is readable. The SQLITE_ACCESS_READ constant is -** currently unused, though it might be used in a future release of -** SQLite. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ -#define SQLITE_ACCESS_READ 2 /* Unused */ - -/* -** CAPI3REF: Flags for the xShmLock VFS method -** -** These integer constants define the various locking operations -** allowed by the xShmLock method of [sqlite3_io_methods]. The -** following are the only legal combinations of flags to the -** xShmLock method: -** -**
    -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE -**
-** -** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as -** was given no the corresponding lock. -** -** The xShmLock method can transition between unlocked and SHARED or -** between unlocked and EXCLUSIVE. It cannot transition between SHARED -** and EXCLUSIVE. -*/ -#define SQLITE_SHM_UNLOCK 1 -#define SQLITE_SHM_LOCK 2 -#define SQLITE_SHM_SHARED 4 -#define SQLITE_SHM_EXCLUSIVE 8 - -/* -** CAPI3REF: Maximum xShmLock index -** -** The xShmLock method on [sqlite3_io_methods] may use values -** between 0 and this upper bound as its "offset" argument. -** The SQLite core will never attempt to acquire or release a -** lock outside of this range -*/ -#define SQLITE_SHM_NLOCK 8 - - -/* -** CAPI3REF: Initialize The SQLite Library -** -** ^The sqlite3_initialize() routine initializes the -** SQLite library. ^The sqlite3_shutdown() routine -** deallocates any resources that were allocated by sqlite3_initialize(). -** These routines are designed to aid in process initialization and -** shutdown on embedded systems. Workstation applications using -** SQLite normally do not need to invoke either of these routines. -** -** A call to sqlite3_initialize() is an "effective" call if it is -** the first time sqlite3_initialize() is invoked during the lifetime of -** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). ^(Only an effective call -** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops.)^ -** -** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only -** an effective call to sqlite3_shutdown() does any deinitialization. -** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ -** -** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() -** is not. The sqlite3_shutdown() interface must only be called from a -** single thread. All open [database connections] must be closed and all -** other SQLite resources must be deallocated prior to invoking -** sqlite3_shutdown(). -** -** Among other things, ^sqlite3_initialize() will invoke -** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() -** will invoke sqlite3_os_end(). -** -** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** ^If for some reason, sqlite3_initialize() is unable to initialize -** the library (perhaps it is unable to allocate a needed resource such -** as a mutex) it returns an [error code] other than [SQLITE_OK]. -** -** ^The sqlite3_initialize() routine is called internally by many other -** SQLite interfaces so that an application usually does not need to -** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] -** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized -** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] -** compile-time option, then the automatic calls to sqlite3_initialize() -** are omitted and the application must call sqlite3_initialize() directly -** prior to using any other SQLite interface. For maximum portability, -** it is recommended that applications always invoke sqlite3_initialize() -** directly prior to using any other SQLite interface. Future releases -** of SQLite may require this. In other words, the behavior exhibited -** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the -** default behavior in some future release of SQLite. -** -** The sqlite3_os_init() routine does operating-system specific -** initialization of the SQLite library. The sqlite3_os_end() -** routine undoes the effect of sqlite3_os_init(). Typical tasks -** performed by these routines include allocation or deallocation -** of static resources, initialization of global variables, -** setting up a default [sqlite3_vfs] module, or setting up -** a default configuration using [sqlite3_config()]. -** -** The application should never invoke either sqlite3_os_init() -** or sqlite3_os_end() directly. The application should only invoke -** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() -** interface is called automatically by sqlite3_initialize() and -** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate -** implementations for sqlite3_os_init() and sqlite3_os_end() -** are built into SQLite when it is compiled for Unix, Windows, or OS/2. -** When [custom builds | built for other platforms] -** (using the [SQLITE_OS_OTHER=1] compile-time -** option) the application must supply a suitable implementation for -** sqlite3_os_init() and sqlite3_os_end(). An application-supplied -** implementation of sqlite3_os_init() or sqlite3_os_end() -** must return [SQLITE_OK] on success and some other [error code] upon -** failure. -*/ -SQLITE_API int sqlite3_initialize(void); -SQLITE_API int sqlite3_shutdown(void); -SQLITE_API int sqlite3_os_init(void); -SQLITE_API int sqlite3_os_end(void); - -/* -** CAPI3REF: Configuring The SQLite Library -** -** The sqlite3_config() interface is used to make global configuration -** changes to SQLite in order to tune SQLite to the specific needs of -** the application. The default configuration is recommended for most -** applications and so this routine is usually not necessary. It is -** provided to support rare applications with unusual needs. -** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** -** The first argument to sqlite3_config() is an integer -** [configuration option] that determines -** what property of SQLite is to be configured. Subsequent arguments -** vary depending on the [configuration option] -** in the first argument. -** -** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** ^If the option is unknown or SQLite is unable to set the option -** then this routine returns a non-zero [error code]. -*/ -SQLITE_API int sqlite3_config(int, ...); - -/* -** CAPI3REF: Configure database connections -** -** The sqlite3_db_config() interface is used to make configuration -** changes to a [database connection]. The interface is similar to -** [sqlite3_config()] except that the changes apply to a single -** [database connection] (specified in the first argument). -** -** The second argument to sqlite3_db_config(D,V,...) is the -** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code -** that indicates what aspect of the [database connection] is being configured. -** Subsequent arguments vary depending on the configuration verb. -** -** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if -** the call is considered successful. -*/ -SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Memory Allocation Routines -** -** An instance of this object defines the interface between SQLite -** and low-level memory allocation routines. -** -** This object is used in only one place in the SQLite interface. -** A pointer to an instance of this object is the argument to -** [sqlite3_config()] when the configuration option is -** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. -** By creating an instance of this object -** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) -** during configuration, an application can specify an alternative -** memory allocation subsystem for SQLite to use for all of its -** dynamic memory needs. -** -** Note that SQLite comes with several [built-in memory allocators] -** that are perfectly adequate for the overwhelming majority of applications -** and that this object is only useful to a tiny minority of applications -** with specialized memory allocation requirements. This object is -** also used during testing of SQLite in order to specify an alternative -** memory allocator that simulates memory out-of-memory conditions in -** order to verify that SQLite recovers gracefully from such -** conditions. -** -** The xMalloc, xRealloc, and xFree methods must work like the -** malloc(), realloc() and free() functions from the standard C library. -** ^SQLite guarantees that the second argument to -** xRealloc is always a value returned by a prior call to xRoundup. -** -** xSize should return the allocated size of a memory allocation -** previously obtained from xMalloc or xRealloc. The allocated size -** is always at least as big as the requested size but may be larger. -** -** The xRoundup method returns what would be the allocated size of -** a memory allocation given a particular requested size. Most memory -** allocators round up memory allocations at least to the next multiple -** of 8. Some allocators round up to a larger multiple or to a power of 2. -** Every memory allocation request coming in through [sqlite3_malloc()] -** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, -** that causes the corresponding memory allocation to fail. -** -** The xInit method initializes the memory allocator. (For example, -** it might allocate any require mutexes or initialize internal data -** structures. The xShutdown method is invoked (indirectly) by -** [sqlite3_shutdown()] and should deallocate any resources acquired -** by xInit. The pAppData pointer is used as the only parameter to -** xInit and xShutdown. -** -** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. For all other methods, SQLite -** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the -** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which -** it is by default) and so the methods are automatically serialized. -** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other -** methods must be threadsafe or else make their own arrangements for -** serialization. -** -** SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -*/ -typedef struct sqlite3_mem_methods sqlite3_mem_methods; -struct sqlite3_mem_methods { - void *(*xMalloc)(int); /* Memory allocation function */ - void (*xFree)(void*); /* Free a prior allocation */ - void *(*xRealloc)(void*,int); /* Resize an allocation */ - int (*xSize)(void*); /* Return the size of an allocation */ - int (*xRoundup)(int); /* Round up request size to allocation size */ - int (*xInit)(void*); /* Initialize the memory allocator */ - void (*xShutdown)(void*); /* Deinitialize the memory allocator */ - void *pAppData; /* Argument to xInit() and xShutdown() */ -}; - -/* -** CAPI3REF: Configuration Options -** KEYWORDS: {configuration option} -** -** These constants are the available integer configuration options that -** can be passed as the first argument to the [sqlite3_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_config()] to make sure that -** the call worked. The [sqlite3_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-** [[SQLITE_CONFIG_SINGLETHREAD]]
SQLITE_CONFIG_SINGLETHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Single-thread. In other words, it disables -** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to change the [threading mode] from its default -** value of Single-thread and so [sqlite3_config()] will return -** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD -** configuration option.
-** -** [[SQLITE_CONFIG_MULTITHREAD]]
SQLITE_CONFIG_MULTITHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Multi-thread. In other words, it disables -** mutexing on [database connection] and [prepared statement] objects. -** The application is responsible for serializing access to -** [database connections] and [prepared statements]. But other mutexes -** are enabled so that SQLite will be safe to use in a multi-threaded -** environment as long as no two threads attempt to use the same -** [database connection] at the same time. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Multi-thread [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_MULTITHREAD configuration option.
-** -** [[SQLITE_CONFIG_SERIALIZED]]
SQLITE_CONFIG_SERIALIZED
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Serialized. In other words, this option enables -** all mutexes including the recursive -** mutexes on [database connection] and [prepared statement] objects. -** In this mode (which is the default when SQLite is compiled with -** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access -** to [database connections] and [prepared statements] so that the -** application is free to use the same [database connection] or the -** same [prepared statement] in different threads at the same time. -** ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Serialized [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_SERIALIZED configuration option.
-** -** [[SQLITE_CONFIG_MALLOC]]
SQLITE_CONFIG_MALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The argument specifies -** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.)^ ^SQLite makes -** its own private copy of the content of the [sqlite3_mem_methods] structure -** before the [sqlite3_config()] call returns.
-** -** [[SQLITE_CONFIG_GETMALLOC]]
SQLITE_CONFIG_GETMALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines.)^ -** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
-** -** [[SQLITE_CONFIG_MEMSTATUS]]
SQLITE_CONFIG_MEMSTATUS
-**
^This option takes single argument of type int, interpreted as a -** boolean, which enables or disables the collection of memory allocation -** statistics. ^(When memory allocation statistics are disabled, the -** following SQLite interfaces become non-operational: -**
    -**
  • [sqlite3_memory_used()] -**
  • [sqlite3_memory_highwater()] -**
  • [sqlite3_soft_heap_limit64()] -**
  • [sqlite3_status()] -**
)^ -** ^Memory allocation statistics are enabled by default unless SQLite is -** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory -** allocation statistics are disabled by default. -**
-** -** [[SQLITE_CONFIG_SCRATCH]]
SQLITE_CONFIG_SCRATCH
-**
^This option specifies a static memory buffer that SQLite can use for -** scratch memory. There are three arguments: A pointer an 8-byte -** aligned memory buffer from which the scratch allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N). The sz -** argument must be a multiple of 16. -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will use no more than two scratch buffers per thread. So -** N should be set to twice the expected maximum number of threads. -** ^SQLite will never require a scratch buffer that is more than 6 -** times the database page size. ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.
-** -** [[SQLITE_CONFIG_PAGECACHE]]
SQLITE_CONFIG_PAGECACHE
-**
^This option specifies a static memory buffer that SQLite can use for -** the database page cache with the default page cache implementation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option. -** There are three arguments to this option: A pointer to 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). -** The sz argument should be the size of the largest database page -** (a power of two between 512 and 32768) plus a little extra for each -** page header. ^The page header size is 20 to 40 bytes depending on -** the host architecture. ^It is harmless, apart from the wasted memory, -** to make sz a little too large. The first -** argument should point to an allocation of at least sz*N bytes of memory. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The pointer in the first argument must -** be aligned to an 8-byte boundary or subsequent behavior of SQLite -** will be undefined.
-** -** [[SQLITE_CONFIG_HEAP]]
SQLITE_CONFIG_HEAP
-**
^This option specifies a static memory buffer that SQLite will use -** for all of its dynamic memory allocation needs beyond those provided -** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. -** There are three arguments: An 8-byte aligned pointer to the memory, -** the number of bytes in the memory buffer, and the minimum allocation size. -** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts -** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the -** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or -** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory -** allocator is engaged to handle all of SQLites memory allocation needs. -** The first pointer (the memory pointer) must be aligned to an 8-byte -** boundary or subsequent behavior of SQLite will be undefined. -** The minimum allocation size is capped at 2**12. Reasonable values -** for the minimum allocation size are 2**5 through 2**8.
-** -** [[SQLITE_CONFIG_MUTEX]]
SQLITE_CONFIG_MUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The argument specifies -** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the -** content of the [sqlite3_mutex_methods] structure before the call to -** [sqlite3_config()] returns. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will -** return [SQLITE_ERROR].
-** -** [[SQLITE_CONFIG_GETMUTEX]]
SQLITE_CONFIG_GETMUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The -** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines.)^ -** This option can be used to overload the default mutex allocation -** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will -** return [SQLITE_ERROR].
-** -** [[SQLITE_CONFIG_LOOKASIDE]]
SQLITE_CONFIG_LOOKASIDE
-**
^(This option takes two arguments that determine the default -** memory allocation for the lookaside memory allocator on each -** [database connection]. The first argument is the -** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection.)^ ^(This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] -** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.)^
-** -** [[SQLITE_CONFIG_PCACHE2]]
SQLITE_CONFIG_PCACHE2
-**
^(This option takes a single argument which is a pointer to -** an [sqlite3_pcache_methods2] object. This object specifies the interface -** to a custom page cache implementation.)^ ^SQLite makes a copy of the -** object and uses it for page cache memory allocations.
-** -** [[SQLITE_CONFIG_GETPCACHE2]]
SQLITE_CONFIG_GETPCACHE2
-**
^(This option takes a single argument which is a pointer to an -** [sqlite3_pcache_methods2] object. SQLite copies of the current -** page cache implementation into that object.)^
-** -** [[SQLITE_CONFIG_LOG]]
SQLITE_CONFIG_LOG
-**
The SQLITE_CONFIG_LOG option is used to configure the SQLite -** global [error log]. -** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a -** function with a call signature of void(*)(void*,int,const char*), -** and a pointer to void. ^If the function pointer is not NULL, it is -** invoked by [sqlite3_log()] to process each logging event. ^If the -** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. -** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is -** passed through as the first parameter to the application-defined logger -** function whenever that function is invoked. ^The second parameter to -** the logger function is a copy of the first parameter to the corresponding -** [sqlite3_log()] call and is intended to be a [result code] or an -** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. -** The SQLite logging interface is not reentrant; the logger function -** supplied by the application must not invoke any SQLite interface. -** In a multi-threaded application, the application-defined logger -** function must be threadsafe.
-** -** [[SQLITE_CONFIG_URI]]
SQLITE_CONFIG_URI -**
This option takes a single argument of type int. If non-zero, then -** URI handling is globally enabled. If the parameter is zero, then URI handling -** is globally disabled. If URI handling is globally enabled, all filenames -** passed to [sqlite3_open()], [sqlite3_open_v2()], [sqlite3_open16()] or -** specified as part of [ATTACH] commands are interpreted as URIs, regardless -** of whether or not the [SQLITE_OPEN_URI] flag is set when the database -** connection is opened. If it is globally disabled, filenames are -** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the -** database connection is opened. By default, URI handling is globally -** disabled. The default value may be changed by compiling with the -** [SQLITE_USE_URI] symbol defined. -** -** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
SQLITE_CONFIG_COVERING_INDEX_SCAN -**
This option takes a single integer argument which is interpreted as -** a boolean in order to enable or disable the use of covering indices for -** full table scans in the query optimizer. The default setting is determined -** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" -** if that compile-time option is omitted. -** The ability to disable the use of covering indices for full table scans -** is because some incorrectly coded legacy applications might malfunction -** malfunction when the optimization is enabled. Providing the ability to -** disable the optimization allows the older, buggy application code to work -** without change even with newer versions of SQLite. -** -** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] -**
SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE -**
These options are obsolete and should not be used by new code. -** They are retained for backwards compatibility but are now no-ops. -**
-** -** [[SQLITE_CONFIG_SQLLOG]] -**
SQLITE_CONFIG_SQLLOG -**
This option is only available if sqlite is compiled with the -** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should -** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). -** The second should be of type (void*). The callback is invoked by the library -** in three separate circumstances, identified by the value passed as the -** fourth parameter. If the fourth parameter is 0, then the database connection -** passed as the second argument has just been opened. The third argument -** points to a buffer containing the name of the main database file. If the -** fourth parameter is 1, then the SQL statement that the third parameter -** points to has just been executed. Or, if the fourth parameter is 2, then -** the connection being passed as the second parameter is being closed. The -** third parameter is passed NULL In this case. An example of using this -** configuration option can be seen in the "test_sqllog.c" source file in -** the canonical SQLite source tree.
-** -** [[SQLITE_CONFIG_MMAP_SIZE]] -**
SQLITE_CONFIG_MMAP_SIZE -**
SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values -** that are the default mmap size limit (the default setting for -** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. -** The default setting can be overridden by each database connection using -** either the [PRAGMA mmap_size] command, or by using the -** [SQLITE_FCNTL_MMAP_SIZE] file control. The maximum allowed mmap size -** cannot be changed at run-time. Nor may the maximum allowed mmap size -** exceed the compile-time maximum mmap size set by the -** [SQLITE_MAX_MMAP_SIZE] compile-time option. -** If either argument to this option is negative, then that argument is -** changed to its compile-time default. -**
-*/ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* no-op */ -#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ -#define SQLITE_CONFIG_URI 17 /* int */ -#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ -#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ -#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ - -/* -** CAPI3REF: Database Connection Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. ^The [sqlite3_db_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-**
SQLITE_DBCONFIG_LOOKASIDE
-**
^This option takes three additional arguments that determine the -** [lookaside memory allocator] configuration for the [database connection]. -** ^The first argument (the third parameter to [sqlite3_db_config()] is a -** pointer to a memory buffer to use for lookaside memory. -** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb -** may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the -** size of each lookaside buffer slot. ^The third argument is the number of -** slots. The size of the buffer in the first argument must be greater than -** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. ^If the second argument to -** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally -** rounded down to the next smaller multiple of 8. ^(The lookaside memory -** configuration for a database connection can only be changed when that -** connection is not currently using lookaside memory, or in other words -** when the "current value" returned by -** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. -** Any attempt to change the lookaside memory configuration when lookaside -** memory is in use leaves the configuration unchanged and returns -** [SQLITE_BUSY].)^
-** -**
SQLITE_DBCONFIG_ENABLE_FKEY
-**
^This option is used to enable or disable the enforcement of -** [foreign key constraints]. There should be two additional arguments. -** The first argument is an integer which is 0 to disable FK enforcement, -** positive to enable FK enforcement or negative to leave FK enforcement -** unchanged. The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether FK enforcement is off or on -** following this call. The second parameter may be a NULL pointer, in -** which case the FK enforcement setting is not reported back.
-** -**
SQLITE_DBCONFIG_ENABLE_TRIGGER
-**
^This option is used to enable or disable [CREATE TRIGGER | triggers]. -** There should be two additional arguments. -** The first argument is an integer which is 0 to disable triggers, -** positive to enable triggers or negative to leave the setting unchanged. -** The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether triggers are disabled or enabled -** following this call. The second parameter may be a NULL pointer, in -** which case the trigger setting is not reported back.
-** -**
-*/ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ -#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ -#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ - - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes -** -** ^The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. ^The extended result -** codes are disabled by default for historical compatibility. -*/ -SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid -** -** ^Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. ^The rowid is always available -** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. ^If -** the table has a column of type [INTEGER PRIMARY KEY] then that column -** is another alias for the rowid. -** -** ^This routine returns the [rowid] of the most recent -** successful [INSERT] into the database from the [database connection] -** in the first argument. ^As of SQLite version 3.7.7, this routines -** records the last insert rowid of both ordinary tables and [virtual tables]. -** ^If no successful [INSERT]s -** have ever occurred on that database connection, zero is returned. -** -** ^(If an [INSERT] occurs within a trigger or within a [virtual table] -** method, then this routine will return the [rowid] of the inserted -** row as long as the trigger or virtual table method is running. -** But once the trigger or virtual table method ends, the value returned -** by this routine reverts to what it was before the trigger or virtual -** table method began.)^ -** -** ^An [INSERT] that fails due to a constraint violation is not a -** successful [INSERT] and does not change the value returned by this -** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, -** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. ^(When INSERT OR REPLACE -** encounters a constraint violation, it does not fail. The -** INSERT continues to completion after deleting rows that caused -** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface.)^ -** -** ^For the purposes of this routine, an [INSERT] is considered to -** be successful even if it is subsequently rolled back. -** -** This function is accessible to SQL statements via the -** [last_insert_rowid() SQL function]. -** -** If a separate thread performs a new [INSERT] on the same -** database connection while the [sqlite3_last_insert_rowid()] -** function is running and thus changes the last insert [rowid], -** then the value returned by [sqlite3_last_insert_rowid()] is -** unpredictable and might not equal either the old or the new -** last insert [rowid]. -*/ -SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified -** -** ^This function returns the number of database rows that were changed -** or inserted or deleted by the most recently completed SQL statement -** on the [database connection] specified by the first parameter. -** ^(Only changes that are directly specified by the [INSERT], [UPDATE], -** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted.)^ Use the -** [sqlite3_total_changes()] function to find the total number of changes -** including changes caused by triggers and foreign key actions. -** -** ^Changes to a view that are simulated by an [INSTEAD OF trigger] -** are not counted. Only real table changes are counted. -** -** ^(A "row change" is a change to a single row of a single table -** caused by an INSERT, DELETE, or UPDATE statement. Rows that -** are changed as side effects of [REPLACE] constraint resolution, -** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes.)^ -** -** A "trigger context" is a scope of execution that begins and -** ends with the script of a [CREATE TRIGGER | trigger]. -** Most SQL statements are -** evaluated outside of any trigger. This is the "top level" -** trigger context. If a trigger fires from the top level, a -** new trigger context is entered for the duration of that one -** trigger. Subtriggers create subcontexts for their duration. -** -** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does -** not create a new trigger context. -** -** ^This function returns the number of direct row changes in the -** most recent INSERT, UPDATE, or DELETE statement within the same -** trigger context. -** -** ^Thus, when called from the top level, this function returns the -** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. ^(Within the body of a trigger, -** the sqlite3_changes() interface can be called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the same trigger. -** However, the number returned does not include changes -** caused by subtriggers since those have their own context.)^ -** -** See also the [sqlite3_total_changes()] interface, the -** [count_changes pragma], and the [changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_changes()] is running then the value returned -** is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified -** -** ^This function returns the number of row changes caused by [INSERT], -** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** ^(The count returned by sqlite3_total_changes() includes all changes -** from all [CREATE TRIGGER | trigger] contexts and changes made by -** [foreign key actions]. However, -** the count does not include changes used to implement [REPLACE] constraints, -** do rollbacks or ABORT processing, or [DROP TABLE] processing. The -** count does not include rows of views that fire an [INSTEAD OF trigger], -** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted.)^ -** ^The sqlite3_total_changes() function counts the changes as soon as -** the statement that makes them is completed (when the statement handle -** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface, the -** [count_changes pragma], and the [total_changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_total_changes()] is running then the value -** returned is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query -** -** ^This function causes any pending database operation to abort and -** return at its earliest opportunity. This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** ^It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. But it -** is not safe to call this routine with a [database connection] that -** is closed or might close before sqlite3_interrupt() returns. -** -** ^If an SQL operation is very nearly finished at the time when -** sqlite3_interrupt() is called, then it might not have an opportunity -** to be interrupted and might continue to completion. -** -** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE -** that is inside an explicit transaction, then the entire transaction -** will be rolled back automatically. -** -** ^The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. ^Any new SQL statements -** that are started after the sqlite3_interrupt() call and before the -** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. ^New SQL statements -** that are started after the running statement count reaches zero are -** not effected by the sqlite3_interrupt(). -** ^A call to sqlite3_interrupt(D) that occurs when there are no running -** SQL statements is a no-op and has no effect on SQL statements -** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. -*/ -SQLITE_API void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete -** -** These routines are useful during command-line input to determine if the -** currently entered text seems to form a complete SQL statement or -** if additional input is needed before sending the text into -** SQLite for parsing. ^These routines return 1 if the input string -** appears to be a complete SQL statement. ^A statement is judged to be -** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within -** string literals or quoted identifier names or comments are not -** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. ^Whitespace -** and comments that follow the final semicolon are ignored. -** -** ^These routines return 0 if the statement is incomplete. ^If a -** memory allocation fails, then SQLITE_NOMEM is returned. -** -** ^These routines do not parse the SQL statements thus -** will not detect syntactically incorrect SQL. -** -** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior -** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked -** automatically by sqlite3_complete16(). If that initialization fails, -** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete.)^ -** -** The input to [sqlite3_complete()] must be a zero-terminated -** UTF-8 string. -** -** The input to [sqlite3_complete16()] must be a zero-terminated -** UTF-16 string in native byte order. -*/ -SQLITE_API int sqlite3_complete(const char *sql); -SQLITE_API int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors -** -** ^This routine sets a callback function that might be invoked whenever -** an attempt is made to open a database table that another thread -** or process has locked. -** -** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. ^If the busy callback -** is not NULL, then the callback might be invoked with two arguments. -** -** ^The first argument to the busy handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). ^The second argument to -** the busy handler callback is the number of times that the busy handler has -** been invoked for this locking event. ^If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** ^If the callback returns non-zero, then another attempt -** is made to open the database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. ^If SQLite determines that invoking the busy -** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] -** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** ^The default busy callback is NULL. -** -** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] -** when SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. ^If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion -** forces an automatic rollback of the changes. See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** ^(There can only be a single busy handler defined for each -** [database connection]. Setting a new busy handler clears any -** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] -** will also set or clear the busy handler. -** -** The busy callback should not take any actions which modify the -** database connection that invoked the busy handler. Any such actions -** result in undefined behavior. -** -** A busy handler must not close the database connection -** or [prepared statement] that invoked the busy handler. -*/ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout -** -** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. ^The handler -** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. ^After at least "ms" milliseconds of sleeping, -** the handler returns 0 which causes [sqlite3_step()] to return -** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** ^Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** ^(There can only be a single busy handler for a particular -** [database connection] any any given moment. If another busy handler -** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared.)^ -*/ -SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries -** -** This is a legacy interface that is preserved for backwards compatibility. -** Use of this interface is not recommended. -** -** Definition: A result table is memory data structure created by the -** [sqlite3_get_table()] interface. A result table records the -** complete query results from one or more queries. -** -** The table conceptually has a number of rows and columns. But -** these numbers are not part of the result table itself. These -** numbers are obtained separately. Let N be the number of rows -** and M be the number of columns. -** -** A result table is an array of pointers to zero-terminated UTF-8 strings. -** There are (N+1)*M elements in the array. The first M pointers point -** to zero-terminated strings that contain the names of the columns. -** The remaining entries all point to query results. NULL values result -** in NULL pointers. All other values are in their UTF-8 zero-terminated -** string representation as returned by [sqlite3_column_text()]. -** -** A result table might consist of one or more memory allocations. -** It is not safe to pass a result table directly to [sqlite3_free()]. -** A result table should be deallocated using [sqlite3_free_table()]. -** -** ^(As an example of the result table format, suppose a query result -** is as follows: -** -**
-**        Name        | Age
-**        -----------------------
-**        Alice       | 43
-**        Bob         | 28
-**        Cindy       | 21
-** 
-** -** There are two column (M==2) and three rows (N==3). Thus the -** result table has 8 entries. Suppose the result table is stored -** in an array names azResult. Then azResult holds this content: -** -**
-**        azResult[0] = "Name";
-**        azResult[1] = "Age";
-**        azResult[2] = "Alice";
-**        azResult[3] = "43";
-**        azResult[4] = "Bob";
-**        azResult[5] = "28";
-**        azResult[6] = "Cindy";
-**        azResult[7] = "21";
-** 
)^ -** -** ^The sqlite3_get_table() function evaluates one or more -** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter and returns a result table to the -** pointer given in its 3rd parameter. -** -** After the application has finished with the result from sqlite3_get_table(), -** it must pass the result table pointer to sqlite3_free_table() in order to -** release the memory that was malloced. Because of the way the -** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling -** function must not try to call [sqlite3_free()] directly. Only -** [sqlite3_free_table()] is able to release the memory properly and safely. -** -** The sqlite3_get_table() interface is implemented as a wrapper around -** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access -** to any internal data structures of SQLite. It uses only the public -** interface defined here. As a consequence, errors that occur in the -** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or -** [sqlite3_errmsg()]. -*/ -SQLITE_API int sqlite3_get_table( - sqlite3 *db, /* An open database */ - const char *zSql, /* SQL to be evaluated */ - char ***pazResult, /* Results of the query */ - int *pnRow, /* Number of result rows written here */ - int *pnColumn, /* Number of result columns written here */ - char **pzErrmsg /* Error msg written here */ -); -SQLITE_API void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions -** -** These routines are work-alikes of the "printf()" family of functions -** from the standard C library. -** -** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** The strings returned by these two routines should be -** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf().)^ This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. ^(Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer.)^ We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** ^As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. ^The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. So the longest string that can be completely -** written will be n-1 characters. -** -** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a nul-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -**
-**  char *zText = "It's a happy day!";
-** 
-** -** One can use this text in an SQL statement as follows: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
-**  INSERT INTO table1 VALUES('It''s a happy day!')
-** 
-** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
-**  INSERT INTO table1 VALUES('It's a happy day!');
-** 
-** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ -*/ -SQLITE_API char *sqlite3_mprintf(const char*,...); -SQLITE_API char *sqlite3_vmprintf(const char*, va_list); -SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); -SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); - -/* -** CAPI3REF: Memory Allocation Subsystem -** -** The SQLite core uses these three routines for all of its own -** internal memory allocation needs. "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The -** Windows VFS uses native malloc() and free() for some operations. -** -** ^The sqlite3_malloc() routine returns a pointer to a block -** of memory at least N bytes in length, where N is the parameter. -** ^If sqlite3_malloc() is unable to obtain sufficient free -** memory, it returns a NULL pointer. ^If the parameter N to -** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns -** a NULL pointer. -** -** ^Calling sqlite3_free() with a pointer previously returned -** by sqlite3_malloc() or sqlite3_realloc() releases that memory so -** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer -** to sqlite3_free() is harmless. After being freed, memory -** should neither be read nor written. Even reading previously freed -** memory might result in a segmentation fault or other severe error. -** Memory corruption, a segmentation fault, or other severe error -** might result if sqlite3_free() is called with a non-NULL pointer that -** was not obtained from sqlite3_malloc() or sqlite3_realloc(). -** -** ^(The sqlite3_realloc() interface attempts to resize a -** prior memory allocation to be at least N bytes, where N is the -** second parameter. The memory allocation to be resized is the first -** parameter.)^ ^ If the first parameter to sqlite3_realloc() -** is a NULL pointer then its behavior is identical to calling -** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). -** ^If the second parameter to sqlite3_realloc() is zero or -** negative then the behavior is exactly the same as calling -** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). -** ^sqlite3_realloc() returns a pointer to a memory allocation -** of at least N bytes in size or NULL if sufficient memory is unavailable. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned -** by sqlite3_realloc() and the prior allocation is freed. -** ^If sqlite3_realloc() returns NULL, then the prior allocation -** is not freed. -** -** ^The memory returned by sqlite3_malloc() and sqlite3_realloc() -** is always aligned to at least an 8 byte boundary, or to a -** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time -** option is used. -** -** In SQLite version 3.5.0 and 3.5.1, it was possible to define -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in -** implementation of these routines to be omitted. That capability -** is no longer provided. Only built-in memory allocators can be used. -** -** Prior to SQLite version 3.7.10, the Windows OS interface layer called -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular Windows -** installation. Memory allocation errors were detected, but -** they were reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -** -** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] -** must be either NULL or else pointers obtained from a prior -** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have -** not yet been released. -** -** The application must not read or write any part of -** a block of memory after it has been released using -** [sqlite3_free()] or [sqlite3_realloc()]. -*/ -SQLITE_API void *sqlite3_malloc(int); -SQLITE_API void *sqlite3_realloc(void*, int); -SQLITE_API void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics -** -** SQLite provides these two interfaces for reporting on the status -** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] -** routines, which form the built-in memory allocation subsystem. -** -** ^The [sqlite3_memory_used()] routine returns the number of bytes -** of memory currently outstanding (malloced but not freed). -** ^The [sqlite3_memory_highwater()] routine returns the maximum -** value of [sqlite3_memory_used()] since the high-water mark -** was last reset. ^The values returned by [sqlite3_memory_used()] and -** [sqlite3_memory_highwater()] include any overhead -** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library -** routines that [sqlite3_malloc()] may call. -** -** ^The memory high-water mark is reset to the current value of -** [sqlite3_memory_used()] if and only if the parameter to -** [sqlite3_memory_highwater()] is true. ^The value returned -** by [sqlite3_memory_highwater(1)] is the high-water mark -** prior to the reset. -*/ -SQLITE_API sqlite3_int64 sqlite3_memory_used(void); -SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Pseudo-Random Number Generator -** -** SQLite contains a high-quality pseudo-random number generator (PRNG) used to -** select random [ROWID | ROWIDs] when inserting new records into a table that -** already uses the largest possible [ROWID]. The PRNG is also used for -** the build-in random() and randomblob() SQL functions. This interface allows -** applications to access the same PRNG for other purposes. -** -** ^A call to this routine stores N bytes of randomness into buffer P. -** -** ^The first time this routine is invoked (either internally or by -** the application) the PRNG is seeded using randomness obtained -** from the xRandomness method of the default [sqlite3_vfs] object. -** ^On all subsequent invocations, the pseudo-randomness is generated -** internally and without recourse to the [sqlite3_vfs] xRandomness -** method. -*/ -SQLITE_API void sqlite3_randomness(int N, void *P); - -/* -** CAPI3REF: Compile-Time Authorization Callbacks -** -** ^This routine registers an authorizer callback with a particular -** [database connection], supplied in the first argument. -** ^The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. ^The authorizer callback should -** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. ^If the authorizer callback returns -** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] -** then the [sqlite3_prepare_v2()] or equivalent call that triggered -** the authorizer will fail with an error message. -** -** When the callback returns [SQLITE_OK], that means the operation -** requested is ok. ^When the callback returns [SQLITE_DENY], the -** [sqlite3_prepare_v2()] or equivalent call that triggered the -** authorizer will fail with an error message explaining that -** access is denied. -** -** ^The first parameter to the authorizer callback is a copy of the third -** parameter to the sqlite3_set_authorizer() interface. ^The second parameter -** to the callback is an integer [SQLITE_COPY | action code] that specifies -** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. -** -** ^If the action code is [SQLITE_READ] -** and the callback returns [SQLITE_IGNORE] then the -** [prepared statement] statement is constructed to substitute -** a NULL value in place of the table column that would have -** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] -** return can be used to deny an untrusted user access to individual -** columns of a table. -** ^If the action code is [SQLITE_DELETE] and the callback returns -** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the -** [truncate optimization] is disabled and all rows are deleted individually. -** -** An authorizer is used when [sqlite3_prepare | preparing] -** SQL statements from an untrusted source, to ensure that the SQL statements -** do not try to access data they are not allowed to see, or that they do not -** try to execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being [sqlite3_prepare | prepared] that -** disallows everything except [SELECT] statements. -** -** Applications that need to process SQL from untrusted sources -** might also consider lowering resource limits using [sqlite3_limit()] -** and limiting database size using the [max_page_count] [PRAGMA] -** in addition to using an authorizer. -** -** ^(Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call.)^ ^Disable the authorizer by installing a NULL callback. -** The authorizer is disabled by default. -** -** The authorizer callback must not do anything that will modify -** the database connection that invoked the authorizer callback. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the -** statement might be re-prepared during [sqlite3_step()] due to a -** schema change. Hence, the application should ensure that the -** correct authorizer callback remains in place during the [sqlite3_step()]. -** -** ^Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. Authorization is not -** performed during statement evaluation in [sqlite3_step()], unless -** as stated in the previous paragraph, sqlite3_step() invokes -** sqlite3_prepare_v2() to reprepare a statement after a schema change. -*/ -SQLITE_API int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -** -** Note that SQLITE_IGNORE is also used as a [SQLITE_ROLLBACK | return code] -** from the [sqlite3_vtab_on_conflict()] interface. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorize certain SQL statement actions. The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. -** -** These action code values signify what kind of operation is to be -** authorized. The 3rd and 4th parameters to the authorization -** callback function will be parameters or NULL depending on which of these -** codes is used as the second parameter. ^(The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* Operation NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* NULL Function Name */ -#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** -** ^The callback function registered by sqlite3_trace() is invoked at -** various times when an SQL statement is being run by [sqlite3_step()]. -** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the -** SQL statement text as the statement first begins executing. -** ^(Additional sqlite3_trace() callbacks might occur -** as each triggered subprogram is entered. The callbacks for triggers -** contain a UTF-8 SQL comment that identifies the trigger.)^ -** -** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit -** the length of [bound parameter] expansion in the output of sqlite3_trace(). -** -** ^The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes. ^The profile callback contains -** the original statement text and an estimate of wall-clock time -** of how long that statement took to run. ^The profile callback -** time is in units of nanoseconds, however the current implementation -** is only capable of millisecond resolution so the six least significant -** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. -*/ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks -** -** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback -** function X to be invoked periodically during long running calls to -** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for -** database connection D. An example use for this -** interface is to keep a GUI updated during a large query. -** -** ^The parameter P is passed through as the only parameter to the -** callback function X. ^The parameter N is the number of -** [virtual machine instructions] that are evaluated between successive -** invocations of the callback X. -** -** ^Only a single progress handler may be defined at one time per -** [database connection]; setting a new progress handler cancels the -** old one. ^Setting parameter X to NULL disables the progress handler. -** ^The progress handler is also disabled by setting N to a value less -** than 1. -** -** ^If the progress callback returns non-zero, the operation is -** interrupted. This feature can be used to implement a -** "Cancel" button on a GUI progress dialog box. -** -** The progress handler callback must not do anything that will modify -** the database connection that invoked the progress handler. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -*/ -SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection -** -** ^These routines open an SQLite database file as specified by the -** filename argument. ^The filename argument is interpreted as UTF-8 for -** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte -** order for sqlite3_open16(). ^(A [database connection] handle is usually -** returned in *ppDb, even if an error occurs. The only exception is that -** if SQLite is unable to allocate memory to hold the [sqlite3] object, -** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] -** object.)^ ^(If the database is opened (and/or created) successfully, then -** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error following a failure of any -** of the sqlite3_open() routines. -** -** ^The default encoding for the database will be UTF-8 if -** sqlite3_open() or sqlite3_open_v2() is called and -** UTF-16 in the native byte order if sqlite3_open16() is used. -** -** Whether or not an error occurs when it is opened, resources -** associated with the [database connection] handle should be released by -** passing it to [sqlite3_close()] when it is no longer required. -** -** The sqlite3_open_v2() interface works like sqlite3_open() -** except that it accepts two additional parameters for additional control -** over the new database connection. ^(The flags parameter to -** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ -** -**
-** ^(
[SQLITE_OPEN_READONLY]
-**
The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE]
-**
The database is opened for reading and writing if possible, or reading -** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
-**
The database is opened for reading and writing, and is created if -** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
)^ -**
-** -** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above optionally combined with other -** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] -** then the behavior is undefined. -** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** -** ^The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. ^If the fourth parameter is -** a NULL pointer then the default [sqlite3_vfs] object is used. -** -** ^If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. ^This in-memory database will vanish when -** the database connection is closed. Future versions of SQLite might -** make use of additional special filenames that begin with the ":" character. -** It is recommended that when a database filename actually does begin with -** a ":" character you should prefix the filename with a pathname such as -** "./" to avoid ambiguity. -** -** ^If the filename is an empty string, then a private, temporary -** on-disk database will be created. ^This private database will be -** automatically deleted as soon as the database connection is closed. -** -** [[URI filenames in sqlite3_open()]]

URI Filenames

-** -** ^If [URI filename] interpretation is enabled, and the filename argument -** begins with "file:", then the filename is interpreted as a URI. ^URI -** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is -** set in the fourth argument to sqlite3_open_v2(), or if it has -** been enabled globally using the [SQLITE_CONFIG_URI] option with the -** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. -** As of SQLite version 3.7.7, URI filename interpretation is turned off -** by default, but future releases of SQLite might enable URI filename -** interpretation by default. See "[URI filenames]" for additional -** information. -** -** URI filenames are parsed according to RFC 3986. ^If the URI contains an -** authority, then it must be either an empty string or the string -** "localhost". ^If the authority is not an empty string or "localhost", an -** error is returned to the caller. ^The fragment component of a URI, if -** present, is ignored. -** -** ^SQLite uses the path component of the URI as the name of the disk file -** which contains the database. ^If the path begins with a '/' character, -** then it is interpreted as an absolute path. ^If the path does not begin -** with a '/' (meaning that the authority section is omitted from the URI) -** then the path is interpreted as a relative path. -** ^On windows, the first component of an absolute path -** is a drive specification (e.g. "C:"). -** -** [[core URI query parameters]] -** The query component of a URI may contain parameters that are interpreted -** either by SQLite itself, or by a [VFS | custom VFS implementation]. -** SQLite interprets the following three query parameters: -** -**
    -**
  • vfs: ^The "vfs" parameter may be used to specify the name of -** a VFS object that provides the operating system interface that should -** be used to access the database file on disk. ^If this option is set to -** an empty string the default VFS object is used. ^Specifying an unknown -** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is -** present, then the VFS specified by the option takes precedence over -** the value passed as the fourth parameter to sqlite3_open_v2(). -** -**
  • mode: ^(The mode parameter may be set to either "ro", "rw", -** "rwc", or "memory". Attempting to set it to any other value is -** an error)^. -** ^If "ro" is specified, then the database is opened for read-only -** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the -** third argument to sqlite3_open_v2(). ^If the mode option is set to -** "rw", then the database is opened for read-write (but not create) -** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had -** been set. ^Value "rwc" is equivalent to setting both -** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is -** set to "memory" then a pure [in-memory database] that never reads -** or writes from disk is used. ^It is an error to specify a value for -** the mode parameter that is less restrictive than that specified by -** the flags passed in the third parameter to sqlite3_open_v2(). -** -**
  • cache: ^The cache parameter may be set to either "shared" or -** "private". ^Setting it to "shared" is equivalent to setting the -** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to -** sqlite3_open_v2(). ^Setting the cache parameter to "private" is -** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. -** ^If sqlite3_open_v2() is used and the "cache" parameter is present in -** a URI filename, its value overrides any behavior requested by setting -** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. -**
-** -** ^Specifying an unknown parameter in the query component of a URI is not an -** error. Future versions of SQLite might understand additional query -** parameters. See "[query parameters with special meaning to SQLite]" for -** additional information. -** -** [[URI filename examples]]

URI filename examples

-** -** -**
URI filenames Results -**
file:data.db -** Open the file "data.db" in the current directory. -**
file:/home/fred/data.db
-** file:///home/fred/data.db
-** file://localhost/home/fred/data.db
-** Open the database file "/home/fred/data.db". -**
file://darkstar/home/fred/data.db -** An error. "darkstar" is not a recognized authority. -**
-** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db -** Windows only: Open the file "data.db" on fred's desktop on drive -** C:. Note that the %20 escaping in this example is not strictly -** necessary - space characters can be used literally -** in URI filenames. -**
file:data.db?mode=ro&cache=private -** Open file "data.db" in the current directory for read-only access. -** Regardless of whether or not shared-cache mode is enabled by -** default, use a private cache. -**
file:/home/fred/data.db?vfs=unix-nolock -** Open file "/home/fred/data.db". Use the special VFS "unix-nolock". -**
file:data.db?mode=readonly -** An error. "readonly" is not a valid option for the "mode" parameter. -**
-** -** ^URI hexadecimal escape sequences (%HH) are supported within the path and -** query components of a URI. A hexadecimal escape sequence consists of a -** percent sign - "%" - followed by exactly two hexadecimal digits -** specifying an octet value. ^Before the path or query components of a -** URI filename are interpreted, they are encoded using UTF-8 and all -** hexadecimal escape sequences replaced by a single byte containing the -** corresponding octet. If this process generates an invalid UTF-8 encoding, -** the results are undefined. -** -** Note to Windows users: The encoding used for the filename argument -** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** sqlite3_open() or sqlite3_open_v2(). -** -** Note to Windows Runtime users: The temporary directory must be set -** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various -** features that require the use of temporary files may fail. -** -** See also: [sqlite3_temp_directory] -*/ -SQLITE_API int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Obtain Values For URI Parameters -** -** These are utility routines, useful to VFS implementations, that check -** to see if a database file was a URI that contained a specific query -** parameter, and if so obtains the value of that query parameter. -** -** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation when the flags parameter to xOpen() has one or -** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and -** P is the name of the query parameter, then -** sqlite3_uri_parameter(F,P) returns the value of the P -** parameter if it exists or a NULL pointer if P does not appear as a -** query parameter on F. If P is a query parameter of F -** has no explicit value, then sqlite3_uri_parameter(F,P) returns -** a pointer to an empty string. -** -** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean -** parameter and returns true (1) or false (0) according to the value -** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the -** value of query parameter P is one of "yes", "true", or "on" in any -** case or if the value begins with a non-zero number. The -** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of -** query parameter P is one of "no", "false", or "off" in any case or -** if the value begins with a numeric zero. If P is not a query -** parameter on F or if the value of P is does not match any of the -** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). -** -** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a -** 64-bit signed integer and returns that integer, or D if P does not -** exist. If the value of P is something other than an integer, then -** zero is returned. -** -** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and -** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and -** is not a database file pathname pointer that SQLite passed into the xOpen -** VFS method, then the behavior of this routine is undefined and probably -** undesirable. -*/ -SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); -SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); -SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); - - -/* -** CAPI3REF: Error Codes And Messages -** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() -** interface is the same except that it always returns the -** [extended result code] even when extended result codes are -** disabled. -** -** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. -** ^(Memory to hold the error message string is managed internally. -** The application does not need to worry about freeing the result. -** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions.)^ -** -** ^The sqlite3_errstr() interface returns the English-language text -** that describes the [result code], as UTF-8. -** ^(Memory to hold the error message string is managed internally -** and must not be freed by the application)^. -** -** When the serialized [threading mode] is in use, it might be the -** case that a second error occurs on a separate thread in between -** the time of the first error and the call to these interfaces. -** When that happens, the second error will be reported since these -** interfaces always report the most recent result. To avoid -** this, each thread can obtain exclusive use of the [database connection] D -** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning -** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after -** all calls to the interfaces listed here are completed. -** -** If an interface fails with SQLITE_MISUSE, that means the interface -** was invoked incorrectly by the application. In that case, the -** error code and message may or may not be set. -*/ -SQLITE_API int sqlite3_errcode(sqlite3 *db); -SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); -SQLITE_API const char *sqlite3_errmsg(sqlite3*); -SQLITE_API const void *sqlite3_errmsg16(sqlite3*); -SQLITE_API const char *sqlite3_errstr(int); - -/* -** CAPI3REF: SQL Statement Object -** KEYWORDS: {prepared statement} {prepared statements} -** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
    -**
  1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
  2. Bind values to [host parameters] using the sqlite3_bind_*() -** interfaces. -**
  3. Run the SQL by calling [sqlite3_step()] one or more times. -**
  4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
  5. Destroy the object using [sqlite3_finalize()]. -**
-** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Run-time Limits -** -** ^(This interface allows the size of various constructs to be limited -** on a connection by connection basis. The first parameter is the -** [database connection] whose limit is to be set or queried. The -** second parameter is one of the [limit categories] that define a -** class of constructs to be size limited. The third parameter is the -** new limit for that construct.)^ -** -** ^If the new limit is a negative number, the limit is unchanged. -** ^(For each limit category SQLITE_LIMIT_NAME there is a -** [limits | hard upper bound] -** set at compile-time by a C preprocessor macro called -** [limits | SQLITE_MAX_NAME]. -** (The "_LIMIT_" in the name is changed to "_MAX_".))^ -** ^Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper bound. -** -** ^Regardless of whether or not the limit was changed, the -** [sqlite3_limit()] interface returns the prior value of the limit. -** ^Hence, to find the current value of a limit without changing it, -** simply invoke this interface with the third parameter set to -1. -** -** Run-time limits are intended for use in applications that manage -** both their own internal database and also databases that are controlled -** by untrusted external sources. An example application might be a -** web browser that has its own databases for storing history and -** separate databases controlled by JavaScript applications downloaded -** off the Internet. The internal databases can be given the -** large, default limits. Databases managed by external sources can -** be given much smaller limits designed to prevent a denial of service -** attack. Developers might also want to use the [sqlite3_set_authorizer()] -** interface to further control untrusted SQL. The size of the database -** created by an untrusted script can be contained using the -** [max_page_count] [PRAGMA]. -** -** New run-time limit categories may be added in future releases. -*/ -SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); - -/* -** CAPI3REF: Run-Time Limit Categories -** KEYWORDS: {limit category} {*limit categories} -** -** These constants define various performance limits -** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. -** -**
-** [[SQLITE_LIMIT_LENGTH]] ^(
SQLITE_LIMIT_LENGTH
-**
The maximum size of any string or BLOB or table row, in bytes.
)^ -** -** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
SQLITE_LIMIT_SQL_LENGTH
-**
The maximum length of an SQL statement, in bytes.
)^ -** -** [[SQLITE_LIMIT_COLUMN]] ^(
SQLITE_LIMIT_COLUMN
-**
The maximum number of columns in a table definition or in the -** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
)^ -** -** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
SQLITE_LIMIT_EXPR_DEPTH
-**
The maximum depth of the parse tree on any expression.
)^ -** -** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
SQLITE_LIMIT_COMPOUND_SELECT
-**
The maximum number of terms in a compound SELECT statement.
)^ -** -** [[SQLITE_LIMIT_VDBE_OP]] ^(
SQLITE_LIMIT_VDBE_OP
-**
The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.
)^ -** -** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
SQLITE_LIMIT_FUNCTION_ARG
-**
The maximum number of arguments on a function.
)^ -** -** [[SQLITE_LIMIT_ATTACHED]] ^(
SQLITE_LIMIT_ATTACHED
-**
The maximum number of [ATTACH | attached databases].)^
-** -** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] -** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
-**
The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
)^ -** -** [[SQLITE_LIMIT_VARIABLE_NUMBER]] -** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
-**
The maximum index number of any [parameter] in an SQL statement.)^ -** -** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
SQLITE_LIMIT_TRIGGER_DEPTH
-**
The maximum depth of recursion for triggers.
)^ -**
-*/ -#define SQLITE_LIMIT_LENGTH 0 -#define SQLITE_LIMIT_SQL_LENGTH 1 -#define SQLITE_LIMIT_COLUMN 2 -#define SQLITE_LIMIT_EXPR_DEPTH 3 -#define SQLITE_LIMIT_COMPOUND_SELECT 4 -#define SQLITE_LIMIT_VDBE_OP 5 -#define SQLITE_LIMIT_FUNCTION_ARG 6 -#define SQLITE_LIMIT_ATTACHED 7 -#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 -#define SQLITE_LIMIT_VARIABLE_NUMBER 9 -#define SQLITE_LIMIT_TRIGGER_DEPTH 10 - -/* -** CAPI3REF: Compiling An SQL Statement -** KEYWORDS: {SQL statement compiler} -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** The first argument, "db", is a [database connection] obtained from a -** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or -** [sqlite3_open16()]. The database connection must not have been closed. -** -** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. -** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string including -** the nul-terminator bytes as this saves SQLite from having to -** make a copy of the input string. -** -** ^If pzTail is not NULL then *pzTail is made to point to the first byte -** past the end of the first SQL statement in zSql. These routines only -** compile the first statement in zSql, so *pzTail is left pointing to -** what remains uncompiled. -** -** ^*ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set -** to NULL. ^If the input text contains no SQL (if the input is an empty -** string or a comment) then *ppStmt is set to NULL. -** The calling procedure is responsible for deleting the compiled -** SQL statement using [sqlite3_finalize()] after it has finished with it. -** ppStmt may not be NULL. -** -** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; -** otherwise an [error code] is returned. -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. This causes the [sqlite3_step()] interface to -** behave differently in three ways: -** -**
    -**
  1. -** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. As many as [SQLITE_MAX_SCHEMA_RETRY] -** retries will occur before sqlite3_step() gives up and returns an error. -**
  2. -** -**
  3. -** ^When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. ^The legacy behavior was that -** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and the application would have to make a second call to [sqlite3_reset()] -** in order to find the underlying cause of the problem. With the "v2" prepare -** interfaces, the underlying reason for the error is returned immediately. -**
  4. -** -**
  5. -** ^If the specific value bound to [parameter | host parameter] in the -** WHERE clause might influence the choice of query plan for a statement, -** then the statement will be automatically recompiled, as if there had been -** a schema change, on the first [sqlite3_step()] call following any change -** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the -** choice of query plan if the parameter is the left-hand side of a [LIKE] -** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. -** the -**
  6. -**
-*/ -SQLITE_API int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPI3REF: Retrieving Statement SQL -** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -*/ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If An SQL Statement Writes The Database -** -** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if -** and only if the [prepared statement] X makes no direct changes to -** the content of the database file. -** -** Note that [application-defined SQL functions] or -** [virtual tables] might change the database indirectly as a side effect. -** ^(For example, if an application defines a function "eval()" that -** calls [sqlite3_exec()], then the following SQL statement would -** change the database file through side-effects: -** -**
-**    SELECT eval('DELETE FROM t1') FROM t2;
-** 
-** -** But because the [SELECT] statement does not change the database file -** directly, sqlite3_stmt_readonly() would still return true.)^ -** -** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], -** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, -** since the statements themselves do not actually modify the database but -** rather they control the timing of when other statements modify the -** database. ^The [ATTACH] and [DETACH] statements also cause -** sqlite3_stmt_readonly() to return true since, while those statements -** change the configuration of a database connection, they do not make -** changes to the content of the database files on disk. -*/ -SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If A Prepared Statement Has Been Reset -** -** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the -** [prepared statement] S has been stepped at least once using -** [sqlite3_step(S)] but has not run to completion and/or has not -** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) -** interface returns false if S is a NULL pointer. If S is not a -** NULL pointer and is not a pointer to a valid [prepared statement] -** object, then the behavior is undefined and probably undesirable. -** -** This interface can be used in combination [sqlite3_next_stmt()] -** to locate all prepared statements associated with a database -** connection that are in need of being reset. This can be used, -** for example, in diagnostic routines to search for prepared -** statements that are holding a transaction open. -*/ -SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); - -/* -** CAPI3REF: Dynamically Typed Value Object -** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} -** -** SQLite uses the sqlite3_value object to represent all values -** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. ^Values stored in sqlite3_value objects -** can be integers, floating point values, strings, BLOBs, or NULL. -** -** An sqlite3_value object may be either "protected" or "unprotected". -** Some interfaces require a protected sqlite3_value. Other interfaces -** will accept either a protected or an unprotected sqlite3_value. -** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. -** -** The terms "protected" and "unprotected" refer to whether or not -** a mutex is held. An internal mutex is held for a protected -** sqlite3_value object but no mutex is held for an unprotected -** sqlite3_value object. If SQLite is compiled to be single-threaded -** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) -** or if SQLite is run in one of reduced mutex modes -** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] -** then there is no distinction between protected and unprotected -** sqlite3_value objects and they can be used interchangeably. However, -** for maximum code portability it is recommended that applications -** still make the distinction between protected and unprotected -** sqlite3_value objects even when not strictly required. -** -** ^The sqlite3_value objects that are passed as parameters into the -** implementation of [application-defined SQL functions] are protected. -** ^The sqlite3_value object returned by -** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. -** The [sqlite3_value_blob | sqlite3_value_type()] family of -** interfaces require protected sqlite3_value objects. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. -** The application-defined SQL function implementation will pass this -** pointer through into calls to [sqlite3_result_int | sqlite3_result()], -** [sqlite3_aggregate_context()], [sqlite3_user_data()], -** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], -** and/or [sqlite3_set_auxdata()]. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements -** KEYWORDS: {host parameter} {host parameters} {host parameter name} -** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} -** -** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following -** templates: -** -**
    -**
  • ? -**
  • ?NNN -**
  • :VVV -**
  • @VVV -**
  • $VVV -**
-** -** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifier.)^ ^The values of these -** parameters (also called "host parameter names" or "SQL parameters") -** can be set using the sqlite3_bind_*() routines defined here. -** -** ^The first argument to the sqlite3_bind_*() routines is always -** a pointer to the [sqlite3_stmt] object returned from -** [sqlite3_prepare_v2()] or its variants. -** -** ^The second argument is the index of the SQL parameter to be set. -** ^The leftmost SQL parameter has an index of 1. ^When the same named -** SQL parameter is used more than once, second and subsequent -** occurrences have the same index as the first occurrence. -** ^The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. ^The index -** for "?NNN" parameters is the value of NNN. -** ^The NNN value must be between 1 and the [sqlite3_limit()] -** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). -** -** ^The third argument is the value to bind to the parameter. -** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() -** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter -** is ignored and the end result is the same as sqlite3_bind_null(). -** -** ^(In those routines that have a fourth argument, its value is the -** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters.)^ -** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() -** is negative, then the length of the string is -** the number of bytes up to the first zero terminator. -** If the fourth parameter to sqlite3_bind_blob() is negative, then -** the behavior is undefined. -** If a non-negative fourth parameter is provided to sqlite3_bind_text() -** or sqlite3_bind_text16() then that parameter must be the byte offset -** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occur at byte offsets less than -** the value of the fourth parameter then the resulting string value will -** contain embedded NULs. The result of expressions involving strings -** with embedded NULs is undefined. -** -** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), -** sqlite3_bind_text(), or sqlite3_bind_text16() fails. -** ^If the fifth argument is -** the special value [SQLITE_STATIC], then SQLite assumes that the -** information is in static, unmanaged space and does not need to be freed. -** ^If the fifth argument has the value [SQLITE_TRANSIENT], then -** SQLite makes its own private copy of the data immediately, before -** the sqlite3_bind_*() routine returns. -** -** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. ^A zeroblob uses a fixed amount of memory -** (just an integer to hold its size) while it is being processed. -** Zeroblobs are intended to serve as placeholders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | incremental BLOB I/O] routines. -** ^A negative value for the zeroblob results in a zero-length BLOB. -** -** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer -** for the [prepared statement] or with a prepared statement for which -** [sqlite3_step()] has been called more recently than [sqlite3_reset()], -** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() -** routine is passed a [prepared statement] that has been finalized, the -** result is undefined and probably harmful. -** -** ^Bindings are not cleared by the [sqlite3_reset()] routine. -** ^Unbound parameters are interpreted as NULL. -** -** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an -** [error code] if anything goes wrong. -** ^[SQLITE_RANGE] is returned if the parameter -** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. -** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); -SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); -SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); -SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of SQL Parameters -** -** ^This routine can be used to find the number of [SQL parameters] -** in a [prepared statement]. SQL parameters are tokens of the -** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as -** placeholders for values that are [sqlite3_bind_blob | bound] -** to the parameters at a later time. -** -** ^(This routine actually returns the index of the largest (rightmost) -** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN form are used, -** there may be gaps in the list.)^ -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_name()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter -** -** ^The sqlite3_bind_parameter_name(P,N) interface returns -** the name of the N-th [SQL parameter] in the [prepared statement] P. -** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" -** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" -** respectively. -** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name.)^ -** ^Parameters of the form "?" without a following integer have no name -** and are referred to as "nameless" or "anonymous parameters". -** -** ^The first host parameter has an index of 1, not 0. -** -** ^If the value N is out of range or if the N-th parameter is -** nameless, then NULL is returned. ^The returned string is -** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name -** -** ^Return the index of an SQL parameter given its name. ^The -** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero -** is returned if no matching parameter is found. ^The parameter -** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement -** -** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset -** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** ^Use this routine to reset all host parameters to NULL. -*/ -SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set -** -** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). -** -** See also: [sqlite3_data_count()] -*/ -SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set -** -** ^These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. ^The sqlite3_column_name() -** interface returns a pointer to a zero-terminated UTF-8 string -** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. ^The first parameter is the [prepared statement] -** that implements the [SELECT] statement. ^The second parameter is the -** column number. ^The leftmost column is number 0. -** -** ^The returned string pointer is valid until either the [prepared statement] -** is destroyed by [sqlite3_finalize()] or until the statement is automatically -** reprepared by the first call to [sqlite3_step()] for a particular run -** or until the next call to -** sqlite3_column_name() or sqlite3_column_name16() on the same column. -** -** ^If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -** -** ^The name of a result column is the value of the "AS" clause for -** that column, if there is an AS clause. If there is no AS clause -** then the name of the column is unspecified and may change from -** one release of SQLite to the next. -*/ -SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); -SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result -** -** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in -** [SELECT] statement. -** ^The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. ^The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. -** ^The returned string is valid until the [prepared statement] is destroyed -** using [sqlite3_finalize()] or until the statement is automatically -** reprepared by the first call to [sqlite3_step()] for a particular run -** or until the same information is requested -** again in a different encoding. -** -** ^The names returned are the original un-aliased names of the -** database, table, and column. -** -** ^The first argument to these interfaces is a [prepared statement]. -** ^These functions return information about the Nth result column returned by -** the statement, where N is the second function argument. -** ^The left-most column is column 0 for these routines. -** -** ^If the Nth column returned by the statement is an expression or -** subquery and is not a column value, then all of these functions return -** NULL. ^These routine might also return NULL if a memory allocation error -** occurs. ^Otherwise, they return the name of the attached database, table, -** or column that query result column was extracted from. -** -** ^As with all other SQLite APIs, those whose names end with "16" return -** UTF-16 encoded strings and the other functions return UTF-8. -** -** ^These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. -** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -** -** If two or more threads call one or more -** [sqlite3_column_database_name | column metadata interfaces] -** for the same [prepared statement] and result column -** at the same time then the results are undefined. -*/ -SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result -** -** ^(The first parameter is a [prepared statement]. -** If this statement is a [SELECT] statement and the Nth column of the -** returned result set of that [SELECT] is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned.)^ ^If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** ^The returned string is always UTF-8 encoded. -** -** ^(For example, given the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** and the following statement to be compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0).)^ -** -** ^SQLite uses dynamic run-time typing. ^So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. ^Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement -** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy -** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function -** must be called one or more times to evaluate the statement. -** -** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** ^In the legacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** ^With the "v2" interface, any of the other [result codes] or -** [extended result codes] might be returned as well. -** -** ^[SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. ^If the statement is a [COMMIT] -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a [COMMIT] and occurs within an -** explicit transaction then you should rollback the transaction before -** continuing. -** -** ^[SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] -** is returned each time a new row of data is ready for processing by the -** caller. The values may be accessed using the [column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** ^[SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** ^With the legacy interface, a more specific error code (for example, -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. ^In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** For all versions of SQLite up to and including 3.6.23.1, a call to -** [sqlite3_reset()] was required after sqlite3_step() returned anything -** other than [SQLITE_ROW] before any subsequent invocation of -** sqlite3_step(). Failure to reset the prepared statement using -** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began -** calling [sqlite3_reset()] automatically in this circumstance rather -** than returning [SQLITE_MISUSE]. This is not considered a compatibility -** break because any application that ever receives an SQLITE_MISUSE error -** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option -** can be used to restore the legacy behavior. -** -** Goofy Interface Alert: In the legacy interface, the sqlite3_step() -** API always returns a generic error code, [SQLITE_ERROR], following any -** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call -** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the -** specific [error codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, -** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -SQLITE_API int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: Number of columns in a result set -** -** ^The sqlite3_data_count(P) interface returns the number of columns in the -** current row of the result set of [prepared statement] P. -** ^If prepared statement P does not have results ready to return -** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of -** interfaces) then sqlite3_data_count(P) returns 0. -** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. -** ^The sqlite3_data_count(P) routine returns 0 if the previous call to -** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) -** will return non-zero if previous call to [sqlite3_step](P) returned -** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] -** where it always returns zero since each step of that multi-step -** pragma returns 0 columns of data. -** -** See also: [sqlite3_column_count()] -*/ -SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes -** KEYWORDS: SQLITE_TEXT -** -** ^(Every value in SQLite has one of five fundamental datatypes: -** -**
    -**
  • 64-bit signed integer -**
  • 64-bit IEEE floating point number -**
  • string -**
  • BLOB -**
  • NULL -**
)^ -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Result Values From A Query -** KEYWORDS: {column access functions} -** -** These routines form the "result set" interface. -** -** ^These routines return information about a single column of the current -** result row of a query. ^In every case the first argument is a pointer -** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] -** that was returned from [sqlite3_prepare_v2()] or one of its variants) -** and the second argument is the index of the column for which information -** should be returned. ^The leftmost column of the result set has the index 0. -** ^The number of columns in the result can be determined using -** [sqlite3_column_count()]. -** -** If the SQL statement does not currently point to a valid row, or if the -** column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** ^The sqlite3_column_type() routine returns the -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes() returns zero. -** -** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts -** the string to UTF-16 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes16() uses -** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. -** -** ^The values returned by [sqlite3_column_bytes()] and -** [sqlite3_column_bytes16()] do not include the zero terminators at the end -** of the string. ^For clarity: the values returned by -** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of -** bytes in the string, not the number of characters. -** -** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero-terminated. ^The return -** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. -** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. -** If the [unprotected sqlite3_value] object returned by -** [sqlite3_column_value()] is used in any other way, including calls -** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. -** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. ^(The following table details the conversions -** that are applied: -** -**
-** -**
Internal
Type
Requested
Type
Conversion -** -**
NULL INTEGER Result is 0 -**
NULL FLOAT Result is 0.0 -**
NULL TEXT Result is NULL pointer -**
NULL BLOB Result is NULL pointer -**
INTEGER FLOAT Convert from integer to float -**
INTEGER TEXT ASCII rendering of the integer -**
INTEGER BLOB Same as INTEGER->TEXT -**
FLOAT INTEGER Convert from float to integer -**
FLOAT TEXT ASCII rendering of the float -**
FLOAT BLOB Same as FLOAT->TEXT -**
TEXT INTEGER Use atoi() -**
TEXT FLOAT Use atof() -**
TEXT BLOB No change -**
BLOB INTEGER Convert to TEXT then use atoi() -**
BLOB FLOAT Convert to TEXT then use atof() -**
BLOB TEXT Add a zero terminator if needed -**
-**
)^ -** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
    -**
  • The initial content is a BLOB and sqlite3_column_text() or -** sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.
  • -**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.
  • -**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.
  • -**
-** -** ^Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer references will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometimes they -** are not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
    -**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • -**
-** -** In other words, you should call sqlite3_column_text(), -** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result -** into the desired format, then invoke sqlite3_column_bytes() or -** sqlite3_column_bytes16() to find the size of the result. Do not mix calls -** to sqlite3_column_text() or sqlite3_column_blob() with calls to -** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() -** with calls to sqlite3_column_bytes(). -** -** ^The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** ^(If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM].)^ -*/ -SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object -** -** ^The sqlite3_finalize() function is called to delete a [prepared statement]. -** ^If the most recent evaluation of the statement encountered no errors -** or if the statement is never been evaluated, then sqlite3_finalize() returns -** SQLITE_OK. ^If the most recent evaluation of statement S failed, then -** sqlite3_finalize(S) returns the appropriate [error code] or -** [extended error code]. -** -** ^The sqlite3_finalize(S) routine can be called at any point during -** the life cycle of [prepared statement] S: -** before statement S is ever evaluated, after -** one or more calls to [sqlite3_reset()], or after any call -** to [sqlite3_step()] regardless of whether or not the statement has -** completed execution. -** -** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. -** -** The application must finalize every [prepared statement] in order to avoid -** resource leaks. It is a grievous error for the application to try to use -** a prepared statement after it has been finalized. Any use of a prepared -** statement after it has been finalized can result in undefined and -** undesirable behavior such as segfaults and heap corruption. -*/ -SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object -** -** The sqlite3_reset() function is called to reset a [prepared statement] -** object back to its initial state, ready to be re-executed. -** ^Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -** -** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. -** -** ^The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. -*/ -SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions -** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} -** -** ^These functions (collectively known as "function creation routines") -** are used to add SQL functions or aggregates or to redefine the behavior -** of existing SQL functions or aggregates. The only differences between -** these routines are the text encoding expected for -** the second parameter (the name of the function being created) -** and the presence or absence of a destructor callback for -** the application data pointer. -** -** ^The first parameter is the [database connection] to which the SQL -** function is to be added. ^If an application uses more than one database -** connection then application-defined SQL functions must be added -** to each database connection separately. -** -** ^The second parameter is the name of the SQL function to be created or -** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 -** representation, exclusive of the zero-terminator. ^Note that the name -** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. -** ^Any attempt to create a function with a longer name -** will result in [SQLITE_MISUSE] being returned. -** -** ^The third parameter (nArg) -** is the number of arguments that the SQL function or -** aggregate takes. ^If this parameter is -1, then the SQL function or -** aggregate may take any number of arguments between 0 and the limit -** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third -** parameter is less than -1 or greater than 127 then the behavior is -** undefined. -** -** ^The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Every SQL function implementation must be able to work -** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. ^An application may -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** ^When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what text -** encoding is used, then the fourth argument should be [SQLITE_ANY]. -** -** ^(The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()].)^ -** -** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL function or -** aggregate. ^A scalar SQL function requires an implementation of the xFunc -** callback only; NULL pointers must be passed as the xStep and xFinal -** parameters. ^An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing -** SQL function or aggregate, pass NULL pointers for all three function -** callbacks. -** -** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, -** then it is destructor for the application data pointer. -** The destructor is invoked when the function is deleted, either by being -** overloaded or when the database connection closes.)^ -** ^The destructor is also invoked if the call to -** sqlite3_create_function_v2() fails. -** ^When the destructor callback of the tenth parameter is invoked, it -** is passed a single argument which is a copy of the application data -** pointer which was the fifth parameter to sqlite3_create_function_v2(). -** -** ^It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. ^SQLite will use -** the implementation that most closely matches the way in which the -** SQL function is used. ^A function implementation with a non-negative -** nArg parameter is a better match than a function implementation with -** a negative nArg. ^A function where the preferred text encoding -** matches the database encoding is a better -** match than a function where the encoding is different. -** ^A function where the encoding difference is between UTF16le and UTF16be -** is a closer match than a function where the encoding difference is -** between UTF8 and UTF16. -** -** ^Built-in functions may be overloaded by new application-defined functions. -** -** ^An application-defined function is permitted to call other -** SQLite interfaces. However, such calls must not -** close the database connection nor finalize or reset the prepared -** statement in which the function is running. -*/ -SQLITE_API int sqlite3_create_function( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function16( - sqlite3 *db, - const void *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function_v2( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*), - void(*xDestroy)(void*) -); - -/* -** CAPI3REF: Text Encodings -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Deprecated Functions -** DEPRECATED -** -** These functions are [deprecated]. In order to maintain -** backwards compatibility with older code, these functions continue -** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. -*/ -#ifndef SQLITE_OMIT_DEPRECATED -SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); -SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); -SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), - void*,sqlite3_int64); -#endif - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work only with [protected sqlite3_value] objects. -** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. -** -** ^These routines work just like the corresponding [column access functions] -** except that these routines take a single [protected sqlite3_value] object -** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. -** -** ^The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. ^The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF-16 strings as big-endian and little-endian respectively. -** -** ^(The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in other -** words, if the value is a string that looks like a number) -** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ -** -** Please pay particular attention to the fact that the pointer returned -** from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the [sqlite3_value*] parameters. -*/ -SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); -SQLITE_API double sqlite3_value_double(sqlite3_value*); -SQLITE_API int sqlite3_value_int(sqlite3_value*); -SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); -SQLITE_API int sqlite3_value_type(sqlite3_value*); -SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context -** -** Implementations of aggregate SQL functions use this -** routine to allocate memory for storing their state. -** -** ^The first time the sqlite3_aggregate_context(C,N) routine is called -** for a particular aggregate function, SQLite -** allocates N of memory, zeroes out that memory, and returns a pointer -** to the new memory. ^On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function instance, -** the same buffer is returned. Sqlite3_aggregate_context() is normally -** called once for each invocation of the xStep callback and then one -** last time when the xFinal callback is invoked. ^(When no rows match -** an aggregate query, the xStep() callback of the aggregate function -** implementation is never called and xFinal() is called exactly once. -** In those cases, sqlite3_aggregate_context() might be called for the -** first time from within xFinal().)^ -** -** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer -** when first called if N is less than or equal to zero or if a memory -** allocate error occurs. -** -** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the -** value of N in subsequent call to sqlite3_aggregate_context() within -** the same aggregate function instance will not resize the memory -** allocation.)^ Within the xFinal callback, it is customary to set -** N=0 in calls to sqlite3_aggregate_context(C,N) so that no -** pointless memory allocations occur. -** -** ^SQLite automatically frees the memory allocated by -** sqlite3_aggregate_context() when the aggregate query concludes. -** -** The first parameter must be a copy of the -** [sqlite3_context | SQL function context] that is the first parameter -** to the xStep or xFinal callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions -** -** ^The sqlite3_user_data() interface returns a copy of -** the pointer that was the pUserData parameter (the 5th parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -** -** This routine must be called from the same thread in which -** the application-defined function is running. -*/ -SQLITE_API void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Database Connection For Functions -** -** ^The sqlite3_context_db_handle() interface returns a copy of -** the pointer to the [database connection] (the 1st parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -*/ -SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data -** -** The following two functions may be used by scalar SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. This may -** be used, for example, to add a regular-expression matching scalar -** function. The compiled version of the regular expression is stored as -** metadata associated with the SQL value passed as the regular expression -** pattern. The compiled regular expression can be reused on multiple -** invocations of the same function so that the original pattern string -** does not need to be recompiled on each invocation. -** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If no metadata has been ever -** been set for the Nth argument of the function, or if the corresponding -** function parameter has changed since the meta-data was set, -** then sqlite3_get_auxdata() returns a NULL pointer. -** -** ^The sqlite3_set_auxdata() interface saves the metadata -** pointed to by its 3rd parameter as the metadata for the N-th -** argument of the application-defined function. Subsequent -** calls to sqlite3_get_auxdata() might return this data, if it has -** not been destroyed. -** ^If it is not NULL, SQLite will invoke the destructor -** function given by the 4th parameter to sqlite3_set_auxdata() on -** the metadata when the corresponding function parameter changes -** or when the SQL statement completes, whichever comes first. -** -** SQLite is free to call the destructor and drop metadata on any -** parameter of any function at any time. ^The only guarantee is that -** the destructor will be called before the metadata is dropped. -** -** ^(In practice, metadata is preserved between function calls for -** expressions that are constant at compile time. This includes literal -** values and [parameters].)^ -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); -SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior -** -** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. ^If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. ^The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the [parameter binding] family of -** functions used to bind values to host parameters in prepared statements. -** Refer to the [SQL parameter] documentation for additional information. -** -** ^The sqlite3_result_blob() interface sets the result from -** an application-defined function to be the BLOB whose content is pointed -** to by the second parameter and which is N bytes long where N is the -** third parameter. -** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. -** -** ^The sqlite3_result_double() interface sets the result from -** an application-defined function to be a floating point value specified -** by its 2nd argument. -** -** ^The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. -** ^SQLite uses the string pointed to by the -** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. ^SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. ^SQLite -** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. ^If the third parameter to sqlite3_result_error() -** or sqlite3_result_error16() is negative then SQLite takes as the error -** message all text up through the first zero character. -** ^If the third parameter to sqlite3_result_error() or -** sqlite3_result_error16() is non-negative then SQLite takes that many -** bytes (not characters) from the 2nd parameter as the error message. -** ^The sqlite3_result_error() and sqlite3_result_error16() -** routines make a private copy of the error message text before -** they return. Hence, the calling function can deallocate or -** modify the text after they return without harm. -** ^The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. ^By default, -** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() -** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. -** -** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an -** error indicating that a string or BLOB is too long to represent. -** -** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an -** error indicating that a memory allocation failed. -** -** ^The sqlite3_result_int() interface sets the return value -** of the application-defined function to be the 32-bit signed integer -** value given in the 2nd argument. -** ^The sqlite3_result_int64() interface sets the return value -** of the application-defined function to be the 64-bit signed integer -** value given in the 2nd argument. -** -** ^The sqlite3_result_null() interface sets the return value -** of the application-defined function to be NULL. -** -** ^The sqlite3_result_text(), sqlite3_result_text16(), -** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces -** set the return value of the application-defined function to be -** a text string which is represented as UTF-8, UTF-16 native byte order, -** UTF-16 little endian, or UTF-16 big endian, respectively. -** ^SQLite takes the text result from the application from -** the 2nd parameter of the sqlite3_result_text* interfaces. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is negative, then SQLite takes result text from the 2nd parameter -** through the first zero character. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is non-negative, then as many bytes (not characters) of the text -** pointed to by the 2nd parameter are taken as the application-defined -** function result. If the 3rd parameter is non-negative, then it -** must be the byte offset into the string where the NUL terminator would -** appear if the string where NUL terminated. If any NUL characters occur -** in the string at a byte offset that is less than the value of the 3rd -** parameter, then the resulting string will contain embedded NULs and the -** result of expressions operating on strings with embedded NULs is undefined. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that -** function as the destructor on the text or BLOB result when it has -** finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces or to -** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite -** assumes that the text or BLOB result is in constant space and does not -** copy the content of the parameter nor call a destructor on the content -** when it has finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from -** from [sqlite3_malloc()] before it returns. -** -** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The -** sqlite3_result_value() interface makes a copy of the [sqlite3_value] -** so that the [sqlite3_value] specified in the parameter may change or -** be deallocated after sqlite3_result_value() returns without harm. -** ^A [protected sqlite3_value] object may always be used where an -** [unprotected sqlite3_value] object is required, so either -** kind of [sqlite3_value] object can be used with this interface. -** -** If these routines are called from within the different thread -** than the one containing the application-defined function that received -** the [sqlite3_context] pointer, the results are undefined. -*/ -SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_double(sqlite3_context*, double); -SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); -SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); -SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); -SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); -SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -SQLITE_API void sqlite3_result_null(sqlite3_context*); -SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences -** -** ^These functions add, remove, or modify a [collation] associated -** with the [database connection] specified as the first argument. -** -** ^The name of the collation is a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string in native byte order for sqlite3_create_collation16(). -** ^Collation names that compare equal according to [sqlite3_strnicmp()] are -** considered to be the same name. -** -** ^(The third argument (eTextRep) must be one of the constants: -**
    -**
  • [SQLITE_UTF8], -**
  • [SQLITE_UTF16LE], -**
  • [SQLITE_UTF16BE], -**
  • [SQLITE_UTF16], or -**
  • [SQLITE_UTF16_ALIGNED]. -**
)^ -** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. -** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep -** force strings to be UTF16 with native byte order. -** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin -** on an even byte address. -** -** ^The fourth argument, pArg, is an application data pointer that is passed -** through as the first argument to the collating function callback. -** -** ^The fifth argument, xCallback, is a pointer to the collating function. -** ^Multiple collating functions can be registered using the same name but -** with different eTextRep parameters and SQLite will use whichever -** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is -** deleted. ^When all collating functions having the same name are deleted, -** that collation is no longer usable. -** -** ^The collating function callback is invoked with a copy of the pArg -** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive -** if the first string is less than, equal to, or greater than the second, -** respectively. A collating function must always return the same answer -** given the same inputs. If two or more collating functions are registered -** to the same collation name (using different eTextRep values) then all -** must give an equivalent answer when invoked with equivalent strings. -** The collating function must obey the following properties for all -** strings A, B, and C: -** -**
    -**
  1. If A==B then B==A. -**
  2. If A==B and B==C then A==C. -**
  3. If A<B THEN B>A. -**
  4. If A<B and B<C then A<C. -**
-** -** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite -** is undefined. -** -** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** with the addition that the xDestroy callback is invoked on pArg when -** the collating function is deleted. -** ^Collating functions are deleted when they are overridden by later -** calls to the collation creation functions or when the -** [database connection] is closed using [sqlite3_close()]. -** -** ^The xDestroy callback is not called if the -** sqlite3_create_collation_v2() function fails. Applications that invoke -** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should -** check the return code and dispose of the application data pointer -** themselves rather than expecting SQLite to deal with it for them. -** This is different from every other SQLite interface. The inconsistency -** is unfortunate but cannot be changed without breaking backwards -** compatibility. -** -** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -*/ -SQLITE_API int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); -SQLITE_API int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -SQLITE_API int sqlite3_create_collation16( - sqlite3*, - const void *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks -** -** ^To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** [database connection] to be invoked whenever an undefined collation -** sequence is required. -** -** ^If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, -** the names are passed as UTF-16 in machine native byte order. -** ^A call to either function replaces the existing collation-needed callback. -** -** ^(When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). The second argument is the database -** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], -** or [SQLITE_UTF16LE], indicating the most desirable form of the collation -** sequence function required. The fourth parameter is the name of the -** required collation sequence.)^ -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -SQLITE_API int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -SQLITE_API int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -#ifdef SQLITE_HAS_CODEC -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); - -/* -** Specify the activation key for a SEE database. Unless -** activated, none of the SEE routines will work. -*/ -SQLITE_API void sqlite3_activate_see( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -#ifdef SQLITE_ENABLE_CEROD -/* -** Specify the activation key for a CEROD database. Unless -** activated, none of the CEROD routines will work. -*/ -SQLITE_API void sqlite3_activate_cerod( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -/* -** CAPI3REF: Suspend Execution For A Short Time -** -** The sqlite3_sleep() function causes the current thread to suspend execution -** for at least a number of milliseconds specified in its parameter. -** -** If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** ^SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. If the xSleep() method -** of the default VFS is not implemented correctly, or not implemented at -** all, then the behavior of sqlite3_sleep() may deviate from the description -** in the previous paragraphs. -*/ -SQLITE_API int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite when using a built-in [sqlite3_vfs | VFS] -** will be placed in that directory.)^ ^If this variable -** is a NULL pointer, then SQLite performs a search for an appropriate -** temporary file directory. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [temp_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [temp_store_directory pragma] should be avoided. -** -** Note to Windows Runtime users: The temporary directory must be set -** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various -** features that require the use of temporary files may fail. Here is an -** example of how to do this using C++ with the Windows Runtime: -** -**
-** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
-**       TemporaryFolder->Path->Data();
-** char zPathBuf[MAX_PATH + 1];
-** memset(zPathBuf, 0, sizeof(zPathBuf));
-** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
-**       NULL, NULL);
-** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
-** 
-*/ -SQLITE_API char *sqlite3_temp_directory; - -/* -** CAPI3REF: Name Of The Folder Holding Database Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all database files -** specified with a relative pathname and created or accessed by -** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed -** to be relative to that directory.)^ ^If this variable is a NULL -** pointer, then SQLite assumes that all database files specified -** with a relative pathname are relative to the current directory -** for the process. Only the windows VFS makes use of this global -** variable; it is ignored by the unix VFS. -** -** Changing the value of this variable while a database connection is -** open can result in a corrupt database. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [data_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [data_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [data_store_directory pragma] should be avoided. -*/ -SQLITE_API char *sqlite3_data_directory; - -/* -** CAPI3REF: Test For Auto-Commit Mode -** KEYWORDS: {autocommit mode} -** -** ^The sqlite3_get_autocommit() interface returns non-zero or -** zero if the given database connection is or is not in autocommit mode, -** respectively. ^Autocommit mode is on by default. -** ^Autocommit mode is disabled by a [BEGIN] statement. -** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. -** -** If certain kinds of errors occur on a statement within a multi-statement -** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. The only way to -** find out whether SQLite automatically rolled back the transaction after -** an error is to use this function. -** -** If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. -*/ -SQLITE_API int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Of A Prepared Statement -** -** ^The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. ^The [database connection] -** returned by sqlite3_db_handle is the same [database connection] -** that was the first argument -** to the [sqlite3_prepare_v2()] call (or its variants) that was used to -** create the statement in the first place. -*/ -SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - -/* -** CAPI3REF: Return The Filename For A Database Connection -** -** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename -** associated with database N of connection D. ^The main database file -** has the name "main". If there is no attached database N on the database -** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. -** -** ^The filename returned by this function is the output of the -** xFullPathname method of the [VFS]. ^In other words, the filename -** will be an absolute pathname, even if the filename used -** to open the database originally was a URI or relative pathname. -*/ -SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); - -/* -** CAPI3REF: Determine if a database is read-only -** -** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N -** of connection D is read-only, 0 if it is read/write, or -1 if N is not -** the name of a database on connection D. -*/ -SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); - -/* -** CAPI3REF: Find the next prepared statement -** -** ^This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. ^If pStmt is NULL -** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. ^If no prepared statement -** satisfies the conditions of this routine, it returns NULL. -** -** The [database connection] pointer D in a call to -** [sqlite3_next_stmt(D,S)] must refer to an open database -** connection and in particular must not be a NULL pointer. -*/ -SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks -** -** ^The sqlite3_commit_hook() interface registers a callback -** function to be invoked whenever a transaction is [COMMIT | committed]. -** ^Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** ^The sqlite3_rollback_hook() interface registers a callback -** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** ^Any callback set by a previous call to sqlite3_rollback_hook() -** for the same database connection is overridden. -** ^The pArg argument is passed through to the callback. -** ^If the callback on a commit hook function returns non-zero, -** then the commit is converted into a rollback. -** -** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions -** return the P argument from the previous call of the same function -** on the same [database connection] D, or NULL for -** the first call for each function on D. -** -** The commit and rollback hook callbacks are not reentrant. -** The callback implementation must not do anything that will modify -** the database connection that invoked the callback. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the commit -** or rollback hook in the first place. -** Note that running any other SQL statements, including SELECT statements, -** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify -** the database connections for the meaning of "modify" in this paragraph. -** -** ^Registering a NULL function disables the callback. -** -** ^When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. ^If the commit hook -** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** ^The rollback hook is invoked on a rollback that results from a commit -** hook returning non-zero, just as it would be with any other rollback. -** -** ^For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. -** ^The rollback callback is not invoked if a transaction is -** automatically rolled back because the database connection is closed. -** -** See also the [sqlite3_update_hook()] interface. -*/ -SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks -** -** ^The sqlite3_update_hook() interface registers a callback function -** with the [database connection] identified by the first argument -** to be invoked whenever a row is updated, inserted or deleted. -** ^Any callback set by a previous call to this function -** for the same database connection is overridden. -** -** ^The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. -** ^The first argument to the callback is a copy of the third argument -** to sqlite3_update_hook(). -** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], -** or [SQLITE_UPDATE], depending on the operation that caused the callback -** to be invoked. -** ^The third and fourth arguments to the callback contain pointers to the -** database and table name containing the affected row. -** ^The final callback parameter is the [rowid] of the row. -** ^In the case of an update, this is the [rowid] after the update takes place. -** -** ^(The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence).)^ -** -** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook -** invoked when rows are deleted using the [truncate optimization]. -** The exceptions defined in this paragraph might change in a future -** release of SQLite. -** -** The update hook implementation must not do anything that will modify -** the database connection that invoked the update hook. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the update hook. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^The sqlite3_update_hook(D,C,P) function -** returns the P argument from the previous call -** on the same [database connection] D, or NULL for -** the first call on D. -** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. -*/ -SQLITE_API void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache -** -** ^(This routine enables or disables the sharing of the database cache -** and schema data structures between [database connection | connections] -** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false.)^ -** -** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, -** sharing was enabled or disabled for each thread separately. -** -** ^(The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened.)^ -** -** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise.)^ -** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -** -** This interface is threadsafe on processors where writing a -** 32-bit integer is atomic. -** -** See Also: [SQLite Shared-Cache Mode] -*/ -SQLITE_API int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory -** -** ^The sqlite3_release_memory() interface attempts to free N bytes -** of heap memory by deallocating non-essential memory allocations -** held by the database library. Memory used to cache database -** pages to improve performance is an example of non-essential memory. -** ^sqlite3_release_memory() returns the number of bytes actually freed, -** which might be more or less than the amount requested. -** ^The sqlite3_release_memory() routine is a no-op returning zero -** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** See also: [sqlite3_db_release_memory()] -*/ -SQLITE_API int sqlite3_release_memory(int); - -/* -** CAPI3REF: Free Memory Used By A Database Connection -** -** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap -** memory as possible from database connection D. Unlike the -** [sqlite3_release_memory()] interface, this interface is effect even -** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is -** omitted. -** -** See also: [sqlite3_release_memory()] -*/ -SQLITE_API int sqlite3_db_release_memory(sqlite3*); - -/* -** CAPI3REF: Impose A Limit On Heap Size -** -** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the -** soft limit on the amount of heap memory that may be allocated by SQLite. -** ^SQLite strives to keep heap memory utilization below the soft heap -** limit by reducing the number of pages held in the page cache -** as heap memory usages approaches the limit. -** ^The soft heap limit is "soft" because even though SQLite strives to stay -** below the limit, it will exceed the limit rather than generate -** an [SQLITE_NOMEM] error. In other words, the soft heap limit -** is advisory only. -** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call, or negative in the case of an -** error. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. -** -** ^(The soft heap limit is not enforced in the current implementation -** if one or more of following conditions are true: -** -**
    -**
  • The soft heap limit is set to zero. -**
  • Memory accounting is disabled using a combination of the -** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and -** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. -**
  • An alternative page cache implementation is specified using -** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). -**
  • The page cache allocates from its own memory pool supplied -** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than -** from the heap. -**
)^ -** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may -** changes in future releases of SQLite. -*/ -SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); - -/* -** CAPI3REF: Deprecated Soft Heap Limit Interface -** DEPRECATED -** -** This is a deprecated version of the [sqlite3_soft_heap_limit64()] -** interface. This routine is provided for historical compatibility -** only. All new applications should use the -** [sqlite3_soft_heap_limit64()] interface rather than this one. -*/ -SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); - - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table -** -** ^This routine returns metadata about a specific column of a specific -** database table accessible using the [database connection] handle -** passed as the first function argument. -** -** ^The column is identified by the second, third and fourth parameters to -** this function. ^The second parameter is either the name of the database -** (i.e. "main", "temp", or an attached database) containing the specified -** table or NULL. ^If it is NULL, then all attached databases are searched -** for the table using the same algorithm used by the database engine to -** resolve unqualified table references. -** -** ^The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** ^Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. ^Any of these arguments may be -** NULL, in which case the corresponding element of metadata is omitted. -** -** ^(
-** -**
Parameter Output
Type
Description -** -**
5th const char* Data type -**
6th const char* Name of default collation sequence -**
7th int True if column has a NOT NULL constraint -**
8th int True if column is part of the PRIMARY KEY -**
9th int True if column is [AUTOINCREMENT] -**
-**
)^ -** -** ^The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any SQLite API function. -** -** ^If the specified table is actually a view, an [error code] is returned. -** -** ^If the specified column is "rowid", "oid" or "_rowid_" and an -** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. ^(If there is no -** explicitly declared [INTEGER PRIMARY KEY] column, then the output -** parameters are set as follows: -** -**
-**     data type: "INTEGER"
-**     collation sequence: "BINARY"
-**     not null: 0
-**     primary key: 1
-**     auto increment: 0
-** 
)^ -** -** ^(This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ -** -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. -*/ -SQLITE_API int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension -** -** ^This interface loads an SQLite extension library from the named file. -** -** ^The sqlite3_load_extension() interface attempts to load an -** [SQLite extension] library contained in the file zFile. If -** the file cannot be loaded directly, attempts are made to load -** with various operating-system specific extensions added. -** So for example, if "samplelib" cannot be loaded, then names like -** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might -** be tried also. -** -** ^The entry point is zProc. -** ^(zProc may be 0, in which case SQLite will try to come up with an -** entry point name on its own. It first tries "sqlite3_extension_init". -** If that does not work, it constructs a name "sqlite3_X_init" where the -** X is consists of the lower-case equivalent of all ASCII alphabetic -** characters in the filename from the last "/" to the first following -** "." and omitting any initial "lib".)^ -** ^The sqlite3_load_extension() interface returns -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** ^If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. The calling function -** should free this memory by calling [sqlite3_free()]. -** -** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. -** -** See also the [load_extension() SQL function]. -*/ -SQLITE_API int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading -** -** ^So as not to open security holes in older applications that are -** unprepared to deal with [extension loading], and as a means of disabling -** [extension loading] while evaluating user-entered SQL, the following API -** is provided to turn the [sqlite3_load_extension()] mechanism on and off. -** -** ^Extension loading is off by default. -** ^Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -*/ -SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Automatically Load Statically Linked Extensions -** -** ^This interface causes the xEntryPoint() function to be invoked for -** each new [database connection] that is created. The idea here is that -** xEntryPoint() is the entry point for a statically linked [SQLite extension] -** that is to be automatically loaded into all new database connections. -** -** ^(Even though the function prototype shows that xEntryPoint() takes -** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the -** entry point where as follows: -** -**
-**    int xEntryPoint(
-**      sqlite3 *db,
-**      const char **pzErrMsg,
-**      const struct sqlite3_api_routines *pThunk
-**    );
-** 
)^ -** -** If the xEntryPoint routine encounters an error, it should make *pzErrMsg -** point to an appropriate error message (obtained from [sqlite3_mprintf()]) -** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg -** is NULL before calling the xEntryPoint(). ^SQLite will invoke -** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any -** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. -** -** ^Calling sqlite3_auto_extension(X) with an entry point X that is already -** on the list of automatic extensions is a harmless no-op. ^No entry point -** will be called more than once for each database connection that is opened. -** -** See also: [sqlite3_reset_auto_extension()]. -*/ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); - -/* -** CAPI3REF: Reset Automatic Extension Loading -** -** ^This interface disables all automatic extensions previously -** registered using [sqlite3_auto_extension()]. -*/ -SQLITE_API void sqlite3_reset_auto_extension(void); - -/* -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** CAPI3REF: Virtual Table Object -** KEYWORDS: sqlite3_module {virtual table module} -** -** This structure, sometimes called a "virtual table module", -** defines the implementation of a [virtual tables]. -** This structure consists mostly of methods for the module. -** -** ^A virtual table module is created by filling in a persistent -** instance of this structure and passing a pointer to that instance -** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** ^The registration remains valid until it is replaced by a different -** module or until the [database connection] closes. The content -** of this structure must not change while it is registered with -** any database connection. -*/ -struct sqlite3_module { - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); - /* The methods above are in version 1 of the sqlite_module object. Those - ** below are for version 2 and greater. */ - int (*xSavepoint)(sqlite3_vtab *pVTab, int); - int (*xRelease)(sqlite3_vtab *pVTab, int); - int (*xRollbackTo)(sqlite3_vtab *pVTab, int); -}; - -/* -** CAPI3REF: Virtual Table Indexing Information -** KEYWORDS: sqlite3_index_info -** -** The sqlite3_index_info structure and its substructures is used as part -** of the [virtual table] interface to -** pass information into and receive the reply from the [xBestIndex] -** method of a [virtual table module]. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** ^(The aConstraint[] array records WHERE clause constraints of the form: -** -**
column OP expr
-** -** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is -** stored in aConstraint[].op using one of the -** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ -** ^(The index of the column is stored in -** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot.)^ -** -** ^The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** ^The aConstraint[] array only reports WHERE clause terms that are -** relevant to the particular virtual table being queried. -** -** ^Information about the ORDER BY clause is stored in aOrderBy[]. -** ^Each term of aOrderBy records a column of the ORDER BY clause. -** -** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. ^If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ -** -** ^The idxNum and idxPtr values are recorded and passed into the -** [xFilter] method. -** ^[sqlite3_free()] is used to free idxPtr if and only if -** needToFreeIdxPtr is true. -** -** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** ^The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info { - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - /* Outputs */ - struct sqlite3_index_constraint_usage { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; - -/* -** CAPI3REF: Virtual Table Constraint Operator Codes -** -** These macros defined the allowed values for the -** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of -** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** CAPI3REF: Register A Virtual Table Implementation -** -** ^These routines are used to register a new [virtual table module] name. -** ^Module names must be registered before -** creating a new [virtual table] using the module and before using a -** preexisting [virtual table] for the module. -** -** ^The module name is registered on the [database connection] specified -** by the first parameter. ^The name of the module is given by the -** second parameter. ^The third parameter is a pointer to -** the implementation of the [virtual table module]. ^The fourth -** parameter is an arbitrary client data pointer that is passed through -** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. -** -** ^The sqlite3_create_module_v2() interface has a fifth parameter which -** is a pointer to a destructor for the pClientData. ^SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. ^The destructor will also -** be invoked if the call to sqlite3_create_module_v2() fails. -** ^The sqlite3_create_module() -** interface is equivalent to sqlite3_create_module_v2() with a NULL -** destructor. -*/ -SQLITE_API int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData /* Client data for xCreate/xConnect */ -); -SQLITE_API int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** CAPI3REF: Virtual Table Instance Object -** KEYWORDS: sqlite3_vtab -** -** Every [virtual table module] implementation uses a subclass -** of this object to describe a particular instance -** of the [virtual table]. Each subclass will -** be tailored to the specific needs of the module implementation. -** The purpose of this superclass is to define certain fields that are -** common to all module implementations. -** -** ^Virtual tables methods can set an error message by assigning a -** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should -** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. ^After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. -*/ -struct sqlite3_vtab { - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Virtual Table Cursor Object -** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} -** -** Every [virtual table module] implementation uses a subclass of the -** following structure to describe cursors that point into the -** [virtual table] and are used -** to loop through the virtual table. Cursors are created using the -** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cursors are used -** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods -** of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Declare The Schema Of A Virtual Table -** -** ^The [xCreate] and [xConnect] methods of a -** [virtual table module] call this interface -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); - -/* -** CAPI3REF: Overload A Function For A Virtual Table -** -** ^(Virtual tables can provide alternative implementations of functions -** using the [xFindFunction] method of the [virtual table module]. -** But global versions of those functions -** must exist in order to be overloaded.)^ -** -** ^(This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created.)^ ^The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a placeholder function that can be overloaded -** by a [virtual table]. -*/ -SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB -** KEYWORDS: {BLOB handle} {BLOB handles} -** -** An instance of this object represents an open BLOB on which -** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** ^Objects of this type are created by [sqlite3_blob_open()] -** and destroyed by [sqlite3_blob_close()]. -** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the BLOB. -** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O -** -** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located -** in row iRow, column zColumn, table zTable in database zDb; -** in other words, the same BLOB that would be selected by: -** -**
-**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
-** 
)^ -** -** ^If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. ^If it is zero, the BLOB is opened for read access. -** ^It is not possible to open a column that is part of an index or primary -** key for writing. ^If [foreign key constraints] are enabled, it is -** not possible to open a column that is part of a [child key] for writing. -** -** ^Note that the database name is not the filename that contains -** the database but rather the symbolic name of the database that -** appears after the AS keyword when the database is connected using [ATTACH]. -** ^For the main database file, the database name is "main". -** ^For TEMP tables, the database name is "temp". -** -** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written -** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer.)^ -** ^This function sets the [database connection] error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. ^Note that the *ppBlob variable is always initialized in a -** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob -** regardless of the success or failure of this routine. -** -** ^(If the row that a BLOB handle points to is modified by an -** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects -** then the BLOB handle is marked as "expired". -** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on.)^ -** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for -** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. -** ^(Changes written into a BLOB prior to the BLOB expiring are not -** rolled back by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion.)^ -** -** ^Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. ^The size of a blob may not be changed by this -** interface. Use the [UPDATE] SQL command to change the size of a -** blob. -** -** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces -** and the built-in [zeroblob] SQL function can be used, if desired, -** to create an empty, zero-filled blob in which to read or write using -** this interface. -** -** To avoid a resource leak, every open [BLOB handle] should eventually -** be released by a call to [sqlite3_blob_close()]. -*/ -SQLITE_API int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Move a BLOB Handle to a New Row -** -** ^This function is used to move an existing blob handle so that it points -** to a different row of the same database table. ^The new row is identified -** by the rowid value passed as the second argument. Only the row can be -** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be -** faster than closing the existing handle and opening a new one. -** -** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - -** it must exist and there must be either a blob or text value stored in -** the nominated column.)^ ^If the new row is not present in the table, or if -** it does not contain a blob or text value, or if another error occurs, an -** SQLite error code is returned and the blob handle is considered aborted. -** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or -** [sqlite3_blob_reopen()] on an aborted blob handle immediately return -** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle -** always returns zero. -** -** ^This function sets the database handle error code and message. -*/ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); - -/* -** CAPI3REF: Close A BLOB Handle -** -** ^Closes an open [BLOB handle]. -** -** ^Closing a BLOB shall cause the current transaction to commit -** if there are no other BLOBs, no pending prepared statements, and the -** database connection is in [autocommit mode]. -** ^If any writes were made to the BLOB, they might be held in cache -** until the close operation if they will fit. -** -** ^(Closing the BLOB often forces the changes -** out to disk and so if any I/O errors occur, they will likely occur -** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value.)^ -** -** ^(The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed.)^ -** -** ^Calling this routine with a null pointer (such as would be returned -** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. -*/ -SQLITE_API int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB -** -** ^Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing -** blob content; they cannot change the size of a blob. -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -*/ -SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally -** -** ^(This function is used to read data from an open [BLOB handle] into a -** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset.)^ -** -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is -** less than zero, [SQLITE_ERROR] is returned and no data is read. -** ^The size of the blob (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to read from an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. -** -** ^(On success, sqlite3_blob_read() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_write()]. -*/ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally -** -** ^This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. ^N bytes of data are copied from the buffer Z -** into the open BLOB, starting at offset iOffset. -** -** ^If the [BLOB handle] passed as the first argument was not opened for -** writing (the flags parameter to [sqlite3_blob_open()] was zero), -** this function returns [SQLITE_READONLY]. -** -** ^This function may only modify the contents of the BLOB; it is -** not possible to increase the size of a BLOB using this API. -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. ^If N is -** less than zero [SQLITE_ERROR] is returned and no data is written. -** The size of the BLOB (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred -** before the [BLOB handle] expired are not rolled back by the -** expiration of the handle, though of course those changes might -** have been overwritten by the statement that expired the BLOB handle -** or by other independent statements. -** -** ^(On success, sqlite3_blob_write() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_read()]. -*/ -SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most SQLite builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** ^Names are case sensitive. -** ^Names are zero-terminated UTF-8 strings. -** ^If there is no match, a NULL pointer is returned. -** ^If zVfsName is NULL then the default VFS is returned. -** -** ^New VFSes are registered with sqlite3_vfs_register(). -** ^Each new VFS becomes the default VFS if the makeDflt flag is set. -** ^The same VFS can be registered multiple times without injury. -** ^To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. If two different VFSes with the -** same name are registered, the behavior is undefined. If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. -** ^(If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary.)^ -*/ -SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. ^(The following -** implementations are available in the SQLite core: -** -**
    -**
  • SQLITE_MUTEX_PTHREADS -**
  • SQLITE_MUTEX_W32 -**
  • SQLITE_MUTEX_NOOP -**
)^ -** -** ^The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. ^The SQLITE_MUTEX_PTHREADS and -** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix -** and Windows. -** -** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. In this case the -** application must supply a custom mutex implementation using the -** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function -** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize().)^ -** -** ^The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. ^If it returns NULL -** that means that a mutex could not be allocated. ^SQLite -** will unwind its stack and return an error. ^(The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
    -**
  • SQLITE_MUTEX_FAST -**
  • SQLITE_MUTEX_RECURSIVE -**
  • SQLITE_MUTEX_STATIC_MASTER -**
  • SQLITE_MUTEX_STATIC_MEM -**
  • SQLITE_MUTEX_STATIC_MEM2 -**
  • SQLITE_MUTEX_STATIC_PRNG -**
  • SQLITE_MUTEX_STATIC_LRU -**
  • SQLITE_MUTEX_STATIC_LRU2 -**
)^ -** -** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) -** cause sqlite3_mutex_alloc() to create -** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. ^SQLite will only request a recursive mutex in -** cases where it really needs one. ^If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other -** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return -** a pointer to a static preexisting mutex. ^Six static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. ^But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -** -** ^The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. ^SQLite is careful to deallocate every -** dynamic mutex that it allocates. The dynamic mutexes must not be in -** use when they are deallocated. Attempting to deallocate a static -** mutex results in undefined behavior. ^SQLite never deallocates -** a static mutex. -** -** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. ^If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. ^(Mutexes created using -** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter.)^ ^(If the same thread tries to enter any other -** kind of mutex more than once, the behavior is undefined. -** SQLite will never exhibit -** such behavior in its own use of mutexes.)^ -** -** ^(Some systems (for example, Windows 95) do not support the operation -** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ -** -** ^The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. ^(The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. SQLite will -** never do either.)^ -** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); -SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Methods Object -** -** An instance of this structure defines the low-level routines -** used to allocate and use mutexes. -** -** Usually, the default mutex implementations provided by SQLite are -** sufficient, however the user has the option of substituting a custom -** implementation for specialized deployments or systems for which SQLite -** does not provide a suitable implementation. In this case, the user -** creates and populates an instance of this structure to pass -** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. -** Additionally, an instance of this structure can be used as an -** output variable when querying the system for the current mutex -** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. -** -** ^The xMutexInit method defined by this structure is invoked as -** part of system initialization by the sqlite3_initialize() function. -** ^The xMutexInit routine is called by SQLite exactly once for each -** effective call to [sqlite3_initialize()]. -** -** ^The xMutexEnd method defined by this structure is invoked as -** part of system shutdown by the sqlite3_shutdown() function. The -** implementation of this method is expected to release all outstanding -** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. ^The xMutexEnd() -** interface is invoked exactly once for each call to [sqlite3_shutdown()]. -** -** ^(The remaining seven methods defined by this structure (xMutexAlloc, -** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and -** xMutexNotheld) implement the following interfaces (respectively): -** -**
    -**
  • [sqlite3_mutex_alloc()]
  • -**
  • [sqlite3_mutex_free()]
  • -**
  • [sqlite3_mutex_enter()]
  • -**
  • [sqlite3_mutex_try()]
  • -**
  • [sqlite3_mutex_leave()]
  • -**
  • [sqlite3_mutex_held()]
  • -**
  • [sqlite3_mutex_notheld()]
  • -**
)^ -** -** The only difference is that the public sqlite3_XXX functions enumerated -** above silently ignore any invocations that pass a NULL pointer instead -** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results -** of passing a NULL pointer instead of a valid mutex handle are undefined -** (i.e. it is acceptable to provide an implementation that segfaults if -** it is passed a NULL pointer). -** -** The xMutexInit() method must be threadsafe. ^It must be harmless to -** invoke xMutexInit() multiple times within the same process and without -** intervening calls to xMutexEnd(). Second and subsequent calls to -** xMutexInit() must be no-ops. -** -** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. ^However xMutexAlloc() may use SQLite -** memory allocation for a fast or recursive mutex. -** -** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is -** called, but only if the prior call to xMutexInit returned SQLITE_OK. -** If xMutexInit fails in any way, it is expected to clean up after itself -** prior to returning. -*/ -typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; -struct sqlite3_mutex_methods { - int (*xMutexInit)(void); - int (*xMutexEnd)(void); - sqlite3_mutex *(*xMutexAlloc)(int); - void (*xMutexFree)(sqlite3_mutex *); - void (*xMutexEnter)(sqlite3_mutex *); - int (*xMutexTry)(sqlite3_mutex *); - void (*xMutexLeave)(sqlite3_mutex *); - int (*xMutexHeld)(sqlite3_mutex *); - int (*xMutexNotheld)(sqlite3_mutex *); -}; - -/* -** CAPI3REF: Mutex Verification Routines -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. ^The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. ^The SQLite core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. ^External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** ^These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. -** -** ^The implementation is not required to provide versions of these -** routines that actually work. If the implementation does not provide working -** versions of these routines, it should at least provide stubs that always -** return true so that one does not get spurious assertion failures. -** -** ^If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. ^The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -#ifndef NDEBUG -SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); -#endif - -/* -** CAPI3REF: Mutex Types -** -** The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. -** -** The set of static mutexes may change from one SQLite release to the -** next. Applications that override the built-in mutex logic must be -** prepared to accommodate additional static mutexes. -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ -#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ - -/* -** CAPI3REF: Retrieve the mutex for a database connection -** -** ^This interface returns a pointer the [sqlite3_mutex] object that -** serializes access to the [database connection] given in the argument -** when the [threading mode] is Serialized. -** ^If the [threading mode] is Single-thread or Multi-thread then this -** routine returns a NULL pointer. -*/ -SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); - -/* -** CAPI3REF: Low-Level Control Of Database Files -** -** ^The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. ^The -** name of the database is "main" for the main database or "temp" for the -** TEMP database, or the name that appears after the AS keyword for -** databases that are added using the [ATTACH] SQL command. -** ^A NULL pointer can be used in place of "main" to refer to the -** main database file. -** ^The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. ^The return value of the xFileControl -** method becomes the return value of this routine. -** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes -** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER -** case is a short-circuit path which does not actually invoke the -** underlying sqlite3_io_methods.xFileControl method. -** -** ^If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. ^This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. The underlying xFileControl method might -** also return SQLITE_ERROR. There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/* -** CAPI3REF: Testing Interface -** -** ^The sqlite3_test_control() interface is used to read out internal -** state of SQLite and to inject faults into SQLite for testing -** purposes. ^The first parameter is an operation code that determines -** the number, meaning, and operation of all subsequent parameters. -** -** This interface is not for use by applications. It exists solely -** for verifying the correct operation of the SQLite library. Depending -** on how the SQLite library is compiled, this interface might not exist. -** -** The details of the operation codes, their meanings, the parameters -** they take, and what they do are all subject to change without notice. -** Unlike most of the SQLite API, this function is not guaranteed to -** operate consistently from one release to the next. -*/ -SQLITE_API int sqlite3_test_control(int op, ...); - -/* -** CAPI3REF: Testing Interface Operation Codes -** -** These constants are the valid operation code parameters used -** as the first argument to [sqlite3_test_control()]. -** -** These parameters and their meanings are subject to change -** without notice. These values are for testing purposes only. -** Applications should not use any of these parameters or the -** [sqlite3_test_control()] interface. -*/ -#define SQLITE_TESTCTRL_FIRST 5 -#define SQLITE_TESTCTRL_PRNG_SAVE 5 -#define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 -#define SQLITE_TESTCTRL_BITVEC_TEST 8 -#define SQLITE_TESTCTRL_FAULT_INSTALL 9 -#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 -#define SQLITE_TESTCTRL_PENDING_BYTE 11 -#define SQLITE_TESTCTRL_ASSERT 12 -#define SQLITE_TESTCTRL_ALWAYS 13 -#define SQLITE_TESTCTRL_RESERVE 14 -#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 -#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 -#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 -#define SQLITE_TESTCTRL_LAST 19 - -/* -** CAPI3REF: SQLite Runtime Status -** -** ^This interface is used to retrieve runtime status information -** about the performance of SQLite, and optionally to reset various -** highwater marks. ^The first argument is an integer code for -** the specific parameter to measure. ^(Recognized integer codes -** are of the form [status parameters | SQLITE_STATUS_...].)^ -** ^The current value of the parameter is returned into *pCurrent. -** ^The highest recorded value is returned in *pHighwater. ^If the -** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. ^(Some parameters do not record the highest -** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored.)^ -** ^(Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent.)^ -** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. -** -** See also: [sqlite3_db_status()] -*/ -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); - - -/* -** CAPI3REF: Status Parameters -** KEYWORDS: {status parameters} -** -** These integer constants designate various run-time status parameters -** that can be returned by [sqlite3_status()]. -** -**
-** [[SQLITE_STATUS_MEMORY_USED]] ^(
SQLITE_STATUS_MEMORY_USED
-**
This parameter is the current amount of memory checked out -** using [sqlite3_malloc()], either directly or indirectly. The -** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache -** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in -** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ -** -** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
SQLITE_STATUS_MALLOC_SIZE
-**
This parameter records the largest memory allocation request -** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their -** internal equivalents). Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
SQLITE_STATUS_MALLOC_COUNT
-**
This parameter records the number of separate memory allocations -** currently checked out.
)^ -** -** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
SQLITE_STATUS_PAGECACHE_USED
-**
This parameter returns the number of pages used out of the -** [pagecache memory allocator] that was configured using -** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
)^ -** -** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] -** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
-**
This parameter returns the number of bytes of page cache -** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] -** buffer and where forced to overflow to [sqlite3_malloc()]. The -** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to -** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
)^ -** -** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
SQLITE_STATUS_PAGECACHE_SIZE
-**
This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** [[SQLITE_STATUS_SCRATCH_USED]] ^(
SQLITE_STATUS_SCRATCH_USED
-**
This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
)^ -** -** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
-**
This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -**
)^ -** -** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(
SQLITE_STATUS_SCRATCH_SIZE
-**
This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** [[SQLITE_STATUS_PARSER_STACK]] ^(
SQLITE_STATUS_PARSER_STACK
-**
This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ -**
-** -** New status parameters may be added from time to time. -*/ -#define SQLITE_STATUS_MEMORY_USED 0 -#define SQLITE_STATUS_PAGECACHE_USED 1 -#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 -#define SQLITE_STATUS_MALLOC_SIZE 5 -#define SQLITE_STATUS_PARSER_STACK 6 -#define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 -#define SQLITE_STATUS_MALLOC_COUNT 9 - -/* -** CAPI3REF: Database Connection Status -** -** ^This interface is used to retrieve runtime status information -** about a single [database connection]. ^The first argument is the -** database connection object to be interrogated. ^The second argument -** is an integer constant, taken from the set of -** [SQLITE_DBSTATUS options], that -** determines the parameter to interrogate. The set of -** [SQLITE_DBSTATUS options] is likely -** to grow in future releases of SQLite. -** -** ^The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. ^If -** the resetFlg is true, then the highest instantaneous value is -** reset back down to the current value. -** -** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. -*/ -SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); - -/* -** CAPI3REF: Status Parameters for database connections -** KEYWORDS: {SQLITE_DBSTATUS options} -** -** These constants are the available integer "verbs" that can be passed as -** the second argument to the [sqlite3_db_status()] interface. -** -** New verbs may be added in future releases of SQLite. Existing verbs -** might be discontinued. Applications should check the return code from -** [sqlite3_db_status()] to make sure that the call worked. -** The [sqlite3_db_status()] interface will return a non-zero error code -** if a discontinued or unsupported verb is invoked. -** -**
-** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
-**
This parameter returns the number of lookaside memory slots currently -** checked out.
)^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
-**
This parameter returns the number malloc attempts that were -** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to the amount of -** memory requested being larger than the lookaside slot size. -** Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to all lookaside -** memory already being in use. -** Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
SQLITE_DBSTATUS_CACHE_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used by all pager caches associated with the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. -** -** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
SQLITE_DBSTATUS_SCHEMA_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used to store the schema for all databases associated -** with the connection - main, temp, and any [ATTACH]-ed databases.)^ -** ^The full amount of memory used by the schemas is reported, even if the -** schema memory is shared with other database connections due to -** [shared cache mode] being enabled. -** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. -** -** [[SQLITE_DBSTATUS_STMT_USED]] ^(
SQLITE_DBSTATUS_STMT_USED
-**
This parameter returns the approximate number of of bytes of heap -** and lookaside memory used by all prepared statements associated with -** the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. -**
-** -** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
SQLITE_DBSTATUS_CACHE_HIT
-**
This parameter returns the number of pager cache hits that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT -** is always 0. -**
-** -** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
SQLITE_DBSTATUS_CACHE_MISS
-**
This parameter returns the number of pager cache misses that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS -** is always 0. -**
-** -** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
SQLITE_DBSTATUS_CACHE_WRITE
-**
This parameter returns the number of dirty cache entries that have -** been written to disk. Specifically, the number of pages written to the -** wal file in wal mode databases, or the number of pages written to the -** database file in rollback mode databases. Any pages written as part of -** transaction rollback or database recovery operations are not included. -** If an IO or other error occurs while writing a page to disk, the effect -** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The -** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. -**
-**
-*/ -#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 -#define SQLITE_DBSTATUS_CACHE_USED 1 -#define SQLITE_DBSTATUS_SCHEMA_USED 2 -#define SQLITE_DBSTATUS_STMT_USED 3 -#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 -#define SQLITE_DBSTATUS_CACHE_HIT 7 -#define SQLITE_DBSTATUS_CACHE_MISS 8 -#define SQLITE_DBSTATUS_CACHE_WRITE 9 -#define SQLITE_DBSTATUS_MAX 9 /* Largest defined DBSTATUS */ - - -/* -** CAPI3REF: Prepared Statement Status -** -** ^(Each prepared statement maintains various -** [SQLITE_STMTSTATUS counters] that measure the number -** of times it has performed specific operations.)^ These counters can -** be used to monitor the performance characteristics of the prepared -** statements. For example, if the number of table steps greatly exceeds -** the number of table searches or result rows, that would tend to indicate -** that the prepared statement is using a full table scan rather than -** an index. -** -** ^(This interface is used to retrieve and reset counter values from -** a [prepared statement]. The first argument is the prepared statement -** object to be interrogated. The second argument -** is an integer code for a specific [SQLITE_STMTSTATUS counter] -** to be interrogated.)^ -** ^The current value of the requested counter is returned. -** ^If the resetFlg is true, then the counter is reset to zero after this -** interface call returns. -** -** See also: [sqlite3_status()] and [sqlite3_db_status()]. -*/ -SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); - -/* -** CAPI3REF: Status Parameters for prepared statements -** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} -** -** These preprocessor macros define integer codes that name counter -** values associated with the [sqlite3_stmt_status()] interface. -** The meanings of the various counters are as follows: -** -**
-** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
SQLITE_STMTSTATUS_FULLSCAN_STEP
-**
^This is the number of times that SQLite has stepped forward in -** a table as part of a full table scan. Large numbers for this counter -** may indicate opportunities for performance improvement through -** careful use of indices.
-** -** [[SQLITE_STMTSTATUS_SORT]]
SQLITE_STMTSTATUS_SORT
-**
^This is the number of sort operations that have occurred. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance through careful use of indices.
-** -** [[SQLITE_STMTSTATUS_AUTOINDEX]]
SQLITE_STMTSTATUS_AUTOINDEX
-**
^This is the number of rows inserted into transient indices that -** were created automatically in order to help joins run faster. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance by adding permanent indices that do not -** need to be reinitialized each time the statement is run.
-**
-*/ -#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 -#define SQLITE_STMTSTATUS_SORT 2 -#define SQLITE_STMTSTATUS_AUTOINDEX 3 - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache type is opaque. It is implemented by -** the pluggable module. The SQLite core has no knowledge of -** its size or internal structure and never deals with the -** sqlite3_pcache object except by holding and passing pointers -** to the object. -** -** See [sqlite3_pcache_methods2] for additional information. -*/ -typedef struct sqlite3_pcache sqlite3_pcache; - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache_page object represents a single page in the -** page cache. The page cache will allocate instances of this -** object. Various methods of the page cache use pointers to instances -** of this object as parameters or as their return value. -** -** See [sqlite3_pcache_methods2] for additional information. -*/ -typedef struct sqlite3_pcache_page sqlite3_pcache_page; -struct sqlite3_pcache_page { - void *pBuf; /* The content of the page */ - void *pExtra; /* Extra information associated with the page */ -}; - -/* -** CAPI3REF: Application Defined Page Cache. -** KEYWORDS: {page cache} -** -** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can -** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods2 structure.)^ -** In many applications, most of the heap memory allocated by -** SQLite is used for the page cache. -** By implementing a -** custom page cache using this API, an application can better control -** the amount of memory consumed by SQLite, the way in which -** that memory is allocated and released, and the policies used to -** determine exactly which parts of a database file are cached and for -** how long. -** -** The alternative page cache mechanism is an -** extreme measure that is only needed by the most demanding applications. -** The built-in page cache is recommended for most uses. -** -** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an -** internal buffer by SQLite within the call to [sqlite3_config]. Hence -** the application may discard the parameter after the call to -** [sqlite3_config()] returns.)^ -** -** [[the xInit() page cache method]] -** ^(The xInit() method is called once for each effective -** call to [sqlite3_initialize()])^ -** (usually only once during the lifetime of the process). ^(The xInit() -** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ -** The intent of the xInit() method is to set up global data structures -** required by the custom page cache implementation. -** ^(If the xInit() method is NULL, then the -** built-in default page cache is used instead of the application defined -** page cache.)^ -** -** [[the xShutdown() page cache method]] -** ^The xShutdown() method is called by [sqlite3_shutdown()]. -** It can be used to clean up -** any outstanding resources before process shutdown, if required. -** ^The xShutdown() method may be NULL. -** -** ^SQLite automatically serializes calls to the xInit method, -** so the xInit method need not be threadsafe. ^The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. All other methods must be threadsafe -** in multithreaded applications. -** -** ^SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -** -** [[the xCreate() page cache methods]] -** ^SQLite invokes the xCreate() method to construct a new cache instance. -** SQLite will typically create one cache instance for each open database file, -** though this is not guaranteed. ^The -** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. ^szPage will always a power of two. ^The -** second parameter szExtra is a number of bytes of extra storage -** associated with each page cache entry. ^The szExtra parameter will -** a number less than 250. SQLite will use the -** extra szExtra bytes on each page to store metadata about the underlying -** database page on disk. The value passed into szExtra depends -** on the SQLite version, the target platform, and how SQLite was compiled. -** ^The third argument to xCreate(), bPurgeable, is true if the cache being -** created will be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation -** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will -** never invoke xUnpin() except to deliberately delete a page. -** ^In other words, calls to xUnpin() on a cache with bPurgeable set to -** false will always have the "discard" flag set to true. -** ^Hence, a cache created with bPurgeable false will -** never contain any unpinned pages. -** -** [[the xCachesize() page cache method]] -** ^(The xCachesize() method may be called at any time by SQLite to set the -** suggested maximum cache-size (number of pages stored by) the cache -** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable -** parameter, the implementation is not required to do anything with this -** value; it is advisory only. -** -** [[the xPagecount() page cache methods]] -** The xPagecount() method must return the number of pages currently -** stored in the cache, both pinned and unpinned. -** -** [[the xFetch() page cache methods]] -** The xFetch() method locates a page in the cache and returns a pointer to -** an sqlite3_pcache_page object associated with that page, or a NULL pointer. -** The pBuf element of the returned sqlite3_pcache_page object will be a -** pointer to a buffer of szPage bytes used to store the content of a -** single database page. The pExtra element of sqlite3_pcache_page will be -** a pointer to the szExtra bytes of extra storage that SQLite has requested -** for each entry in the page cache. -** -** The page to be fetched is determined by the key. ^The minimum key value -** is 1. After it has been retrieved using xFetch, the page is considered -** to be "pinned". -** -** If the requested page is already in the page cache, then the page cache -** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the -** cache implementation should use the value of the createFlag -** parameter to help it determined what action to take: -** -** -**
createFlag Behavior when page is not already in cache -**
0 Do not allocate a new page. Return NULL. -**
1 Allocate a new page if it easy and convenient to do so. -** Otherwise return NULL. -**
2 Make every effort to allocate a new page. Only return -** NULL if allocating a new page is effectively impossible. -**
-** -** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite -** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may -** attempt to unpin one or more cache pages by spilling the content of -** pinned pages to disk and synching the operating system disk cache. -** -** [[the xUnpin() page cache method]] -** ^xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, -** then the page must be evicted from the cache. -** ^If the discard parameter is -** zero, then the page may be discarded or retained at the discretion of -** page cache implementation. ^The page cache implementation -** may choose to evict unpinned pages at any time. -** -** The cache must not perform any reference counting. A single -** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). -** -** [[the xRekey() page cache methods]] -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument. If the cache -** previously contains an entry associated with newKey, it must be -** discarded. ^Any prior cache entry associated with newKey is guaranteed not -** to be pinned. -** -** When SQLite calls the xTruncate() method, the cache must discard all -** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any -** of these pages are pinned, they are implicitly unpinned, meaning that -** they can be safely discarded. -** -** [[the xDestroy() page cache method]] -** ^The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. ^After -** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] -** handle invalid, and will not use it with any other sqlite3_pcache_methods2 -** functions. -** -** [[the xShrink() page cache method]] -** ^SQLite invokes the xShrink() method when it wants the page cache to -** free up as much of heap memory as possible. The page cache implementation -** is not obligated to free any memory, but well-behaved implementations should -** do their best. -*/ -typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; -struct sqlite3_pcache_methods2 { - int iVersion; - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); - void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, - unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); - void (*xShrink)(sqlite3_pcache*); -}; - -/* -** This is the obsolete pcache_methods object that has now been replaced -** by sqlite3_pcache_methods2. This object is not used by SQLite. It is -** retained in the header file for backwards compatibility only. -*/ -typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; -struct sqlite3_pcache_methods { - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, void*, int discard); - void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); -}; - - -/* -** CAPI3REF: Online Backup Object -** -** The sqlite3_backup object records state information about an ongoing -** online backup operation. ^The sqlite3_backup object is created by -** a call to [sqlite3_backup_init()] and is destroyed by a call to -** [sqlite3_backup_finish()]. -** -** See Also: [Using the SQLite Online Backup API] -*/ -typedef struct sqlite3_backup sqlite3_backup; - -/* -** CAPI3REF: Online Backup API. -** -** The backup API copies the content of one database into another. -** It is useful either for creating backups of databases or -** for copying in-memory databases to or from persistent files. -** -** See Also: [Using the SQLite Online Backup API] -** -** ^SQLite holds a write transaction open on the destination database file -** for the duration of the backup operation. -** ^The source database is read-locked only while it is being read; -** it is not locked continuously for the entire backup operation. -** ^Thus, the backup may be performed on a live source database without -** preventing other database connections from -** reading or writing to the source database while the backup is underway. -** -** ^(To perform a backup operation: -**
    -**
  1. sqlite3_backup_init() is called once to initialize the -** backup, -**
  2. sqlite3_backup_step() is called one or more times to transfer -** the data between the two databases, and finally -**
  3. sqlite3_backup_finish() is called to release all resources -** associated with the backup operation. -**
)^ -** There should be exactly one call to sqlite3_backup_finish() for each -** successful call to sqlite3_backup_init(). -** -** [[sqlite3_backup_init()]] sqlite3_backup_init() -** -** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the -** [database connection] associated with the destination database -** and the database name, respectively. -** ^The database name is "main" for the main database, "temp" for the -** temporary database, or the name specified after the AS keyword in -** an [ATTACH] statement for an attached database. -** ^The S and M arguments passed to -** sqlite3_backup_init(D,N,S,M) identify the [database connection] -** and database name of the source database, respectively. -** ^The source and destination [database connections] (parameters S and D) -** must be different or else sqlite3_backup_init(D,N,S,M) will fail with -** an error. -** -** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is -** returned and an error code and error message are stored in the -** destination [database connection] D. -** ^The error code and message for the failed call to sqlite3_backup_init() -** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or -** [sqlite3_errmsg16()] functions. -** ^A successful call to sqlite3_backup_init() returns a pointer to an -** [sqlite3_backup] object. -** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and -** sqlite3_backup_finish() functions to perform the specified backup -** operation. -** -** [[sqlite3_backup_step()]] sqlite3_backup_step() -** -** ^Function sqlite3_backup_step(B,N) will copy up to N pages between -** the source and destination databases specified by [sqlite3_backup] object B. -** ^If N is negative, all remaining source pages are copied. -** ^If sqlite3_backup_step(B,N) successfully copies N pages and there -** are still more pages to be copied, then the function returns [SQLITE_OK]. -** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages -** from source to destination, then it returns [SQLITE_DONE]. -** ^If an error occurs while running sqlite3_backup_step(B,N), -** then an [error code] is returned. ^As well as [SQLITE_OK] and -** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], -** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. -** -** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if -**
    -**
  1. the destination database was opened read-only, or -**
  2. the destination database is using write-ahead-log journaling -** and the destination and source page sizes differ, or -**
  3. the destination database is an in-memory database and the -** destination and source page sizes differ. -**
)^ -** -** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then -** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). ^If the -** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. ^In this case the call to -** sqlite3_backup_step() can be retried later. ^If the source -** [database connection] -** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this -** case the call to sqlite3_backup_step() can be retried later on. ^(If -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or -** [SQLITE_READONLY] is returned, then -** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal.)^ The application must accept -** that the backup operation has failed and pass the backup operation handle -** to the sqlite3_backup_finish() to release associated resources. -** -** ^The first call to sqlite3_backup_step() obtains an exclusive lock -** on the destination file. ^The exclusive lock is not released until either -** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to -** sqlite3_backup_step() obtains a [shared lock] on the source database that -** lasts for the duration of the sqlite3_backup_step() call. -** ^Because the source database is not locked between calls to -** sqlite3_backup_step(), the source database may be modified mid-way -** through the backup process. ^If the source database is modified by an -** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be automatically -** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is automatically -** updated at the same time. -** -** [[sqlite3_backup_finish()]] sqlite3_backup_finish() -** -** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the application -** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). -** ^The sqlite3_backup_finish() interfaces releases all -** resources associated with the [sqlite3_backup] object. -** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any -** active write-transaction on the destination database is rolled back. -** The [sqlite3_backup] object is invalid -** and may not be used following a call to sqlite3_backup_finish(). -** -** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not -** sqlite3_backup_step() completed. -** ^If an out-of-memory condition or IO error occurred during any prior -** sqlite3_backup_step() call on the same [sqlite3_backup] object, then -** sqlite3_backup_finish() returns the corresponding [error code]. -** -** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() -** is not a permanent error and does not affect the return value of -** sqlite3_backup_finish(). -** -** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] -** sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. -** -** Concurrent Usage of Database Handles -** -** ^The source [database connection] may be used by the application for other -** purposes while a backup operation is underway or being initialized. -** ^If SQLite is compiled and configured to support threadsafe database -** connections, then the source database connection may be used concurrently -** from within other threads. -** -** However, the application must guarantee that the destination -** [database connection] is not passed to any other API (by any thread) after -** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). SQLite does not currently check to see -** if the application incorrectly accesses the destination [database connection] -** and so no error code is reported, but the operations may malfunction -** nevertheless. Use of the destination database connection while a -** backup is in progress might also also cause a mutex deadlock. -** -** If running in [shared cache mode], the application must -** guarantee that the shared cache used by the destination database -** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the disk file being -** backed up to is not accessed by any connection within the process, -** not just the specific connection that was passed to sqlite3_backup_init(). -** -** The [sqlite3_backup] object itself is partially threadsafe. Multiple -** threads may safely make multiple concurrent calls to sqlite3_backup_step(). -** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** APIs are not strictly speaking threadsafe. If they are invoked at the -** same time as another thread is invoking sqlite3_backup_step() it is -** possible that they return invalid values. -*/ -SQLITE_API sqlite3_backup *sqlite3_backup_init( - sqlite3 *pDest, /* Destination database handle */ - const char *zDestName, /* Destination database name */ - sqlite3 *pSource, /* Source database handle */ - const char *zSourceName /* Source database name */ -); -SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); -SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); - -/* -** CAPI3REF: Unlock Notification -** -** ^When running in shared-cache mode, a database operation may fail with -** an [SQLITE_LOCKED] error if the required locks on the shared-cache or -** individual tables within the shared-cache cannot be obtained. See -** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** ^This API may be used to register a callback that SQLite will invoke -** when the connection currently holding the required lock relinquishes it. -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. -** -** See Also: [Using the SQLite Unlock Notification Feature]. -** -** ^Shared-cache locks are released when a database connection concludes -** its current transaction, either by committing it or rolling it back. -** -** ^When a connection (known as the blocked connection) fails to obtain a -** shared-cache lock and SQLITE_LOCKED is returned to the caller, the -** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. ^After an -** application receives an SQLITE_LOCKED error, it may call the -** sqlite3_unlock_notify() method with the blocked connection handle as -** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. ^The -** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. -** -** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, -** there is a chance that the blocking connection will have already -** concluded its transaction by the time sqlite3_unlock_notify() is invoked. -** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify().)^ -** -** ^If the blocked connection is attempting to obtain a write-lock on a -** shared-cache table, and more than one other connection currently holds -** a read-lock on the same table, then SQLite arbitrarily selects one of -** the other connections to use as the blocking connection. -** -** ^(There may be at most one unlock-notify callback registered by a -** blocked connection. If sqlite3_unlock_notify() is called when the -** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is -** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is canceled. ^The blocked connections -** unlock-notify callback may also be canceled by closing the blocked -** connection using [sqlite3_close()]. -** -** The unlock-notify callback is not reentrant. If an application invokes -** any sqlite3_xxx API functions from within an unlock-notify callback, a -** crash or deadlock may be the result. -** -** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always -** returns SQLITE_OK. -** -** Callback Invocation Details -** -** When an unlock-notify callback is registered, the application provides a -** single void* pointer that is passed to the callback when it is invoked. -** However, the signature of the callback function allows SQLite to pass -** it an array of void* context pointers. The first argument passed to -** an unlock-notify callback is a pointer to an array of void* pointers, -** and the second is the number of entries in the array. -** -** When a blocking connections transaction is concluded, there may be -** more than one blocked connection that has registered for an unlock-notify -** callback. ^If two or more such blocked connections have specified the -** same callback function, then instead of invoking the callback function -** multiple times, it is invoked once with the set of void* context pointers -** specified by the blocked connections bundled together into an array. -** This gives the application an opportunity to prioritize any actions -** related to the set of unblocked database connections. -** -** Deadlock Detection -** -** Assuming that after registering for an unlock-notify callback a -** database waits for the callback to be issued before taking any further -** action (a reasonable assumption), then using this API may cause the -** application to deadlock. For example, if connection X is waiting for -** connection Y's transaction to be concluded, and similarly connection -** Y is waiting on connection X's transaction, then neither connection -** will proceed and the system may remain deadlocked indefinitely. -** -** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. ^If a given call to sqlite3_unlock_notify() would put the -** system in a deadlocked state, then SQLITE_LOCKED is returned and no -** unlock-notify callback is registered. The system is said to be in -** a deadlocked state if connection A has registered for an unlock-notify -** callback on the conclusion of connection B's transaction, and connection -** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. ^Indirect deadlock is also detected, so -** the system is also considered to be deadlocked if connection B has -** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. ^Any -** number of levels of indirection are allowed. -** -** The "DROP TABLE" Exception -** -** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost -** always appropriate to call sqlite3_unlock_notify(). There is however, -** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, -** SQLite checks if there are any currently executing SELECT statements -** that belong to the same connection. If there are, SQLITE_LOCKED is -** returned. In this case there is no "blocking connection", so invoking -** sqlite3_unlock_notify() results in the unlock-notify callback being -** invoked immediately. If the application then re-attempts the "DROP TABLE" -** or "DROP INDEX" query, an infinite loop might be the result. -** -** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. ^(If there is a blocking connection, then the -** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in -** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED.)^ -*/ -SQLITE_API int sqlite3_unlock_notify( - sqlite3 *pBlocked, /* Waiting connection */ - void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ - void *pNotifyArg /* Argument to pass to xNotify */ -); - - -/* -** CAPI3REF: String Comparison -** -** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications -** and extensions to compare the contents of two buffers containing UTF-8 -** strings in a case-independent fashion, using the same definition of "case -** independence" that SQLite uses internally when comparing identifiers. -*/ -SQLITE_API int sqlite3_stricmp(const char *, const char *); -SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); - -/* -** CAPI3REF: String Globbing -* -** ^The [sqlite3_strglob(P,X)] interface returns zero if string X matches -** the glob pattern P, and it returns non-zero if string X does not match -** the glob pattern P. ^The definition of glob pattern matching used in -** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the -** SQL dialect used by SQLite. ^The sqlite3_strglob(P,X) function is case -** sensitive. -** -** Note that this routine returns zero on a match and non-zero if the strings -** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. -*/ -SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); - -/* -** CAPI3REF: Error Logging Interface -** -** ^The [sqlite3_log()] interface writes a message into the [error log] -** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. -** ^If logging is enabled, the zFormat string and subsequent arguments are -** used with [sqlite3_snprintf()] to generate the final output string. -** -** The sqlite3_log() interface is intended for use by extensions such as -** virtual tables, collating functions, and SQL functions. While there is -** nothing to prevent an application from calling sqlite3_log(), doing so -** is considered bad form. -** -** The zFormat string must not be NULL. -** -** To avoid deadlocks and other threading problems, the sqlite3_log() routine -** will not use dynamically allocated memory. The log message is stored in -** a fixed-length buffer on the stack. If the log message is longer than -** a few hundred characters, it will be truncated to the length of the -** buffer. -*/ -SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); - -/* -** CAPI3REF: Write-Ahead Log Commit Hook -** -** ^The [sqlite3_wal_hook()] function is used to register a callback that -** will be invoked each time a database connection commits data to a -** [write-ahead log] (i.e. whenever a transaction is committed in -** [journal_mode | journal_mode=WAL mode]). -** -** ^The callback is invoked by SQLite after the commit has taken place and -** the associated write-lock on the database released, so the implementation -** may read, write or [checkpoint] the database as required. -** -** ^The first parameter passed to the callback function when it is invoked -** is a copy of the third parameter passed to sqlite3_wal_hook() when -** registering the callback. ^The second is a copy of the database handle. -** ^The third parameter is the name of the database that was written to - -** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter -** is the number of pages currently in the write-ahead log file, -** including those that were just committed. -** -** The callback function should normally return [SQLITE_OK]. ^If an error -** code is returned, that error will propagate back up through the -** SQLite code base to cause the statement that provoked the callback -** to report an error, though the commit will have still occurred. If the -** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value -** that does not correspond to any valid SQLite error code, the results -** are undefined. -** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^Note that the -** [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. -*/ -SQLITE_API void *sqlite3_wal_hook( - sqlite3*, - int(*)(void *,sqlite3*,const char*,int), - void* -); - -/* -** CAPI3REF: Configure an auto-checkpoint -** -** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around -** [sqlite3_wal_hook()] that causes any database on [database connection] D -** to automatically [checkpoint] -** after committing a transaction if there are N or -** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic -** checkpoints entirely. -** -** ^The callback registered by this function replaces any existing callback -** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback -** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism -** configured by this function. -** -** ^The [wal_autocheckpoint pragma] can be used to invoke this interface -** from SQL. -** -** ^Every new [database connection] defaults to having the auto-checkpoint -** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. -*/ -SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); - -/* -** CAPI3REF: Checkpoint a database -** -** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X -** on [database connection] D to be [checkpointed]. ^If X is NULL or an -** empty string, then a checkpoint is run on all databases of -** connection D. ^If the database connection D is not in -** [WAL | write-ahead log mode] then this interface is a harmless no-op. -** -** ^The [wal_checkpoint pragma] can be used to invoke this interface -** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] can be used to cause this interface to be -** run whenever the WAL reaches a certain size threshold. -** -** See also: [sqlite3_wal_checkpoint_v2()] -*/ -SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); - -/* -** CAPI3REF: Checkpoint a database -** -** Run a checkpoint operation on WAL database zDb attached to database -** handle db. The specific operation is determined by the value of the -** eMode parameter: -** -**
-**
SQLITE_CHECKPOINT_PASSIVE
-** Checkpoint as many frames as possible without waiting for any database -** readers or writers to finish. Sync the db file if all frames in the log -** are checkpointed. This mode is the same as calling -** sqlite3_wal_checkpoint(). The busy-handler callback is never invoked. -** -**
SQLITE_CHECKPOINT_FULL
-** This mode blocks (calls the busy-handler callback) until there is no -** database writer and all readers are reading from the most recent database -** snapshot. It then checkpoints all frames in the log file and syncs the -** database file. This call blocks database writers while it is running, -** but not database readers. -** -**
SQLITE_CHECKPOINT_RESTART
-** This mode works the same way as SQLITE_CHECKPOINT_FULL, except after -** checkpointing the log file it blocks (calls the busy-handler callback) -** until all readers are reading from the database file only. This ensures -** that the next client to write to the database file restarts the log file -** from the beginning. This call blocks database writers while it is running, -** but not database readers. -**
-** -** If pnLog is not NULL, then *pnLog is set to the total number of frames in -** the log file before returning. If pnCkpt is not NULL, then *pnCkpt is set to -** the total number of checkpointed frames (including any that were already -** checkpointed when this function is called). *pnLog and *pnCkpt may be -** populated even if sqlite3_wal_checkpoint_v2() returns other than SQLITE_OK. -** If no values are available because of an error, they are both set to -1 -** before returning to communicate this to the caller. -** -** All calls obtain an exclusive "checkpoint" lock on the database file. If -** any other process is running a checkpoint operation at the same time, the -** lock cannot be obtained and SQLITE_BUSY is returned. Even if there is a -** busy-handler configured, it will not be invoked in this case. -** -** The SQLITE_CHECKPOINT_FULL and RESTART modes also obtain the exclusive -** "writer" lock on the database file. If the writer lock cannot be obtained -** immediately, and a busy-handler is configured, it is invoked and the writer -** lock retried until either the busy-handler returns 0 or the lock is -** successfully obtained. The busy-handler is also invoked while waiting for -** database readers as described above. If the busy-handler returns 0 before -** the writer lock is obtained or while waiting for database readers, the -** checkpoint operation proceeds from that point in the same way as -** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible -** without blocking any further. SQLITE_BUSY is returned in this case. -** -** If parameter zDb is NULL or points to a zero length string, then the -** specified operation is attempted on all WAL databases. In this case the -** values written to output parameters *pnLog and *pnCkpt are undefined. If -** an SQLITE_BUSY error is encountered when processing one or more of the -** attached WAL databases, the operation is still attempted on any remaining -** attached databases and SQLITE_BUSY is returned to the caller. If any other -** error occurs while processing an attached database, processing is abandoned -** and the error code returned to the caller immediately. If no error -** (SQLITE_BUSY or otherwise) is encountered while processing the attached -** databases, SQLITE_OK is returned. -** -** If database zDb is the name of an attached database that is not in WAL -** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. If -** zDb is not NULL (or a zero length string) and is not the name of any -** attached database, SQLITE_ERROR is returned to the caller. -*/ -SQLITE_API int sqlite3_wal_checkpoint_v2( - sqlite3 *db, /* Database handle */ - const char *zDb, /* Name of attached database (or NULL) */ - int eMode, /* SQLITE_CHECKPOINT_* value */ - int *pnLog, /* OUT: Size of WAL log in frames */ - int *pnCkpt /* OUT: Total number of frames checkpointed */ -); - -/* -** CAPI3REF: Checkpoint operation parameters -** -** These constants can be used as the 3rd parameter to -** [sqlite3_wal_checkpoint_v2()]. See the [sqlite3_wal_checkpoint_v2()] -** documentation for additional information about the meaning and use of -** each of these values. -*/ -#define SQLITE_CHECKPOINT_PASSIVE 0 -#define SQLITE_CHECKPOINT_FULL 1 -#define SQLITE_CHECKPOINT_RESTART 2 - -/* -** CAPI3REF: Virtual Table Interface Configuration -** -** This function may be called by either the [xConnect] or [xCreate] method -** of a [virtual table] implementation to configure -** various facets of the virtual table interface. -** -** If this interface is invoked outside the context of an xConnect or -** xCreate virtual table method then the behavior is undefined. -** -** At present, there is only one option that may be configured using -** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options -** may be added in the future. -*/ -SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Virtual Table Configuration Options -** -** These macros define the various options to the -** [sqlite3_vtab_config()] interface that [virtual table] implementations -** can use to customize and optimize their behavior. -** -**
-**
SQLITE_VTAB_CONSTRAINT_SUPPORT -**
Calls of the form -** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, -** where X is an integer. If X is zero, then the [virtual table] whose -** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not -** support constraints. In this configuration (which is the default) if -** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire -** statement is rolled back as if [ON CONFLICT | OR ABORT] had been -** specified as part of the users SQL statement, regardless of the actual -** ON CONFLICT mode specified. -** -** If X is non-zero, then the virtual table implementation guarantees -** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before -** any modifications to internal or persistent data structures have been made. -** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite -** is able to roll back a statement or database transaction, and abandon -** or continue processing the current SQL statement as appropriate. -** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns -** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode -** had been ABORT. -** -** Virtual table implementations that are required to handle OR REPLACE -** must do so within the [xUpdate] method. If a call to the -** [sqlite3_vtab_on_conflict()] function indicates that the current ON -** CONFLICT policy is REPLACE, the virtual table implementation should -** silently replace the appropriate rows within the xUpdate callback and -** return SQLITE_OK. Or, if this is not possible, it may return -** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT -** constraint handling. -**
-*/ -#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 - -/* -** CAPI3REF: Determine The Virtual Table Conflict Policy -** -** This function may only be called from within a call to the [xUpdate] method -** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The -** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], -** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode -** of the SQL statement that triggered the call to the [xUpdate] method of the -** [virtual table]. -*/ -SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); - -/* -** CAPI3REF: Conflict resolution modes -** -** These constants are returned by [sqlite3_vtab_on_conflict()] to -** inform a [virtual table] implementation what the [ON CONFLICT] mode -** is for the SQL statement being evaluated. -** -** Note that the [SQLITE_IGNORE] constant is also used as a potential -** return value from the [sqlite3_set_authorizer()] callback and that -** [SQLITE_ABORT] is also a [result code]. -*/ -#define SQLITE_ROLLBACK 1 -/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ -#define SQLITE_FAIL 3 -/* #define SQLITE_ABORT 4 // Also an error code */ -#define SQLITE_REPLACE 5 - - - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#if 0 -} /* End of the 'extern "C"' block */ -#endif -#endif - -/* -** 2010 August 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -*/ - -#ifndef _SQLITE3RTREE_H_ -#define _SQLITE3RTREE_H_ - - -#if 0 -extern "C" { -#endif - -typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; - -/* -** Register a geometry callback named zGeom that can be used as part of an -** R-Tree geometry query as follows: -** -** SELECT ... FROM WHERE MATCH $zGeom(... params ...) -*/ -SQLITE_API int sqlite3_rtree_geometry_callback( - sqlite3 *db, - const char *zGeom, -#ifdef SQLITE_RTREE_INT_ONLY - int (*xGeom)(sqlite3_rtree_geometry*, int n, sqlite3_int64 *a, int *pRes), -#else - int (*xGeom)(sqlite3_rtree_geometry*, int n, double *a, int *pRes), -#endif - void *pContext -); - - -/* -** A pointer to a structure of the following type is passed as the first -** argument to callbacks registered using rtree_geometry_callback(). -*/ -struct sqlite3_rtree_geometry { - void *pContext; /* Copy of pContext passed to s_r_g_c() */ - int nParam; /* Size of array aParam[] */ - double *aParam; /* Parameters passed to SQL geom function */ - void *pUser; /* Callback implementation user data */ - void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ -}; - - -#if 0 -} /* end of the 'extern "C"' block */ -#endif - -#endif /* ifndef _SQLITE3RTREE_H_ */ - - -/************** End of sqlite3.h *********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include hash.h in the middle of sqliteInt.h ******************/ -/************** Begin file hash.h ********************************************/ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implementation -** used in SQLite. -*/ -#ifndef _SQLITE_HASH_H_ -#define _SQLITE_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct Hash Hash; -typedef struct HashElem HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, some of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -** -** All elements of the hash table are on a single doubly-linked list. -** Hash.first points to the head of this list. -** -** There are Hash.htsize buckets. Each bucket points to a spot in -** the global doubly-linked list. The contents of the bucket are the -** element pointed to plus the next _ht.count-1 elements in the list. -** -** Hash.htsize and Hash.ht may be zero. In that case lookup is done -** by a linear search of the global list. For small tables, the -** Hash.ht table is never allocated because if there are few elements -** in the table, it is faster to do a linear search than to manage -** the hash table. -*/ -struct Hash { - unsigned int htsize; /* Number of buckets in the hash table */ - unsigned int count; /* Number of entries in this table */ - HashElem *first; /* The first element of the array */ - struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ - HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct HashElem { - HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - const char *pKey; int nKey; /* Key associated with this element */ -}; - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -SQLITE_PRIVATE void sqlite3HashInit(Hash*); -SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData); -SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey); -SQLITE_PRIVATE void sqlite3HashClear(Hash*); - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** Hash h; -** HashElem *p; -** ... -** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ -** SomeStructure *pData = sqliteHashData(p); -** // do something with pData -** } -*/ -#define sqliteHashFirst(H) ((H)->first) -#define sqliteHashNext(E) ((E)->next) -#define sqliteHashData(E) ((E)->data) -/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ -/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ - -/* -** Number of entries in a hash table -*/ -/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ - -#endif /* _SQLITE_HASH_H_ */ - -/************** End of hash.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include parse.h in the middle of sqliteInt.h *****************/ -/************** Begin file parse.h *******************************************/ -#define TK_SEMI 1 -#define TK_EXPLAIN 2 -#define TK_QUERY 3 -#define TK_PLAN 4 -#define TK_BEGIN 5 -#define TK_TRANSACTION 6 -#define TK_DEFERRED 7 -#define TK_IMMEDIATE 8 -#define TK_EXCLUSIVE 9 -#define TK_COMMIT 10 -#define TK_END 11 -#define TK_ROLLBACK 12 -#define TK_SAVEPOINT 13 -#define TK_RELEASE 14 -#define TK_TO 15 -#define TK_TABLE 16 -#define TK_CREATE 17 -#define TK_IF 18 -#define TK_NOT 19 -#define TK_EXISTS 20 -#define TK_TEMP 21 -#define TK_LP 22 -#define TK_RP 23 -#define TK_AS 24 -#define TK_COMMA 25 -#define TK_ID 26 -#define TK_INDEXED 27 -#define TK_ABORT 28 -#define TK_ACTION 29 -#define TK_AFTER 30 -#define TK_ANALYZE 31 -#define TK_ASC 32 -#define TK_ATTACH 33 -#define TK_BEFORE 34 -#define TK_BY 35 -#define TK_CASCADE 36 -#define TK_CAST 37 -#define TK_COLUMNKW 38 -#define TK_CONFLICT 39 -#define TK_DATABASE 40 -#define TK_DESC 41 -#define TK_DETACH 42 -#define TK_EACH 43 -#define TK_FAIL 44 -#define TK_FOR 45 -#define TK_IGNORE 46 -#define TK_INITIALLY 47 -#define TK_INSTEAD 48 -#define TK_LIKE_KW 49 -#define TK_MATCH 50 -#define TK_NO 51 -#define TK_KEY 52 -#define TK_OF 53 -#define TK_OFFSET 54 -#define TK_PRAGMA 55 -#define TK_RAISE 56 -#define TK_REPLACE 57 -#define TK_RESTRICT 58 -#define TK_ROW 59 -#define TK_TRIGGER 60 -#define TK_VACUUM 61 -#define TK_VIEW 62 -#define TK_VIRTUAL 63 -#define TK_REINDEX 64 -#define TK_RENAME 65 -#define TK_CTIME_KW 66 -#define TK_ANY 67 -#define TK_OR 68 -#define TK_AND 69 -#define TK_IS 70 -#define TK_BETWEEN 71 -#define TK_IN 72 -#define TK_ISNULL 73 -#define TK_NOTNULL 74 -#define TK_NE 75 -#define TK_EQ 76 -#define TK_GT 77 -#define TK_LE 78 -#define TK_LT 79 -#define TK_GE 80 -#define TK_ESCAPE 81 -#define TK_BITAND 82 -#define TK_BITOR 83 -#define TK_LSHIFT 84 -#define TK_RSHIFT 85 -#define TK_PLUS 86 -#define TK_MINUS 87 -#define TK_STAR 88 -#define TK_SLASH 89 -#define TK_REM 90 -#define TK_CONCAT 91 -#define TK_COLLATE 92 -#define TK_BITNOT 93 -#define TK_STRING 94 -#define TK_JOIN_KW 95 -#define TK_CONSTRAINT 96 -#define TK_DEFAULT 97 -#define TK_NULL 98 -#define TK_PRIMARY 99 -#define TK_UNIQUE 100 -#define TK_CHECK 101 -#define TK_REFERENCES 102 -#define TK_AUTOINCR 103 -#define TK_ON 104 -#define TK_INSERT 105 -#define TK_DELETE 106 -#define TK_UPDATE 107 -#define TK_SET 108 -#define TK_DEFERRABLE 109 -#define TK_FOREIGN 110 -#define TK_DROP 111 -#define TK_UNION 112 -#define TK_ALL 113 -#define TK_EXCEPT 114 -#define TK_INTERSECT 115 -#define TK_SELECT 116 -#define TK_DISTINCT 117 -#define TK_DOT 118 -#define TK_FROM 119 -#define TK_JOIN 120 -#define TK_USING 121 -#define TK_ORDER 122 -#define TK_GROUP 123 -#define TK_HAVING 124 -#define TK_LIMIT 125 -#define TK_WHERE 126 -#define TK_INTO 127 -#define TK_VALUES 128 -#define TK_INTEGER 129 -#define TK_FLOAT 130 -#define TK_BLOB 131 -#define TK_REGISTER 132 -#define TK_VARIABLE 133 -#define TK_CASE 134 -#define TK_WHEN 135 -#define TK_THEN 136 -#define TK_ELSE 137 -#define TK_INDEX 138 -#define TK_ALTER 139 -#define TK_ADD 140 -#define TK_TO_TEXT 141 -#define TK_TO_BLOB 142 -#define TK_TO_NUMERIC 143 -#define TK_TO_INT 144 -#define TK_TO_REAL 145 -#define TK_ISNOT 146 -#define TK_END_OF_FILE 147 -#define TK_ILLEGAL 148 -#define TK_SPACE 149 -#define TK_UNCLOSED_STRING 150 -#define TK_FUNCTION 151 -#define TK_COLUMN 152 -#define TK_AGG_FUNCTION 153 -#define TK_AGG_COLUMN 154 -#define TK_CONST_FUNC 155 -#define TK_UMINUS 156 -#define TK_UPLUS 157 - -/************** End of parse.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -#include -#include -#include -#include -#include - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite_int64 -# define float sqlite_int64 -# define LONGDOUBLE_TYPE sqlite_int64 -# ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) -# endif -# define SQLITE_OMIT_DATETIME_FUNCS 1 -# define SQLITE_OMIT_TRACE 1 -# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -# undef SQLITE_HAVE_ISNAN -#endif -#ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (1e99) -#endif - -/* -** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 -** afterward. Having this macro allows us to cause the C compiler -** to omit code used by TEMP tables without messy #ifndef statements. -*/ -#ifdef SQLITE_OMIT_TEMPDB -#define OMIT_TEMPDB 1 -#else -#define OMIT_TEMPDB 0 -#endif - -/* -** The "file format" number is an integer that is incremented whenever -** the VDBE-level file format changes. The following macros define the -** the default file format for new databases and the maximum file format -** that the library can read. -*/ -#define SQLITE_MAX_FILE_FORMAT 4 -#ifndef SQLITE_DEFAULT_FILE_FORMAT -# define SQLITE_DEFAULT_FILE_FORMAT 4 -#endif - -/* -** Determine whether triggers are recursive by default. This can be -** changed at run-time using a pragma. -*/ -#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS -# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 -#endif - -/* -** Provide a default value for SQLITE_TEMP_STORE in case it is not specified -** on the command-line -*/ -#ifndef SQLITE_TEMP_STORE -# define SQLITE_TEMP_STORE 1 -# define SQLITE_TEMP_STORE_xc 1 /* Exclude from ctime.c */ -#endif - -/* -** GCC does not define the offsetof() macro so we'll have to do it -** ourselves. -*/ -#ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) -#endif - -/* -** Check to see if this machine uses EBCDIC. (Yes, believe it or -** not, there are still machines out there that use EBCDIC.) -*/ -#if 'A' == '\301' -# define SQLITE_EBCDIC 1 -#else -# define SQLITE_ASCII 1 -#endif - -/* -** Integers of known sizes. These typedefs might change for architectures -** where the sizes very. Preprocessor macros are available so that the -** types can be conveniently redefined at compile-type. Like this: -** -** cc '-DUINTPTR_TYPE=long long int' ... -*/ -#ifndef UINT32_TYPE -# ifdef HAVE_UINT32_T -# define UINT32_TYPE uint32_t -# else -# define UINT32_TYPE unsigned int -# endif -#endif -#ifndef UINT16_TYPE -# ifdef HAVE_UINT16_T -# define UINT16_TYPE uint16_t -# else -# define UINT16_TYPE unsigned short int -# endif -#endif -#ifndef INT16_TYPE -# ifdef HAVE_INT16_T -# define INT16_TYPE int16_t -# else -# define INT16_TYPE short int -# endif -#endif -#ifndef UINT8_TYPE -# ifdef HAVE_UINT8_T -# define UINT8_TYPE uint8_t -# else -# define UINT8_TYPE unsigned char -# endif -#endif -#ifndef INT8_TYPE -# ifdef HAVE_INT8_T -# define INT8_TYPE int8_t -# else -# define INT8_TYPE signed char -# endif -#endif -#ifndef LONGDOUBLE_TYPE -# define LONGDOUBLE_TYPE long double -#endif -typedef sqlite_int64 i64; /* 8-byte signed integer */ -typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ -typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ -typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ -typedef INT16_TYPE i16; /* 2-byte signed integer */ -typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ -typedef INT8_TYPE i8; /* 1-byte signed integer */ - -/* -** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value -** that can be stored in a u32 without loss of data. The value -** is 0x00000000ffffffff. But because of quirks of some compilers, we -** have to specify the value in the less intuitive manner shown: -*/ -#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) - -/* -** The datatype used to store estimates of the number of rows in a -** table or index. This is an unsigned integer type. For 99.9% of -** the world, a 32-bit integer is sufficient. But a 64-bit integer -** can be used at compile-time if desired. -*/ -#ifdef SQLITE_64BIT_STATS - typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ -#else - typedef u32 tRowcnt; /* 32-bit is the default */ -#endif - -/* -** Macros to determine whether the machine is big or little endian, -** evaluated at runtime. -*/ -#ifdef SQLITE_AMALGAMATION -SQLITE_PRIVATE const int sqlite3one = 1; -#else -SQLITE_PRIVATE const int sqlite3one; -#endif -#if defined(i386) || defined(__i386__) || defined(_M_IX86)\ - || defined(__x86_64) || defined(__x86_64__) -# define SQLITE_BIGENDIAN 0 -# define SQLITE_LITTLEENDIAN 1 -# define SQLITE_UTF16NATIVE SQLITE_UTF16LE -#else -# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) -# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) -# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) -#endif - -/* -** Constants for the largest and smallest possible 64-bit signed integers. -** These macros are designed to work correctly on both 32-bit and 64-bit -** compilers. -*/ -#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) -#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) - -/* -** Round up a number to the next larger multiple of 8. This is used -** to force 8-byte alignment on 64-bit architectures. -*/ -#define ROUND8(x) (((x)+7)&~7) - -/* -** Round down to the nearest multiple of 8 -*/ -#define ROUNDDOWN8(x) ((x)&~7) - -/* -** Assert that the pointer X is aligned to an 8-byte boundary. This -** macro is used only within assert() to verify that the code gets -** all alignment restrictions correct. -** -** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the -** underlying malloc() implemention might return us 4-byte aligned -** pointers. In that case, only verify 4-byte alignment. -*/ -#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) -#else -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) -#endif - -/* -** Disable MMAP on platforms where it is known to not work -*/ -#if defined(__OpenBSD__) || defined(__QNXNTO__) -# undef SQLITE_MAX_MMAP_SIZE -# define SQLITE_MAX_MMAP_SIZE 0 -#endif - -/* -** Default maximum size of memory used by memory-mapped I/O in the VFS -*/ -#ifdef __APPLE__ -# include -# if TARGET_OS_IPHONE -# undef SQLITE_MAX_MMAP_SIZE -# define SQLITE_MAX_MMAP_SIZE 0 -# endif -#endif -#ifndef SQLITE_MAX_MMAP_SIZE -# if defined(__linux__) \ - || defined(_WIN32) \ - || (defined(__APPLE__) && defined(__MACH__)) \ - || defined(__sun) -# define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */ -# else -# define SQLITE_MAX_MMAP_SIZE 0 -# endif -# define SQLITE_MAX_MMAP_SIZE_xc 1 /* exclude from ctime.c */ -#endif - -/* -** The default MMAP_SIZE is zero on all platforms. Or, even if a larger -** default MMAP_SIZE is specified at compile-time, make sure that it does -** not exceed the maximum mmap size. -*/ -#ifndef SQLITE_DEFAULT_MMAP_SIZE -# define SQLITE_DEFAULT_MMAP_SIZE 0 -# define SQLITE_DEFAULT_MMAP_SIZE_xc 1 /* Exclude from ctime.c */ -#endif -#if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE -# undef SQLITE_DEFAULT_MMAP_SIZE -# define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE -#endif - -/* -** An instance of the following structure is used to store the busy-handler -** callback for a given sqlite handle. -** -** The sqlite.busyHandler member of the sqlite struct contains the busy -** callback for the database handle. Each pager opened via the sqlite -** handle is passed a pointer to sqlite.busyHandler. The busy-handler -** callback is currently invoked only from within pager.c. -*/ -typedef struct BusyHandler BusyHandler; -struct BusyHandler { - int (*xFunc)(void *,int); /* The busy callback */ - void *pArg; /* First arg to busy callback */ - int nBusy; /* Incremented with each busy call */ -}; - -/* -** Name of the master database table. The master database table -** is a special table that holds the names and attributes of all -** user tables and indices. -*/ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" - -/* -** The root-page of the master database table. -*/ -#define MASTER_ROOT 1 - -/* -** The name of the schema table. -*/ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) - -/* -** A convenience macro that returns the number of elements in -** an array. -*/ -#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) - -/* -** Determine if the argument is a power of two -*/ -#define IsPowerOfTwo(X) (((X)&((X)-1))==0) - -/* -** The following value as a destructor means to use sqlite3DbFree(). -** The sqlite3DbFree() routine requires two parameters instead of the -** one parameter that destructors normally want. So we have to introduce -** this magic value that the code knows to handle differently. Any -** pointer will work here as long as it is distinct from SQLITE_STATIC -** and SQLITE_TRANSIENT. -*/ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3MallocSize) - -/* -** When SQLITE_OMIT_WSD is defined, it means that the target platform does -** not support Writable Static Data (WSD) such as global and static variables. -** All variables must either be on the stack or dynamically allocated from -** the heap. When WSD is unsupported, the variable declarations scattered -** throughout the SQLite code must become constants instead. The SQLITE_WSD -** macro is used for this purpose. And instead of referencing the variable -** directly, we use its constant as a key to lookup the run-time allocated -** buffer that holds real variable. The constant is also the initializer -** for the run-time allocated buffer. -** -** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL -** macros become no-ops and have zero performance impact. -*/ -#ifdef SQLITE_OMIT_WSD - #define SQLITE_WSD const - #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) - #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) -SQLITE_API int sqlite3_wsd_init(int N, int J); -SQLITE_API void *sqlite3_wsd_find(void *K, int L); -#else - #define SQLITE_WSD - #define GLOBAL(t,v) v - #define sqlite3GlobalConfig sqlite3Config -#endif - -/* -** The following macros are used to suppress compiler warnings and to -** make it clear to human readers when a function parameter is deliberately -** left unused within the body of a function. This usually happens when -** a function is called via a function pointer. For example the -** implementation of an SQL aggregate step callback may not use the -** parameter indicating the number of arguments passed to the aggregate, -** if it knows that this is enforced elsewhere. -** -** When a function parameter is not used at all within the body of a function, -** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. -** However, these macros may also be used to suppress warnings related to -** parameters that may or may not be used depending on compilation options. -** For example those parameters only used in assert() statements. In these -** cases the parameters are named as per the usual conventions. -*/ -#define UNUSED_PARAMETER(x) (void)(x) -#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) - -/* -** Forward references to structures -*/ -typedef struct AggInfo AggInfo; -typedef struct AuthContext AuthContext; -typedef struct AutoincInfo AutoincInfo; -typedef struct Bitvec Bitvec; -typedef struct CollSeq CollSeq; -typedef struct Column Column; -typedef struct Db Db; -typedef struct Schema Schema; -typedef struct Expr Expr; -typedef struct ExprList ExprList; -typedef struct ExprSpan ExprSpan; -typedef struct FKey FKey; -typedef struct FuncDestructor FuncDestructor; -typedef struct FuncDef FuncDef; -typedef struct FuncDefHash FuncDefHash; -typedef struct IdList IdList; -typedef struct Index Index; -typedef struct IndexSample IndexSample; -typedef struct KeyClass KeyClass; -typedef struct KeyInfo KeyInfo; -typedef struct Lookaside Lookaside; -typedef struct LookasideSlot LookasideSlot; -typedef struct Module Module; -typedef struct NameContext NameContext; -typedef struct Parse Parse; -typedef struct RowSet RowSet; -typedef struct Savepoint Savepoint; -typedef struct Select Select; -typedef struct SelectDest SelectDest; -typedef struct SrcList SrcList; -typedef struct StrAccum StrAccum; -typedef struct Table Table; -typedef struct TableLock TableLock; -typedef struct Token Token; -typedef struct Trigger Trigger; -typedef struct TriggerPrg TriggerPrg; -typedef struct TriggerStep TriggerStep; -typedef struct UnpackedRecord UnpackedRecord; -typedef struct VTable VTable; -typedef struct VtabCtx VtabCtx; -typedef struct Walker Walker; -typedef struct WherePlan WherePlan; -typedef struct WhereInfo WhereInfo; -typedef struct WhereLevel WhereLevel; - -/* -** Defer sourcing vdbe.h and btree.h until after the "u8" and -** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque -** pointer types (i.e. FuncDef) defined above. -*/ -/************** Include btree.h in the middle of sqliteInt.h *****************/ -/************** Begin file btree.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite B-Tree file -** subsystem. See comments in the source code for a detailed description -** of what each interface routine does. -*/ -#ifndef _BTREE_H_ -#define _BTREE_H_ - -/* TODO: This definition is just included so other modules compile. It -** needs to be revisited. -*/ -#define SQLITE_N_BTREE_META 10 - -/* -** If defined as non-zero, auto-vacuum is enabled by default. Otherwise -** it must be turned on for each database using "PRAGMA auto_vacuum = 1". -*/ -#ifndef SQLITE_DEFAULT_AUTOVACUUM - #define SQLITE_DEFAULT_AUTOVACUUM 0 -#endif - -#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ -#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ -#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ - -/* -** Forward declarations of structure -*/ -typedef struct Btree Btree; -typedef struct BtCursor BtCursor; -typedef struct BtShared BtShared; - - -SQLITE_PRIVATE int sqlite3BtreeOpen( - sqlite3_vfs *pVfs, /* VFS to use with this b-tree */ - const char *zFilename, /* Name of database file to open */ - sqlite3 *db, /* Associated database connection */ - Btree **ppBtree, /* Return open Btree* here */ - int flags, /* Flags */ - int vfsFlags /* Flags passed through to VFS open */ -); - -/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the -** following values. -** -** NOTE: These values must match the corresponding PAGER_ values in -** pager.h. -*/ -#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ -#define BTREE_MEMORY 2 /* This is an in-memory DB */ -#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */ -#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */ - -SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64); -SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int,int); -SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); -SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); -SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); -SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); -#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG) -SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); -#endif -SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); -SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); -SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); -SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); -SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); -SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); -SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); -SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); -SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); -SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); - -SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); -SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); -SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); - -SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); - -/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR -** of the flags shown below. -** -** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. -** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data -** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With -** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored -** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL -** indices.) -*/ -#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ -#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ - -SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); -SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); -SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int); - -SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); -SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); - -SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); - -/* -** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta -** should be one of the following values. The integer values are assigned -** to constants so that the offset of the corresponding field in an -** SQLite database header may be found using the following formula: -** -** offset = 36 + (idx * 4) -** -** For example, the free-page-count field is located at byte offset 36 of -** the database file header. The incr-vacuum-flag field is located at -** byte offset 64 (== 36+4*7). -*/ -#define BTREE_FREE_PAGE_COUNT 0 -#define BTREE_SCHEMA_VERSION 1 -#define BTREE_FILE_FORMAT 2 -#define BTREE_DEFAULT_CACHE_SIZE 3 -#define BTREE_LARGEST_ROOT_PAGE 4 -#define BTREE_TEXT_ENCODING 5 -#define BTREE_USER_VERSION 6 -#define BTREE_INCR_VACUUM 7 -#define BTREE_APPLICATION_ID 8 - -/* -** Values that may be OR'd together to form the second argument of an -** sqlite3BtreeCursorHints() call. -*/ -#define BTREE_BULKLOAD 0x00000001 - -SQLITE_PRIVATE int sqlite3BtreeCursor( - Btree*, /* BTree containing table to open */ - int iTable, /* Index of root page */ - int wrFlag, /* 1 for writing. 0 for read-only */ - struct KeyInfo*, /* First argument to compare function */ - BtCursor *pCursor /* Space to write cursor structure */ -); -SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); -SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); - -SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( - BtCursor*, - UnpackedRecord *pUnKey, - i64 intKey, - int bias, - int *pRes -); -SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*); -SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, - const void *pData, int nData, - int nZero, int bias, int seekResult); -SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); -SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); -SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); -SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); -SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); -SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); - -SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); -SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); - -SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); -SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *); -SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); -SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); -SQLITE_PRIVATE void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask); - -#ifndef NDEBUG -SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); -#endif - -#ifndef SQLITE_OMIT_BTREECOUNT -SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); -SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); -#endif - -#ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); -#endif - -/* -** If we are not using shared cache, then there is no need to -** use mutexes to access the BtShared structures. So make the -** Enter and Leave procedures no-ops. -*/ -#ifndef SQLITE_OMIT_SHARED_CACHE -SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); -#else -# define sqlite3BtreeEnter(X) -# define sqlite3BtreeEnterAll(X) -#endif - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE -SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); -SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); -#ifndef NDEBUG - /* These routines are used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); -SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); -SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); -#endif -#else - -# define sqlite3BtreeSharable(X) 0 -# define sqlite3BtreeLeave(X) -# define sqlite3BtreeEnterCursor(X) -# define sqlite3BtreeLeaveCursor(X) -# define sqlite3BtreeLeaveAll(X) - -# define sqlite3BtreeHoldsMutex(X) 1 -# define sqlite3BtreeHoldsAllMutexes(X) 1 -# define sqlite3SchemaMutexHeld(X,Y,Z) 1 -#endif - - -#endif /* _BTREE_H_ */ - -/************** End of btree.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include vdbe.h in the middle of sqliteInt.h ******************/ -/************** Begin file vdbe.h ********************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Header file for the Virtual DataBase Engine (VDBE) -** -** This header defines the interface to the virtual database engine -** or VDBE. The VDBE implements an abstract machine that runs a -** simple program to access and modify the underlying database. -*/ -#ifndef _SQLITE_VDBE_H_ -#define _SQLITE_VDBE_H_ -/* #include */ - -/* -** A single VDBE is an opaque structure named "Vdbe". Only routines -** in the source file sqliteVdbe.c are allowed to see the insides -** of this structure. -*/ -typedef struct Vdbe Vdbe; - -/* -** The names of the following types declared in vdbeInt.h are required -** for the VdbeOp definition. -*/ -typedef struct VdbeFunc VdbeFunc; -typedef struct Mem Mem; -typedef struct SubProgram SubProgram; - -/* -** A single instruction of the virtual machine has an opcode -** and as many as three operands. The instruction is recorded -** as an instance of the following structure: -*/ -struct VdbeOp { - u8 opcode; /* What operation to perform */ - signed char p4type; /* One of the P4_xxx constants for p4 */ - u8 opflags; /* Mask of the OPFLG_* flags in opcodes.h */ - u8 p5; /* Fifth parameter is an unsigned character */ - int p1; /* First operand */ - int p2; /* Second parameter (often the jump destination) */ - int p3; /* The third parameter */ - union { /* fourth parameter */ - int i; /* Integer value if p4type==P4_INT32 */ - void *p; /* Generic pointer */ - char *z; /* Pointer to data for string (char array) types */ - i64 *pI64; /* Used when p4type is P4_INT64 */ - double *pReal; /* Used when p4type is P4_REAL */ - FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ - VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */ - CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ - Mem *pMem; /* Used when p4type is P4_MEM */ - VTable *pVtab; /* Used when p4type is P4_VTAB */ - KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ - int *ai; /* Used when p4type is P4_INTARRAY */ - SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ - int (*xAdvance)(BtCursor *, int *); - } p4; -#ifdef SQLITE_DEBUG - char *zComment; /* Comment to improve readability */ -#endif -#ifdef VDBE_PROFILE - int cnt; /* Number of times this instruction was executed */ - u64 cycles; /* Total time spent executing this instruction */ -#endif -}; -typedef struct VdbeOp VdbeOp; - - -/* -** A sub-routine used to implement a trigger program. -*/ -struct SubProgram { - VdbeOp *aOp; /* Array of opcodes for sub-program */ - int nOp; /* Elements in aOp[] */ - int nMem; /* Number of memory cells required */ - int nCsr; /* Number of cursors required */ - int nOnce; /* Number of OP_Once instructions */ - void *token; /* id that may be used to recursive triggers */ - SubProgram *pNext; /* Next sub-program already visited */ -}; - -/* -** A smaller version of VdbeOp used for the VdbeAddOpList() function because -** it takes up less space. -*/ -struct VdbeOpList { - u8 opcode; /* What operation to perform */ - signed char p1; /* First operand */ - signed char p2; /* Second parameter (often the jump destination) */ - signed char p3; /* Third parameter */ -}; -typedef struct VdbeOpList VdbeOpList; - -/* -** Allowed values of VdbeOp.p4type -*/ -#define P4_NOTUSED 0 /* The P4 parameter is not used */ -#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ -#define P4_STATIC (-2) /* Pointer to a static string */ -#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ -#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ -#define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ -#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ -#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ -#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ -#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ -#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ -#define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */ - -/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure -** is made. That copy is freed when the Vdbe is finalized. But if the -** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still -** gets freed when the Vdbe is finalized so it still should be obtained -** from a single sqliteMalloc(). But no copy is made and the calling -** function should *not* try to free the KeyInfo. -*/ -#define P4_KEYINFO_HANDOFF (-16) -#define P4_KEYINFO_STATIC (-17) - -/* -** The Vdbe.aColName array contains 5n Mem structures, where n is the -** number of columns of data returned by the statement. -*/ -#define COLNAME_NAME 0 -#define COLNAME_DECLTYPE 1 -#define COLNAME_DATABASE 2 -#define COLNAME_TABLE 3 -#define COLNAME_COLUMN 4 -#ifdef SQLITE_ENABLE_COLUMN_METADATA -# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ -#else -# ifdef SQLITE_OMIT_DECLTYPE -# define COLNAME_N 1 /* Store only the name */ -# else -# define COLNAME_N 2 /* Store the name and decltype */ -# endif -#endif - -/* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. -*/ -#define ADDR(X) (-1-(X)) - -/* -** The makefile scans the vdbe.c source file and creates the "opcodes.h" -** header file that defines a number for each opcode used by the VDBE. -*/ -/************** Include opcodes.h in the middle of vdbe.h ********************/ -/************** Begin file opcodes.h *****************************************/ -/* Automatically generated. Do not edit */ -/* See the mkopcodeh.awk script for details */ -#define OP_Goto 1 -#define OP_Gosub 2 -#define OP_Return 3 -#define OP_Yield 4 -#define OP_HaltIfNull 5 -#define OP_Halt 6 -#define OP_Integer 7 -#define OP_Int64 8 -#define OP_Real 130 /* same as TK_FLOAT */ -#define OP_String8 94 /* same as TK_STRING */ -#define OP_String 9 -#define OP_Null 10 -#define OP_Blob 11 -#define OP_Variable 12 -#define OP_Move 13 -#define OP_Copy 14 -#define OP_SCopy 15 -#define OP_ResultRow 16 -#define OP_Concat 91 /* same as TK_CONCAT */ -#define OP_Add 86 /* same as TK_PLUS */ -#define OP_Subtract 87 /* same as TK_MINUS */ -#define OP_Multiply 88 /* same as TK_STAR */ -#define OP_Divide 89 /* same as TK_SLASH */ -#define OP_Remainder 90 /* same as TK_REM */ -#define OP_CollSeq 17 -#define OP_Function 18 -#define OP_BitAnd 82 /* same as TK_BITAND */ -#define OP_BitOr 83 /* same as TK_BITOR */ -#define OP_ShiftLeft 84 /* same as TK_LSHIFT */ -#define OP_ShiftRight 85 /* same as TK_RSHIFT */ -#define OP_AddImm 20 -#define OP_MustBeInt 21 -#define OP_RealAffinity 22 -#define OP_ToText 141 /* same as TK_TO_TEXT */ -#define OP_ToBlob 142 /* same as TK_TO_BLOB */ -#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ -#define OP_ToInt 144 /* same as TK_TO_INT */ -#define OP_ToReal 145 /* same as TK_TO_REAL */ -#define OP_Eq 76 /* same as TK_EQ */ -#define OP_Ne 75 /* same as TK_NE */ -#define OP_Lt 79 /* same as TK_LT */ -#define OP_Le 78 /* same as TK_LE */ -#define OP_Gt 77 /* same as TK_GT */ -#define OP_Ge 80 /* same as TK_GE */ -#define OP_Permutation 23 -#define OP_Compare 24 -#define OP_Jump 25 -#define OP_And 69 /* same as TK_AND */ -#define OP_Or 68 /* same as TK_OR */ -#define OP_Not 19 /* same as TK_NOT */ -#define OP_BitNot 93 /* same as TK_BITNOT */ -#define OP_Once 26 -#define OP_If 27 -#define OP_IfNot 28 -#define OP_IsNull 73 /* same as TK_ISNULL */ -#define OP_NotNull 74 /* same as TK_NOTNULL */ -#define OP_Column 29 -#define OP_Affinity 30 -#define OP_MakeRecord 31 -#define OP_Count 32 -#define OP_Savepoint 33 -#define OP_AutoCommit 34 -#define OP_Transaction 35 -#define OP_ReadCookie 36 -#define OP_SetCookie 37 -#define OP_VerifyCookie 38 -#define OP_OpenRead 39 -#define OP_OpenWrite 40 -#define OP_OpenAutoindex 41 -#define OP_OpenEphemeral 42 -#define OP_SorterOpen 43 -#define OP_OpenPseudo 44 -#define OP_Close 45 -#define OP_SeekLt 46 -#define OP_SeekLe 47 -#define OP_SeekGe 48 -#define OP_SeekGt 49 -#define OP_Seek 50 -#define OP_NotFound 51 -#define OP_Found 52 -#define OP_IsUnique 53 -#define OP_NotExists 54 -#define OP_Sequence 55 -#define OP_NewRowid 56 -#define OP_Insert 57 -#define OP_InsertInt 58 -#define OP_Delete 59 -#define OP_ResetCount 60 -#define OP_SorterCompare 61 -#define OP_SorterData 62 -#define OP_RowKey 63 -#define OP_RowData 64 -#define OP_Rowid 65 -#define OP_NullRow 66 -#define OP_Last 67 -#define OP_SorterSort 70 -#define OP_Sort 71 -#define OP_Rewind 72 -#define OP_SorterNext 81 -#define OP_Prev 92 -#define OP_Next 95 -#define OP_SorterInsert 96 -#define OP_IdxInsert 97 -#define OP_IdxDelete 98 -#define OP_IdxRowid 99 -#define OP_IdxLT 100 -#define OP_IdxGE 101 -#define OP_Destroy 102 -#define OP_Clear 103 -#define OP_CreateIndex 104 -#define OP_CreateTable 105 -#define OP_ParseSchema 106 -#define OP_LoadAnalysis 107 -#define OP_DropTable 108 -#define OP_DropIndex 109 -#define OP_DropTrigger 110 -#define OP_IntegrityCk 111 -#define OP_RowSetAdd 112 -#define OP_RowSetRead 113 -#define OP_RowSetTest 114 -#define OP_Program 115 -#define OP_Param 116 -#define OP_FkCounter 117 -#define OP_FkIfZero 118 -#define OP_MemMax 119 -#define OP_IfPos 120 -#define OP_IfNeg 121 -#define OP_IfZero 122 -#define OP_AggStep 123 -#define OP_AggFinal 124 -#define OP_Checkpoint 125 -#define OP_JournalMode 126 -#define OP_Vacuum 127 -#define OP_IncrVacuum 128 -#define OP_Expire 129 -#define OP_TableLock 131 -#define OP_VBegin 132 -#define OP_VCreate 133 -#define OP_VDestroy 134 -#define OP_VOpen 135 -#define OP_VFilter 136 -#define OP_VColumn 137 -#define OP_VNext 138 -#define OP_VRename 139 -#define OP_VUpdate 140 -#define OP_Pagecount 146 -#define OP_MaxPgcnt 147 -#define OP_Trace 148 -#define OP_Noop 149 -#define OP_Explain 150 - - -/* Properties such as "out2" or "jump" that are specified in -** comments following the "case" for each opcode in the vdbe.c -** are encoded into bitvectors as follows: -*/ -#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ -#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ -#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ -#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ -#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ -#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ -#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ -#define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x01, 0x01, 0x04, 0x04, 0x10, 0x00, 0x02,\ -/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x24,\ -/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ -/* 24 */ 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00,\ -/* 32 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00,\ -/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\ -/* 48 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x02,\ -/* 56 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 64 */ 0x00, 0x02, 0x00, 0x01, 0x4c, 0x4c, 0x01, 0x01,\ -/* 72 */ 0x01, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ -/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ -/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x01,\ -/* 96 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\ -/* 104 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 112 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\ -/* 120 */ 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00,\ -/* 128 */ 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 136 */ 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x04, 0x04,\ -/* 144 */ 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00,} - -/************** End of opcodes.h *********************************************/ -/************** Continuing where we left off in vdbe.h ***********************/ - -/* -** Prototypes for the VDBE interface. See comments on the implementation -** for a description of what each of these routines does. -*/ -SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); -SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); -SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); -SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); -SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); -SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr); -SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); -SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); -SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); -#ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); -SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*); -#endif -SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*); -SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); -SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); -SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); -SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); -SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, u8); -SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); -#ifndef SQLITE_OMIT_TRACE -SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); -#endif - -SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); -SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); -SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); - -#ifndef SQLITE_OMIT_TRIGGER -SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif - - -#ifndef NDEBUG -SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); -# define VdbeComment(X) sqlite3VdbeComment X -SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); -# define VdbeNoopComment(X) sqlite3VdbeNoopComment X -#else -# define VdbeComment(X) -# define VdbeNoopComment(X) -#endif - -#endif - -/************** End of vdbe.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pager.h in the middle of sqliteInt.h *****************/ -/************** Begin file pager.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. The page cache subsystem reads and writes a file a page -** at a time and provides a journal for rollback. -*/ - -#ifndef _PAGER_H_ -#define _PAGER_H_ - -/* -** Default maximum size for persistent journal files. A negative -** value means no limit. This value may be overridden using the -** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". -*/ -#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT - #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 -#endif - -/* -** The type used to represent a page number. The first page in a file -** is called page 1. 0 is used to represent "not a page". -*/ -typedef u32 Pgno; - -/* -** Each open file is managed by a separate instance of the "Pager" structure. -*/ -typedef struct Pager Pager; - -/* -** Handle type for pages. -*/ -typedef struct PgHdr DbPage; - -/* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is -** reserved for working around a windows/posix incompatibility). It is -** used in the journal to signify that the remainder of the journal file -** is devoted to storing a master journal name - there are no more pages to -** roll back. See comments for function writeMasterJournal() in pager.c -** for details. -*/ -#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) - -/* -** Allowed values for the flags parameter to sqlite3PagerOpen(). -** -** NOTE: These values must match the corresponding BTREE_ values in btree.h. -*/ -#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ -#define PAGER_MEMORY 0x0002 /* In-memory database */ - -/* -** Valid values for the second argument to sqlite3PagerLockingMode(). -*/ -#define PAGER_LOCKINGMODE_QUERY -1 -#define PAGER_LOCKINGMODE_NORMAL 0 -#define PAGER_LOCKINGMODE_EXCLUSIVE 1 - -/* -** Numeric constants that encode the journalmode. -*/ -#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ -#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ -#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ -#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ -#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ -#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ -#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ - -/* -** Flags that make up the mask passed to sqlite3PagerAcquire(). -*/ -#define PAGER_ACQUIRE_NOCONTENT 0x01 /* Do not load data from disk */ -#define PAGER_ACQUIRE_READONLY 0x02 /* Read-only page is acceptable */ - -/* -** The remainder of this file contains the declarations of the functions -** that make up the Pager sub-system API. See source code comments for -** a detailed description of each routine. -*/ - -/* Open and close a Pager connection. */ -SQLITE_PRIVATE int sqlite3PagerOpen( - sqlite3_vfs*, - Pager **ppPager, - const char*, - int, - int, - int, - void(*)(DbPage*) -); -SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); - -/* Functions used to configure a Pager object. */ -SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); -SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); -SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); -SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); -SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int); -SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); -SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); -SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); -SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); - -/* Functions used to obtain and release page references. */ -SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); -#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) -SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); -SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); -SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); - -/* Operations on page references. */ -SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); -SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); -SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); -SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); -SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); - -/* Functions used to manage pager transactions and savepoints. */ -SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); -SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); -SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); -SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); -SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); -SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); -SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); - -#ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); -SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); -SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); -#endif - -#ifdef SQLITE_ENABLE_ZIPVFS -SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); -#endif - -/* Functions used to query pager state and configuration. */ -SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); -SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); -SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*, int); -SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); -SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); -SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); -SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); -SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); -SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); -SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *); -SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); - -/* Functions used to truncate the database file. */ -SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); - -#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) -SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *); -#endif - -/* Functions to support testing and debugging. */ -#if !defined(NDEBUG) || defined(SQLITE_TEST) -SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); -SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); -#endif -#ifdef SQLITE_TEST -SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); -SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); - void disable_simulated_io_errors(void); - void enable_simulated_io_errors(void); -#else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() -#endif - -#endif /* _PAGER_H_ */ - -/************** End of pager.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pcache.h in the middle of sqliteInt.h ****************/ -/************** Begin file pcache.h ******************************************/ -/* -** 2008 August 05 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. -*/ - -#ifndef _PCACHE_H_ - -typedef struct PgHdr PgHdr; -typedef struct PCache PCache; - -/* -** Every page in the cache is controlled by an instance of the following -** structure. -*/ -struct PgHdr { - sqlite3_pcache_page *pPage; /* Pcache object page handle */ - void *pData; /* Page data */ - void *pExtra; /* Extra content */ - PgHdr *pDirty; /* Transient list of dirty pages */ - Pager *pPager; /* The pager this page is part of */ - Pgno pgno; /* Page number for this page */ -#ifdef SQLITE_CHECK_PAGES - u32 pageHash; /* Hash of page content */ -#endif - u16 flags; /* PGHDR flags defined below */ - - /********************************************************************** - ** Elements above are public. All that follows is private to pcache.c - ** and should not be accessed by other modules. - */ - i16 nRef; /* Number of users of this page */ - PCache *pCache; /* Cache that owns this page */ - - PgHdr *pDirtyNext; /* Next element in list of dirty pages */ - PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ -}; - -/* Bit values for PgHdr.flags */ -#define PGHDR_DIRTY 0x002 /* Page has changed */ -#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before - ** writing this page to the database */ -#define PGHDR_NEED_READ 0x008 /* Content is unread */ -#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ -#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ - -#define PGHDR_MMAP 0x040 /* This is an mmap page object */ - -/* Initialize and shutdown the page cache subsystem */ -SQLITE_PRIVATE int sqlite3PcacheInitialize(void); -SQLITE_PRIVATE void sqlite3PcacheShutdown(void); - -/* Page cache buffer management: -** These routines implement SQLITE_CONFIG_PAGECACHE. -*/ -SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); - -/* Create a new pager cache. -** Under memory stress, invoke xStress to try to make pages clean. -** Only clean and unpinned pages can be reclaimed. -*/ -SQLITE_PRIVATE void sqlite3PcacheOpen( - int szPage, /* Size of every page */ - int szExtra, /* Extra space associated with each page */ - int bPurgeable, /* True if pages are on backing store */ - int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ - void *pStress, /* Argument to xStress */ - PCache *pToInit /* Preallocated space for the PCache */ -); - -/* Modify the page-size after the cache has been created. */ -SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int); - -/* Return the size in bytes of a PCache object. Used to preallocate -** storage space. -*/ -SQLITE_PRIVATE int sqlite3PcacheSize(void); - -/* One release per successful fetch. Page is pinned until released. -** Reference counted. -*/ -SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**); -SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); - -SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ -SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ -SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ -SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ - -/* Change a page number. Used by incr-vacuum. */ -SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); - -/* Remove all pages with pgno>x. Reset the cache if x==0 */ -SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); - -/* Get a list of all dirty pages in the cache, sorted by page number */ -SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); - -/* Reset and close the cache object */ -SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); - -/* Clear flags from pages of the page cache */ -SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); - -/* Discard the contents of the cache */ -SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); - -/* Return the total number of outstanding page references */ -SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); - -/* Increment the reference count of an existing page */ -SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); - -SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); - -/* Return the total number of pages stored in the cache */ -SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); - -#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) -/* Iterate through all dirty pages currently stored in the cache. This -** interface is only available if SQLITE_CHECK_PAGES is defined when the -** library is built. -*/ -SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); -#endif - -/* Set and get the suggested cache-size for the specified pager-cache. -** -** If no global maximum is configured, then the system attempts to limit -** the total number of pages cached by purgeable pager-caches to the sum -** of the suggested cache-sizes. -*/ -SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); -#endif - -/* Free up as much memory as possible from the page cache */ -SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -/* Try to return memory used by the pcache module to the main memory heap */ -SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); -#endif - -SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); - -#endif /* _PCACHE_H_ */ - -/************** End of pcache.h **********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/************** Include os.h in the middle of sqliteInt.h ********************/ -/************** Begin file os.h **********************************************/ -/* -** 2001 September 16 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file (together with is companion C source-code file -** "os.c") attempt to abstract the underlying operating system so that -** the SQLite library will work on both POSIX and windows systems. -** -** This header file is #include-ed by sqliteInt.h and thus ends up -** being included by every source file. -*/ -#ifndef _SQLITE_OS_H_ -#define _SQLITE_OS_H_ - -/* -** Figure out if we are dealing with Unix, Windows, or some other -** operating system. After the following block of preprocess macros, -** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, and SQLITE_OS_OTHER -** will defined to either 1 or 0. One of the four will be 1. The other -** three will be 0. -*/ -#if defined(SQLITE_OS_OTHER) -# if SQLITE_OS_OTHER==1 -# undef SQLITE_OS_UNIX -# define SQLITE_OS_UNIX 0 -# undef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# else -# undef SQLITE_OS_OTHER -# endif -#endif -#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) -# define SQLITE_OS_OTHER 0 -# ifndef SQLITE_OS_WIN -# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) -# define SQLITE_OS_WIN 1 -# define SQLITE_OS_UNIX 0 -# else -# define SQLITE_OS_WIN 0 -# define SQLITE_OS_UNIX 1 -# endif -# else -# define SQLITE_OS_UNIX 0 -# endif -#else -# ifndef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# endif -#endif - -#if SQLITE_OS_WIN -# include -#endif - -/* -** Determine if we are dealing with Windows NT. -** -** We ought to be able to determine if we are compiling for win98 or winNT -** using the _WIN32_WINNT macro as follows: -** -** #if defined(_WIN32_WINNT) -** # define SQLITE_OS_WINNT 1 -** #else -** # define SQLITE_OS_WINNT 0 -** #endif -** -** However, vs2005 does not set _WIN32_WINNT by default, as it ought to, -** so the above test does not work. We'll just assume that everything is -** winNT unless the programmer explicitly says otherwise by setting -** SQLITE_OS_WINNT to 0. -*/ -#if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT) -# define SQLITE_OS_WINNT 1 -#endif - -/* -** Determine if we are dealing with WindowsCE - which has a much -** reduced API. -*/ -#if defined(_WIN32_WCE) -# define SQLITE_OS_WINCE 1 -#else -# define SQLITE_OS_WINCE 0 -#endif - -/* -** Determine if we are dealing with WinRT, which provides only a subset of -** the full Win32 API. -*/ -#if !defined(SQLITE_OS_WINRT) -# define SQLITE_OS_WINRT 0 -#endif - -/* If the SET_FULLSYNC macro is not defined above, then make it -** a no-op -*/ -#ifndef SET_FULLSYNC -# define SET_FULLSYNC(x,y) -#endif - -/* -** The default size of a disk sector -*/ -#ifndef SQLITE_DEFAULT_SECTOR_SIZE -# define SQLITE_DEFAULT_SECTOR_SIZE 4096 -#endif - -/* -** Temporary files are named starting with this prefix followed by 16 random -** alphanumeric characters, and no file extension. They are stored in the -** OS's standard temporary file directory, and are deleted prior to exit. -** If sqlite is being embedded in another program, you may wish to change the -** prefix to reflect your program's name, so that if your program exits -** prematurely, old temporary files can be easily identified. This can be done -** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. -** -** 2006-10-31: The default prefix used to be "sqlite_". But then -** Mcafee started using SQLite in their anti-virus product and it -** started putting files with the "sqlite" name in the c:/temp folder. -** This annoyed many windows users. Those users would then do a -** Google search for "sqlite", find the telephone numbers of the -** developers and call to wake them up at night and complain. -** For this reason, the default name prefix is changed to be "sqlite" -** spelled backwards. So the temp files are still identified, but -** anybody smart enough to figure out the code is also likely smart -** enough to know that calling the developer will not help get rid -** of the file. -*/ -#ifndef SQLITE_TEMP_FILE_PREFIX -# define SQLITE_TEMP_FILE_PREFIX "etilqs_" -#endif - -/* -** The following values may be passed as the second argument to -** sqlite3OsLock(). The various locks exhibit the following semantics: -** -** SHARED: Any number of processes may hold a SHARED lock simultaneously. -** RESERVED: A single process may hold a RESERVED lock on a file at -** any time. Other processes may hold and obtain new SHARED locks. -** PENDING: A single process may hold a PENDING lock on a file at -** any one time. Existing SHARED locks may persist, but no new -** SHARED locks may be obtained by other processes. -** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. -** -** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a -** process that requests an EXCLUSIVE lock may actually obtain a PENDING -** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to -** sqlite3OsLock(). -*/ -#define NO_LOCK 0 -#define SHARED_LOCK 1 -#define RESERVED_LOCK 2 -#define PENDING_LOCK 3 -#define EXCLUSIVE_LOCK 4 - -/* -** File Locking Notes: (Mostly about windows but also some info for Unix) -** -** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because -** those functions are not available. So we use only LockFile() and -** UnlockFile(). -** -** LockFile() prevents not just writing but also reading by other processes. -** A SHARED_LOCK is obtained by locking a single randomly-chosen -** byte out of a specific range of bytes. The lock byte is obtained at -** random so two separate readers can probably access the file at the -** same time, unless they are unlucky and choose the same lock byte. -** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. -** There can only be one writer. A RESERVED_LOCK is obtained by locking -** a single byte of the file that is designated as the reserved lock byte. -** A PENDING_LOCK is obtained by locking a designated byte different from -** the RESERVED_LOCK byte. -** -** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, -** which means we can use reader/writer locks. When reader/writer locks -** are used, the lock is placed on the same range of bytes that is used -** for probabilistic locking in Win95/98/ME. Hence, the locking scheme -** will support two or more Win95 readers or two or more WinNT readers. -** But a single Win95 reader will lock out all WinNT readers and a single -** WinNT reader will lock out all other Win95 readers. -** -** The following #defines specify the range of bytes used for locking. -** SHARED_SIZE is the number of bytes available in the pool from which -** a random byte is selected for a shared lock. The pool of bytes for -** shared locks begins at SHARED_FIRST. -** -** The same locking strategy and -** byte ranges are used for Unix. This leaves open the possiblity of having -** clients on win95, winNT, and unix all talking to the same shared file -** and all locking correctly. To do so would require that samba (or whatever -** tool is being used for file sharing) implements locks correctly between -** windows and unix. I'm guessing that isn't likely to happen, but by -** using the same locking range we are at least open to the possibility. -** -** Locking in windows is manditory. For this reason, we cannot store -** actual data in the bytes used for locking. The pager never allocates -** the pages involved in locking therefore. SHARED_SIZE is selected so -** that all locks will fit on a single page even at the minimum page size. -** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE -** is set high so that we don't have to allocate an unused page except -** for very large databases. But one should test the page skipping logic -** by setting PENDING_BYTE low and running the entire regression suite. -** -** Changing the value of PENDING_BYTE results in a subtly incompatible -** file format. Depending on how it is changed, you might not notice -** the incompatibility right away, even running a full regression test. -** The default location of PENDING_BYTE is the first byte past the -** 1GB boundary. -** -*/ -#ifdef SQLITE_OMIT_WSD -# define PENDING_BYTE (0x40000000) -#else -# define PENDING_BYTE sqlite3PendingByte -#endif -#define RESERVED_BYTE (PENDING_BYTE+1) -#define SHARED_FIRST (PENDING_BYTE+2) -#define SHARED_SIZE 510 - -/* -** Wrapper around OS specific sqlite3_os_init() function. -*/ -SQLITE_PRIVATE int sqlite3OsInit(void); - -/* -** Functions for accessing sqlite3_file methods -*/ -SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); -SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); -SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); -SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); -SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); -#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 -SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); -SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); -SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); -SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); -SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); - - -/* -** Functions for accessing sqlite3_vfs methods -*/ -SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); -SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); -SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); -#ifndef SQLITE_OMIT_LOAD_EXTENSION -SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); -SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); -SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ -SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); -SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); - -/* -** Convenience functions for opening and closing files using -** sqlite3_malloc() to obtain space for the file-handle structure. -*/ -SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); -SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); - -#endif /* _SQLITE_OS_H_ */ - -/************** End of os.h **************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include mutex.h in the middle of sqliteInt.h *****************/ -/************** Begin file mutex.h *******************************************/ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file contains the common header for all mutex implementations. -** The sqliteInt.h header #includes this file so that it is available -** to all source files. We break it out in an effort to keep the code -** better organized. -** -** NOTE: source files should *not* #include this header file directly. -** Source files should #include the sqliteInt.h file and let that file -** include this one indirectly. -*/ - - -/* -** Figure out what version of the code to use. The choices are -** -** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The -** mutexes implemention cannot be overridden -** at start-time. -** -** SQLITE_MUTEX_NOOP For single-threaded applications. No -** mutual exclusion is provided. But this -** implementation can be overridden at -** start-time. -** -** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. -** -** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. -*/ -#if !SQLITE_THREADSAFE -# define SQLITE_MUTEX_OMIT -#endif -#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) -# if SQLITE_OS_UNIX -# define SQLITE_MUTEX_PTHREADS -# elif SQLITE_OS_WIN -# define SQLITE_MUTEX_W32 -# else -# define SQLITE_MUTEX_NOOP -# endif -#endif - -#ifdef SQLITE_MUTEX_OMIT -/* -** If this is a no-op implementation, implement everything as macros. -*/ -#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) -#define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) -#define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) -#define sqlite3_mutex_held(X) ((void)(X),1) -#define sqlite3_mutex_notheld(X) ((void)(X),1) -#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) -#define sqlite3MutexInit() SQLITE_OK -#define sqlite3MutexEnd() -#define MUTEX_LOGIC(X) -#else -#define MUTEX_LOGIC(X) X -#endif /* defined(SQLITE_MUTEX_OMIT) */ - -/************** End of mutex.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - - -/* -** Each database file to be accessed by the system is an instance -** of the following structure. There are normally two of these structures -** in the sqlite.aDb[] array. aDb[0] is the main database file and -** aDb[1] is the database file used to hold temporary tables. Additional -** databases may be attached. -*/ -struct Db { - char *zName; /* Name of this database */ - Btree *pBt; /* The B*Tree structure for this database file */ - u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ - u8 safety_level; /* How aggressive at syncing data to disk */ - Schema *pSchema; /* Pointer to database schema (possibly shared) */ -}; - -/* -** An instance of the following structure stores a database schema. -** -** Most Schema objects are associated with a Btree. The exception is -** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. -** In shared cache mode, a single Schema object can be shared by multiple -** Btrees that refer to the same underlying BtShared object. -** -** Schema objects are automatically deallocated when the last Btree that -** references them is destroyed. The TEMP Schema is manually freed by -** sqlite3_close(). -* -** A thread must be holding a mutex on the corresponding Btree in order -** to access Schema content. This implies that the thread must also be -** holding a mutex on the sqlite3 connection pointer that owns the Btree. -** For a TEMP Schema, only the connection mutex is required. -*/ -struct Schema { - int schema_cookie; /* Database schema version number for this file */ - int iGeneration; /* Generation counter. Incremented with each change */ - Hash tblHash; /* All tables indexed by name */ - Hash idxHash; /* All (named) indices indexed by name */ - Hash trigHash; /* All triggers indexed by name */ - Hash fkeyHash; /* All foreign keys by referenced table name */ - Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ - u8 file_format; /* Schema format version for this file */ - u8 enc; /* Text encoding used by this database */ - u16 flags; /* Flags associated with this schema */ - int cache_size; /* Number of pages to use in the cache */ -}; - -/* -** These macros can be used to test, set, or clear bits in the -** Db.pSchema->flags field. -*/ -#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) -#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) -#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) -#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) - -/* -** Allowed values for the DB.pSchema->flags field. -** -** The DB_SchemaLoaded flag is set after the database schema has been -** read into internal hash tables. -** -** DB_UnresetViews means that one or more views have column names that -** have been filled out. If the schema changes, these column names might -** changes and so the view will need to be reset. -*/ -#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ -#define DB_UnresetViews 0x0002 /* Some views have defined column names */ -#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ - -/* -** The number of different kinds of things that can be limited -** using the sqlite3_limit() interface. -*/ -#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1) - -/* -** Lookaside malloc is a set of fixed-size buffers that can be used -** to satisfy small transient memory allocation requests for objects -** associated with a particular database connection. The use of -** lookaside malloc provides a significant performance enhancement -** (approx 10%) by avoiding numerous malloc/free requests while parsing -** SQL statements. -** -** The Lookaside structure holds configuration information about the -** lookaside malloc subsystem. Each available memory allocation in -** the lookaside subsystem is stored on a linked list of LookasideSlot -** objects. -** -** Lookaside allocations are only allowed for objects that are associated -** with a particular database connection. Hence, schema information cannot -** be stored in lookaside because in shared cache mode the schema information -** is shared by multiple database connections. Therefore, while parsing -** schema information, the Lookaside.bEnabled flag is cleared so that -** lookaside allocations are not used to construct the schema objects. -*/ -struct Lookaside { - u16 sz; /* Size of each buffer in bytes */ - u8 bEnabled; /* False to disable new lookaside allocations */ - u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ - int nOut; /* Number of buffers currently checked out */ - int mxOut; /* Highwater mark for nOut */ - int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ - LookasideSlot *pFree; /* List of available buffers */ - void *pStart; /* First byte of available memory space */ - void *pEnd; /* First byte past end of available space */ -}; -struct LookasideSlot { - LookasideSlot *pNext; /* Next buffer in the list of free buffers */ -}; - -/* -** A hash table for function definitions. -** -** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.pHash chain. -*/ -struct FuncDefHash { - FuncDef *a[23]; /* Hash table for functions */ -}; - -/* -** Each database connection is an instance of the following structure. -*/ -struct sqlite3 { - sqlite3_vfs *pVfs; /* OS Interface */ - struct Vdbe *pVdbe; /* List of active virtual machines */ - CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ - sqlite3_mutex *mutex; /* Connection mutex */ - Db *aDb; /* All backends */ - int nDb; /* Number of backends currently in use */ - int flags; /* Miscellaneous flags. See below */ - i64 lastRowid; /* ROWID of most recent insert (see above) */ - i64 szMmap; /* Default mmap_size setting */ - unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ - int errCode; /* Most recent error code (SQLITE_*) */ - int errMask; /* & result codes with this before returning */ - u16 dbOptFlags; /* Flags to enable/disable optimizations */ - u8 autoCommit; /* The auto-commit flag. */ - u8 temp_store; /* 1: file 2: memory 0: default */ - u8 mallocFailed; /* True if we have seen a malloc failure */ - u8 dfltLockMode; /* Default locking-mode for attached dbs */ - signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ - u8 suppressErr; /* Do not issue error messages if true */ - u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ - u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ - int nextPagesize; /* Pagesize after VACUUM if >0 */ - u32 magic; /* Magic number for detect library misuse */ - int nChange; /* Value returned by sqlite3_changes() */ - int nTotalChange; /* Value returned by sqlite3_total_changes() */ - int aLimit[SQLITE_N_LIMIT]; /* Limits */ - struct sqlite3InitInfo { /* Information used during initialization */ - int newTnum; /* Rootpage of table being initialized */ - u8 iDb; /* Which db file is being initialized */ - u8 busy; /* TRUE if currently initializing */ - u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ - } init; - int activeVdbeCnt; /* Number of VDBEs currently executing */ - int writeVdbeCnt; /* Number of active VDBEs that are writing */ - int vdbeExecCnt; /* Number of nested calls to VdbeExec() */ - int nExtension; /* Number of loaded extensions */ - void **aExtension; /* Array of shared library handles */ - void (*xTrace)(void*,const char*); /* Trace function */ - void *pTraceArg; /* Argument to the trace function */ - void (*xProfile)(void*,const char*,u64); /* Profiling function */ - void *pProfileArg; /* Argument to profile function */ - void *pCommitArg; /* Argument to xCommitCallback() */ - int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ - void (*xRollbackCallback)(void*); /* Invoked at every commit. */ - void *pUpdateArg; - void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); -#ifndef SQLITE_OMIT_WAL - int (*xWalCallback)(void *, sqlite3 *, const char *, int); - void *pWalArg; -#endif - void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); - void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); - void *pCollNeededArg; - sqlite3_value *pErr; /* Most recent error message */ - char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ - char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ - union { - volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ - double notUsed1; /* Spacer */ - } u1; - Lookaside lookaside; /* Lookaside malloc configuration */ -#ifndef SQLITE_OMIT_AUTHORIZATION - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); - /* Access authorization function */ - void *pAuthArg; /* 1st argument to the access auth function */ -#endif -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - int (*xProgress)(void *); /* The progress callback */ - void *pProgressArg; /* Argument to the progress callback */ - int nProgressOps; /* Number of opcodes for progress callback */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - int nVTrans; /* Allocated size of aVTrans */ - Hash aModule; /* populated by sqlite3_create_module() */ - VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ - VTable **aVTrans; /* Virtual tables with open transactions */ - VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ -#endif - FuncDefHash aFunc; /* Hash table of connection functions */ - Hash aCollSeq; /* All collating sequences */ - BusyHandler busyHandler; /* Busy callback */ - Db aDbStatic[2]; /* Static space for the 2 default backends */ - Savepoint *pSavepoint; /* List of active savepoints */ - int busyTimeout; /* Busy handler timeout, in msec */ - int nSavepoint; /* Number of non-transaction savepoints */ - int nStatement; /* Number of nested statement-transactions */ - i64 nDeferredCons; /* Net deferred constraints this transaction. */ - int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ - -#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY - /* The following variables are all protected by the STATIC_MASTER - ** mutex, not by sqlite3.mutex. They are used by code in notify.c. - ** - ** When X.pUnlockConnection==Y, that means that X is waiting for Y to - ** unlock so that it can proceed. - ** - ** When X.pBlockingConnection==Y, that means that something that X tried - ** tried to do recently failed with an SQLITE_LOCKED error due to locks - ** held by Y. - */ - sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ - sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ - void *pUnlockArg; /* Argument to xUnlockNotify */ - void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ - sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ -#endif -}; - -/* -** A macro to discover the encoding of a database. -*/ -#define ENC(db) ((db)->aDb[0].pSchema->enc) - -/* -** Possible values for the sqlite3.flags. -*/ -#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ -#define SQLITE_InternChanges 0x00000002 /* Uncommitted Hash table changes */ -#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ -#define SQLITE_ShortColNames 0x00000008 /* Show short columns names */ -#define SQLITE_CountRows 0x00000010 /* Count rows changed by INSERT, */ - /* DELETE, or UPDATE and return */ - /* the count using a callback. */ -#define SQLITE_NullCallback 0x00000020 /* Invoke the callback once if the */ - /* result set is empty */ -#define SQLITE_SqlTrace 0x00000040 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00000080 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00000100 /* OK to update SQLITE_MASTER */ -#define SQLITE_VdbeAddopTrace 0x00000200 /* Trace sqlite3VdbeAddOp() calls */ -#define SQLITE_IgnoreChecks 0x00000400 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x0000800 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00001000 /* Create new databases in format 1 */ -#define SQLITE_FullFSync 0x00002000 /* Use full fsync on the backend */ -#define SQLITE_CkptFullFSync 0x00004000 /* Use full fsync for checkpoint */ -#define SQLITE_RecoveryMode 0x00008000 /* Ignore schema errors */ -#define SQLITE_ReverseOrder 0x00010000 /* Reverse unordered SELECTs */ -#define SQLITE_RecTriggers 0x00020000 /* Enable recursive triggers */ -#define SQLITE_ForeignKeys 0x00040000 /* Enforce foreign key constraints */ -#define SQLITE_AutoIndex 0x00080000 /* Enable automatic indexes */ -#define SQLITE_PreferBuiltin 0x00100000 /* Preference to built-in funcs */ -#define SQLITE_LoadExtension 0x00200000 /* Enable load_extension */ -#define SQLITE_EnableTrigger 0x00400000 /* True to enable triggers */ - -/* -** Bits of the sqlite3.dbOptFlags field that are used by the -** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to -** selectively disable various optimizations. -*/ -#define SQLITE_QueryFlattener 0x0001 /* Query flattening */ -#define SQLITE_ColumnCache 0x0002 /* Column cache */ -#define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ -#define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ -#define SQLITE_IdxRealAsInt 0x0010 /* Store REAL as INT in indices */ -#define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ -#define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ -#define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ -#define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */ -#define SQLITE_Transitive 0x0200 /* Transitive constraints */ -#define SQLITE_AllOpts 0xffff /* All optimizations */ - -/* -** Macros for testing whether or not optimizations are enabled or disabled. -*/ -#ifndef SQLITE_OMIT_BUILTIN_TEST -#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) -#define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) -#else -#define OptimizationDisabled(db, mask) 0 -#define OptimizationEnabled(db, mask) 1 -#endif - -/* -** Possible values for the sqlite.magic field. -** The numbers are obtained at random and have no special meaning, other -** than being distinct from one another. -*/ -#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ -#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ -#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ -#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ -#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ -#define SQLITE_MAGIC_ZOMBIE 0x64cffc7f /* Close with last statement close */ - -/* -** Each SQL function is defined by an instance of the following -** structure. A pointer to this structure is stored in the sqlite.aFunc -** hash table. When multiple functions have the same name, the hash table -** points to a linked list of these structures. -*/ -struct FuncDef { - i16 nArg; /* Number of arguments. -1 means unlimited */ - u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ - u8 flags; /* Some combination of SQLITE_FUNC_* */ - void *pUserData; /* User data parameter */ - FuncDef *pNext; /* Next function with same name */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ - void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ - void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ - char *zName; /* SQL name of the function. */ - FuncDef *pHash; /* Next with a different name but the same hash */ - FuncDestructor *pDestructor; /* Reference counted destructor function */ -}; - -/* -** This structure encapsulates a user-function destructor callback (as -** configured using create_function_v2()) and a reference counter. When -** create_function_v2() is called to create a function with a destructor, -** a single object of this type is allocated. FuncDestructor.nRef is set to -** the number of FuncDef objects created (either 1 or 3, depending on whether -** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor -** member of each of the new FuncDef objects is set to point to the allocated -** FuncDestructor. -** -** Thereafter, when one of the FuncDef objects is deleted, the reference -** count on this object is decremented. When it reaches 0, the destructor -** is invoked and the FuncDestructor structure freed. -*/ -struct FuncDestructor { - int nRef; - void (*xDestroy)(void *); - void *pUserData; -}; - -/* -** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF -** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. There -** are assert() statements in the code to verify this. -*/ -#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ -#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ -#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */ -#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ -#define SQLITE_FUNC_COUNT 0x10 /* Built-in count(*) aggregate */ -#define SQLITE_FUNC_COALESCE 0x20 /* Built-in coalesce() or ifnull() function */ -#define SQLITE_FUNC_LENGTH 0x40 /* Built-in length() function */ -#define SQLITE_FUNC_TYPEOF 0x80 /* Built-in typeof() function */ - -/* -** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are -** used to create the initializers for the FuncDef structures. -** -** FUNCTION(zName, nArg, iArg, bNC, xFunc) -** Used to create a scalar function definition of a function zName -** implemented by C function xFunc that accepts nArg arguments. The -** value passed as iArg is cast to a (void*) and made available -** as the user-data (sqlite3_user_data()) for the function. If -** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. -** -** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) -** Used to create an aggregate function definition implemented by -** the C functions xStep and xFinal. The first four parameters -** are interpreted in the same way as the first 4 parameters to -** FUNCTION(). -** -** LIKEFUNC(zName, nArg, pArg, flags) -** Used to create a scalar function definition of a function zName -** that accepts nArg arguments and is implemented by a call to C -** function likeFunc. Argument pArg is cast to a (void *) and made -** available as the function user-data (sqlite3_user_data()). The -** FuncDef.flags variable is set to the value passed as the flags -** parameter. -*/ -#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, (bNC*SQLITE_FUNC_NEEDCOLL), \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} -#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ - {nArg, SQLITE_UTF8, (bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} -#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ - pArg, 0, xFunc, 0, 0, #zName, 0, 0} -#define LIKEFUNC(zName, nArg, arg, flags) \ - {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} -#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ - {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \ - SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} - -/* -** All current savepoints are stored in a linked list starting at -** sqlite3.pSavepoint. The first element in the list is the most recently -** opened savepoint. Savepoints are added to the list by the vdbe -** OP_Savepoint instruction. -*/ -struct Savepoint { - char *zName; /* Savepoint name (nul-terminated) */ - i64 nDeferredCons; /* Number of deferred fk violations */ - Savepoint *pNext; /* Parent savepoint (if any) */ -}; - -/* -** The following are used as the second parameter to sqlite3Savepoint(), -** and as the P1 argument to the OP_Savepoint instruction. -*/ -#define SAVEPOINT_BEGIN 0 -#define SAVEPOINT_RELEASE 1 -#define SAVEPOINT_ROLLBACK 2 - - -/* -** Each SQLite module (virtual table definition) is defined by an -** instance of the following structure, stored in the sqlite3.aModule -** hash table. -*/ -struct Module { - const sqlite3_module *pModule; /* Callback pointers */ - const char *zName; /* Name passed to create_module() */ - void *pAux; /* pAux passed to create_module() */ - void (*xDestroy)(void *); /* Module destructor function */ -}; - -/* -** information about each column of an SQL table is held in an instance -** of this structure. -*/ -struct Column { - char *zName; /* Name of this column */ - Expr *pDflt; /* Default value of this column */ - char *zDflt; /* Original text of the default value */ - char *zType; /* Data type for this column */ - char *zColl; /* Collating sequence. If NULL, use the default */ - u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ - char affinity; /* One of the SQLITE_AFF_... values */ - u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ -}; - -/* Allowed values for Column.colFlags: -*/ -#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ -#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ - -/* -** A "Collating Sequence" is defined by an instance of the following -** structure. Conceptually, a collating sequence consists of a name and -** a comparison routine that defines the order of that sequence. -** -** If CollSeq.xCmp is NULL, it means that the -** collating sequence is undefined. Indices built on an undefined -** collating sequence may not be read or written. -*/ -struct CollSeq { - char *zName; /* Name of the collating sequence, UTF-8 encoded */ - u8 enc; /* Text encoding handled by xCmp() */ - void *pUser; /* First argument to xCmp() */ - int (*xCmp)(void*,int, const void*, int, const void*); - void (*xDel)(void*); /* Destructor for pUser */ -}; - -/* -** A sort order can be either ASC or DESC. -*/ -#define SQLITE_SO_ASC 0 /* Sort in ascending order */ -#define SQLITE_SO_DESC 1 /* Sort in ascending order */ - -/* -** Column affinity types. -** -** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and -** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve -** the speed a little by numbering the values consecutively. -** -** But rather than start with 0 or 1, we begin with 'a'. That way, -** when multiple affinity types are concatenated into a string and -** used as the P4 operand, they will be more readable. -** -** Note also that the numeric types are grouped together so that testing -** for a numeric type is a single comparison. -*/ -#define SQLITE_AFF_TEXT 'a' -#define SQLITE_AFF_NONE 'b' -#define SQLITE_AFF_NUMERIC 'c' -#define SQLITE_AFF_INTEGER 'd' -#define SQLITE_AFF_REAL 'e' - -#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) - -/* -** The SQLITE_AFF_MASK values masks off the significant bits of an -** affinity value. -*/ -#define SQLITE_AFF_MASK 0x67 - -/* -** Additional bit values that can be ORed with an affinity without -** changing the affinity. -*/ -#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ -#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ -#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ - -/* -** An object of this type is created for each virtual table present in -** the database schema. -** -** If the database schema is shared, then there is one instance of this -** structure for each database connection (sqlite3*) that uses the shared -** schema. This is because each database connection requires its own unique -** instance of the sqlite3_vtab* handle used to access the virtual table -** implementation. sqlite3_vtab* handles can not be shared between -** database connections, even when the rest of the in-memory database -** schema is shared, as the implementation often stores the database -** connection handle passed to it via the xConnect() or xCreate() method -** during initialization internally. This database connection handle may -** then be used by the virtual table implementation to access real tables -** within the database. So that they appear as part of the callers -** transaction, these accesses need to be made via the same database -** connection as that used to execute SQL operations on the virtual table. -** -** All VTable objects that correspond to a single table in a shared -** database schema are initially stored in a linked-list pointed to by -** the Table.pVTable member variable of the corresponding Table object. -** When an sqlite3_prepare() operation is required to access the virtual -** table, it searches the list for the VTable that corresponds to the -** database connection doing the preparing so as to use the correct -** sqlite3_vtab* handle in the compiled query. -** -** When an in-memory Table object is deleted (for example when the -** schema is being reloaded for some reason), the VTable objects are not -** deleted and the sqlite3_vtab* handles are not xDisconnect()ed -** immediately. Instead, they are moved from the Table.pVTable list to -** another linked list headed by the sqlite3.pDisconnect member of the -** corresponding sqlite3 structure. They are then deleted/xDisconnected -** next time a statement is prepared using said sqlite3*. This is done -** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. -** Refer to comments above function sqlite3VtabUnlockList() for an -** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect -** list without holding the corresponding sqlite3.mutex mutex. -** -** The memory for objects of this type is always allocated by -** sqlite3DbMalloc(), using the connection handle stored in VTable.db as -** the first argument. -*/ -struct VTable { - sqlite3 *db; /* Database connection associated with this table */ - Module *pMod; /* Pointer to module implementation */ - sqlite3_vtab *pVtab; /* Pointer to vtab instance */ - int nRef; /* Number of pointers to this structure */ - u8 bConstraint; /* True if constraints are supported */ - int iSavepoint; /* Depth of the SAVEPOINT stack */ - VTable *pNext; /* Next in linked list (see above) */ -}; - -/* -** Each SQL table is represented in memory by an instance of the -** following structure. -** -** Table.zName is the name of the table. The case of the original -** CREATE TABLE statement is stored, but case is not significant for -** comparisons. -** -** Table.nCol is the number of columns in this table. Table.aCol is a -** pointer to an array of Column structures, one for each column. -** -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of -** the column that is that key. Otherwise Table.iPKey is negative. Note -** that the datatype of the PRIMARY KEY must be INTEGER for this field to -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. TF_HasPrimaryKey is set if -** the table has any PRIMARY KEY, INTEGER or otherwise. -** -** Table.tnum is the page number for the root BTree page of the table in the -** database file. If Table.iDb is the index of the database table backend -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that -** holds temporary tables and indices. If TF_Ephemeral is set -** then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Table.tnum -** refers VDBE cursor number that holds the table open, not to the root -** page number. Transient tables are used to hold the results of a -** sub-query that appears instead of a real table name in the FROM clause -** of a SELECT statement. -*/ -struct Table { - char *zName; /* Name of the table or view */ - Column *aCol; /* Information about each column */ - Index *pIndex; /* List of SQL indexes on this table. */ - Select *pSelect; /* NULL for tables. Points to definition if a view. */ - FKey *pFKey; /* Linked list of all foreign keys in this table */ - char *zColAff; /* String defining the affinity of each column */ -#ifndef SQLITE_OMIT_CHECK - ExprList *pCheck; /* All CHECK constraints */ -#endif - tRowcnt nRowEst; /* Estimated rows in table - from sqlite_stat1 table */ - int tnum; /* Root BTree node for this table (see note above) */ - i16 iPKey; /* If not negative, use aCol[iPKey] as the primary key */ - i16 nCol; /* Number of columns in this table */ - u16 nRef; /* Number of pointers to this Table */ - u8 tabFlags; /* Mask of TF_* values */ - u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ -#ifndef SQLITE_OMIT_ALTERTABLE - int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* Text of all module args. [0] is module name */ - VTable *pVTable; /* List of VTable objects. */ -#endif - Trigger *pTrigger; /* List of triggers stored in pSchema */ - Schema *pSchema; /* Schema that contains this table */ - Table *pNextZombie; /* Next on the Parse.pZombieTab list */ -}; - -/* -** Allowed values for Tabe.tabFlags. -*/ -#define TF_Readonly 0x01 /* Read-only system table */ -#define TF_Ephemeral 0x02 /* An ephemeral table */ -#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ -#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ -#define TF_Virtual 0x10 /* Is a virtual table */ - - -/* -** Test to see whether or not a table is a virtual table. This is -** done as a macro so that it will be optimized out when virtual -** table support is omitted from the build. -*/ -#ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) -# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) -#else -# define IsVirtual(X) 0 -# define IsHiddenColumn(X) 0 -#endif - -/* -** Each foreign key constraint is an instance of the following structure. -** -** A foreign key is associated with two tables. The "from" table is -** the table that contains the REFERENCES clause that creates the foreign -** key. The "to" table is the table that is named in the REFERENCES clause. -** Consider this example: -** -** CREATE TABLE ex1( -** a INTEGER PRIMARY KEY, -** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) -** ); -** -** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". -** -** Each REFERENCES clause generates an instance of the following structure -** which is attached to the from-table. The to-table need not exist when -** the from-table is created. The existence of the to-table is not checked. -*/ -struct FKey { - Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ - FKey *pNextFrom; /* Next foreign key in pFrom */ - char *zTo; /* Name of table that the key points to (aka: Parent) */ - FKey *pNextTo; /* Next foreign key on table named zTo */ - FKey *pPrevTo; /* Previous foreign key on table named zTo */ - int nCol; /* Number of columns in this key */ - /* EV: R-30323-21917 */ - u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ - u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ - Trigger *apTrigger[2]; /* Triggers for aAction[] actions */ - struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ - int iFrom; /* Index of column in pFrom */ - char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ - } aCol[1]; /* One entry for each of nCol column s */ -}; - -/* -** SQLite supports many different ways to resolve a constraint -** error. ROLLBACK processing means that a constraint violation -** causes the operation in process to fail and for the current transaction -** to be rolled back. ABORT processing means the operation in process -** fails and any prior changes from that one operation are backed out, -** but the transaction is not rolled back. FAIL processing means that -** the operation in progress stops and returns an error code. But prior -** changes due to the same operation are not backed out and no rollback -** occurs. IGNORE means that the particular row that caused the constraint -** error is not inserted or updated. Processing continues and no error -** is returned. REPLACE means that preexisting database rows that caused -** a UNIQUE constraint violation are removed so that the new insert or -** update can proceed. Processing continues and no error is reported. -** -** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. -** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the -** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign -** key is set to NULL. CASCADE means that a DELETE or UPDATE of the -** referenced table row is propagated into the row that holds the -** foreign key. -** -** The following symbolic values are used to record which type -** of action to take. -*/ -#define OE_None 0 /* There is no constraint to check */ -#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ -#define OE_Abort 2 /* Back out changes but do no rollback transaction */ -#define OE_Fail 3 /* Stop the operation but leave all prior changes */ -#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ -#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ - -#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ -#define OE_SetNull 7 /* Set the foreign key value to NULL */ -#define OE_SetDflt 8 /* Set the foreign key value to its default */ -#define OE_Cascade 9 /* Cascade the changes */ - -#define OE_Default 99 /* Do whatever the default action is */ - - -/* -** An instance of the following structure is passed as the first -** argument to sqlite3VdbeKeyCompare and is used to control the -** comparison of the two index keys. -*/ -struct KeyInfo { - sqlite3 *db; /* The database connection */ - u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ - u16 nField; /* Number of entries in aColl[] */ - u8 *aSortOrder; /* Sort order for each column. May be NULL */ - CollSeq *aColl[1]; /* Collating sequence for each term of the key */ -}; - -/* -** An instance of the following structure holds information about a -** single index record that has already been parsed out into individual -** values. -** -** A record is an object that contains one or more fields of data. -** Records are used to store the content of a table row and to store -** the key of an index. A blob encoding of a record is created by -** the OP_MakeRecord opcode of the VDBE and is disassembled by the -** OP_Column opcode. -** -** This structure holds a record that has already been disassembled -** into its constituent fields. -*/ -struct UnpackedRecord { - KeyInfo *pKeyInfo; /* Collation and sort-order information */ - u16 nField; /* Number of entries in apMem[] */ - u8 flags; /* Boolean settings. UNPACKED_... below */ - i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ - Mem *aMem; /* Values */ -}; - -/* -** Allowed values of UnpackedRecord.flags -*/ -#define UNPACKED_INCRKEY 0x01 /* Make this key an epsilon larger */ -#define UNPACKED_PREFIX_MATCH 0x02 /* A prefix match is considered OK */ -#define UNPACKED_PREFIX_SEARCH 0x04 /* Ignore final (rowid) field */ - -/* -** Each SQL index is represented in memory by an -** instance of the following structure. -** -** The columns of the table that are to be indexed are described -** by the aiColumn[] field of this structure. For example, suppose -** we have the following table and index: -** -** CREATE TABLE Ex1(c1 int, c2 int, c3 text); -** CREATE INDEX Ex2 ON Ex1(c3,c1); -** -** In the Table structure describing Ex1, nCol==3 because there are -** three columns in the table. In the Index structure describing -** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. -** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the -** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. -** The second column to be indexed (c1) has an index of 0 in -** Ex1.aCol[], hence Ex2.aiColumn[1]==0. -** -** The Index.onError field determines whether or not the indexed columns -** must be unique and what to do if they are not. When Index.onError=OE_None, -** it means this is not a unique index. Otherwise it is a unique index -** and the value of Index.onError indicate the which conflict resolution -** algorithm to employ whenever an attempt is made to insert a non-unique -** element. -*/ -struct Index { - char *zName; /* Name of this index */ - int *aiColumn; /* Which columns are used by this index. 1st is 0 */ - tRowcnt *aiRowEst; /* From ANALYZE: Est. rows selected by each column */ - Table *pTable; /* The SQL table being indexed */ - char *zColAff; /* String defining the affinity of each column */ - Index *pNext; /* The next index associated with the same table */ - Schema *pSchema; /* Schema containing this index */ - u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ - char **azColl; /* Array of collation sequence names for index */ - int tnum; /* DB Page containing root of this index */ - u16 nColumn; /* Number of columns in table used by this index */ - u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned autoIndex:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ - unsigned bUnordered:1; /* Use this index for == or IN queries only */ -#ifdef SQLITE_ENABLE_STAT3 - int nSample; /* Number of elements in aSample[] */ - tRowcnt avgEq; /* Average nEq value for key values not in aSample */ - IndexSample *aSample; /* Samples of the left-most key */ -#endif -}; - -/* -** Each sample stored in the sqlite_stat3 table is represented in memory -** using a structure of this type. See documentation at the top of the -** analyze.c source file for additional information. -*/ -struct IndexSample { - union { - char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */ - double r; /* Value if eType is SQLITE_FLOAT */ - i64 i; /* Value if eType is SQLITE_INTEGER */ - } u; - u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */ - int nByte; /* Size in byte of text or blob. */ - tRowcnt nEq; /* Est. number of rows where the key equals this sample */ - tRowcnt nLt; /* Est. number of rows where key is less than this sample */ - tRowcnt nDLt; /* Est. number of distinct keys less than this sample */ -}; - -/* -** Each token coming out of the lexer is an instance of -** this structure. Tokens are also used as part of an expression. -** -** Note if Token.z==0 then Token.dyn and Token.n are undefined and -** may contain random values. Do not make any assumptions about Token.dyn -** and Token.n when Token.z==0. -*/ -struct Token { - const char *z; /* Text of the token. Not NULL-terminated! */ - unsigned int n; /* Number of characters in this token */ -}; - -/* -** An instance of this structure contains information needed to generate -** code for a SELECT that contains aggregate functions. -** -** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a -** pointer to this structure. The Expr.iColumn field is the index in -** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate -** code for that node. -** -** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the -** original Select structure that describes the SELECT statement. These -** fields do not need to be freed when deallocating the AggInfo structure. -*/ -struct AggInfo { - u8 directMode; /* Direct rendering mode means take data directly - ** from source tables rather than from accumulators */ - u8 useSortingIdx; /* In direct mode, reference the sorting index rather - ** than the source table */ - int sortingIdx; /* Cursor number of the sorting index */ - int sortingIdxPTab; /* Cursor number of pseudo-table */ - int nSortingColumn; /* Number of columns in the sorting index */ - ExprList *pGroupBy; /* The group by clause */ - struct AggInfo_col { /* For each column used in source tables */ - Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ - Expr *pExpr; /* The original expression */ - } *aCol; - int nColumn; /* Number of used entries in aCol[] */ - int nAccumulator; /* Number of columns that show through to the output. - ** Additional columns are used only as parameters to - ** aggregate functions */ - struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ - FuncDef *pFunc; /* The aggregate function implementation */ - int iMem; /* Memory location that acts as accumulator */ - int iDistinct; /* Ephemeral table used to enforce DISTINCT */ - } *aFunc; - int nFunc; /* Number of entries in aFunc[] */ -}; - -/* -** The datatype ynVar is a signed integer, either 16-bit or 32-bit. -** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater -** than 32767 we have to make it 32-bit. 16-bit is preferred because -** it uses less memory in the Expr object, which is a big memory user -** in systems with lots of prepared statements. And few applications -** need more than about 10 or 20 variables. But some extreme users want -** to have prepared statements with over 32767 variables, and for them -** the option is available (at compile-time). -*/ -#if SQLITE_MAX_VARIABLE_NUMBER<=32767 -typedef i16 ynVar; -#else -typedef int ynVar; -#endif - -/* -** Each node of an expression in the parse tree is an instance -** of this structure. -** -** Expr.op is the opcode. The integer parser token codes are reused -** as opcodes here. For example, the parser defines TK_GE to be an integer -** code representing the ">=" operator. This same integer code is reused -** to represent the greater-than-or-equal-to operator in the expression -** tree. -** -** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, -** or TK_STRING), then Expr.token contains the text of the SQL literal. If -** the expression is a variable (TK_VARIABLE), then Expr.token contains the -** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), -** then Expr.token contains the name of the function. -** -** Expr.pRight and Expr.pLeft are the left and right subexpressions of a -** binary operator. Either or both may be NULL. -** -** Expr.x.pList is a list of arguments if the expression is an SQL function, -** a CASE expression or an IN expression of the form " IN (, ...)". -** Expr.x.pSelect is used if the expression is a sub-select or an expression of -** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the -** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is -** valid. -** -** An expression of the form ID or ID.ID refers to a column in a table. -** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is -** the integer cursor number of a VDBE cursor pointing to that table and -** Expr.iColumn is the column number for the specific column. If the -** expression is used as a result in an aggregate SELECT, then the -** value is also stored in the Expr.iAgg column in the aggregate so that -** it can be accessed after all aggregates are computed. -** -** If the expression is an unbound variable marker (a question mark -** character '?' in the original SQL) then the Expr.iTable holds the index -** number for that variable. -** -** If the expression is a subquery then Expr.iColumn holds an integer -** register number containing the result of the subquery. If the -** subquery gives a constant result, then iTable is -1. If the subquery -** gives a different answer at different times during statement processing -** then iTable is the address of a subroutine that computes the subquery. -** -** If the Expr is of type OP_Column, and the table it is selecting from -** is a disk table or the "old.*" pseudo-table, then pTab points to the -** corresponding table definition. -** -** ALLOCATION NOTES: -** -** Expr objects can use a lot of memory space in database schema. To -** help reduce memory requirements, sometimes an Expr object will be -** truncated. And to reduce the number of memory allocations, sometimes -** two or more Expr objects will be stored in a single memory allocation, -** together with Expr.zToken strings. -** -** If the EP_Reduced and EP_TokenOnly flags are set when -** an Expr object is truncated. When EP_Reduced is set, then all -** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees -** are contained within the same memory allocation. Note, however, that -** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately -** allocated, regardless of whether or not EP_Reduced is set. -*/ -struct Expr { - u8 op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ - u16 flags; /* Various flags. EP_* See below */ - union { - char *zToken; /* Token value. Zero terminated and dequoted */ - int iValue; /* Non-negative integer value if EP_IntValue */ - } u; - - /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no - ** space is allocated for the fields below this point. An attempt to - ** access them will result in a segfault or malfunction. - *********************************************************************/ - - Expr *pLeft; /* Left subnode */ - Expr *pRight; /* Right subnode */ - union { - ExprList *pList; /* Function arguments or in " IN ( IN ( - - - -
-
- -

Stats

-

Server

-
Connected Clients: N/A
-
Admin Clients: N/A
-
-

Messages

-
Messages Sent: N/A
-
Messages Acked: N/A
-
Messages Rate: N/A
-
- -
- - - - - - -
idsentackedsizetimemessage ratedata rate
-
- -

Data

-
Bytes Sent: N/A
-
Data Rate: N/A
-
- -
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_admin_handler.hpp b/Subtrees/websocket/examples/broadcast_server_tls/broadcast_admin_handler.hpp deleted file mode 100644 index 9d37bf93a7..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_admin_handler.hpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WEBSOCKETPP_BROADCAST_ADMIN_HANDLER_HPP -#define WEBSOCKETPP_BROADCAST_ADMIN_HANDLER_HPP - -#include "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include "broadcast_handler.hpp" - -#include - -#include -#include -#include - -namespace websocketpp { -namespace broadcast { - -template -class admin_handler : public endpoint_type::handler { -public: - typedef admin_handler type; - typedef boost::shared_ptr ptr; - typedef typename endpoint_type::handler_ptr handler_ptr; - typedef typename handler::ptr broadcast_handler_ptr; - typedef typename endpoint_type::connection_ptr connection_ptr; - - admin_handler() - : m_epoch(boost::posix_time::time_from_string("1970-01-01 00:00:00.000")) - {} - - void on_open(connection_ptr connection) { - if (!m_timer) { - m_timer.reset(new boost::asio::deadline_timer(connection->get_io_service(),boost::posix_time::seconds(0))); - m_timer->expires_from_now(boost::posix_time::milliseconds(250)); - m_timer->async_wait(boost::bind(&type::on_timer,this,boost::asio::placeholders::error)); - } - - m_connections.insert(connection); - } - - // this dummy tls init function will cause all TLS connections to fail. - // TLS handling for broadcast::handler is usually done by a lobby handler. - // If you want to use the broadcast handler alone with TLS then return the - // appropriately filled in context here. - boost::shared_ptr on_tls_init() { - return boost::shared_ptr(); - } - - void on_load(connection_ptr connection, handler_ptr old_handler) { - this->on_open(connection); - m_lobby = old_handler; - } - - void track(broadcast_handler_ptr target) { - m_broadcast_handler = target; - } - - void on_close(connection_ptr connection) { - m_connections.erase(connection); - } - - void on_message(connection_ptr connection,websocketpp::message::data_ptr msg) { - typename std::set::iterator it; - - wscmd::cmd command = wscmd::parse(msg->get_payload()); - - if (command.command == "close") { - handle_close(connection,command); - } else { - command_error(connection,"Invalid Command"); - } - } - - void command_error(connection_ptr connection,const std::string msg) { - std::string str = "{\"type\":\"error\",\"value\":\""+msg+"\"}"; - connection->send(str); - } - - // close: - close this connection - // close:all; close all connections - void handle_close(connection_ptr connection,const wscmd::cmd& command) { - if (!m_broadcast_handler) { - // Unable to connect to local broadcast handler - return; - } - - m_broadcast_handler->close_connection(connection_ptr()); - } - - long get_ms(boost::posix_time::ptime s) const { - boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); - boost::posix_time::time_period period(s,now); - return period.length().total_milliseconds(); - } - - void on_timer(const boost::system::error_code& error) { - if (!m_broadcast_handler) { - // Unable to connect to local broadcast handler - return; - } - - if (m_connections.size() > 0) { - long milli_seconds = get_ms(m_epoch); - - std::stringstream update; - update << "{\"type\":\"stats\"" - << ",\"timestamp\":" << milli_seconds - << ",\"connections\":" << m_broadcast_handler->get_connection_count() - << ",\"admin_connections\":" << m_connections.size() - << ",\"messages\":["; - - const msg_map& m = m_broadcast_handler->get_message_stats(); - - msg_map::const_iterator msg_it; - msg_map::const_iterator last = m.end(); - if (m.size() > 0) { - last--; - } - - for (msg_it = m.begin(); msg_it != m.end(); msg_it++) { - update << "{\"id\":" << (*msg_it).second.id - << ",\"hash\":\"" << (*msg_it).second.hash << "\"" - << ",\"sent\":" << (*msg_it).second.sent - << ",\"acked\":" << (*msg_it).second.acked - << ",\"size\":" << (*msg_it).second.size - << ",\"time\":" << (*msg_it).second.time - << "}" << (msg_it == last ? "" : ","); - } - - update << "]}"; - - m_broadcast_handler->clear_message_stats(); - - typename std::set::iterator it; - - websocketpp::message::data_ptr msg = (*m_connections.begin())->get_data_message(); - - if (msg) { - msg->reset(frame::opcode::TEXT); - - msg->set_payload(update.str()); - - for (it = m_connections.begin(); it != m_connections.end(); it++) { - (*it)->send(msg); - } - } else { - // error no avaliable message buffers - } - } - - m_timer->expires_from_now(boost::posix_time::milliseconds(250)); - m_timer->async_wait( - boost::bind( - &type::on_timer, - this, - boost::asio::placeholders::error - ) - ); - } -private: - handler_ptr m_lobby; - broadcast_handler_ptr m_broadcast_handler; - - std::set m_connections; - boost::posix_time::ptime m_epoch; - - boost::shared_ptr m_timer; -}; - -} // namespace broadcast -} // namespace websocketpp - -#endif // WEBSOCKETPP_BROADCAST_ADMIN_HANDLER_HPP diff --git a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_handler.hpp b/Subtrees/websocket/examples/broadcast_server_tls/broadcast_handler.hpp deleted file mode 100644 index 3054119087..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_handler.hpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WEBSOCKETPP_BROADCAST_HANDLER_HPP -#define WEBSOCKETPP_BROADCAST_HANDLER_HPP - -#include "wscmd.hpp" - -#include "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include "../../src/md5/md5.hpp" - -#include - -#include -#include - -namespace websocketpp { -namespace broadcast { - -/// this structure is used to keep track of message statistics -struct msg { - int id; - size_t sent; - size_t acked; - size_t size; - uint64_t time; - - std::string hash; - boost::posix_time::ptime time_sent; -}; - -typedef std::map msg_map; - -template -class handler : public endpoint_type::handler { -public: - typedef handler type; - typedef boost::shared_ptr ptr; - typedef typename endpoint_type::handler_ptr handler_ptr; - typedef typename endpoint_type::connection_ptr connection_ptr; - - handler() : m_nextid(0) {} - - void on_open(connection_ptr connection) { - m_connections.insert(connection); - } - - // this dummy tls init function will cause all TLS connections to fail. - // TLS handling for broadcast::handler is usually done by a lobby handler. - // If you want to use the broadcast handler alone with TLS then return the - // appropriately filled in context here. - boost::shared_ptr on_tls_init() { - return boost::shared_ptr(); - } - - void on_load(connection_ptr connection, handler_ptr old_handler) { - this->on_open(connection); - m_lobby = old_handler; - } - - void on_close(connection_ptr connection) { - m_connections.erase(connection); - } - - void on_message(connection_ptr connection,message::data_ptr msg) { - wscmd::cmd command = wscmd::parse(msg->get_payload()); - - std::cout << "msg: " << msg->get_payload() << std::endl; - - if (command.command == "ack") { - handle_ack(connection,command); - } else { - broadcast_message(msg); - } - } - - void command_error(connection_ptr connection,const std::string msg) { - connection->send("{\"type\":\"error\",\"value\":\""+msg+"\"}"); - } - - // ack:e3458d0aceff8b70a3e5c0afec632881=38;e3458d0aceff8b70a3e5c0afec632881=42; - void handle_ack(connection_ptr connection,const wscmd::cmd& command) { - wscmd::arg_list::const_iterator arg_it; - size_t count; - - for (arg_it = command.args.begin(); arg_it != command.args.end(); arg_it++) { - if (m_msgs.find(arg_it->first) == m_msgs.end()) { - std::cout << "ack for message we didn't send" << std::endl; - continue; - } - - count = atol(arg_it->second.c_str()); - if (count == 0) { - continue; - } - - struct msg& m(m_msgs[arg_it->first]); - - m.acked += count; - - if (m.acked == m.sent) { - m.time = get_ms(m.time_sent); - } - } - } - - // close: - close this connection - // close:all; close all connections - void close_connection(connection_ptr connection) { - if (connection){ - connection->close(close::status::NORMAL); - } else { - typename std::set::iterator it; - - for (it = m_connections.begin(); it != m_connections.end(); it++) { - - (*it)->close(close::status::NORMAL); - } - } - } - - void broadcast_message(message::data_ptr msg) { - std::string hash = md5_hash_hex(msg->get_payload()); - struct msg& new_msg(m_msgs[hash]); - - new_msg.id = m_nextid++; - new_msg.hash = hash; - new_msg.size = msg->get_payload().size(); - new_msg.time_sent = boost::posix_time::microsec_clock::local_time(); - new_msg.time = 0; - - typename std::set::iterator it; - - // broadcast to clients - for (it = m_connections.begin(); it != m_connections.end(); it++) { - //(*it)->send(msg->get_payload(),(msg->get_opcode() == frame::opcode::BINARY)); - for (int i = 0; i < 10; i++) { - (*it)->send(msg); - } - - } - new_msg.sent = m_connections.size()*10; - new_msg.acked = 0; - } - - long get_ms(boost::posix_time::ptime s) const { - boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); - boost::posix_time::time_period period(s,now); - return period.length().total_milliseconds(); - } - - // hooks for admin console - size_t get_connection_count() const { - return m_connections.size(); - } - - const msg_map& get_message_stats() const { - return m_msgs; - } - - void clear_message_stats() { - m_msgs.empty(); - } -private: - handler_ptr m_lobby; - - int m_nextid; - msg_map m_msgs; - - std::set m_connections; -}; - -} // namespace broadcast -} // namespace websocketpp - -#endif // WEBSOCKETPP_BROADCAST_HANDLER_HPP diff --git a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_handler.hpp b/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_handler.hpp deleted file mode 100644 index 3bb8868b47..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_handler.hpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WEBSOCKETPP_BROADCAST_SERVER_HANDLER_HPP -#define WEBSOCKETPP_BROADCAST_SERVER_HANDLER_HPP - -#include "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include "broadcast_handler.hpp" -#include "broadcast_admin_handler.hpp" - -#include - -namespace websocketpp { -namespace broadcast { - -template -class server_handler : public endpoint_type::handler { -public: - typedef server_handler type; - typedef boost::shared_ptr ptr; - typedef typename endpoint_type::handler_ptr handler_ptr; - typedef typename admin_handler::ptr admin_handler_ptr; - typedef typename handler::ptr broadcast_handler_ptr; - typedef typename endpoint_type::connection_ptr connection_ptr; - - server_handler(); - - std::string get_password() const { - return "test"; - } - - boost::shared_ptr on_tls_init() { - // create a tls context, init, and return. - boost::shared_ptr context(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); - try { - context->set_options(boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::single_dh_use); - context->set_password_callback(boost::bind(&type::get_password, this)); - context->use_certificate_chain_file("../../src/ssl/server.pem"); - context->use_private_key_file("../../src/ssl/server.pem", boost::asio::ssl::context::pem); - context->use_tmp_dh_file("../../src/ssl/dh512.pem"); - } catch (std::exception& e) { - std::cout << e.what() << std::endl; - } - return context; - } - - void validate(connection_ptr connection) {} - - void on_open(connection_ptr connection) { - if (connection->get_resource() == "/admin") { - connection->set_handler(m_admin_handler); - } else { - connection->set_handler(m_broadcast_handler); - } - } - - void on_unload(connection_ptr connection, handler_ptr new_handler) { - - } - - void on_close(connection_ptr connection) {} - - void on_message(connection_ptr connection,websocketpp::message::data_ptr msg) {} - - void http(connection_ptr connection); - - void on_fail(connection_ptr connection) { - std::cout << "connection failed" << std::endl; - } - - // utility - - handler_ptr get_broadcast_handler() { - return m_broadcast_handler; - } - -private: - admin_handler_ptr m_admin_handler; - broadcast_handler_ptr m_broadcast_handler; -}; - -} // namespace broadcast -} // namespace websocketpp - - - - -namespace websocketpp { -namespace broadcast { - -template -server_handler::server_handler() - : m_admin_handler(new admin_handler()), - m_broadcast_handler(new handler()) -{ - m_admin_handler->track(m_broadcast_handler); -} - -template -void server_handler::http(connection_ptr connection) { - std::stringstream foo; - - foo << "

" - << m_broadcast_handler->get_connection_count() - << " current connections.

"; - - connection->set_body(foo.str()); -} - -} // namespace broadcast -} // namespace websocketpp - -#endif // WEBSOCKETPP_BROADCAST_SERVER_HANDLER_HPP diff --git a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_tls.cpp b/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_tls.cpp deleted file mode 100644 index b61181eb76..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/broadcast_server_tls.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include "broadcast_server_handler.hpp" - -#include - -#include -#include - -#include - -//typedef websocketpp::endpoint plain_endpoint_type; -//typedef plain_endpoint_type::handler_ptr plain_handler_ptr; - -//typedef websocketpp::endpoint tls_endpoint_type; -//typedef tls_endpoint_type::handler_ptr tls_handler_ptr; - -using websocketpp::server; -using websocketpp::server_tls; - -int main(int argc, char* argv[]) { - unsigned short port = 9002; - bool tls = false; - - // 12288 is max OS X limit without changing kernal settings - const rlim_t ideal_size = 10000; - rlim_t old_size; - rlim_t old_max; - - struct rlimit rl; - int result; - - result = getrlimit(RLIMIT_NOFILE, &rl); - if (result == 0) { - //std::cout << "System FD limits: " << rl.rlim_cur << " max: " << rl.rlim_max << std::endl; - - old_size = rl.rlim_cur; - old_max = rl.rlim_max; - - if (rl.rlim_cur < ideal_size) { - std::cout << "Attempting to raise system file descriptor limit from " << rl.rlim_cur << " to " << ideal_size << std::endl; - rl.rlim_cur = ideal_size; - - if (rl.rlim_max < ideal_size) { - rl.rlim_max = ideal_size; - } - - result = setrlimit(RLIMIT_NOFILE, &rl); - - if (result == 0) { - std::cout << "Success" << std::endl; - } else if (result == EPERM) { - std::cout << "Failed. This server will be limited to " << old_size << " concurrent connections. Error code: Insufficient permissions. Try running process as root. system max: " << old_max << std::endl; - } else { - std::cout << "Failed. This server will be limited to " << old_size << " concurrent connections. Error code: " << errno << " system max: " << old_max << std::endl; - } - } - } - - if (argc == 2) { - // TODO: input validation? - port = atoi(argv[1]); - } - - if (argc == 3) { - // TODO: input validation? - port = atoi(argv[1]); - tls = !strcmp(argv[2],"-tls"); - } - - try { - if (tls) { - server_tls::handler_ptr handler(new websocketpp::broadcast::server_handler()); - server_tls endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().set_level(websocketpp::log::elevel::ALL); - - std::cout << "Starting Secure WebSocket broadcast server on port " << port << std::endl; - endpoint.listen(port); - } else { - server::handler_ptr handler(new websocketpp::broadcast::server_handler()); - server endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().set_level(websocketpp::log::elevel::ALL); - - //endpoint.alog().set_level(websocketpp::log::alevel::DEVEL); - - std::cout << "Starting WebSocket broadcast server on port " << port << std::endl; - endpoint.listen(port); - } - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - - } - - return 0; -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/API.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/API.txt deleted file mode 100644 index 8a8dbc23d2..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/API.txt +++ /dev/null @@ -1,1201 +0,0 @@ -Flot Reference --------------- - -Consider a call to the plot function: - - var plot = $.plot(placeholder, data, options) - -The placeholder is a jQuery object or DOM element or jQuery expression -that the plot will be put into. This placeholder needs to have its -width and height set as explained in the README (go read that now if -you haven't, it's short). The plot will modify some properties of the -placeholder so it's recommended you simply pass in a div that you -don't use for anything else. Make sure you check any fancy styling -you apply to the div, e.g. background images have been reported to be a -problem on IE 7. - -The format of the data is documented below, as is the available -options. The plot object returned from the call has some methods you -can call. These are documented separately below. - -Note that in general Flot gives no guarantees if you change any of the -objects you pass in to the plot function or get out of it since -they're not necessarily deep-copied. - - -Data Format ------------ - -The data is an array of data series: - - [ series1, series2, ... ] - -A series can either be raw data or an object with properties. The raw -data format is an array of points: - - [ [x1, y1], [x2, y2], ... ] - -E.g. - - [ [1, 3], [2, 14.01], [3.5, 3.14] ] - -Note that to simplify the internal logic in Flot both the x and y -values must be numbers (even if specifying time series, see below for -how to do this). This is a common problem because you might retrieve -data from the database and serialize them directly to JSON without -noticing the wrong type. If you're getting mysterious errors, double -check that you're inputting numbers and not strings. - -If a null is specified as a point or if one of the coordinates is null -or couldn't be converted to a number, the point is ignored when -drawing. As a special case, a null value for lines is interpreted as a -line segment end, i.e. the points before and after the null value are -not connected. - -Lines and points take two coordinates. For filled lines and bars, you -can specify a third coordinate which is the bottom of the filled -area/bar (defaults to 0). - -The format of a single series object is as follows: - - { - color: color or number - data: rawdata - label: string - lines: specific lines options - bars: specific bars options - points: specific points options - xaxis: number - yaxis: number - clickable: boolean - hoverable: boolean - shadowSize: number - } - -You don't have to specify any of them except the data, the rest are -options that will get default values. Typically you'd only specify -label and data, like this: - - { - label: "y = 3", - data: [[0, 3], [10, 3]] - } - -The label is used for the legend, if you don't specify one, the series -will not show up in the legend. - -If you don't specify color, the series will get a color from the -auto-generated colors. The color is either a CSS color specification -(like "rgb(255, 100, 123)") or an integer that specifies which of -auto-generated colors to select, e.g. 0 will get color no. 0, etc. - -The latter is mostly useful if you let the user add and remove series, -in which case you can hard-code the color index to prevent the colors -from jumping around between the series. - -The "xaxis" and "yaxis" options specify which axis to use. The axes -are numbered from 1 (default), so { yaxis: 2} means that the series -should be plotted against the second y axis. - -"clickable" and "hoverable" can be set to false to disable -interactivity for specific series if interactivity is turned on in -the plot, see below. - -The rest of the options are all documented below as they are the same -as the default options passed in via the options parameter in the plot -commmand. When you specify them for a specific data series, they will -override the default options for the plot for that data series. - -Here's a complete example of a simple data specification: - - [ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] }, - { label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] } ] - - -Plot Options ------------- - -All options are completely optional. They are documented individually -below, to change them you just specify them in an object, e.g. - - var options = { - series: { - lines: { show: true }, - points: { show: true } - } - }; - - $.plot(placeholder, data, options); - - -Customizing the legend -====================== - - legend: { - show: boolean - labelFormatter: null or (fn: string, series object -> string) - labelBoxBorderColor: color - noColumns: number - position: "ne" or "nw" or "se" or "sw" - margin: number of pixels or [x margin, y margin] - backgroundColor: null or color - backgroundOpacity: number between 0 and 1 - container: null or jQuery object/DOM element/jQuery expression - } - -The legend is generated as a table with the data series labels and -small label boxes with the color of the series. If you want to format -the labels in some way, e.g. make them to links, you can pass in a -function for "labelFormatter". Here's an example that makes them -clickable: - - labelFormatter: function(label, series) { - // series is the series object for the label - return '' + label + ''; - } - -"noColumns" is the number of columns to divide the legend table into. -"position" specifies the overall placement of the legend within the -plot (top-right, top-left, etc.) and margin the distance to the plot -edge (this can be either a number or an array of two numbers like [x, -y]). "backgroundColor" and "backgroundOpacity" specifies the -background. The default is a partly transparent auto-detected -background. - -If you want the legend to appear somewhere else in the DOM, you can -specify "container" as a jQuery object/expression to put the legend -table into. The "position" and "margin" etc. options will then be -ignored. Note that Flot will overwrite the contents of the container. - - -Customizing the axes -==================== - - xaxis, yaxis: { - show: null or true/false - position: "bottom" or "top" or "left" or "right" - mode: null or "time" - - color: null or color spec - tickColor: null or color spec - - min: null or number - max: null or number - autoscaleMargin: null or number - - transform: null or fn: number -> number - inverseTransform: null or fn: number -> number - - ticks: null or number or ticks array or (fn: range -> ticks array) - tickSize: number or array - minTickSize: number or array - tickFormatter: (fn: number, object -> string) or string - tickDecimals: null or number - - labelWidth: null or number - labelHeight: null or number - reserveSpace: null or true - - tickLength: null or number - - alignTicksWithAxis: null or number - } - -All axes have the same kind of options. The following describes how to -configure one axis, see below for what to do if you've got more than -one x axis or y axis. - -If you don't set the "show" option (i.e. it is null), visibility is -auto-detected, i.e. the axis will show up if there's data associated -with it. You can override this by setting the "show" option to true or -false. - -The "position" option specifies where the axis is placed, bottom or -top for x axes, left or right for y axes. The "mode" option determines -how the data is interpreted, the default of null means as decimal -numbers. Use "time" for time series data, see the time series data -section. - -The "color" option determines the color of the labels and ticks for -the axis (default is the grid color). For more fine-grained control -you can also set the color of the ticks separately with "tickColor" -(otherwise it's autogenerated as the base color with some -transparency). - -The options "min"/"max" are the precise minimum/maximum value on the -scale. If you don't specify either of them, a value will automatically -be chosen based on the minimum/maximum data values. Note that Flot -always examines all the data values you feed to it, even if a -restriction on another axis may make some of them invisible (this -makes interactive use more stable). - -The "autoscaleMargin" is a bit esoteric: it's the fraction of margin -that the scaling algorithm will add to avoid that the outermost points -ends up on the grid border. Note that this margin is only applied when -a min or max value is not explicitly set. If a margin is specified, -the plot will furthermore extend the axis end-point to the nearest -whole tick. The default value is "null" for the x axes and 0.02 for y -axes which seems appropriate for most cases. - -"transform" and "inverseTransform" are callbacks you can put in to -change the way the data is drawn. You can design a function to -compress or expand certain parts of the axis non-linearly, e.g. -suppress weekends or compress far away points with a logarithm or some -other means. When Flot draws the plot, each value is first put through -the transform function. Here's an example, the x axis can be turned -into a natural logarithm axis with the following code: - - xaxis: { - transform: function (v) { return Math.log(v); }, - inverseTransform: function (v) { return Math.exp(v); } - } - -Similarly, for reversing the y axis so the values appear in inverse -order: - - yaxis: { - transform: function (v) { return -v; }, - inverseTransform: function (v) { return -v; } - } - -Note that for finding extrema, Flot assumes that the transform -function does not reorder values (it should be monotone). - -The inverseTransform is simply the inverse of the transform function -(so v == inverseTransform(transform(v)) for all relevant v). It is -required for converting from canvas coordinates to data coordinates, -e.g. for a mouse interaction where a certain pixel is clicked. If you -don't use any interactive features of Flot, you may not need it. - - -The rest of the options deal with the ticks. - -If you don't specify any ticks, a tick generator algorithm will make -some for you. The algorithm has two passes. It first estimates how -many ticks would be reasonable and uses this number to compute a nice -round tick interval size. Then it generates the ticks. - -You can specify how many ticks the algorithm aims for by setting -"ticks" to a number. The algorithm always tries to generate reasonably -round tick values so even if you ask for three ticks, you might get -five if that fits better with the rounding. If you don't want any -ticks at all, set "ticks" to 0 or an empty array. - -Another option is to skip the rounding part and directly set the tick -interval size with "tickSize". If you set it to 2, you'll get ticks at -2, 4, 6, etc. Alternatively, you can specify that you just don't want -ticks at a size less than a specific tick size with "minTickSize". -Note that for time series, the format is an array like [2, "month"], -see the next section. - -If you want to completely override the tick algorithm, you can specify -an array for "ticks", either like this: - - ticks: [0, 1.2, 2.4] - -Or like this where the labels are also customized: - - ticks: [[0, "zero"], [1.2, "one mark"], [2.4, "two marks"]] - -You can mix the two if you like. - -For extra flexibility you can specify a function as the "ticks" -parameter. The function will be called with an object with the axis -min and max and should return a ticks array. Here's a simplistic tick -generator that spits out intervals of pi, suitable for use on the x -axis for trigonometric functions: - - function piTickGenerator(axis) { - var res = [], i = Math.floor(axis.min / Math.PI); - do { - var v = i * Math.PI; - res.push([v, i + "\u03c0"]); - ++i; - } while (v < axis.max); - - return res; - } - -You can control how the ticks look like with "tickDecimals", the -number of decimals to display (default is auto-detected). - -Alternatively, for ultimate control over how ticks are formatted you can -provide a function to "tickFormatter". The function is passed two -parameters, the tick value and an axis object with information, and -should return a string. The default formatter looks like this: - - function formatter(val, axis) { - return val.toFixed(axis.tickDecimals); - } - -The axis object has "min" and "max" with the range of the axis, -"tickDecimals" with the number of decimals to round the value to and -"tickSize" with the size of the interval between ticks as calculated -by the automatic axis scaling algorithm (or specified by you). Here's -an example of a custom formatter: - - function suffixFormatter(val, axis) { - if (val > 1000000) - return (val / 1000000).toFixed(axis.tickDecimals) + " MB"; - else if (val > 1000) - return (val / 1000).toFixed(axis.tickDecimals) + " kB"; - else - return val.toFixed(axis.tickDecimals) + " B"; - } - -"labelWidth" and "labelHeight" specifies a fixed size of the tick -labels in pixels. They're useful in case you need to align several -plots. "reserveSpace" means that even if an axis isn't shown, Flot -should reserve space for it - it is useful in combination with -labelWidth and labelHeight for aligning multi-axis charts. - -"tickLength" is the length of the tick lines in pixels. By default, the -innermost axes will have ticks that extend all across the plot, while -any extra axes use small ticks. A value of null means use the default, -while a number means small ticks of that length - set it to 0 to hide -the lines completely. - -If you set "alignTicksWithAxis" to the number of another axis, e.g. -alignTicksWithAxis: 1, Flot will ensure that the autogenerated ticks -of this axis are aligned with the ticks of the other axis. This may -improve the looks, e.g. if you have one y axis to the left and one to -the right, because the grid lines will then match the ticks in both -ends. The trade-off is that the forced ticks won't necessarily be at -natural places. - - -Multiple axes -============= - -If you need more than one x axis or y axis, you need to specify for -each data series which axis they are to use, as described under the -format of the data series, e.g. { data: [...], yaxis: 2 } specifies -that a series should be plotted against the second y axis. - -To actually configure that axis, you can't use the xaxis/yaxis options -directly - instead there are two arrays in the options: - - xaxes: [] - yaxes: [] - -Here's an example of configuring a single x axis and two y axes (we -can leave options of the first y axis empty as the defaults are fine): - - { - xaxes: [ { position: "top" } ], - yaxes: [ { }, { position: "right", min: 20 } ] - } - -The arrays get their default values from the xaxis/yaxis settings, so -say you want to have all y axes start at zero, you can simply specify -yaxis: { min: 0 } instead of adding a min parameter to all the axes. - -Generally, the various interfaces in Flot dealing with data points -either accept an xaxis/yaxis parameter to specify which axis number to -use (starting from 1), or lets you specify the coordinate directly as -x2/x3/... or x2axis/x3axis/... instead of "x" or "xaxis". - - -Time series data -================ - -Time series are a bit more difficult than scalar data because -calendars don't follow a simple base 10 system. For many cases, Flot -abstracts most of this away, but it can still be a bit difficult to -get the data into Flot. So we'll first discuss the data format. - -The time series support in Flot is based on Javascript timestamps, -i.e. everywhere a time value is expected or handed over, a Javascript -timestamp number is used. This is a number, not a Date object. A -Javascript timestamp is the number of milliseconds since January 1, -1970 00:00:00 UTC. This is almost the same as Unix timestamps, except it's -in milliseconds, so remember to multiply by 1000! - -You can see a timestamp like this - - alert((new Date()).getTime()) - -Normally you want the timestamps to be displayed according to a -certain time zone, usually the time zone in which the data has been -produced. However, Flot always displays timestamps according to UTC. -It has to as the only alternative with core Javascript is to interpret -the timestamps according to the time zone that the visitor is in, -which means that the ticks will shift unpredictably with the time zone -and daylight savings of each visitor. - -So given that there's no good support for custom time zones in -Javascript, you'll have to take care of this server-side. - -The easiest way to think about it is to pretend that the data -production time zone is UTC, even if it isn't. So if you have a -datapoint at 2002-02-20 08:00, you can generate a timestamp for eight -o'clock UTC even if it really happened eight o'clock UTC+0200. - -In PHP you can get an appropriate timestamp with -'strtotime("2002-02-20 UTC") * 1000', in Python with -'calendar.timegm(datetime_object.timetuple()) * 1000', in .NET with -something like: - - public static int GetJavascriptTimestamp(System.DateTime input) - { - System.TimeSpan span = new System.TimeSpan(System.DateTime.Parse("1/1/1970").Ticks); - System.DateTime time = input.Subtract(span); - return (long)(time.Ticks / 10000); - } - -Javascript also has some support for parsing date strings, so it is -possible to generate the timestamps manually client-side. - -If you've already got the real UTC timestamp, it's too late to use the -pretend trick described above. But you can fix up the timestamps by -adding the time zone offset, e.g. for UTC+0200 you would add 2 hours -to the UTC timestamp you got. Then it'll look right on the plot. Most -programming environments have some means of getting the timezone -offset for a specific date (note that you need to get the offset for -each individual timestamp to account for daylight savings). - -Once you've gotten the timestamps into the data and specified "time" -as the axis mode, Flot will automatically generate relevant ticks and -format them. As always, you can tweak the ticks via the "ticks" option -- just remember that the values should be timestamps (numbers), not -Date objects. - -Tick generation and formatting can also be controlled separately -through the following axis options: - - minTickSize: array - timeformat: null or format string - monthNames: null or array of size 12 of strings - twelveHourClock: boolean - -Here "timeformat" is a format string to use. You might use it like -this: - - xaxis: { - mode: "time" - timeformat: "%y/%m/%d" - } - -This will result in tick labels like "2000/12/24". The following -specifiers are supported - - %h: hours - %H: hours (left-padded with a zero) - %M: minutes (left-padded with a zero) - %S: seconds (left-padded with a zero) - %d: day of month (1-31), use %0d for zero-padding - %m: month (1-12), use %0m for zero-padding - %y: year (four digits) - %b: month name (customizable) - %p: am/pm, additionally switches %h/%H to 12 hour instead of 24 - %P: AM/PM (uppercase version of %p) - -Inserting a zero like %0m or %0d means that the specifier will be -left-padded with a zero if it's only single-digit. So %y-%0m-%0d -results in unambigious ISO timestamps like 2007-05-10 (for May 10th). - -You can customize the month names with the "monthNames" option. For -instance, for Danish you might specify: - - monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] - -If you set "twelveHourClock" to true, the autogenerated timestamps -will use 12 hour AM/PM timestamps instead of 24 hour. - -The format string and month names are used by a very simple built-in -format function that takes a date object, a format string (and -optionally an array of month names) and returns the formatted string. -If needed, you can access it as $.plot.formatDate(date, formatstring, -monthNames) or even replace it with another more advanced function -from a date library if you're feeling adventurous. - -If everything else fails, you can control the formatting by specifying -a custom tick formatter function as usual. Here's a simple example -which will format December 24 as 24/12: - - tickFormatter: function (val, axis) { - var d = new Date(val); - return d.getUTCDate() + "/" + (d.getUTCMonth() + 1); - } - -Note that for the time mode "tickSize" and "minTickSize" are a bit -special in that they are arrays on the form "[value, unit]" where unit -is one of "second", "minute", "hour", "day", "month" and "year". So -you can specify - - minTickSize: [1, "month"] - -to get a tick interval size of at least 1 month and correspondingly, -if axis.tickSize is [2, "day"] in the tick formatter, the ticks have -been produced with two days in-between. - - - -Customizing the data series -=========================== - - series: { - lines, points, bars: { - show: boolean - lineWidth: number - fill: boolean or number - fillColor: null or color/gradient - } - - points: { - radius: number - symbol: "circle" or function - } - - bars: { - barWidth: number - align: "left" or "center" - horizontal: boolean - } - - lines: { - steps: boolean - } - - shadowSize: number - } - - colors: [ color1, color2, ... ] - -The options inside "series: {}" are copied to each of the series. So -you can specify that all series should have bars by putting it in the -global options, or override it for individual series by specifying -bars in a particular the series object in the array of data. - -The most important options are "lines", "points" and "bars" that -specify whether and how lines, points and bars should be shown for -each data series. In case you don't specify anything at all, Flot will -default to showing lines (you can turn this off with -lines: { show: false }). You can specify the various types -independently of each other, and Flot will happily draw each of them -in turn (this is probably only useful for lines and points), e.g. - - var options = { - series: { - lines: { show: true, fill: true, fillColor: "rgba(255, 255, 255, 0.8)" }, - points: { show: true, fill: false } - } - }; - -"lineWidth" is the thickness of the line or outline in pixels. You can -set it to 0 to prevent a line or outline from being drawn; this will -also hide the shadow. - -"fill" is whether the shape should be filled. For lines, this produces -area graphs. You can use "fillColor" to specify the color of the fill. -If "fillColor" evaluates to false (default for everything except -points which are filled with white), the fill color is auto-set to the -color of the data series. You can adjust the opacity of the fill by -setting fill to a number between 0 (fully transparent) and 1 (fully -opaque). - -For bars, fillColor can be a gradient, see the gradient documentation -below. "barWidth" is the width of the bars in units of the x axis (or -the y axis if "horizontal" is true), contrary to most other measures -that are specified in pixels. For instance, for time series the unit -is milliseconds so 24 * 60 * 60 * 1000 produces bars with the width of -a day. "align" specifies whether a bar should be left-aligned -(default) or centered on top of the value it represents. When -"horizontal" is on, the bars are drawn horizontally, i.e. from the y -axis instead of the x axis; note that the bar end points are still -defined in the same way so you'll probably want to swap the -coordinates if you've been plotting vertical bars first. - -For lines, "steps" specifies whether two adjacent data points are -connected with a straight (possibly diagonal) line or with first a -horizontal and then a vertical line. Note that this transforms the -data by adding extra points. - -For points, you can specify the radius and the symbol. The only -built-in symbol type is circles, for other types you can use a plugin -or define them yourself by specifying a callback: - - function cross(ctx, x, y, radius, shadow) { - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.moveTo(x - size, y - size); - ctx.lineTo(x + size, y + size); - ctx.moveTo(x - size, y + size); - ctx.lineTo(x + size, y - size); - } - -The parameters are the drawing context, x and y coordinates of the -center of the point, a radius which corresponds to what the circle -would have used and whether the call is to draw a shadow (due to -limited canvas support, shadows are currently faked through extra -draws). It's good practice to ensure that the area covered by the -symbol is the same as for the circle with the given radius, this -ensures that all symbols have approximately the same visual weight. - -"shadowSize" is the default size of shadows in pixels. Set it to 0 to -remove shadows. - -The "colors" array specifies a default color theme to get colors for -the data series from. You can specify as many colors as you like, like -this: - - colors: ["#d18b2c", "#dba255", "#919733"] - -If there are more data series than colors, Flot will try to generate -extra colors by lightening and darkening colors in the theme. - - -Customizing the grid -==================== - - grid: { - show: boolean - aboveData: boolean - color: color - backgroundColor: color/gradient or null - labelMargin: number - axisMargin: number - markings: array of markings or (fn: axes -> array of markings) - borderWidth: number - borderColor: color or null - minBorderMargin: number or null - clickable: boolean - hoverable: boolean - autoHighlight: boolean - mouseActiveRadius: number - } - -The grid is the thing with the axes and a number of ticks. Many of the -things in the grid are configured under the individual axes, but not -all. "color" is the color of the grid itself whereas "backgroundColor" -specifies the background color inside the grid area, here null means -that the background is transparent. You can also set a gradient, see -the gradient documentation below. - -You can turn off the whole grid including tick labels by setting -"show" to false. "aboveData" determines whether the grid is drawn -above the data or below (below is default). - -"labelMargin" is the space in pixels between tick labels and axis -line, and "axisMargin" is the space in pixels between axes when there -are two next to each other. Note that you can style the tick labels -with CSS, e.g. to change the color. They have class "tickLabel". - -"borderWidth" is the width of the border around the plot. Set it to 0 -to disable the border. You can also set "borderColor" if you want the -border to have a different color than the grid lines. -"minBorderMargin" controls the default minimum margin around the -border - it's used to make sure that points aren't accidentally -clipped by the canvas edge so by default the value is computed from -the point radius. - -"markings" is used to draw simple lines and rectangular areas in the -background of the plot. You can either specify an array of ranges on -the form { xaxis: { from, to }, yaxis: { from, to } } (with multiple -axes, you can specify coordinates for other axes instead, e.g. as -x2axis/x3axis/...) or with a function that returns such an array given -the axes for the plot in an object as the first parameter. - -You can set the color of markings by specifying "color" in the ranges -object. Here's an example array: - - markings: [ { xaxis: { from: 0, to: 2 }, yaxis: { from: 10, to: 10 }, color: "#bb0000" }, ... ] - -If you leave out one of the values, that value is assumed to go to the -border of the plot. So for example if you only specify { xaxis: { -from: 0, to: 2 } } it means an area that extends from the top to the -bottom of the plot in the x range 0-2. - -A line is drawn if from and to are the same, e.g. - - markings: [ { yaxis: { from: 1, to: 1 } }, ... ] - -would draw a line parallel to the x axis at y = 1. You can control the -line width with "lineWidth" in the range object. - -An example function that makes vertical stripes might look like this: - - markings: function (axes) { - var markings = []; - for (var x = Math.floor(axes.xaxis.min); x < axes.xaxis.max; x += 2) - markings.push({ xaxis: { from: x, to: x + 1 } }); - return markings; - } - - -If you set "clickable" to true, the plot will listen for click events -on the plot area and fire a "plotclick" event on the placeholder with -a position and a nearby data item object as parameters. The coordinates -are available both in the unit of the axes (not in pixels) and in -global screen coordinates. - -Likewise, if you set "hoverable" to true, the plot will listen for -mouse move events on the plot area and fire a "plothover" event with -the same parameters as the "plotclick" event. If "autoHighlight" is -true (the default), nearby data items are highlighted automatically. -If needed, you can disable highlighting and control it yourself with -the highlight/unhighlight plot methods described elsewhere. - -You can use "plotclick" and "plothover" events like this: - - $.plot($("#placeholder"), [ d ], { grid: { clickable: true } }); - - $("#placeholder").bind("plotclick", function (event, pos, item) { - alert("You clicked at " + pos.x + ", " + pos.y); - // axis coordinates for other axes, if present, are in pos.x2, pos.x3, ... - // if you need global screen coordinates, they are pos.pageX, pos.pageY - - if (item) { - highlight(item.series, item.datapoint); - alert("You clicked a point!"); - } - }); - -The item object in this example is either null or a nearby object on the form: - - item: { - datapoint: the point, e.g. [0, 2] - dataIndex: the index of the point in the data array - series: the series object - seriesIndex: the index of the series - pageX, pageY: the global screen coordinates of the point - } - -For instance, if you have specified the data like this - - $.plot($("#placeholder"), [ { label: "Foo", data: [[0, 10], [7, 3]] } ], ...); - -and the mouse is near the point (7, 3), "datapoint" is [7, 3], -"dataIndex" will be 1, "series" is a normalized series object with -among other things the "Foo" label in series.label and the color in -series.color, and "seriesIndex" is 0. Note that plugins and options -that transform the data can shift the indexes from what you specified -in the original data array. - -If you use the above events to update some other information and want -to clear out that info in case the mouse goes away, you'll probably -also need to listen to "mouseout" events on the placeholder div. - -"mouseActiveRadius" specifies how far the mouse can be from an item -and still activate it. If there are two or more points within this -radius, Flot chooses the closest item. For bars, the top-most bar -(from the latest specified data series) is chosen. - -If you want to disable interactivity for a specific data series, you -can set "hoverable" and "clickable" to false in the options for that -series, like this { data: [...], label: "Foo", clickable: false }. - - -Specifying gradients -==================== - -A gradient is specified like this: - - { colors: [ color1, color2, ... ] } - -For instance, you might specify a background on the grid going from -black to gray like this: - - grid: { - backgroundColor: { colors: ["#000", "#999"] } - } - -For the series you can specify the gradient as an object that -specifies the scaling of the brightness and the opacity of the series -color, e.g. - - { colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] } - -where the first color simply has its alpha scaled, whereas the second -is also darkened. For instance, for bars the following makes the bars -gradually disappear, without outline: - - bars: { - show: true, - lineWidth: 0, - fill: true, - fillColor: { colors: [ { opacity: 0.8 }, { opacity: 0.1 } ] } - } - -Flot currently only supports vertical gradients drawn from top to -bottom because that's what works with IE. - - -Plot Methods ------------- - -The Plot object returned from the plot function has some methods you -can call: - - - highlight(series, datapoint) - - Highlight a specific datapoint in the data series. You can either - specify the actual objects, e.g. if you got them from a - "plotclick" event, or you can specify the indices, e.g. - highlight(1, 3) to highlight the fourth point in the second series - (remember, zero-based indexing). - - - - unhighlight(series, datapoint) or unhighlight() - - Remove the highlighting of the point, same parameters as - highlight. - - If you call unhighlight with no parameters, e.g. as - plot.unhighlight(), all current highlights are removed. - - - - setData(data) - - You can use this to reset the data used. Note that axis scaling, - ticks, legend etc. will not be recomputed (use setupGrid() to do - that). You'll probably want to call draw() afterwards. - - You can use this function to speed up redrawing a small plot if - you know that the axes won't change. Put in the new data with - setData(newdata), call draw(), and you're good to go. Note that - for large datasets, almost all the time is consumed in draw() - plotting the data so in this case don't bother. - - - - setupGrid() - - Recalculate and set axis scaling, ticks, legend etc. - - Note that because of the drawing model of the canvas, this - function will immediately redraw (actually reinsert in the DOM) - the labels and the legend, but not the actual tick lines because - they're drawn on the canvas. You need to call draw() to get the - canvas redrawn. - - - draw() - - Redraws the plot canvas. - - - triggerRedrawOverlay() - - Schedules an update of an overlay canvas used for drawing - interactive things like a selection and point highlights. This - is mostly useful for writing plugins. The redraw doesn't happen - immediately, instead a timer is set to catch multiple successive - redraws (e.g. from a mousemove). You can get to the overlay by - setting up a drawOverlay hook. - - - width()/height() - - Gets the width and height of the plotting area inside the grid. - This is smaller than the canvas or placeholder dimensions as some - extra space is needed (e.g. for labels). - - - offset() - - Returns the offset of the plotting area inside the grid relative - to the document, useful for instance for calculating mouse - positions (event.pageX/Y minus this offset is the pixel position - inside the plot). - - - pointOffset({ x: xpos, y: ypos }) - - Returns the calculated offset of the data point at (x, y) in data - space within the placeholder div. If you are working with multiple axes, you - can specify the x and y axis references, e.g. - - o = pointOffset({ x: xpos, y: ypos, xaxis: 2, yaxis: 3 }) - // o.left and o.top now contains the offset within the div - - - resize() - - Tells Flot to resize the drawing canvas to the size of the - placeholder. You need to run setupGrid() and draw() afterwards as - canvas resizing is a destructive operation. This is used - internally by the resize plugin. - - - shutdown() - - Cleans up any event handlers Flot has currently registered. This - is used internally. - - -There are also some members that let you peek inside the internal -workings of Flot which is useful in some cases. Note that if you change -something in the objects returned, you're changing the objects used by -Flot to keep track of its state, so be careful. - - - getData() - - Returns an array of the data series currently used in normalized - form with missing settings filled in according to the global - options. So for instance to find out what color Flot has assigned - to the data series, you could do this: - - var series = plot.getData(); - for (var i = 0; i < series.length; ++i) - alert(series[i].color); - - A notable other interesting field besides color is datapoints - which has a field "points" with the normalized data points in a - flat array (the field "pointsize" is the increment in the flat - array to get to the next point so for a dataset consisting only of - (x,y) pairs it would be 2). - - - getAxes() - - Gets an object with the axes. The axes are returned as the - attributes of the object, so for instance getAxes().xaxis is the - x axis. - - Various things are stuffed inside an axis object, e.g. you could - use getAxes().xaxis.ticks to find out what the ticks are for the - xaxis. Two other useful attributes are p2c and c2p, functions for - transforming from data point space to the canvas plot space and - back. Both returns values that are offset with the plot offset. - Check the Flot source code for the complete set of attributes (or - output an axis with console.log() and inspect it). - - With multiple axes, the extra axes are returned as x2axis, x3axis, - etc., e.g. getAxes().y2axis is the second y axis. You can check - y2axis.used to see whether the axis is associated with any data - points and y2axis.show to see if it is currently shown. - - - getPlaceholder() - - Returns placeholder that the plot was put into. This can be useful - for plugins for adding DOM elements or firing events. - - - getCanvas() - - Returns the canvas used for drawing in case you need to hack on it - yourself. You'll probably need to get the plot offset too. - - - getPlotOffset() - - Gets the offset that the grid has within the canvas as an object - with distances from the canvas edges as "left", "right", "top", - "bottom". I.e., if you draw a circle on the canvas with the center - placed at (left, top), its center will be at the top-most, left - corner of the grid. - - - getOptions() - - Gets the options for the plot, normalized, with default values - filled in. You get a reference to actual values used by Flot, so - if you modify the values in here, Flot will use the new values. - If you change something, you probably have to call draw() or - setupGrid() or triggerRedrawOverlay() to see the change. - - -Hooks -===== - -In addition to the public methods, the Plot object also has some hooks -that can be used to modify the plotting process. You can install a -callback function at various points in the process, the function then -gets access to the internal data structures in Flot. - -Here's an overview of the phases Flot goes through: - - 1. Plugin initialization, parsing options - - 2. Constructing the canvases used for drawing - - 3. Set data: parsing data specification, calculating colors, - copying raw data points into internal format, - normalizing them, finding max/min for axis auto-scaling - - 4. Grid setup: calculating axis spacing, ticks, inserting tick - labels, the legend - - 5. Draw: drawing the grid, drawing each of the series in turn - - 6. Setting up event handling for interactive features - - 7. Responding to events, if any - - 8. Shutdown: this mostly happens in case a plot is overwritten - -Each hook is simply a function which is put in the appropriate array. -You can add them through the "hooks" option, and they are also available -after the plot is constructed as the "hooks" attribute on the returned -plot object, e.g. - - // define a simple draw hook - function hellohook(plot, canvascontext) { alert("hello!"); }; - - // pass it in, in an array since we might want to specify several - var plot = $.plot(placeholder, data, { hooks: { draw: [hellohook] } }); - - // we can now find it again in plot.hooks.draw[0] unless a plugin - // has added other hooks - -The available hooks are described below. All hook callbacks get the -plot object as first parameter. You can find some examples of defined -hooks in the plugins bundled with Flot. - - - processOptions [phase 1] - - function(plot, options) - - Called after Flot has parsed and merged options. Useful in the - instance where customizations beyond simple merging of default - values is needed. A plugin might use it to detect that it has been - enabled and then turn on or off other options. - - - - processRawData [phase 3] - - function(plot, series, data, datapoints) - - Called before Flot copies and normalizes the raw data for the given - series. If the function fills in datapoints.points with normalized - points and sets datapoints.pointsize to the size of the points, - Flot will skip the copying/normalization step for this series. - - In any case, you might be interested in setting datapoints.format, - an array of objects for specifying how a point is normalized and - how it interferes with axis scaling. - - The default format array for points is something along the lines of: - - [ - { x: true, number: true, required: true }, - { y: true, number: true, required: true } - ] - - The first object means that for the first coordinate it should be - taken into account when scaling the x axis, that it must be a - number, and that it is required - so if it is null or cannot be - converted to a number, the whole point will be zeroed out with - nulls. Beyond these you can also specify "defaultValue", a value to - use if the coordinate is null. This is for instance handy for bars - where one can omit the third coordinate (the bottom of the bar) - which then defaults to 0. - - - - processDatapoints [phase 3] - - function(plot, series, datapoints) - - Called after normalization of the given series but before finding - min/max of the data points. This hook is useful for implementing data - transformations. "datapoints" contains the normalized data points in - a flat array as datapoints.points with the size of a single point - given in datapoints.pointsize. Here's a simple transform that - multiplies all y coordinates by 2: - - function multiply(plot, series, datapoints) { - var points = datapoints.points, ps = datapoints.pointsize; - for (var i = 0; i < points.length; i += ps) - points[i + 1] *= 2; - } - - Note that you must leave datapoints in a good condition as Flot - doesn't check it or do any normalization on it afterwards. - - - - drawSeries [phase 5] - - function(plot, canvascontext, series) - - Hook for custom drawing of a single series. Called just before the - standard drawing routine has been called in the loop that draws - each series. - - - - draw [phase 5] - - function(plot, canvascontext) - - Hook for drawing on the canvas. Called after the grid is drawn - (unless it's disabled or grid.aboveData is set) and the series have - been plotted (in case any points, lines or bars have been turned - on). For examples of how to draw things, look at the source code. - - - - bindEvents [phase 6] - - function(plot, eventHolder) - - Called after Flot has setup its event handlers. Should set any - necessary event handlers on eventHolder, a jQuery object with the - canvas, e.g. - - function (plot, eventHolder) { - eventHolder.mousedown(function (e) { - alert("You pressed the mouse at " + e.pageX + " " + e.pageY); - }); - } - - Interesting events include click, mousemove, mouseup/down. You can - use all jQuery events. Usually, the event handlers will update the - state by drawing something (add a drawOverlay hook and call - triggerRedrawOverlay) or firing an externally visible event for - user code. See the crosshair plugin for an example. - - Currently, eventHolder actually contains both the static canvas - used for the plot itself and the overlay canvas used for - interactive features because some versions of IE get the stacking - order wrong. The hook only gets one event, though (either for the - overlay or for the static canvas). - - Note that custom plot events generated by Flot are not generated on - eventHolder, but on the div placeholder supplied as the first - argument to the plot call. You can get that with - plot.getPlaceholder() - that's probably also the one you should use - if you need to fire a custom event. - - - - drawOverlay [phase 7] - - function (plot, canvascontext) - - The drawOverlay hook is used for interactive things that need a - canvas to draw on. The model currently used by Flot works the way - that an extra overlay canvas is positioned on top of the static - canvas. This overlay is cleared and then completely redrawn - whenever something interesting happens. This hook is called when - the overlay canvas is to be redrawn. - - "canvascontext" is the 2D context of the overlay canvas. You can - use this to draw things. You'll most likely need some of the - metrics computed by Flot, e.g. plot.width()/plot.height(). See the - crosshair plugin for an example. - - - - shutdown [phase 8] - - function (plot, eventHolder) - - Run when plot.shutdown() is called, which usually only happens in - case a plot is overwritten by a new plot. If you're writing a - plugin that adds extra DOM elements or event handlers, you should - add a callback to clean up after you. Take a look at the section in - PLUGINS.txt for more info. - - -Plugins -------- - -Plugins extend the functionality of Flot. To use a plugin, simply -include its Javascript file after Flot in the HTML page. - -If you're worried about download size/latency, you can concatenate all -the plugins you use, and Flot itself for that matter, into one big file -(make sure you get the order right), then optionally run it through a -Javascript minifier such as YUI Compressor. - -Here's a brief explanation of how the plugin plumbings work: - -Each plugin registers itself in the global array $.plot.plugins. When -you make a new plot object with $.plot, Flot goes through this array -calling the "init" function of each plugin and merging default options -from the "option" attribute of the plugin. The init function gets a -reference to the plot object created and uses this to register hooks -and add new public methods if needed. - -See the PLUGINS.txt file for details on how to write a plugin. As the -above description hints, it's actually pretty easy. - - -Version number --------------- - -The version number of Flot is available in $.plot.version. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/FAQ.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/FAQ.txt deleted file mode 100644 index e02b761888..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/FAQ.txt +++ /dev/null @@ -1,76 +0,0 @@ -Frequently asked questions --------------------------- - -Q: How much data can Flot cope with? - -A: Flot will happily draw everything you send to it so the answer -depends on the browser. The excanvas emulation used for IE (built with -VML) makes IE by far the slowest browser so be sure to test with that -if IE users are in your target group. - -1000 points is not a problem, but as soon as you start having more -points than the pixel width, you should probably start thinking about -downsampling/aggregation as this is near the resolution limit of the -chart anyway. If you downsample server-side, you also save bandwidth. - - -Q: Flot isn't working when I'm using JSON data as source! - -A: Actually, Flot loves JSON data, you just got the format wrong. -Double check that you're not inputting strings instead of numbers, -like [["0", "-2.13"], ["5", "4.3"]]. This is most common mistake, and -the error might not show up immediately because Javascript can do some -conversion automatically. - - -Q: Can I export the graph? - -A: This is a limitation of the canvas technology. There's a hook in -the canvas object for getting an image out, but you won't get the tick -labels. And it's not likely to be supported by IE. At this point, your -best bet is probably taking a screenshot, e.g. with PrtScn. - - -Q: The bars are all tiny in time mode? - -A: It's not really possible to determine the bar width automatically. -So you have to set the width with the barWidth option which is NOT in -pixels, but in the units of the x axis (or the y axis for horizontal -bars). For time mode that's milliseconds so the default value of 1 -makes the bars 1 millisecond wide. - - -Q: Can I use Flot with libraries like Mootools or Prototype? - -A: Yes, Flot supports it out of the box and it's easy! Just use jQuery -instead of $, e.g. call jQuery.plot instead of $.plot and use -jQuery(something) instead of $(something). As a convenience, you can -put in a DOM element for the graph placeholder where the examples and -the API documentation are using jQuery objects. - -Depending on how you include jQuery, you may have to add one line of -code to prevent jQuery from overwriting functions from the other -libraries, see the documentation in jQuery ("Using jQuery with other -libraries") for details. - - -Q: Flot doesn't work with [insert name of Javascript UI framework]! - -A: The only non-standard thing used by Flot is the canvas tag; -otherwise it is simply a series of absolute positioned divs within the -placeholder tag you put in. If this is not working, it's probably -because the framework you're using is doing something weird with the -DOM, or you're using it the wrong way. - -A common problem is that there's display:none on a container until the -user does something. Many tab widgets work this way, and there's -nothing wrong with it - you just can't call Flot inside a display:none -container as explained in the README so you need to hold off the Flot -call until the container is actually displayed (or use -visibility:hidden instead of display:none or move the container -off-screen). - -If you find there's a specific thing we can do to Flot to help, feel -free to submit a bug report. Otherwise, you're welcome to ask for help -on the forum/mailing list, but please don't submit a bug report to -Flot. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/LICENSE.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/LICENSE.txt deleted file mode 100644 index 07d5b2094d..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2007-2009 IOLA and Ole Laursen - -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, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/Makefile b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/Makefile deleted file mode 100644 index b300f1a476..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# Makefile for generating minified files - -.PHONY: all - -# we cheat and process all .js files instead of an exhaustive list -all: $(patsubst %.js,%.min.js,$(filter-out %.min.js,$(wildcard *.js))) - -%.min.js: %.js - yui-compressor $< -o $@ diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/NEWS.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/NEWS.txt deleted file mode 100644 index 5f8e1a0c05..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/NEWS.txt +++ /dev/null @@ -1,508 +0,0 @@ -Flot 0.7 --------- - -API changes: - -Multiple axes support. Code using dual axes should be changed from -using x2axis/y2axis in the options to using an array (although -backwards-compatibility hooks are in place). For instance, - - { - xaxis: { ... }, x2axis: { ... }, - yaxis: { ... }, y2axis: { ... } - } - -becomes - - { - xaxes: [ { ... }, { ... } ], - yaxes: [ { ... }, { ... } ] - } - -Note that if you're just using one axis, continue to use the -xaxis/yaxis directly (it now sets the default settings for the -arrays). Plugins touching the axes must be ported to take the extra -axes into account, check the source to see some examples. - -A related change is that the visibility of axes is now auto-detected. -So if you were relying on an axis to show up even without any data in -the chart, you now need to set the axis "show" option explicitly. - -"tickColor" on the grid options is now deprecated in favour of a -corresponding option on the axes, so { grid: { tickColor: "#000" }} -becomes { xaxis: { tickColor: "#000"}, yaxis: { tickColor: "#000"} }, -but if you just configure a base color Flot will now autogenerate a -tick color by adding transparency. Backwards-compatibility hooks are -in place. - -Final note: now that IE 9 is coming out with canvas support, you may -want to adapt the excanvas include to skip loading it in IE 9 (the -examples have been adapted thanks to Ryley Breiddal). An alternative -to excanvas using Flash has also surfaced, if your graphs are slow in -IE, you may want to give it a spin: - - http://code.google.com/p/flashcanvas/ - - -Changes: - -- Support for specifying a bottom for each point for line charts when - filling them, this means that an arbitrary bottom can be used - instead of just the x axis (based on patches patiently provided by - Roman V. Prikhodchenko). -- New fillbetween plugin that can compute a bottom for a series from - another series, useful for filling areas between lines (see new - example percentiles.html for a use case). -- More predictable handling of gaps for the stacking plugin, now all - undefined ranges are skipped. -- Stacking plugin can stack horizontal bar charts. -- Navigate plugin now redraws the plot while panning instead of only - after the fact (can be disabled by setting the pan.frameRate option - to null), raised by lastthemy (issue 235). -- Date formatter now accepts %0m and %0d to get a zero-padded month or - day (issue raised by Maximillian Dornseif). -- Revamped internals to support an unlimited number of axes, not just - dual (sponsored by Flight Data Services, - www.flightdataservices.com). -- New setting on axes, "tickLength", to control the size of ticks or - turn them off without turning off the labels. -- Axis labels are now put in container divs with classes, for instance - labels in the x axes can be reached via ".xAxis .tickLabel". -- Support for setting the color of an axis (sponsored by Flight Data - Services, www.flightdataservices.com). -- Tick color is now auto-generated as the base color with some - transparency (unless you override it). -- Support for aligning ticks in the axes with "alignTicksWithAxis" to - ensure that they appear next to each other rather than in between, - at the expense of possibly awkward tick steps (sponsored by Flight - Data Services, www.flightdataservices.com). -- Support for customizing the point type through a callback when - plotting points and new symbol plugin with some predefined point - types (sponsored by Utility Data Corporation). -- Resize plugin for automatically redrawing when the placeholder - changes size, e.g. on window resizes (sponsored by Novus Partners). - A resize() method has been added to plot object facilitate this. -- Support Infinity/-Infinity for plotting asymptotes by hacking it - into +/-Number.MAX_VALUE (reported by rabaea.mircea). -- Support for restricting navigate plugin to not pan/zoom an axis (based - on patch by kkaefer). -- Support for providing the drag cursor for the navigate plugin as an - option (based on patch by Kelly T. Moore). -- Options for controlling whether an axis is shown or not (suggestion - by Timo Tuominen) and whether to reserve space for it even if it - isn't shown. -- New attribute $.plot.version with the Flot version as a string. -- The version comment is now included in the minified jquery.flot.min.js. -- New options.grid.minBorderMargin for adjusting the minimum margin - provided around the border (based on patch by corani, issue 188). -- Refactor replot behaviour so Flot tries to reuse the existing - canvas, adding shutdown() methods to the plot (based on patch by - Ryley Breiddal, issue 269). This prevents a memory leak in Chrome - and hopefully makes replotting faster for those who are using $.plot - instead of .setData()/.draw(). Also update jQuery to 1.5.1 to - prevent IE leaks fixed in jQuery. -- New real-time line chart example. - -- New hooks: drawSeries, shutdown - -Bug fixes: - -- Fixed problem with findNearbyItem and bars on top of each other - (reported by ragingchikn, issue 242). -- Fixed problem with ticks and the border (based on patch from - ultimatehustler69, issue 236). -- Fixed problem with plugins adding options to the series objects. -- Fixed a problem introduced in 0.6 with specifying a gradient with { - brightness: x, opacity: y }. -- Don't use $.browser.msie, check for getContext on the created canvas - element instead and try to use excanvas if it's not found (fixes IE - 9 compatibility). -- highlight(s, index) was looking up the point in the original s.data - instead of in the computed datapoints array, which breaks with - plugins that modify the datapoints (such as the stacking plugin). - Issue 316 reported by curlypaul924. -- More robust handling of axis from data passed in from getData() - (problem reported by Morgan). -- Fixed problem with turning off bar outline (issue 253, fix by Jordi - Castells). -- Check the selection passed into setSelection in the selection - plugin, to guard against errors when synchronizing plots (fix by Lau - Bech Lauritzen). -- Fix bug in crosshair code with mouseout resetting the crosshair even - if it is locked (fix by Lau Bech Lauritzen and Banko Adam). -- Fix bug with points plotting using line width from lines rather than - points. -- Fix bug with passing non-array 0 data (for plugins that don't expect - arrays, patch by vpapp1). -- Fix errors in JSON in examples so they work with jQuery 1.4.2 - (fix reported by honestbleeps, issue 357). -- Fix bug with tooltip in interacting.html, this makes the tooltip - much smoother (fix by bdkahn). Fix related bug inside highlighting - handler in Flot. -- Use closure trick to make inline colorhelpers plugin respect - jQuery.noConflict(true), renaming the global jQuery object (reported - by Nick Stielau). -- Listen for mouseleave events and fire a plothover event with empty - item when it occurs to drop highlights when the mouse leaves the - plot (reported by by outspirit). -- Fix bug with using aboveData with a background (reported by - amitayd). -- Fix possible excanvas leak (report and suggested fix by tom9729). -- Fix bug with backwards compatibility for shadowSize = 0 (report and - suggested fix by aspinak). -- Adapt examples to skip loading excanvas (fix by Ryley Breiddal). -- Fix bug that prevent a simple f(x) = -x transform from working - correctly (fix by Mike, issue 263). -- Fix bug in restoring cursor in navigate plugin (reported by Matteo - Gattanini, issue 395). -- Fix bug in picking items when transform/inverseTransform is in use - (reported by Ofri Raviv, and patches and analysis by Jan and Tom - Paton, issue 334 and 467). -- Fix problem with unaligned ticks and hover/click events caused by - padding on the placeholder by hardcoding the placeholder padding to - 0 (reported by adityadineshsaxena, Matt Sommer, Daniel Atos and some - other people, issue 301). -- Update colorhelpers plugin to avoid dying when trying to parse an - invalid string (reported by cadavor, issue 483). - - -Flot 0.6 --------- - -API changes: - -1. Selection support has been moved to a plugin. Thus if you're -passing selection: { mode: something }, you MUST include the file -jquery.flot.selection.js after jquery.flot.js. This reduces the size -of base Flot and makes it easier to customize the selection as well as -improving code clarity. The change is based on a patch from andershol. - -2. In the global options specified in the $.plot command, -"lines", "points", "bars" and "shadowSize" have been moved to a -sub-object called "series", i.e. - - $.plot(placeholder, data, { lines: { show: true }}) - -should be changed to - - $.plot(placeholder, data, { series: { lines: { show: true }}}) - -All future series-specific options will go into this sub-object to -simplify plugin writing. Backward-compatibility code is in place, so -old code should not break. - -3. "plothover" no longer provides the original data point, but instead -a normalized one, since there may be no corresponding original point. - -4. Due to a bug in previous versions of jQuery, you now need at least -jQuery 1.2.6. But if you can, try jQuery 1.3.2 as it got some -improvements in event handling speed. - - -Changes: - -- Added support for disabling interactivity for specific data series - (request from Ronald Schouten and Steve Upton). - -- Flot now calls $() on the placeholder and optional legend container - passed in so you can specify DOM elements or CSS expressions to make - it easier to use Flot with libraries like Prototype or Mootools or - through raw JSON from Ajax responses. - -- A new "plotselecting" event is now emitted while the user is making - a selection. - -- The "plothover" event is now emitted immediately instead of at most - 10 times per second, you'll have to put in a setTimeout yourself if - you're doing something really expensive on this event. - -- The built-in date formatter can now be accessed as - $.plot.formatDate(...) (suggestion by Matt Manela) and even - replaced. - -- Added "borderColor" option to the grid (patch from Amaury Chamayou - and patch from Mike R. Williamson). - -- Added support for gradient backgrounds for the grid, take a look at - the "setting options" example (based on patch from Amaury Chamayou, - issue 90). - -- Gradient bars (suggestion by stefpet). - -- Added a "plotunselected" event which is triggered when the selection - is removed, see "selection" example (suggestion by Meda Ugo); - -- The option legend.margin can now specify horizontal and vertical - margins independently (suggestion by someone who's annoyed). - -- Data passed into Flot is now copied to a new canonical format to - enable further processing before it hits the drawing routines. As a - side-effect, this should make Flot more robust in the face of bad - data (and fixes issue 112). - -- Step-wise charting: line charts have a new option "steps" that when - set to true connects the points with horizontal/vertical steps - instead of diagonal lines. - -- The legend labelFormatter now passes the series in addition to just - the label (suggestion by Vincent Lemeltier). - -- Horizontal bars (based on patch by Jason LeBrun). - -- Support for partial bars by specifying a third coordinate, i.e. they - don't have to start from the axis. This can be used to make stacked - bars. - -- New option to disable the (grid.show). - -- Added pointOffset method for converting a point in data space to an - offset within the placeholder. - -- Plugin system: register an init method in the $.flot.plugins array - to get started, see PLUGINS.txt for details on how to write plugins - (it's easy). There are also some extra methods to enable access to - internal state. - -- Hooks: you can register functions that are called while Flot is - crunching the data and doing the plot. This can be used to modify - Flot without changing the source, useful for writing plugins. Some - hooks are defined, more are likely to come. - -- Threshold plugin: you can set a threshold and a color, and the data - points below that threshold will then get the color. Useful for - marking data below 0, for instance. - -- Stack plugin: you can specify a stack key for each series to have - them summed. This is useful for drawing additive/cumulative graphs - with bars and (currently unfilled) lines. - -- Crosshairs plugin: trace the mouse position on the axes, enable with - crosshair: { mode: "x"} (see the new tracking example for a use). - -- Image plugin: plot prerendered images. - -- Navigation plugin for panning and zooming a plot. - -- More configurable grid. - -- Axis transformation support, useful for non-linear plots, e.g. log - axes and compressed time axes (like omitting weekends). - -- Support for twelve-hour date formatting (patch by Forrest Aldridge). - -- The color parsing code in Flot has been cleaned up and split out so - it's now available as a separate jQuery plugin. It's included inline - in the Flot source to make dependency managing easier. This also - makes it really easy to use the color helpers in Flot plugins. - -Bug fixes: - -- Fixed two corner-case bugs when drawing filled curves (report and - analysis by Joshua Varner). -- Fix auto-adjustment code when setting min to 0 for an axis where the - dataset is completely flat on that axis (report by chovy). -- Fixed a bug with passing in data from getData to setData when the - secondary axes are used (issue 65, reported by nperelman). -- Fixed so that it is possible to turn lines off when no other chart - type is shown (based on problem reported by Glenn Vanderburg), and - fixed so that setting lineWidth to 0 also hides the shadow (based on - problem reported by Sergio Nunes). -- Updated mousemove position expression to the latest from jQuery (bug - reported by meyuchas). -- Use CSS borders instead of background in legend (fix printing issue 25 - and 45). -- Explicitly convert axis min/max to numbers. -- Fixed a bug with drawing marking lines with different colors - (reported by Khurram). -- Fixed a bug with returning y2 values in the selection event (fix - by exists, issue 75). -- Only set position relative on placeholder if it hasn't already a - position different from static (reported by kyberneticist, issue 95). -- Don't round markings to prevent sub-pixel problems (reported by Dan - Lipsitt). -- Make the grid border act similarly to a regular CSS border, i.e. - prevent it from overlapping the plot itself. This also fixes a - problem with anti-aliasing when the width is 1 pixel (reported by - Anthony Ettinger). -- Imported version 3 of excanvas and fixed two issues with the newer - version. Hopefully, this will make Flot work with IE8 (nudge by - Fabien Menager, further analysis by Booink, issue 133). -- Changed the shadow code for lines to hopefully look a bit better - with vertical lines. -- Round tick positions to avoid possible problems with fractions - (suggestion by Fred, issue 130). -- Made the heuristic for determining how many ticks to aim for a bit - smarter. -- Fix for uneven axis margins (report and patch by Paul Kienzle) and - snapping to ticks (concurrent report and patch by lifthrasiir). -- Fixed bug with slicing in findNearbyItems (patch by zollman). -- Make heuristic for x axis label widths more dynamic (patch by - rickinhethuis). -- Make sure points on top take precedence when finding nearby points - when hovering (reported by didroe, issue 224). - -Flot 0.5 --------- - -Backwards API change summary: Timestamps are now in UTC. Also -"selected" event -> becomes "plotselected" with new data, the -parameters for setSelection are now different (but backwards -compatibility hooks are in place), coloredAreas becomes markings with -a new interface (but backwards compatibility hooks are in place). - - -Interactivity: added a new "plothover" event and this and the -"plotclick" event now returns the closest data item (based on patch by -/david, patch by Mark Byers for bar support). See the revamped -"interacting with the data" example for some hints on what you can do. - -Highlighting: you can now highlight points and datapoints are -autohighlighted when you hover over them (if hovering is turned on). - -Support for dual axis has been added (based on patch by someone who's -annoyed and /david). For each data series you can specify which axes -it belongs to, and there are two more axes, x2axis and y2axis, to -customize. This affects the "selected" event which has been renamed to -"plotselected" and spews out { xaxis: { from: -10, to: 20 } ... }, -setSelection in which the parameters are on a new form (backwards -compatible hooks are in place so old code shouldn't break) and -markings (formerly coloredAreas). - -Timestamps in time mode are now displayed according to -UTC instead of the time zone of the visitor. This affects the way the -timestamps should be input; you'll probably have to offset the -timestamps according to your local time zone. It also affects any -custom date handling code (which basically now should use the -equivalent UTC date mehods, e.g. .setUTCMonth() instead of -.setMonth(). - -Added support for specifying the size of tick labels (axis.labelWidth, -axis.labelHeight). Useful for specifying a max label size to keep -multiple plots aligned. - -Markings, previously coloredAreas, are now specified as ranges on the -axes, like { xaxis: { from: 0, to: 10 }}. Furthermore with markings -you can now draw horizontal/vertical lines by setting from and to to -the same coordinate (idea from line support patch by by Ryan Funduk). - -The "fill" option can now be a number that specifies the opacity of -the fill. - -You can now specify a coordinate as null (like [2, null]) and Flot -will take the other coordinate into account when scaling the axes -(based on patch by joebno). - -New option for bars "align". Set it to "center" to center the bars on -the value they represent. - -setSelection now takes a second parameter which you can use to prevent -the method from firing the "plotselected" handler. - -Using the "container" option in legend now overwrites the container -element instead of just appending to it (fixes infinite legend bug, -reported by several people, fix by Brad Dewey). - -Fixed a bug in calculating spacing around the plot (reported by -timothytoe). Fixed a bug in finding max values for all-negative data -sets. Prevent the possibility of eternal looping in tick calculations. -Fixed a bug when borderWidth is set to 0 (reported by -Rob/sanchothefat). Fixed a bug with drawing bars extending below 0 -(reported by James Hewitt, patch by Ryan Funduk). Fixed a -bug with line widths of bars (reported by MikeM). Fixed a bug with -'nw' and 'sw' legend positions. Improved the handling of axis -auto-scaling with bars. Fixed a bug with multi-line x-axis tick -labels (reported by Luca Ciano). IE-fix help by Savage Zhang. - - -Flot 0.4 --------- - -API changes: deprecated axis.noTicks in favor of just specifying the -number as axis.ticks. So "xaxis: { noTicks: 10 }" becomes -"xaxis: { ticks: 10 }" - -Time series support. Specify axis.mode: "time", put in Javascript -timestamps as data, and Flot will automatically spit out sensible -ticks. Take a look at the two new examples. The format can be -customized with axis.timeformat and axis.monthNames, or if that fails -with axis.tickFormatter. - -Support for colored background areas via grid.coloredAreas. Specify an -array of { x1, y1, x2, y2 } objects or a function that returns these -given { xmin, xmax, ymin, ymax }. - -More members on the plot object (report by Chris Davies and others). -"getData" for inspecting the assigned settings on data series (e.g. -color) and "setData", "setupGrid" and "draw" for updating the contents -without a total replot. - -The default number of ticks to aim for is now dependent on the size of -the plot in pixels. Support for customizing tick interval sizes -directly with axis.minTickSize and axis.tickSize. - -Cleaned up the automatic axis scaling algorithm and fixed how it -interacts with ticks. Also fixed a couple of tick-related corner case -bugs (one reported by mainstreetmark, another reported by timothytoe). - -The option axis.tickFormatter now takes a function with two -parameters, the second parameter is an optional object with -information about the axis. It has min, max, tickDecimals, tickSize. - -Added support for segmented lines (based on patch from Michael -MacDonald) and for ignoring null and bad values (suggestion from Nick -Konidaris and joshwaihi). - -Added support for changing the border width (joebno and safoo). -Label colors can be changed via CSS by selecting the tickLabel class. - -Fixed a bug in handling single-item bar series (reported by Emil -Filipov). Fixed erratic behaviour when interacting with the plot -with IE 7 (reported by Lau Bech Lauritzen). Prevent IE/Safari text -selection when selecting stuff on the canvas. - - - -Flot 0.3 --------- - -This is mostly a quick-fix release because jquery.js wasn't included -in the previous zip/tarball. - -Support clicking on the plot. Turn it on with grid: { clickable: true }, -then you get a "plotclick" event on the graph placeholder with the -position in units of the plot. - -Fixed a bug in dealing with data where min = max, thanks to Michael -Messinides. - -Include jquery.js in the zip/tarball. - - -Flot 0.2 --------- - -Added support for putting a background behind the default legend. The -default is the partly transparent background color. Added -backgroundColor and backgroundOpacity to the legend options to control -this. - -The ticks options can now be a callback function that takes one -parameter, an object with the attributes min and max. The function -should return a ticks array. - -Added labelFormatter option in legend, useful for turning the legend -labels into links. - -Fixed a couple of bugs. - -The API should now be fully documented. - -Patch from Guy Fraser to make parts of the code smaller. - -API changes: Moved labelMargin option to grid from x/yaxis. - - -Flot 0.1 --------- - -First public release. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/PLUGINS.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/PLUGINS.txt deleted file mode 100644 index af3d90be58..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/PLUGINS.txt +++ /dev/null @@ -1,137 +0,0 @@ -Writing plugins ---------------- - -All you need to do to make a new plugin is creating an init function -and a set of options (if needed), stuffing it into an object and -putting it in the $.plot.plugins array. For example: - - function myCoolPluginInit(plot) { - plot.coolstring = "Hello!"; - }; - - $.plot.plugins.push({ init: myCoolPluginInit, options: { ... } }); - - // if $.plot is called, it will return a plot object with the - // attribute "coolstring" - -Now, given that the plugin might run in many different places, it's -a good idea to avoid leaking names. The usual trick here is wrap the -above lines in an anonymous function which is called immediately, like -this: (function () { inner code ... })(). To make it even more robust -in case $ is not bound to jQuery but some other Javascript library, we -can write it as - - (function ($) { - // plugin definition - // ... - })(jQuery); - -There's a complete example below, but you should also check out the -plugins bundled with Flot. - - -Complete example ----------------- - -Here is a simple debug plugin which alerts each of the series in the -plot. It has a single option that control whether it is enabled and -how much info to output: - - (function ($) { - function init(plot) { - var debugLevel = 1; - - function checkDebugEnabled(plot, options) { - if (options.debug) { - debugLevel = options.debug; - - plot.hooks.processDatapoints.push(alertSeries); - } - } - - function alertSeries(plot, series, datapoints) { - var msg = "series " + series.label; - if (debugLevel > 1) - msg += " with " + series.data.length + " points"; - alert(msg); - } - - plot.hooks.processOptions.push(checkDebugEnabled); - } - - var options = { debug: 0 }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "simpledebug", - version: "0.1" - }); - })(jQuery); - -We also define "name" and "version". It's not used by Flot, but might -be helpful for other plugins in resolving dependencies. - -Put the above in a file named "jquery.flot.debug.js", include it in an -HTML page and then it can be used with: - - $.plot($("#placeholder"), [...], { debug: 2 }); - -This simple plugin illustrates a couple of points: - - - It uses the anonymous function trick to avoid name pollution. - - It can be enabled/disabled through an option. - - Variables in the init function can be used to store plot-specific - state between the hooks. - -The two last points are important because there may be multiple plots -on the same page, and you'd want to make sure they are not mixed up. - - -Shutting down a plugin ----------------------- - -Each plot object has a shutdown hook which is run when plot.shutdown() -is called. This usually mostly happens in case another plot is made on -top of an existing one. - -The purpose of the hook is to give you a chance to unbind any event -handlers you've registered and remove any extra DOM things you've -inserted. - -The problem with event handlers is that you can have registered a -handler which is run in some point in the future, e.g. with -setTimeout(). Meanwhile, the plot may have been shutdown and removed, -but because your event handler is still referencing it, it can't be -garbage collected yet, and worse, if your handler eventually runs, it -may overwrite stuff on a completely different plot. - - -Some hints on the options -------------------------- - -Plugins should always support appropriate options to enable/disable -them because the plugin user may have several plots on the same page -where only one should use the plugin. In most cases it's probably a -good idea if the plugin is turned off rather than on per default, just -like most of the powerful features in Flot. - -If the plugin needs options that are specific to each series, like the -points or lines options in core Flot, you can put them in "series" in -the options object, e.g. - - var options = { - series: { - downsample: { - algorithm: null, - maxpoints: 1000 - } - } - } - -Then they will be copied by Flot into each series, providing default -values in case none are specified. - -Think hard and long about naming the options. These names are going to -be public API, and code is going to depend on them if the plugin is -successful. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/README.txt b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/README.txt deleted file mode 100644 index 1e49787a05..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/README.txt +++ /dev/null @@ -1,90 +0,0 @@ -About ------ - -Flot is a Javascript plotting library for jQuery. Read more at the -website: - - http://code.google.com/p/flot/ - -Take a look at the examples linked from above, they should give a good -impression of what Flot can do and the source code of the examples is -probably the fastest way to learn how to use Flot. - - -Installation ------------- - -Just include the Javascript file after you've included jQuery. - -Generally, all browsers that support the HTML5 canvas tag are -supported. - -For support for Internet Explorer < 9, you can use Excanvas, a canvas -emulator; this is used in the examples bundled with Flot. You just -include the excanvas script like this: - - - -If it's not working on your development IE 6.0, check that it has -support for VML which Excanvas is relying on. It appears that some -stripped down versions used for test environments on virtual machines -lack the VML support. - -You can also try using Flashcanvas (see -http://code.google.com/p/flashcanvas/), which uses Flash to do the -emulation. Although Flash can be a bit slower to load than VML, if -you've got a lot of points, the Flash version can be much faster -overall. Flot contains some wrapper code for activating Excanvas which -Flashcanvas is compatible with. - -You need at least jQuery 1.2.6, but try at least 1.3.2 for interactive -charts because of performance improvements in event handling. - - -Basic usage ------------ - -Create a placeholder div to put the graph in: - -
- -You need to set the width and height of this div, otherwise the plot -library doesn't know how to scale the graph. You can do it inline like -this: - -
- -You can also do it with an external stylesheet. Make sure that the -placeholder isn't within something with a display:none CSS property - -in that case, Flot has trouble measuring label dimensions which -results in garbled looks and might have trouble measuring the -placeholder dimensions which is fatal (it'll throw an exception). - -Then when the div is ready in the DOM, which is usually on document -ready, run the plot function: - - $.plot($("#placeholder"), data, options); - -Here, data is an array of data series and options is an object with -settings if you want to customize the plot. Take a look at the -examples for some ideas of what to put in or look at the reference -in the file "API.txt". Here's a quick example that'll draw a line from -(0, 0) to (1, 1): - - $.plot($("#placeholder"), [ [[0, 0], [1, 1]] ], { yaxis: { max: 1 } }); - -The plot function immediately draws the chart and then returns a plot -object with a couple of methods. - - -What's with the name? ---------------------- - -First: it's pronounced with a short o, like "plot". Not like "flawed". - -So "Flot" rhymes with "plot". - -And if you look up "flot" in a Danish-to-English dictionary, some up -the words that come up are "good-looking", "attractive", "stylish", -"smart", "impressive", "extravagant". One of the main goals with Flot -is pretty looks. diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/ajax.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/ajax.html deleted file mode 100644 index 9b5ec853a6..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/ajax.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Example of loading data dynamically with AJAX. Percentage change in GDP (source: Eurostat). Click the buttons below.

- -

The data is fetched over HTTP, in this case directly from text - files. Usually the URL would point to some web server handler - (e.g. a PHP page or Java/.NET/Python/Ruby on Rails handler) that - extracts it from a database and serializes it to JSON.

- -

- - - data - - -

- -

- - - data - - -

- -

- - - data - - -

- -

If you combine AJAX with setTimeout, you can poll the server - for new data.

- -

- -

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/annotating.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/annotating.html deleted file mode 100644 index 72c212b3de..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/annotating.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Flot has support for simple background decorations such as - lines and rectangles. They can be useful for marking up certain - areas. You can easily add any HTML you need with standard DOM - manipulation, e.g. for labels. For drawing custom shapes there is - also direct access to the canvas.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-down.gif b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-down.gif deleted file mode 100644 index e239d11aa65b7f9e65978ea1306ee0d8562ff66e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmV;F18e+8Nk%w1VG{ro0Ouh9000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP8AEC2ui022Tc000Pa0RIUbNU)&6fAjPm6sT|B!A!#L6}%@b z(?VdGGWn8t&sRoZ3)f}LNNZ%KbqoKEGC6Wo%74sQW@PrVp3F@3UjA#vvX#z%*jQrw q$&V$!pZ{)+yoK~%xRK$S{@avklhl70K}r>g@~Y3P2*K(M2mm{w^}*Nx diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-left.gif b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-left.gif deleted file mode 100644 index 93ffd5a9e0ddd08a790c3da95a228b2235aae7f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCoXNk%w1VG{ro0Ow}_000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP8AEC2ui022Tc000PB0RIUbNU)&6g9sBUT!?TU!-4C7Wzxs6 z96ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP8AEC2ui022Tc000PH0RIUbNU)&6g9sBU95`>`L4BEkt#e3F zSf)&)nAM|r@1n<6*!V5<<+0?ga0xq>EV)VIL0T(gwrV&~Wz0-1Cl(|b^CUu>7eR_l XXc41EhY(#-{6}-C)2C1s1_S^*=cTQ_ diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-up.gif b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/arrow-up.gif deleted file mode 100644 index 7d196267ebff0e127db6ad9a4fc42a75ff7a348e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmV;F18e+8Nk%w1VG{ro0Ox@K000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP8AEC2ui022Tc000Pa0RIUbNU)&6gYyn59N221!gZO}IW!0? z6R?Q|H)Yy{abUPiAj5V1cMD{uTOIkC1j!F0ww0N%VQdAnp~HGGLDqA~EN3QW4oCSM qwGg67S}P?UteDByy?^(7fxLJyldz`*?+MF - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Simple example. You don't need to specify much to get an - attractive look. Put in a placeholder, make sure you set its - dimensions (otherwise the plot library will barf) and call the - plot function with the data. The axes are automatically - scaled.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-1.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-1.json deleted file mode 100644 index 51952cfa92..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-1.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-2.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-2.json deleted file mode 100644 index 82004d6416..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-2.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-3.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-3.json deleted file mode 100644 index 86844795ad..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2], [2003, 1.3], [2004, 2.5]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-4.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-4.json deleted file mode 100644 index b3635781fa..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-4.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2], [2003, 1.3], [2004, 2.5], [2005, 2.0], [2006, 3.1]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-5.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-5.json deleted file mode 100644 index a7e1e13d6f..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth-5.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2], [2003, 1.3], [2004, 2.5], [2005, 2.0], [2006, 3.1], [2007, 2.9], [2008, 0.9]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth.json deleted file mode 100644 index a7e1e13d6f..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-eu-gdp-growth.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Europe (EU27)", - "data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2], [2003, 1.3], [2004, 2.5], [2005, 2.0], [2006, 3.1], [2007, 2.9], [2008, 0.9]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-japan-gdp-growth.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-japan-gdp-growth.json deleted file mode 100644 index 855477ce0d..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-japan-gdp-growth.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Japan", - "data": [[1999, -0.1], [2000, 2.9], [2001, 0.2], [2002, 0.3], [2003, 1.4], [2004, 2.7], [2005, 1.9], [2006, 2.0], [2007, 2.3], [2008, -0.7]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-usa-gdp-growth.json b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-usa-gdp-growth.json deleted file mode 100644 index 33f66c69a3..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/data-usa-gdp-growth.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "USA", - "data": [[1999, 4.4], [2000, 3.7], [2001, 0.8], [2002, 1.6], [2003, 2.5], [2004, 3.6], [2005, 2.9], [2006, 2.8], [2007, 2.0], [2008, 1.1]] -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/graph-types.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/graph-types.html deleted file mode 100644 index dd21a31edd..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/graph-types.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Flot supports lines, points, filled areas, bars and any - combinations of these, in the same plot and even on the same data - series.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/hs-2004-27-a-large_web.jpg b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/hs-2004-27-a-large_web.jpg deleted file mode 100644 index a1d5c05837576a37a8a7631d8549472154a74807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34489 zcmb4qcQjmI^zY~)NR-h#qnAXCPNEwVL>t3I?`5C-=w;Lx z34(}-5GBv=y|vzY|Gs_xyL;_@_PXcpeLlO~e@p*10r&N^A=&^UA|in9?E?J612h14 z$jK?l$?i~4P*76dp`vD_p}u>Unw6g69wR3kHy0-x2M3RUq!16EI6nu6u$+kagNHIQ zGTcH6D)Q3Gl8GU1}B@8Ww3@4qoa1Z~8X?pu0oDbGwN60K{}eBy>do zJ^d`Gk#r-DQGJ?!>-Z;G2y|0=x|yw!Tk5}^CvyWQ%#)%SmPC88td zeMmyD#$Y6EN6P1`{%-|9eaj-IBcTI423!FE+TkR3dE^09xF@W(%uh&`)YQl~|HoWe z9?ojOk}&-V82}C-$H5zE_q?9m30kEh2e5~GJ#_w<9a+@I@$4SuW|5Vs{VK&;B~EvQ6v{Yx{_Tj-PZ6K*C6D z!dJ;AAKKa0A4&Woh?sq|J8Xr^ijGq5q{Iz3zynEVndQZV&31)1BFyeNa{#0Wvfb3= z1WHff6%A?r6R!Ku!uV`~sc_DqRW4Tm)b^XtB*05$u-8_;8n9*)Av*358Ue5--T&C( zTQEvaPj4`Y4Y|(?|IWn7h-DbTA)W;RtcgFW7t#X6YzxV8UW@<$%>#2Bv8O-R2Y}-3 zdnZeK0$^kU0JwbsfCi$qXdVKK56P0o1^Kf$wLbtNTU!7tt;S`zCwuQP$rIY6nCF?v z!&>TufL%{>Tcs0Ly8$a6;LI7*`qtFYIlzM$a0&2J{Mb-bhRmi@PF7-vhS$M|r)`K# zW&6V|g6^;}M=YjZjH!8@u#2&OBF65d-Fur#T8X;ii{uSJ!cD>mOqT%6r=tFd`GkIe zVKlpR_Ih0O3F%^lNyuhbKyqXzTqYAsS@sVA61e$NW<3D4tr3eu9gDt%0P0CvQV#_< ztcW;vDEcViFV(TO2_g$V;s^aCHx(~ahXJ*{INqydIQ`lK4XDp>50Oj*&=XbTsRF>9 z0ka(n0c8oxu|x^s46Cy6dk5@~HI2rJjxki1;Zcl_83o=^jKV#K%}+?k{{cv9Y={wn z5GrhKzAQ7>08FAy#D&0JO!ho(DU_6$1$HKNz$i=NY6|#uEagDpyw4Tcz`Y81{+1XH z01P|>RN9h0q3jPvemjh8L}sxtSU;c?%*@zN6Y1>`<>u;%6;q-SvKXjZ_&}eplC0_( zUtB$MWx+V(NOaQp|*4>>WA5;W?GarrHMOUpn!u&l;(o5%w|^o zL4>H~s8AS5k&G5ozC0CMVYM)v3?`>5cC04n5D-dXu$#>m1k@6Lb+?9Xeb?-1gy+Fa zwT7k>66?=ov7=-o>Ue*XacBl}Dg)5b`)?)vB$-4zt>@#8Ls0T4GZW*w2CC@CG->Zp%x1s=f`?|X(v1=is8KIuW$dBgeR>;^YlwUvr>dpi2as`u0{|3D0BL~I z9THzJ#nNYfK)XS^yaVEzO$BmB;zoiz;9f-GYJk?06>1V}q7V7et}w8|6(E|gad6MJ z0!Bioc2H?*>JVg)ee04+MT8F{?QSY6@?sq(*_dX$C>-93SHc2KO{rE22LlKmABo*0 zFaX5y;|!obhb>Y0&xXC)taY577^hr=y75ajn^dS$MqUlk3pLDf6muJu(S{g+(l1|u z{Ae$unT>+9suUK0d5UVBT@66S7$Q}0E{x_#Ur*JINH%>3TZk88+52feeh7YIq7hg{ zIURuUAokd+9{^LWjGEshTE7T|AP%0&V0Os=Lkh%L6w*GRIxA`~P_MWO?>$jjTROUq z4+D`IGYp05p@$RNiDaNRb;709`Res@YI=3)3^!Q5n!E@;w(Q=RS6BD0iwybzn92AH zG2bwA1wJ&M-&$Rozcqfn$UrDaF1Wz{V(@mM9Bvwu4+H z=EG|OhhFY_$kU3@>DBi0ZTQxnQ6R(X{{b8}d@M#ib99Mj>h14xNk{_BBVQXu z5qr9kIdc8JqSO9Qx6H;D5XFC={7d6ssy1Q(Fy;XjX(oY(YQU4oFvgw$;4LgfkYxY^ zANt;gGFOiQPhtR}T9kfCm4u)GAgF4D576-3izpj=)=|y2#1_PTiUpuA0q>6f5FK_n zCB_7iWsx9aOsFLW^K1aX6mj=XvbPsh$YWEgxUCr9QL6`RH`?0)$wc$U_BI_2F$=Vb&hNv7%@f(@m2U}p1eQ3b&A?{IzGrJ(p z7JN1RhAmBAcMR@3eV(Zp}U z3G^dd_-%2~k^WKoES;_qVTIO)&m;!(SSrNdW6LrWRc8G$x%W3>=+tP}Wt?}h{XS8d zQ;XQueZj*^P-Rm`IMsVoN4<; zXUiIJ-|Qb?z&em>getZq+-;q>0OXx03RJ;)?N{0Phpg4c~JZF;#7%uR)e4TfiZaq-<@qLvPkFIJP~IO0_op(s(j58NBH! z_sWi;+kKBd%fxfKrtf~>Rv~t!Z3B?y<7V355V(rI!&#;|zXJ1EI%D<%Bn+AgF=D3f zep4XNJj}d`(Q&BxHULIEZjx#TG{SI|hXk{!iO7W?jsiUq1+FvZp3_(qz1g+R062dp zpg|0ky>hPZ>o!a5+mB{AMU*a8lFlA+nDY;nwo|VU+_jUrH7{XRjFO1s^B+|F5Btew zW*}tkUP5hj=HXRx7m5+YWwjU~zjK@jT_?T4_N2N%eCWEw0#ncUO5~yy%NkDJ<@ht! z?=6XVQSBlQo;cMMX*s_)?m7{2J0W(@*`m72N`Ki8IUiH z;u_hzAae9y+SLb#GvV|a9v_IqSV-{PX)ubed*Ptk-Z*!H2d{rSu_e(7_i94!=a75U z-s1!JZ*NGVzRicc;gq(v92rd14;{{kyEW8%XlyG(Ji`&mwr`icsy%NojND^7) zXH`qzl`@G(!opv6{M>wQ2LLBFta1$!t@(g|2HsVUgae?ggomhP*U4qTi{>I9G0TELI_i9SdW98RE-~HbI3jLjMUp z`Xj%tk~djksp(wl{s{UAibmHvlojyI)*uL&irmbbRWFti;qWt@nN3=C;Xl9!GSF&W z9R4F;Qr;`}($9C>8gOM61A3;t$^B*UyX-s(;|(K2iEGnFW+5$lh+k=c>|(0*2Dr{s z=tPy<4l1tU{{TxhQ?3d6h^KXGZs(Hp7l|%)4p^_}EMDW$AUSfT262s|gi!;#vat2CQtk46s(Vt+SE!&v&ApeODsN z=`J^CR{;4}4_ zLLk0QZ9ci;C7ekmyxz`CQ8$cdPuxoj3UNrS$62@?+9NKB%z3I~X>0CKPHjPGc<>=h z#^npRrX}~4e*iv1WkA05;01Nu1&`{$ESb53*E@z#Stk0`fK-q0N&pprrShc~KqvwM z;O1$du>}Gce>L(q72aRpY647u5RMRMYK#z24HVaNv)Z)R=oSN=H9!NwZ9^5P@Xk}&UoqjO7z+`noo5UNXKV>b zCUpCDMC)%!VmCd^U?a#NGpppB+kMTJEw*a$*xcRFZvLyDNAaMZJr2R zS0QZ+8AIe;Y5JOZN zWUqk`l_k2B%4~N3Hkqtds^)M_lWKzg3a)H{Oux&5-*VC`uDLe$hwa)W4}WS3HmTOO*bWE+SxiB zdCUQ%s^J}x6DiZp`VpsTx)8|LJ}BaKLMahmkRgy641V@A)#r>{IoLkKLzzw9Ncowm zeAfllRw&B_0}sTmnj-g=h~S5RfJ)Lnl0ep4To0KudlZ1^GqEs07@)dcb1M0g>$~3v zWizVzI{~RQ??i36ZHW%piAV2kx_b9sMTX>&PR2% z`if1x#bn^WjGYxy1fa=nDinnKkZ%N4XmYy|V#C8D>72DJ4Bhw;$KoWN_D z7~w80mez3~qI^=IqY!R2N|_O;3C@`IGAHoWS_72am7ZbB+?cl>w#HcK+KI7B#OW)$ z;Jg%WG}C)nJ&Y!$F-SSBz{edmdl%%74)wh|=1>SiWev)c>6fRQy;Byj)$5OwuxKOr zBfv#8jL%K9c+Sj*&qHh(DBphqe6?D)`pwprl+yYi!0v4QnYa&7LTE1?^mN_?VFFqY zA!uc)SQaj+)2RHhaY;|R~-^i$Yau3I9oypZT>vEuoH0( zg1g`P2+T}zV9)HtsX}=x*6~YodO4B>x;f{R?XhWi;XV6yn*HqJD!o-&P=+HC}xw)iAQhRs-^ZbRlUzLZ4X(H zliHUCBDKEZCx9CqaDoqGlUjjd?2}g1Zp>rn_15woXoJxcmCph%EJTn{fZ&N`9R%VH z`v_U05p0gkWJuyIt-nXa)He0S_e<~6_b%%MuWP!pM19Ky09tSE}6Ug!4(2?x<15x9xP|anGmb(40MFKNjpCTZLu{z_D$1rlQ$63JVwkr zr^wNc*B=A(KiQl3|IwZ?xGs@n&Ky<4dkBkpAF1NaoIr>O@Je%Mj($#8i@HVNV3Bq` zZG5KS3SlMxL*;_^3km7*J~+5_Mxrh((nB>|U-leGt1g+UDL$uvYpxc1Ok zGLz|%>(?WkK#d==BBBaWT%4~pggm+%;%RIaI$)NzfTXDoRYM}A?1)dXk3w&Ans?|= zg-k(9)%rY$tju~cH47ZdN7TI2*T&4bH#2qH7JXDa^V0JnjI^}*dc0@;K;lL_ecN8- zj}hWTynW=^mpUwE%>byGfIq|k12h`Vc)?Ox2j#LlWGn;gQr@^8Ou{fbseT`!DDB2s zT#o}I6jch$wM9=IMkUmU?l~Hl_v1(_%(Mh68L)gaNKiyMUr%qmZ}(VDOh{BL^ZDH* zk##kxv8Kq4a}hObV(CMO;KCMM?z-n|8|_?MeW#&h=-SK@qsQAWx!}Nb`dH=rPNp#s z%o*%5hR!08e(SVfc%@(5stWl>1l#Sa8^`2zteM%0B5{yhG)<#7z0PCobB$yC?ja^V z^Vd8L4>y>8-52jBa7?4|4=_%~?l6QE2SPmG(HCDmlS!Xg?J{i_bX&jE$apzkn{a5F z11bxGivq=P^a*-snL+;u?7|&vb*7h)+cx#|$R0Mat&EWDA*z3F2LV54#{YJrf@_*W z8cp0p$B_0%OPI+eI)Ph=-{qVc8iPmtuobAX5$HL7-dRlF8(T*tkwxY9dN@Sq4BtvEmOc;nKv-!BR{zmb_ zD;%R744P&r=8SV|>(i~Iaz38+N-mk*7T~C+Ze=q~n`<#%%V^2EA{yVsj|Muh^EbMc zpM1O&Ye|+zA>nfd1ja*O;AWnc{wx6m~PGZlC*+MKvj5 z_#lSJ>XI_Izl<%%`p^ATR3Qg$4lio=(wAJdBa1upkexS zo6Q;M%_-EJogZ>ek)5Gfn(CA)+9*G3D%T*}U?ib(Tc@z!Uy$82^nW9idrlU9Nu$Ff z*e+=FCDFoeWd#p#F&p^O7};%!q|fZ`Ip-@|L-8khJK;?>k}>nte|0B$ zW;oIHz{*By2;{Iv1~rW@ZPdCtF)&%84E;g+4?xzkf|EE5e=r&nNnCXRZh(hm-nAX3 z>1KFxSL*ZnO=|PN00Y|uL(mecxUhx{x+ylgGC+3DVRA-^;&Aisv^N8Jf1Wd54M=<{ zFEb`OYBob}@jN4YM3=1Ho5ZwFJN0A%M?Cotkm?@M1-mN&rxl%F0_8PDhQ7kG) zQ&z=he{OO!i>Ly{jAFipQ$#4Q`w4}cN4jqb_U+6Z*5YuTwlnufo=j>rzgCewwwx_< z8ZkQow1i|XvmC1)Z8?v2+y)_~7Jx1MA`qwYJA*D`v(m zO4^~?bT-DL?Udk8vwPPn%`x>t{)(^EMTTA=C0Hg^=cBy})Aimy9$O9WlS=8#O3y%} zyMt6X75vx4O)_As@5aR-3ca7$YxkWLj9)1jJWk)J2<jyKK=f-b{kHNWaXUxbXqaWF=SHK0-SL-c;fN zzdH83{*cAw4L18ePn~o^qkMnj?u@;BjjLJ9ernLH>Be5K_7wSww004|TGmRxNNA0v zk$A`2GCVSTM&Od?Lz{JY?Y=^tfVn)o-X(ND^1yY^w&;Trcv%BidUxa5WS}r$p4^FY zDe!5)M3^n_${-=O3ZvBBWW7F6Kzj7+C87GsKR^R(E2<#?hw#EeT*MA2gwJV7qMnQn zhoyG2(dxkF?+%<@hKrk#Z}j5pbRgZ_C(#RT54d@IJ?{dY#GA^f6at#rA+_(m zlikua=f2e;d%%>_pI)qJZjkuwFp%75 zwya^#$0Vp|5lg1G(=f@0mU)I_Vzga{9*WYX%UDY4TRyT(LV3uHA1ap2o`c`&;+GP( zjY9agNoL+^jrr~wqsV+D__ES_-$KuLvPrHx%GJK!4E4rw<((_7It*ko`qt&8OHge7 zuxg``0(>Nyu@5##IhtEq$Lz4SR&j79lO!tTqeJNbhNSt9EQn{Nyx(ncxim%!L`v(W zd;5tl@4B5bv}U4)w^tIka~* z_>6O#xV-vhN_I0h`>2QdCBtjkf2Mlrw(Hf zm39#+66jc-yLyGTpLKGXxKVCXB7FlkO=5Qju{BMQt&T_Z*zUEN$;<^ z=C9f7LaMw*Qts{PKX+XC#*|;-jCI;7F#r4QA3$dR9{_R9Tzvh=lFfH!&jC-nG<*5} z`(ZPaOI}EhsW@Er2eO0H7SH?4X9%qC3GRIMr9O$q3kS|51mNsV){M!*@mHC8u=_Pf z;68Y9&w;sn_flnd@S&uZ$ zTGq^fjC;{Al??QzF$>6Rusge1S7(vbbokm@nZE|A-*;zbrVV=-&FBN4EK-w{Wz2jH z*~TFknC|GE6O1)4DLl4PFqdq5d$LYg?OZ1h9KNE=%sw{HcG&?iWZDq@D@`s9oBU8x zwjga#0wXNjrYO_((tO}yw0};Z|K6?*#Z!NJ3zmFGNNu3u;Uj%lsMJYZv3J#|A zwjbhXoc8lio2HF3M&!q4B{{$qmCVV0Qn!B7IK7!~&2c;R>G^OLY@O3v@BHgpp?uGF zXK{?bo*Vdm7WbMfeT(KMyP~r1ePHukw(e=!Z_N$EGULpjyXiYw?i;ZaZ%Ir}k?9(AYodsJxp84TTA!qV8Fr@_nPwPW1D4zd3Y1xjjR>@m4)KXzpg7xI0q3&R$ zv+hoA-sb78U~Ft@+2!nESybZLg+^os7hR$(_*24P+F~o!e2j1Q%YT5XA!L;v;!%z^ zeR|t+y^-pqIR2?k@*_sYt+RM+gNGdTtrOTG6Q%k`-zPHlzPemHS5bgm3QcnaiA zL%zIMKU1O^^UM;jnc#yS8wW<9CG0>!k7~deLabYse`S1_VDf83x+EZZf%MCwawg`C zMs@)Zm+9ErO6Un(yM7b6_L(8k)i5dJNMwOV=37Ky%!)UEStFm36>F+-?)+U_b0ScNm8eSpS8KpNShY$goDw|`ud?GQp8kt{Wv=;1)!wiDGN;A{D zDG*%o?X;sK#p~|R#5~T|2GyPxW+{jnl{Jrwm|A%`Z}>hF^A?{G1CCLG4)A(%omq{~ zX2YEQhoG&%vWg^(BAl<8>wiB zt2lg2QN+noNAuWAm0T>6O}0(!T494lOM1J!^z4y?(YKG~y;JYpM(zqhBjLJGtv3Ce zENzeJQvV#eIB2s{S7;{0L|elDTV6@=TX)0s#{ITxL<;9)`%)))h%$%bFY7v?1?fC@ z$z|w%b94FUgcR596trdDjFLlTx0_;#Li*s*8e3NbWLOl%rDIYfp)ea1!o1)CG3=5O z{?#fZq2m{%^g`U{XuKBo+d(J0o-NOe^ZH0I__Jk!(YjU8fe+54q{L7k8u{4keP2FR zG6y5S?$-WM%GW6?r*&t;`SzdRgxf?80#rnw?#vx~u(nQAW54>Y?&Um0*LQYubk)mQ zIpzLFRwbF|WIK6vjijkH?owuvke5m;XWA*NiX7knFY@WPbU-b(S^C_?Wvl~O}I z!(efBI*NXSK=IMwWS#3kNf0CxqM;xe#4+ zA8H_~){B7O=u4L$qnF$yvIy1HTCg3pc6rVtoG1ln2OrxfA~;!Mq19+%iZ#>S)`5KU zRRfvb$o*eq?h;z)%$8*1Ka*_EMWT2R)-j}YV4Gdv`|J_yUTg0p@7=M7usu#TAJ2qZ z6~Wsgi;%iiYe#XnS@I5>t(-UUH~zP$mmCflZOb&Hn9+mjnd%npl$_;~E;^$(@Lb_( z`miyR_34MOUCaV~qUXWqz1$9N!`Zfld&X?;beoC%^6H9E`v9Sc?@*S927eya+O{p1 zGSPAN`5@S$^sU}&j_w~3eaV$qxxYIn67>gJP-Xx$kGv=0C#qWJR%@M$^m(-Qvf?w`nJzZ>j${W0FhbbeznNK~j#)oQ}+n zmYPshI!wynd(AmGWg=;1b6(%)g}ZDpLrh7WHMp^IXBO?X{uC^8p(s#Kh@)>Jpo_V2 z(^cH$G+-x9V{8fQM_eDo{WJV4mi}jyg?5wUji1)jf^^yXC`*5+rn_`uwNs14jc%pu z1G#bFeZd$lPh4T;nP7v-(2~I@J*-HK%$A%I8>{htc&*-I{pTiGqBWo=Y28T zRFKSV4IgcJ3Z$W|`I7KWVC(^Cc8VZVz$z-+MFdPS zm@|dO9wzUsG3L0VFEbgl9{yp2CPyHwS&h1H2=ESdLP1G46xu47mJ*xSW5pHChgM@T z5JQWpro`8TCOtO`VyY8LVs{-}|FAc>yjDU5W#y~a6EQ-5eq82@R(@Zr1@ac7{ywvJ zSwrgT_GkLL|6e_-6@IvkKMXU@R8pG^1`R%FTVt^N0Cwzfa0s0;D$jcB-^SN8J$vLP z6RfBr9cy9vS~10SCb&vF&B$s@oND!b2BNw6K?`GsK^|?s36|}&_c3Z5x9{pdW&GDn zb2Yy1HCLK?qvxrA7puM)ZoZ_VqJlFs4GO~;H&TtFxQrgdOvk>w%R}IQc<1##Mj3*ZNKYhw~pR%$j6Q)B!fvvcJ3^|HG(WbMLow?zVUO^z@>E zp0s-}`pR6HdracwSJAAx=tlCJd0#BoRKGs!SEc5+Hbq(a<7*r*zK3)jeY(ew5XC42 z@XfRw2L!MMH_XABUVL|V7Db0-{{t}m13Z7UA?O9p7+*l@Hz`Jiu@3Sz+veFZeXe05Rnp(o>R5Xwvxqaw#`9gQR`e0t2dJv>OYtt7Rnk^H ze8o0gx;=}amNf=}DH^kRqP%lh?@GyM*^3y`3zhfiqIXVegD zQ}SBAJgGGbs^5;}^fen$mv8Lxq?3}DnVmff(7XjCM+Mp|ATJ#qXo*EhZI|g&8&B6M zzlU{bhAclrzBSC=UfXD`zwM4rQAu%@?%t^}Y$_h2Wi0n58De~k%=^B}h8g+H9p5 z_iGQCe9Mlg@D`q;tNmnd1KHCT>Sy$GckM*Dl{{a2@gw)eOVftY#W;V@sy(Rw`u9;0 z!ETFN19QW6t{NNf~cezcFiSAu7eMl_L zRcuRpS=25}KVcLcy=hjfMm?v$(&YkSa05#Idiy;(fK{&=h!9K<`#roRHpROd;)Cf|W=na;l+thl5+7yD%&3a1xJMQ&je{e+Q6 z(2$IULA{GRSy_j4+HZ09_NvD;TkSoLOLvsgvPXaA;O^K}Y2VC9+I zS(ft_{nac*xj-1RI?D(;FVpz7iD1mk)LJPj3Kb3#WgZth2hOgBiQl$49A_Hh5jJE$ zolAg^m_AXzBKYcQQR$lH8167#GxTmoqPHW{$4@{pZEAR!sU_N#zGt2A;-K_wl$m9v z#C14?_2XrZy$s9*w1Q<8i>%&2&mqg2PMllGF`WWahw{}5Et~k8k0CPqVq=Ul8Bb@B zf*%DhtBCDOO_>ZPfffq>Goe$H%A!>B+F5OQ?Esn_5_bTskY?^#{rN6HwaMpNEZ z{}C!-OW$WOvnnx}DbD#L@IYo_dw%ly%^!kIYSYt4MOFL$P1>+8rE)D@#R z*jC=Je#0C}D#Dulz#XlwzqXWf_CA4nz={ETwYZ7abjpP-Skeq(7B(`$3$tsd8qw-(|y%ZHk`i68|Y$=kh zch^9^xM>T0=p2N~dlYLCHB=g<>z)sBKSqF3o#!QzR!%(l9*EFAnHMK`3ta!#VyHyF z=V!$LvY^V&CtVP)Ca|!UE)2|zl7HCyD_vA`!La15zyRwI*X%jc`Z-n%U(IST$~)I= zPdc&2n>PhsoX|voM=w=j0qgC$R4UQ#qywx!Lk zoN`8kT*e!KQoLJ5v~V?w5sx|$uBWC#T4FDX+FxErXUd`Coq!Y~&*s|?%(R9Dj+VTu_4A9b_lePCJ@&{Z5 za+Vl9VIE|j$x?dk>=lUETxiVzt-|WTbjeZMf>5w9yg;qzr} zdcKTy`;PYVMiDjBZCmZiV3#_S}Jyfem*Y%BGn^L6bqnc+J93IV}>_> zaT~W30XOtdQVwsCv1kw|QA~E_zvR>Muk)Vt(N2I_o3@673CKKB9TKF#&t2Pn$tj)N zno)B85HiTJnrLBY^rvP}a{|%l_J^U0S^U=+-C|i@jQB%i}2=~9S=dahSPvnG>CR5^{u4uDn>ED&M@lkWGviWgIPy>dZQ}C*Ij4; zKHODot>@SzCR-5s{6#JsiosxDyt4`A=Q>aShab{pbz%ZaH5mM*0jLW53v%)@St{5} z5JP*&4XjOz^W0DdalQzQIX2a>5bW_Z2}rS!Yr2Y%RA!J!$fU}v5gvywXfEPPYItW} zUJt}IyBW!$+gsH=oZg1ZTk)2~^3{yB2%gbnljjRJBU|C-C}GMKL#2MKxB?4 zk`O(PMzEiO9@JLR&&@=CZKV_}p~NgSzFdIdz|x)^H!){lgZ6X97KcpNgzvGuyHkFF zu4pVP7)fx8kVMEuwnwpi*qwPR@Z4XkM7L(*pwC4H(bpw+l*8`jRyw zRw|gz>;=v6xu4i9QLm@4^dqU8$F7815QEmA?#PrZo%G+<_Jw(uCu@3B^Ic*y8$e^_ zX2MlmZ}+SoS*^t7FdqB~hQ>Xu!MU6j?Df@E%v#gZKx6{+zg#GQt=`u)eiCo;kdf;n z-*%tiSAUp{sVtFKJGynkvem^i#VL4e3^=`6O=P6>kK}9R3<4#qJ zvwPc@{+KW`(lEn)aKLIA`|R>#owCoN1(F5YCX4PS9$gQP*?LX;y)0kqBX?I{Eauhx z4Us{lSNC?>?*}7YwN;M)I@VHIHuYCqEjQOg`>i2|-q)*lnQb1|ty<}^cut>QcX1oc zzfz5SO<^e9Dz|!-`qw%eY9P}6H7zfDDEMM*(8Q>AcYm*m_@F~^WYSu8OvAMPM5-MR>3KS5uUQ)sk;F4p(vWvf7p8Sl+|UR7rz-rj5R}{1E7p z$-|dA|JM>1E4ci+xSq#F{C#VBur|`ISk2hW4~(#MzL-fH;>9m9;0=r^LxM5n%NMdYl+doTx%uTeI=K`}s%#?hDP zp97i~j%`PYD2sdhR9kJvZDZ1Ges|02( zJv0(S6|Y!Bg8X5&7AR)DlX&cmNckI}*l^1H`hU#F#)-vI$=BieHW9P+jzA7`uF1lx z9ab&t%N#9Ly#y_DQpC}a$ZO+?QfI73Mdxy1cEAFyyy)tW&zf!}df3U4jjeUZ%Ef3x#t4w~Wy$|9tNCsy-rT4@eC=9^&KesHwEcY}cHtBw{qs(b^m%< zxPB})KjWJWy6qFH`18!?S*zot^wqup3~Fd-lc!9xeb>9Vmn&ALjxyakMI-gj75@Q@ zG9J$kD$b$DL}2kU8XD35l(!OQ-VaAe{4{|wbMfjT$r|+kH=YCl4enOO6aphbSX7v`E z3)WpO{c|r~bLD z(GN41F}$Togn3Wb`MASsK69=TedB3v(@RW&Fmxurnl6A+31tiJoD?_=^5 zC#L@!g2Ti=520BmYi`SI`rNpT>=)&F4VWhDOUBQb2JF>eitiC+>LVZSp9pPb*~MyFV1VviVpMy8dQyw%n_}}Fc@G8dAhA}ogCQoKlG`!uWn-k z_irAvgGXHr^~@m=&;9`>M6c;fl00#?mDnFm98P~6*H9W=FEyDk-kwDZnz0QhIih0Z z({8MwJ{tSR-e|>_xinhHaO{yOvNzr`+5gM>4~pA_Nr)>q-EDz(S4nrg*z~E1S2Czg zTDa$W%rY@yN*X4n=F^kViMnmhKYVGDw8T*k=9o9AkV1$X62xn?gGm- z){(?~ovM{{iZR{mp`{y>u92P9OK$4mFPAKKxnt4prT?MAJz9=FP)sr& zge;lbtFRnBWs}RNM+sa#Qb1&aJgaU;&Qu=HDuR9UvE2S`rx4DPiqra8#?ytm_L&~P zU@KTkY?1?umKqEY|c_+nNrlsV4JPOJ)Hxq`Ob*l&W zwx!Fr67WbYCyU4B5!=I@kEk}M1$TGZ!?yQs!>7l8QRz6#t`#{>q4HJq>LGt}-}5d> zw$}-$i2}0k`fiZPwTB%m#@986DB!~HVEVU#R< z-sSs(6|6JWhkR@+oH98H%RA|88+$FM+a=W){noMRnNP;S1)U;bvMy(%@BZL9LNk8i z#BVpC|F>hAGE)8A5Pa&pI6XJ_EU^ob_g8U39k^x~9rCpRR-!CW@BG%V_qUa@6L-1M zw=wYr@3`5U0u}w&AQ8kz-oJ6inEV3c`n#=<{=0tko6{gqo4&0;mA2qUO=@G;|L>b0 z%ulyA6c+zlOKlfiYezfKNZb*sTz~poF{Y$e*v#UaKb1`vp{%RIrL4BR^>Nwr4e`lu zk{>M={==3@t-YOBfcU(91e2ac3OCOOOHV_)({pNPYW0pLeOv@i7x0HW1}}0ir8TAx z{r|`Wf1aLub)*=;f7uv~KEV07-2UqN`%rhN`gPX}rPG$}OPzwni8g6daTn|7fva)4 zm5uJUle%L^pbiB-RFhqKvh9d}vWe%AvE+Z#w3?k=+z$5FZH^AI%foZn<=qM0ulq7H zDO+HI!7ziBY3=(e5Z`E4!(!sGpEBp)69ai2>U=f&KUAkeLUu2Qi8InN8fIj&0;NMO zL_e&1VhCQlxdK{3zchb!*qZMOyU~3rUN;wzon?&gC%PSb55h?pF=DRhf1>lP(AUvo zpsnP!Z}u-QgtKO0=gjj6TkPv|-kx(u`gJqP{>kL?Cd6eXmEj8SrBf^JF^EIihTkA- zfhJVD_8%Z!?T_<6Ktz4jZAWL@uEGuo#1N)Irp~oLE=2PX;?4yaV5pizUZe%_A~<4O zUtYAo@8xUIlI>)#Jnt!3lsjOD8wlNBm?UE1gPlliNzEJot(Z1d9>K8p!_X8 z$_8c}1$|L(EoJdiYx=7P1cymlWJl^PXO-^FzLK3sztj)kW$gu$I|2*U_G)lqD5c zmU)_q!f{cJUNUdgb<*tpr0|UWrd@UV-I(st)9mS-rzDl}$H$a+!hWl*z~%&cW6d2igK%Nk0(=4SH7BS+3YT} z_afCLoKiE_)KZN(TRF{i@s9=cP*c1)cxGCUQgX~{wmUVUH8%3jS2;OWcREPTtsTooTvA z$5#a=$kbM5jC;2w$&}-gOpN6>RB`nUxU;pZ;N{m}OTeUgQ(0zdTgkqr=4)_>)s7Aw zNYgzHU+KZasI#~uCaiU8=z9q&0Zmdcm7OwpIp)C-$aGzkCz3RW=K|O!(&g6#w&?)w zkrHYAl;7ZnLJxvoUPix?UJ(>Of_U5T63%%-w{}pQwM>_WJH6)I8QdR_WkkDoMBW?U(B50CuyzL$c=!dEuyCv@@@O@FXm^yJ{)G0b1f7Iw z6^yc;b9))Z*ZqrE_VQTG4Y$Z7+6~{3UjR~SuoTs>yLnU(d{I3oi|4|mMG|I((*+Y zc8ZP}DJ*01Tx()0NV8Q`W|dK@q^J$FpWx}!e^Je*bZOF-f*yUQD_+ ziovX6t8+MZnntLxT0%DWH&NRr8f@16n~b(m#^ZvfL}m1cbu)3A>Q4kop(#Gn8#Kwb zj_=ar-_=LLJmcK`6Q_NW)aC4SwPne6`n@yPzy=v`Esq}~pFcqzrZR`RUt&D&mE;o(p9 zPxQB^`*CTjZJt+G*Xdt#(@(o}uxsuZR(Vy=2&hT`-R{7(fZoapsQjhOK zN^LIWp9OxO&~(%NQ>KSisUO$@{QHqq45hOK4$vii@}x~{S?j<&9(qYvp#>|nHe z`)73DG{5LrE3-wz+jKV5x4ODEK)48=ZAOZAyUr~M{yjwLFyi=@}nT~;M(%)eKk z?sR&yP5%H=O8!iD>7GBy=4d;OZ%Mq zdn}vVx@1*X{)$Oi7)=(QNUdV6?r5tBjWml@U~2}f=z~_Ub4IUYrVnB@9ZgNq$sCF8;rGr`bF80gU01IM&dP$Z3G}}W(NTJli|~0J zOL3B>ZPRMErP#N-vxipxJ#t5@siPP=PR>rFNxhm!UXyWxPshm}MxLbNyB0nUlDXLO zo|En}*6HIFozCfL${CTzuPI5jM&q52SE5cIpnW_`C!D80-tB4jte&svzxBE)=oxDC zO=?fK#>Z}MTOL~Z{-zpwom+WHCVb~m=N)NIQ2zjSJs(v*j&D{Suzl9-^LqY)xz?3$ z^(VtOTIS_^r&OmsOfRKuc4+G^pQnnNcO|jt>3)|ebqZ6dCziK4^*T@WJ!fqH0I5Ie z@Qlf0ui9S@UZbSbmrwqoMfSHz8N*IeidgMirNQh^N-ir(F>;2Q!t!O(^s&^Ra#DGDf9r{BYqr|2gxt`dT6C%>cWI&SSAg~2?@J7+vPdCo~_uGp=^PfJzx6>hG#H6}TA ze$Isd0BRk{Rje`or>f)nR*ZR+za!RaQj99vXD8}<&sV6^(2w-#Ds|+~cf#>M?W}rq zBDl54tNSm!YJsTRjalw9=<&&8vs68S#{PeMDB3 z$+|t)oj&Bx2la_TY4-mB{)y%J65(dPcdXWWnyvdea&M@e`7_0AS0M@~QQ)Mg&r@SH zW1XyyDYv*#;TL#0*4lQuF`nkm)J!F2C|nt8VA*VEt5nRZnVj0o4C(S=tiFaBd77)i zl4jb8eX=80J_ zdD$8_Kse@(jWl4N29cHs)Os2*wUeSTif1N+xSbHT%+{l-GE`|97{g7pZ>JQu5vH(} zpviDb%5JtgMrw4_u8mwDCUKKeHLF=><0l$VEYk2}X%?k}q-AhdG@p~|ze;aTDpE_e zpDUwpRUcE(&NI=3E~Iq-0Off904CjDv?V|2W>D%o5>Zr+jeQBpTK<*0Ij5$bMi%AC z=C$j`r_gn=lWS3)jJky3QCK`Z4LIr2d!Ejci_*<}8s(0!MU+w)XiaZXXPI_-q-|lVld#y`XvC8qfIXaG)P8ycp9)3={o*0qy zUAo#+PFkM|&b?cUhO5%KJSkCqW`>;gRa(E`>(bHg=o}ig7lO}ATy7aoal(6>YIOFL z^q$#h*H@;Lv{G9j(bCn`g49uc(R9+~4MrMzl8&!zr%`xxb*_{4l(iwKnwJ)Buljsr z2x`W=UjG0ly*841P3kT##-oZ!biF+FX0BiD`8>TSN^)~*+jiONbx@YJr*mIKc1D^V zI{myOox1DH$mG+~l75-rrKHs%OQ+OPO-Bc2hK{0&ZaF#H+M&}rO&+IB(kVeVwF$>#pCEsb-s zGu@W>c+!)xDGk#fZVkAG)g1bc-5N?%VDij#u&`+aMOmU$j8=|VMl#8Bx-hnximhB% zY0aw~8o9bLo}rP0PCK01@_nrAl;Y9H)Hu}@mz}9C%r85eYNTZtM)Qwf}s zY*G?gF1?Vf85KI1zh(}s(sJCzyWk-;WJ_Y(tQo)Qu&8KM(-|qdd$zz$+sQVsnkl7z zXom6O60A&>des?AEv%?*_ZuB}*o$xg#eQnWmmMI!0*iY|;rW!Mto|ZL@Kj?CIbM5spf4iXxHCDFraLx)kxWR^pRjt~h+wJq<>;0>W)b4kGgUi>CFK;(uG@&;- z-EenDLVc;ZJmQP#wBEdujbnC>*{wY}c3VMj{A>+vL?s?zAC)b#I8t$&h#(XNlDy-H43O3zbA zs*g)*YAQS=cztJG)AciYl9aCh0Ho#j>v6t#*{mN-^t)*9WX)%fEN)*9OZ7Qv$ER~u7xTH{L#v!{q|!NcI^9iK)aKs`#+9olGaByezfW1E zdz?S2%eg0J+IJV7jz838ZZveq3tURkN_DuCq(riXNON&!J-NX$ZXpR|=UZHDGW&+A zvP)Z-wNW{cnkIXbbYjrwM?R!{GNkjloTTiDSj{wXbu-D?si|9@cC_ugDmmpLMnp-b z!(;;0mJVj^`!7;iGPh(_ik<F;1fpDiLAV(>)sqPYDO;e(YmTx4tg`AAOfxzxx56 z>G&QN7R22Tcap_5OC>6M6TaVpuV2_BM5?opP2F-zcZTqaiqALwixQjLw~%iYSQAZG zz-7|FMR!_AX*RtX?Y=YlE;m*oMQ4JOUBuRGD}3?>u#&&7at_zxg2bjsM-%FZj-niF{@1K(VaRYPVF~t zj)>AnBqYwbM%A#faDEP*G-Db@@nwrnNJzHRL_8fMEmbroh>VeFA|R#O>{M zeh)jRPCBUc^ya^%?9Q{yW_xyYy7Q9lZwU0Hr~6B`X}6V6W5IU`TwNV~Cs^Y;blda6 z=lLYZuj1+SKc~i8dY0v!9>nyaIJVtM{{Sb?X!Wc2QpBFgp8ki|rxh$S$$HFsagMfz zmKK&J$%5%;-A$d7>E{P0@b1ai3%=FTv^beMY{VV4F|p zgB=cubrb!|O*6kortFt=pV1y!o^AbSsV}8OYox{byIBI7+wK z9xk(jbe)pc`RBu3XsJa>HD(gjtvY6X%*J}VsS{TQr16ZIt#=s8FJn3Ca<(#@yO*-+ zSS>kO)ui4IEjIh9qteiYq|HVvZre(aGp(QfUf&0@;^3tJ%P^@7s-U>lNDN8WJ_W@h;wEYGThE=)43T<;>2dT zb*F}T`i{=7rdgzLYD$WTdyTvk780Hx0Ar}~LRJ!$yfBJnQ%a1rE&Liux-gUDkTRBV zg~biF*)6KrVWli`WahHD9PJ|~mrHOeFZe4Jf;LN$H-_?54J;7XwL{O5IaelH5!05W z)FPXcbdo1qN?KEJn(dr-LEj}WrL_E+w{I=yk>^hs9{D4WV{Vl3sys9EqmwE6}ExXu;@t2z`>_^)G zEY@;0m-0>hSQ>cokgBolB~3lB7F1fQ8gI!9*>P)ixnfh<`vjJ9JMQD~DyQfnt+v1{ zKS1vcBI_@Z8x?Jl+IxM5o#8YQU(7vH#@0?~M%}ZoPtnp=Ri?Xj5!1F#cl5~{ zZxd3cG*i!%QksOVBy(iAr!`!d>iBfy#de4isrjtljHQ<;QLwX zXlpG!1e9<80NcUh`8oZ2c~=PJ~?3lB9G?LUNm(?cm2(Qy*4q6wg%aTrW77sKLgU(rcp) zJy}VqeT=_;9f`P{v+5UpX||cavp1bbTl!Pg)NQTKPyYZE>-ri!34W!i2rlK_UQTEF z%;hfDseBf6&E~b~x=k$z#p+3_*&H2zRXuq)Mm?HqW#qknv1(<#yq<2hthF1>lJ>mt z&sX|XQ!@RxYR#h_>=&sNqG#;X<;ygpot#>&JEN~wR~C*hDAe+o!* z)^_yCFY3wCM>|;QX*Vs8OGi()1i}$=!P6&_E4vg$ zIm-t;oxRO98Znj_3DKOMQ1~KJDkZ#-?K=lAs9n~w0P*38yI&*YdLivViFn3Iww}Q& z@=erQc1E;HO|8k#8AQ2Z@Jnqrf+@Ub@=fE&uGU#DPiB$?UAo zvaT77)f(P*`w^*JrSeGA2{Sk9%a_TMy1GW0FJ$i9LwM%wmw=^XYaYc;kS+ZMQflxu zo<8EQu+wO)sZ}?~(!Y{Z&IfqGQE~DOy4;lAh38}w4Lal=%JwJyrAAx@R9g)M7jIFGM zZ{0)gq9f()V{WmMR-<@oHvD{>TWZc-JA5;?IA36ls{ESit-TWMGJCR!uTMdz8nT}F zXBLjHYdYMnn%H9M<30_cHt=#eWVlJ;lNy!V8B<4IoUGxCv!_Yah_6FT-Dh)_55d<3 zYRtD9L2zoSJDI7dpo@Bs(Pdn8EUXV>K!*p`8ajYm!qD%KIcYqlK!hmTIvlazoX0O`qeyb<(`jh zWdz|XCmrSTy>qU4OEoCq=jvyr8C+E}x-d^sUmwZK)%4J6Qc<_Ho#%Sz^>FnKPfpS2 z$y2*KW}02JaZWG3xHQTe?o>=+pGK+_!KZjzmI+CBDjvL3`5biHcPB{8TJ2LTn@`6S z;?rsDbIo?k2WF%0bkR{lfg9?o3<5JlDEHtqnr@(`Jw$yD#IZfIaUahc*zoUM5UYHVw{_Q*v?OY zZ6|h1cHK}=+7oXUCv{=HWh~3u5_uh!m8Vkr zsT*m_IWS83`CXzt)OP5~w>u-PO9z;>GN|t9;oVkZ+;5*Qy*)WkFJqy{vMKUJbyOqTvmi~k zY?EuH$h9uxSUP4sxU^c8qk7Id;`Ti)D6LI3d(q?R>Tr5p9;eomI&)a9o|kJPQ9Jc? z`{Ue>M4VsLjaWu%6k1eLMv4kbjM&ty^q*{-*xCyg>vCZTsih{Va#p8mmL49+;bflO z<#u%aM{X7mSElPyN-j@3o*tT{nYxos(Tm2{S<~phbGck@xHNj2lF)Y(#nI~~t3L;) zqtz&<9a~n6`RChS*#6Icq^rThtJBR+==QX=`fIC2YObGBKK&i1$u*0|htEq+N}4I9 zi$|vVPUTV9<<;q2FMaksT*+K|mN_*ejBIA~T$-hiCw`Al`-#L-(Uz7tI(-?PJn8h# z_6MWg6>DSA{iP_mcPm^ReNLn_=_bh?dqDKy=)k?vIYwr2GeVC8x-a;h zPVL~0_Q6m~dZ%RCOWF?aJBc*kpc|XICCO5G6zc5}C%1-1pzdnCvRhQS6rD0wB|r{T zgxjihOjmC^3gXjzluK2+78(ZoR@oDHw5c*Ea_w8$Nz`)4tb7IJ3UlsN&yzN*lvJKF zl4M~8g)ae%VYM~LvXdf{YM1gSoQD_{vMBlcj_Z);G%d<0I(8S}DzFcKNTQwJvDR~z zN|5b5hE-^*{1LK4ypV%uGj!jco!Oa%#+p}0U)v-v@-QW_=;J^J}> zD|ICo?6_(^>=-2F@@o~_R%W#xmW4^>38<7-U)Ay4f8ztRGM1~xkRUXmlbT2!(P>!7 zdTC{w$8&PCW7+Ao6ycJ3ojy{*%b}~c@3r1#LPPVLNS);S} z(nmK_2dul7;R)Qg%Gu+?nq5|+cay89{YFZoCv5Y-bGA-0Uy^&$csqX_w_}&`*!nFm z)Grc}SFxw=DNei7K6W~JRYx$##d zrv2MIuCMhMH&Nr0re)gaeoq-5k5kvE!lQ%8>N>vlmuDWQP~`rm*@U%QLiXkDdYY}h z=@?H@Rt)DmGrKunmlZ8W%)7D|Vyu|e4dgc)R*96MJui=$vyeWD#DYz zbL5tqeum_(#M^b?DLX{%7ej5;a!vg^WCQxQ$d>F`dtgc5*yDZ1o;a#qHX&QdB;Rmx-SyrIVrVw$C4nw`~E0t)TNkzEvN7i<3F<&*yFq1v~= z4M%T2N480B`C~v@mKAOnR_I^cXjy z2@yiKm6KRX-?A1RHMm98nnW9?>^7EnB{bGYH@}$TBzt&x`Z!sn^&_PlW-``{4?n2tUaXzG9sb!I@p}DCwIuTB=9HM6utk`? z7*5+F$0kQ|vpTp;ipb|Ap5}AbidZJ1+M!9sM|_w|sI|F+)oh5`THB;!Jxk=qQ^_sZ z(Q=tBl2XRuod{EsM9OL>F0QTKN{ZFjRYwk_uaVAen95cWF94qdYw0Dv)CD(4=bY`1 zT9>h#@&a|P$&0)H07ObllA*VhL!>E7@Gk6nK~US?@Mh(B=gD)H z^kXSB{{Y|+aa@wxs$nOytdR31$rWyuXV~Yd8EHZ>f>Mt1@=JA$5aq`L!cuOL5^C?1 zH74$s#5~IO@=d(mh4$SOxar^*e;kgYjU7Xr(2bWcS1`GC~4=| zC|{HbdsrP%JNr--cjChMb!4SW*=gNy!UWQ7qT=oNCwKlw96v=zPMW?=Q>AA#XZE9L z$+dPvS|{)9JFk;8@r}xgzDTNrxlz1+rIRSdCAnX@#{yKbUCKO(JAQ`M=W!&_Q(Ecc zEbGzKsd_mg{JOJ6JQA#X5So-c6$`V^(AK9-o{o%`r4t&LUA;f`BiPWT6nQ;7Dpq>h zDY&DbPP{uKQmQ+2bpDicboy_(T0N~kmAyNPIol(*GS>#AYh{xeX-O+RT^PqnzVw^E zOuCQTea&L{G56b!pG=!xPjga7Oed0FpLR_&p=zGzURr}q>mdkf-ktvd>$uZS4qpTR0DUuG z+=Vq0Ejg`8)TuPg&aG~|8QAkWi74tiXJ1#;C`Yw3$JCpXJN!KU*AJVi>MmN; zWj>~iwH;-%gIlQ0BhxNC)zPihZc2l@7duo$nGRgo4o%$<+p+gv#&UGa60f?IvkA)aV{-fu-GQ5QF6Car zcx=t!iniJ_Y))3ylP7M9fxBLe+Z%sPWX-%|`2f2MRPrYzl`NRbS6l@-Hr=g=zC-bT zN#)oI^Zr8Qo$$g>B`h@ z$ZmlH-#dw_Uct7~X=FaGNYG9xXCiMP^3zBkzz;2WA&rPE8Dd-RJ^?SJ1l0ove_~sE z5l1y+;6Y?lOE?c`7xo+YDg?1(etFUA}{6()@1)+F-MJQezkr@J(cx9(=mUkNV0f&Qf( zG`_1E{X#mMGv{Tf?{UXfteKblZuoshp0{%Tq+jm#e@i}RPpO)Aq;xL3Q7y&#(pw)* zqtvh4wU@~+UMgx?UQeEf>N=3vxB7&nvWX`uW|z)3$L>Su1U$&7WI0gwAPe z%1^{ymC_ZE4CS}=pvUk z7#0>e8uGuAp}oejb;y<;!jAdCMLa(!R_XX2{Nz0pIIAgIA=kSLb#xJSzQD31K6ePD z>x>Nx3jv(i2H9n%v4Sl<$9=g7*-Gk|<8N;!P-|mYV5rtP!ZnUeW4^|#QZ*FjG44`XwTKJw!7mb`75~PjMZSi=BSn|zFi&E zQ<;L5v^OGR{g&ntotSqH@NPzJXyxpeC0m)cOL*L|n@!60V4i&#xqA-pWld`-WSL9p zGL)6>PwwHBoo(DirR>A^Y>8?zrnQvPPqUEV(Go53S9Iot%O32eiJX2)1 z{E+Y~X@k9cWMw^yYc=4Be^yuySS7qx5SxA5s^DI3O%bRG*nTn&w*a=Ep?c&> z#P7P+7*xJ^67YuA+u$ym#z@g-s9C&&O+15k{1Hc+`wHw_Z;<3D_23rc_D)x#2HRK% z`33EX<6sr}7=qeFQrsvQ&{J1bCaaO`tH@H=s5uS6;n4B_009LKt>8=Ge+3C(tP+>8 z?S=v5sPW*8*=vCko^ALQdEBIfZV^x`Y^Q{o8*ay%u!mNz_8%DxH-Jj^WkGFMBUyGz z!^Y*u7zI*(5Y}$kCu)-Ca%K0jvUsF}d_D!2p9NkBrn8-ki*0g4LEQM*Bcd}~54x7d z3Rts5?5XLrCBL5qsdpGwRX@2(R%W#wFu6S7(X^ksF;neDEVt~E7PL-~`}?{64BNee zIW?@~qB3c2Xtku{{Y>Ukr?AuJ`3UQb-De@*?8QiF{1V2cbw^W!XzDtoa6)#CwC673 zV#@Vk(uQ{?Qu@9;9IIa&l^sW0*^G47>AV!5vna`18hI3sm8n=Xj<1$-SzXjA9kA6_ zRJBt~!MR8Q^AAObW50!wQgPocFbIrv8mI^ zaW$mnW^LdlBR2hn)e`2Zk=)a!Cetn^n`?4Ztqr8{WULHLDLj#7Nv+J}(WG7OLt^f- zC#i}8yOMTHrmEKFPHVKy&%jJ+El+!p-VB_-xk=bi@=N3%b`^anVrZrA!!54>mNE`Y z1r^7%WjFT^+#$~W0wQv@X7^qm>r?$rR*tlflGfOZ*(VM4W`Mv$05#m731WMVew+My#@Qg zt=7Q7Yj%OId(j0w?y@fBa6#g;jOKJ~6_W@Nrh5_;*p#u{GDmVbX01CPX zziKlYx{w!t=lPc!HRjLXr1RJ_MV!l zI$WA}(ymT-g|!Vn=WJ3sBKW+TO9@xp!ZM|IlDnj_c1&GUZOJ5Bc%`urt;%vqTHGT0 zvG81F+`Sm5Tb87-fY*epV_3~aTjb}BbFoeFV2!_XG-$PO=;Ttj{zn;EF?HxeRU>F> zDs;~^H}Y*6_OFs-Q>Sv9AMR|9Nb5^^Y*N-t&NZ&y{{W-e5}o~wzjZaa9sa>vu>FsY@H89M#$| zb4-Uaqjx?G-o)nL zgC6Q*Zv0pSljN5q{{R5?7bQU6Ee_sLEwF+76%8lAeC{PG`;j?w$x!7w#|BPnn46Vd zWX|$UTsJ#)R1QzJ?3X6Q^S%huo4Te%uJ2%Nt}qQIx6c4gw1X`Q+OI(5&<5Pm7SKtM z+iu$?tcT4!3DSFp!dsD`+u1$Ay0q2@SCSrOjhB*!+T9{#4dgF&_add?{DyW1Z3^F? zxf%}`NZOS@ZyUvhPTbV9W9T9zrGg2!Jz z#a+(%TUcAWz(YxInh&Kt=x=JUrv5-K@?2$%k;egezu>7`IV@8Jwb_^7B}PrJV8*H7 zrKxmeo8N+>5x4Z=F~^HC?z+Ktt1s?FYip6J-}o|&v1O;7@I`E@pA4I)Tnf^xlHYZr zYT~Z2R9|fonniG3OlcWcqem-PIpZg@!Y{k(-ooReGUmZQtI3acD~42OTaa(xiWhyo z-5Dw81GTstcR73mlBzQAc7@#k042etr0Vwu^S(^mTg_!qDLs)t z)ws1}4dhMm*fnu}LaP>Kp=;Q(vOHEDU--z@J-;01NJN58;95%rbQcaA*^MO z`Sb)^u-{;I^1_IvcnyK7NHJX4QJ&qww)6Z43}4@X1-MXPL{ObN8+a9Y01jvcvj*RS zDGz|)U_F8S4-NVY$)-xe!R`PSA2}FZEr1Xtm52EZQ}P3OK&v5uPk$vt+XGwM$hpfJ zTYw?v$sNDWN{UgH)dJ)&_Z#k|#sU+qxejsxYPJHCrW*B}yTa_9`uOr@!*4JgHYcBw3p9z&2Qu1b`xGxx30^GiwZ)1#;-O-e!`>88Ho!;hg zt!ky3;J)klF;_xOrc5Pobg)!qOFWsUbwlFTLbOigR(u&o>nx=&Yz~|MMlkwy0AicCh+`(Xytce zantKbmUgmO^aD>>?8mV5y z%1vU(Zz=c{03HJIu(|X+cq$OsSXn@_=yiLsdkpyq z7qQ`NODSV;1zhYrH)vMf;1`Q1cHbU~_LjoO0^}jPrGcz87g(V!z3Nvl@i)X-y>hsmV{D3RB+gxH@-o?BDKFh!WzPF@Co_IuN*H!QLrv9 zmFA1@Mr*|bd~yZ%d;Ax7?HH^g)Vp`d6{>jnEpdY{+|ALXbuKqRQ?}?y+*U#|a&OS& z)-#GBq@6OYSNs#(OAgRev@vyE!%nY*H??d%(#RKgm65kicp-eGIX|TXPRX>}3$!b& zARSx7z}v02CAO~>;1rWsSpu#0*l%1th24yY`$8TQpiOr>*oQ0w*rBIZo1t5yHthxH z!UCMLf>W;M#lIx%mg5Z*Z)+7RO|qJDU-C_2kOOVJuuD9HUT}pQOZycSEFxa}55H}& zOr>uuBEOaBhSxj__Et-3_X~&ImcZXEhTj_s=?z>{-!x6wJFDN&xgv#h4wAsUAZqi- zQg0(}n0OPb$piAm&f>d}Y^=Iq?m~6jb`C4GWKOTq8X2@INju)fZnO3k(pUK+oAiZ* zvB>2sM656lHpl}7wUI->a+o}dumf3OC$O@BeBe(U4R7EZ&Pb_uVYtNY1sMhy@G=3D zL*y_3{{Vq}j6@a11%R=PnnM7v0P+YJC3pe*1hed3Myq!6Q1-CMvE*wZ1GMRY-=O!& zL2PL){RVD={{R6GoPycpOEMa_gaO9k94*1DQ``|y_gF!75cnN7w*Yqe47jVH<#`&v zArCgQK;AGPkrfoBL&`JxF7aD|S6plz)=pBePlvEfTz*-0pWBl(>v|h}0ZNCB(J_`S zA>FJOQw`#oS9?(|q{D6%1X^m|SD`!a;7z2d6K^7{Ta|FKQf{4Ki_NmreWVRvC93j6 zbxAUmli~b?Qf~v4o$f2mq2Yy6Zjv3lB`cOLy^869ZeLJh(!7w>HJ3tc6{B^)Iach1 z)4LOHfV-{imfKrbf^GO?lTNWi4O5lGR@UVAUIDdyfoZL)j!KlB8K&vF!1i^QV+|Ib zF=9`YzQE$G3f99DL(8-_+DQkU!P{7QE+&rL)e2ATK;>@l1i2*_GUCHga zGMWl)+ozFAdGL`ASBuD?HFcE04vyKNGsYoB9wG{SOQEHHGIGR1hvXCzW@>Etgf z0ZWlpVe%CI)Hj@yw<5cUL#7u>xfRg4z*Dg`e2a~NvM6+`mL~qKfnZJN(G*i28r)ln zV{ga>uK|V_71&bdm;*umh@}2U-H_v8#Qj00Ci00Be278@IkhH{}a+LF^ldHVCcu3qlIy1MF4WStp7NCILgN z&|e{UB8Ij@%HD;#2GwN*I|V?PDsKw~50*Dvf9OfR1AW3D@)b$oFMzxRB(H*z3i-%JyS@eQ*$eub*d64f zNXr$#+`gkO{gPw4w8o|_%ZnwuYll1Z;~vBDOVPSwpSr0oiM!Qi-i6{ z>=L_F9N;N^$7xk;DSsl#6y4p6eeetJE^-4(m@4oXpuflu;FjoUIA=W0JDH^ z0@w!A*fs|27R&&5Pa+Rx6r=$_y_F3=K$};vlgQVQ8mfQXYdCC{!30j2 zyx}e9UQ;VADf&IX}zTvxD3%eU`M}MmF2A0P0=+4tsvK#WB-GdgI z-(Yy$l+wtq@A3s-)3HA+8?=`M-Qg?(G+9EwdE{8eMBP#Xfn_`02}ucicmliCQ7z%! zhjtt1f?Tm+JI44QbG%@TUPmUvski>$87B=`o?WK0OWy1XO*_DzN%P<_c?xeicoW7` z&#-%L7~lb0-^iXvc-TqfU>jB`Rc<@;u?oC$2&-zE*iX+O+T+NrT@goiFu}YD;5)5l zWQs3=W58a11pWewbkh}u^0fxj-IwWrh0f=FA z0uDie06l|o008VRxF|Ub0BayL0eD`6(NKMY{=l~i0rD9$rKj7n}vWWR%9+WkqLTs`(UZ%1bNAK^B$XM7-o{d%#tIxgG&? zV6wLWOEk9+?l$Sz>eb@7Di+(IRmiJ%W5!?h0QlVvW$sE|usrtoDl3v3&yn!FlD!3r z!&ppq;OtiR9lk&-&n2uP6N|?MJRpN?V<9c}5^sJ+wqP~og*&jjK&8j{2yc8bC&T1c z_k402yn#;Jt;VqOO0~f1^J#hlpK9_X=uI(u0B0AXGm z1^5Q?s0O`1$XZNPx%?n%H_KoAd*y9W3Yz!kuOyABE)3=PAOTp(FkC%WDS zo&c&zaK|T%A{E_~os=9efm+yY-Vm*AxezZr3?ou>Hym%0iCe4%WE;Bh8&v@6whZsU za4XI5QA>;ivT*akQA+Z{9>TS63YdCg?Z6bNvGI0C!B1tJkUs7KQn7KkCbnQz+oYY? zJZ8e0yjBR!(M8@j1hYbK{{Rq`?{tVNPmVEYyPa-L)7*Sll4*zCf8-m%GRxZ(7xdFZ zR~2o$!xi}0GLbFT5D#TSUg#^}9o6^>RYPJ=@(%eROT$C4W90x*i`+7m&?;{219gBW z_!^++jNc#bEP8XrS0ELrGn>KtEdzI(~`T(Mp#Lq51v; zYb9xGzHv!`W;_y9zJfB*;x9SMbpAOP3^0002%0${h!zylYs4S+ZgK)?nb!;c_c z59}%qZ~zDvb_)dBU^)zl5kn8~AmkyTSZq1~@DIRZ!*B)cIS-ZqG}R8ph4&AJP}BIZ zdj%!C2=WkC=x^X#@;0sElq}fOp{=d#O`t0LioJ^LecVt(utHgU2c!%;$mGeo+%OC^ zNl^YT7X0B+;??fk#Y79oq`>X=`t@gR$6`l6B;LGtfeZCZD47F@j|wn#URal z;1YHNwOiy@mYBb!U+%CeyZZ^es}o;fyaiHriK-p_guftGYhb!d^$+;1J2%sLqUn8IuhX4cvKmY&$ K0Y!iSAOG38#4Yy# diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/image.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/image.html deleted file mode 100644 index 073ad43f8c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/image.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

The Cat's Eye Nebula (picture from Hubble).

- -

With the image plugin, you can plot images. This is for example - useful for getting ticks on complex prerendered visualizations. - Instead of inputting data points, you put in the images and where - their two opposite corners are supposed to be in plot space.

- -

Images represent a little further complication because you need - to make sure they are loaded before you can use them (Flot skips - incomplete images). The plugin comes with a couple of helpers - for doing that.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/index.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/index.html deleted file mode 100644 index f24f750c5f..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Flot Examples - - - -

Flot Examples

- -

Here are some examples for Flot, the Javascript charting library for jQuery:

- - - -

Being interactive:

- - - -

Various features:

- - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting-axes.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting-axes.html deleted file mode 100644 index 5b6e3bb563..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting-axes.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

With multiple axes, you sometimes need to interact with them. A - simple way to do this is to draw the plot, deduce the axis - placements and insert a couple of divs on top to catch events. - Try clicking an axis.

- -

- - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting.html deleted file mode 100644 index d04eedddee..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/interacting.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

One of the goals of Flot is to support user interactions. Try - pointing and clicking on the points.

- -

Mouse hovers at - (0, 0).

- -

A tooltip is easy to build with a bit of jQuery code and the - data returned from the plot.

- -

Enable tooltip

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/layout.css b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/layout.css deleted file mode 100644 index 7ef7dd4c5f..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/layout.css +++ /dev/null @@ -1,6 +0,0 @@ -body { - font-family: sans-serif; - font-size: 16px; - margin: 50px; - max-width: 800px; -} diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/multiple-axes.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/multiple-axes.html deleted file mode 100644 index 4b32e64bcc..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/multiple-axes.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Multiple axis support showing the raw oil price in US $/barrel of - crude oil vs. the exchange rate from US $ to €.

- -

As illustrated, you can put in multiple axes if you - need to. For each data series, simply specify the axis number. - In the options, you can then configure where you want the extra - axes to appear.

- -

Position axis or .

- - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/navigate.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/navigate.html deleted file mode 100644 index c916ef243d..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/navigate.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Flot Examples - - - - - - - - -

Flot Examples

- -
- -

- -

With the navigate plugin it is easy to add panning and zooming. - Drag to pan, double click to zoom (or use the mouse scrollwheel).

- -

The plugin fires events (useful for synchronizing several - plots) and adds a couple of public methods so you can easily build - a little user interface around it, like the little buttons at the - top right in the plot.

- - - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/percentiles.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/percentiles.html deleted file mode 100644 index 9f2ba3aa98..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/percentiles.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

Height in centimeters of individuals from the US (2003-2006) as function of - age in years (source: CDC). - The 15%-85%, 25%-75% and 50% percentiles are indicated.

- -

For each point of a filled curve, you can specify an arbitrary - bottom. As this example illustrates, this can be useful for - plotting percentiles. If you have the data sets available without - appropriate fill bottoms, you can use the fillbetween plugin to - compute the data point bottoms automatically.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/pie.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/pie.html deleted file mode 100644 index 77fb141a8b..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/pie.html +++ /dev/null @@ -1,756 +0,0 @@ - - - - - Flot Pie Examples - - - - - - - - - -

Flot Pie Examples

- -

Default with Legend

-
- - -

Default without Legend

-
- - -

Graph2

-
- - -

Graph3

-
- - -

Graph4

-
- - -

Graph5

-
- - -

Graph6

-
- - -

Graph7

-
- - -

Graph8

-
- - -

Graph9

-
- - -

Donut

-
- - -

Interactive

-
- - -

Pie Options

-
    -
  • option: default value - Description of option
  • -
  • show: false - Enable the plugin and draw as a pie.
  • -
  • radius: 'auto' - Sets the radius of the pie. If value is between 0 and 1 (inclusive) then it will use that as a percentage of the available space (size of the container), otherwise it will use the value as a direct pixel length. If set to 'auto', it will be set to 1 if the legend is enabled and 3/4 if not.
  • -
  • innerRadius: 0 - Sets the radius of the donut hole. If value is between 0 and 1 (inclusive) then it will use that as a percentage of the radius, otherwise it will use the value as a direct pixel length.
  • -
  • startAngle: 3/2 - Factor of PI used for the starting angle (in radians) It can range between 0 and 2 (where 0 and 2 have the same result).
  • -
  • tilt: 1 - Percentage of tilt ranging from 0 and 1, where 1 has no change (fully vertical) and 0 is completely flat (fully horizontal -- in which case nothing actually gets drawn).
  • -
  • offset:
      -
    • top: 0 - Pixel distance to move the pie up and down (relative to the center).
    • -
    • left: 'auto' - Pixel distance to move the pie left and right (relative to the center).
    • -
    -
  • stroke:
      -
    • color: '#FFF' - Color of the border of each slice. Hexadecimal color definitions are prefered (other formats may or may not work).
    • -
    • width: 1 - Pixel width of the border of each slice.
    • -
    -
  • label:
      -
    • show: 'auto' - Enable/Disable the labels. This can be set to true, false, or 'auto'. When set to 'auto', it will be set to false if the legend is enabled and true if not.
    • -
    • radius: 1 - Sets the radius at which to place the labels. If value is between 0 and 1 (inclusive) then it will use that as a percentage of the available space (size of the container), otherwise it will use the value as a direct pixel length.
    • -
    • threshold: 0 - Hides the labels of any pie slice that is smaller than the specified percentage (ranging from 0 to 1) i.e. a value of '0.03' will hide all slices 3% or less of the total.
    • -
    • formatter: [function] - This function specifies how the positioned labels should be formatted, and is applied after the legend's labelFormatter function. The labels can also still be styled using the class "pieLabel" (i.e. ".pieLabel" or "#graph1 .pieLabel").
    • -
    • radius: 1 - Sets the radius at which to place the labels. If value is between 0 and 1 (inclusive) then it will use that as a percentage of the available space (size of the container), otherwise it will use the value as a direct pixel length.
    • -
    • background:
        -
      • color: null - Backgound color of the positioned labels. If null, the plugin will automatically use the color of the slice.
      • -
      • opacity: 0 - Opacity of the background for the positioned labels. Acceptable values range from 0 to 1, where 0 is completely transparent and 1 is completely opaque.
      • -
      -
    -
  • combine:
      -
    • threshold: 0 - Combines all slices that are smaller than the specified percentage (ranging from 0 to 1) i.e. a value of '0.03' will combine all slices 3% or less into one slice).
    • -
    • color: null - Backgound color of the positioned labels. If null, the plugin will automatically use the color of the first slice to be combined.
    • -
    • label: 'Other' - Label text for the combined slice.
    • -
    -
  • highlight:
      -
    • opacity: 0.5 - Opacity of the highlight overlay on top of the current pie slice. Currently this just uses a white overlay, but support for changing the color of the overlay will also be added at a later date. -
    -
- -

Changes/Features

-
    -
  • v1.0 - November 20th, 2009 - Brian Medendorp
  • -
  • The pie plug-in is now part of the Flot repository! This should make it a lot easier to deal with.
  • -
  • Added a new option (innerRadius) to add a "donut hole" to the center of the pie, based on comtributions from Anthony Aragues. I was a little reluctant to add this feature because it doesn't work very well with the shadow created for the tilted pie, but figured it was worthwhile for non-tilted pies. Also, excanvas apparently doesn't support compositing, so it will fall back to using the stroke color to fill in the center (but I recommend setting the stroke color to the background color anyway).
  • -
  • Changed the lineJoin for the border of the pie slices to use the 'round' option. This should make the center of the pie look better, particularly when there are numerous thin slices.
  • -
  • Included a bug fix submitted by btburnett3 to display a slightly smaller slice in the event that the slice is 100% and being rendered with Internet Explorer. I haven't experienced this bug myself, but it doesn't seem to hurt anything so I've included it.
  • -
  • The tilt value is now used when calculating the maximum radius of the pie in relation to the height of the container. This should prevent the pie from being smaller than it needed to in some cases, as well as reducing the amount of extra white space generated above and below the pie.
  • -
  • Hover and Click functionality are now availabe!
      -
    • Thanks to btburnett3 for the original hover functionality and Anthony Aragues for the modification that makes it compatable with excanvas, this was a huge help!
    • -
    • Added a new option (highlight opacity) to modify the highlight created when mousing over a slice. Currently this just uses a white overlay, but an option to change the hightlight color will be added when the appropriate functionality becomes available. -
    • I had a major setback that required me to practically rebuild the hover/click events from scratch one piece at a time (I discovered that it only worked with a single pie on a page at a time), but the end result ended up being virtually identical to the original, so I'm not quite sure what exactly made it work.
    • -
    • Warning: There are some minor issues with using this functionality in conjuction with some of the other more advanced features (tilt and donut). When using a donut hole, the inner portion still triggers the events even though that portion of the pie is no longer visible. When tilted, the interactive portions still use the original, untilted version of the pie when determining mouse position (this is because the isPointInPath function apparently doesn't work with transformations), however hover and click both work this way, so the appropriate slice is still highlighted when clicking, and it isn't as noticable of a problem.
    • -
  • -
  • Included a bug fix submitted by Xavi Ivars to fix array issues when other javascript libraries are included in addition to jQuery
  • -
    -
  • v0.4 - July 1st, 2009 - Brian Medendorp
  • -
  • Each series will now be shown in the legend, even if it's value is zero. The series will not get a positioned label because it will overlap with the other labels present and often makes them unreadable.
  • -
  • Data can now be passed in using the standard Flot method using an array of datapoints, the pie plugin will simply use the first y-value that it finds for each series in this case. The plugin uses this datastructure internally, but you can still use the old method of passing in a single numerical value for each series (the plugin will convert it as necessary). This should make it easier to transition from other types of graphs (such as a stacked bar graph) to a pie.
  • -
  • The pie can now be tilted at an angle with a new "tilt" option. Acceptable values range from 0-1, where 1 has no change (fully vertical) and 0 is completely flat (fully horizontal -- in which case nothing actually gets drawn). If the plugin determines that it will fit within the canvas, a drop shadow will be drawn under the tilted pie (this also requires a tilt value of 0.8 or less).
  • -
    -
  • v0.3.2 - June 25th, 2009 - Brian Medendorp
  • -
  • Fixed a bug that was causing the pie to be shifted too far left or right when the legend is showing in some cases.
  • -
    -
  • v0.3.1 - June 24th, 2009 - Brian Medendorp
  • -
  • Fixed a bug that was causing nothing to be drawn and generating a javascript error if any of the data values were set to zero.
  • -
    -
  • v0.3 - June 23rd, 2009 - Brian Medendorp
  • -
  • The legend now works without any modifications! Because of changes made to flot and the plugin system (thanks Ole Laursen!) I was able to simplify a number of things and am now able to use the legend without the direct access hack that was required in the previous version.
  • -
    -
  • v0.2 - June 22nd, 2009 - Brian Medendorp
  • -
  • The legend now works but only if you make the necessary changes to jquery.flot.js. Because of this, I changed the default values for pie.radius and pie.label.show to new 'auto' settings that change the default behavior of the size and labels depending on whether the legend functionality is available or not.
  • -
    -
  • v0.1 - June 18th, 2009 - Brian Medendorp
  • -
  • Rewrote the entire pie code into a flot plugin (since that is now an option), so it should be much easier to use and the code is cleaned up a bit. However, the (standard flot) legend is no longer available because the only way to prevent the grid lines from being displayed also prevents the legend from being displayed. Hopefully this can be fixed at a later date.
  • -
  • Restructured and combined some of the options. It should be much easier to deal with now.
  • -
  • Added the ability to change the starting point of the pie (still defaults to the top).
  • -
  • Modified the default options to show the labels to compensate for the lack of a legend.
  • -
  • Modified this page to use a random dataset. Note: you may need to refresh the page to see the effects of some of the examples.
  • -
    -
  • May 21st, 2009 - Brian Medendorp
  • -
  • Merged original pie modifications by Sergey Nosenko into the latest SVN version (as of May 15th, 2009) so that it will work with ie8.
  • -
  • Pie graph will now be centered in the canvas unless moved because of the legend or manually via the options. Additionally it prevents the pie from being moved beyond the edge of the canvas.
  • -
  • Modified the code related to the labelFormatter option to apply flot's legend labelFormatter first. This is so that the labels will be consistent, but still provide extra formatting for the positioned labels (such as adding the percentage value).
  • -
  • Positioned labels now have their backgrounds applied as a seperate element (much like the legend background) so that the opacity value can be set independently from the label itself (foreground). Additionally, the background color defaults to that of the matching slice.
  • -
  • As long as the labelOffset and radiusLimit are not set to hard values, the pie will be shrunk if the labels will extend outside the edge of the canvas
  • -
  • Added new options "radiusLimitFactor" and "radiusLimit" which limits how large the (visual) radius of the pie is in relation to the full radius (as calculated from the canvas dimensions) or a hard-pixel value (respectively). This allows for pushing the labels "outside" the pie.
  • -
  • Added a new option "labelHidePercent" that does not show the positioned labels of slices smaller than the specified percentage. This is to help prevent a bunch of overlapping labels from small slices.
  • -
  • Added a new option "sliceCombinePercent" that combines all slices smaller than the specified percentage into one larger slice. This is to help make the pie more attractive when there are a number of tiny slices. The options "sliceCombineColor" and "sliceCombineLabel" have also been added to change the color and name of the new slice if desired.
  • -
  • Tested in Firefox (3.0.10, 3.5b4), Internet Explorer (6.0.2900, 7.0.5730, 8.0.6001), Chrome (1.0.154), Opera (9.64), and Safari (3.1.1, 4 beta 5528.16). -
- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/realtime.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/realtime.html deleted file mode 100644 index 3b427e148c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/realtime.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

You can update a chart periodically to get a real-time effect - by using a timer to insert the new data in the plot and redraw it.

- -

Time between updates: milliseconds

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/resize.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/resize.html deleted file mode 100644 index d1e18c3e75..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/resize.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Flot Examples - - - - - - - - -

Flot Examples

- -
- -

- -

Sometimes it makes more sense to just let the plot take up the - available space. In that case, we need to redraw the plot each - time the placeholder changes its size. If you include the resize - plugin, this is handled automatically.

- -

Try resizing the window.

- - - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/selection.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/selection.html deleted file mode 100644 index 1646f5aae4..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/selection.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

1000 kg. CO2 emissions per year per capita for various countries (source: Wikipedia).

- -

Flot supports selections through the selection plugin. - You can enable rectangular selection - or one-dimensional selection if the user should only be able to - select on one axis. Try left-click and drag on the plot above - where selection on the x axis is enabled.

- -

You selected:

- -

The plot command returns a plot object you can use to control - the selection. Click the buttons below.

- -

-

- -

Selections are really useful for zooming. Just replot the - chart with min and max values for the axes set to the values - in the "plotselected" event triggered. Enable the checkbox - below and select a region again.

- -

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/setting-options.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/setting-options.html deleted file mode 100644 index 8d1967ef76..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/setting-options.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

There are plenty of options you can set to control the precise - looks of your plot. You can control the ticks on the axes, the - legend, the graph type, etc. The idea is that Flot goes to great - lengths to provide sensible defaults so that you don't have to - customize much for a good result.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/stacking.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/stacking.html deleted file mode 100644 index b7de39173c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/stacking.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

With the stack plugin, you can have Flot stack the - series. This is useful if you wish to display both a total and the - constituents it is made of. The only requirement is that you provide - the input sorted on x.

- -

- - -

- -

- - - -

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/symbols.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/symbols.html deleted file mode 100644 index e71b1aad60..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/symbols.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

Various point types. Circles are built-in. For other - point types, you can define a little callback function to draw the - symbol; some common ones are available in the symbol plugin.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/thresholding.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/thresholding.html deleted file mode 100644 index f10144a2bb..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/thresholding.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

With the threshold plugin, you can apply a specific color to - the part of a data series below a threshold. This is can be useful - for highlighting negative values, e.g. when displaying net results - or what's in stock.

- -

- - - -

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/time.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/time.html deleted file mode 100644 index da62347d7c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/time.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Monthly mean atmospheric CO2 in PPM at Mauna Loa, Hawaii (source: NOAA/ESRL).

- -

If you tell Flot that an axis represents time, the data will - be interpreted as timestamps and the ticks adjusted and - formatted accordingly.

- -

Zoom to: - -

- -

The timestamps must be specified as Javascript timestamps, as - milliseconds since January 1, 1970 00:00. This is like Unix - timestamps, but in milliseconds instead of seconds (remember to - multiply with 1000!).

- -

As an extra caveat, the timestamps are interpreted according to - UTC to avoid having the graph shift with each visitor's local - time zone. So you might have to add your local time zone offset - to the timestamps or simply pretend that the data was produced - in UTC instead of your local time zone.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/tracking.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/tracking.html deleted file mode 100644 index c116159c3c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/tracking.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

You can add crosshairs that'll track the mouse position, either - on both axes or as here on only one.

- -

If you combine it with listening on hover events, you can use - it to track the intersection on the curves by interpolating - the data points (look at the legend).

- -

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/turning-series.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/turning-series.html deleted file mode 100644 index bc6fd9fd51..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/turning-series.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Flot Examples - - - - - - -

Flot Examples

- -
- -

Here is an example with real data: military budgets for - various countries in constant (2005) million US dollars (source: SIPRI).

- -

Since all data is available client-side, it's pretty easy to - make the plot interactive. Try turning countries on/off with the - checkboxes below.

- -

Show:

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/visitors.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/visitors.html deleted file mode 100644 index 8a9d4d74b7..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/visitors.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
- -

Visitors per day to the Flot homepage. Weekends are colored. Try zooming. - The plot below shows an overview.

- -
- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/zooming.html b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/zooming.html deleted file mode 100644 index 9a4ef22206..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/examples/zooming.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Flot Examples - - - - - - - -

Flot Examples

- -
-
-
- -
-
- -

-
- -

The selection support makes it easy to - construct flexible zooming schemes. With a few lines of code, the - small overview plot to the right has been connected to the large - plot. Try selecting a rectangle on either of them.

- - - - - diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.js deleted file mode 100644 index c40d6f7014..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.js +++ /dev/null @@ -1,1427 +0,0 @@ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -// Known Issues: -// -// * Patterns only support repeat. -// * Radial gradient are not implemented. The VML version of these look very -// different from the canvas one. -// * Clipping paths are not implemented. -// * Coordsize. The width and height attribute have higher priority than the -// width and height style values which isn't correct. -// * Painting mode isn't implemented. -// * Canvas width/height should is using content-box by default. IE in -// Quirks mode will draw the canvas using border-box. Either change your -// doctype to HTML5 -// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) -// or use Box Sizing Behavior from WebFX -// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) -// * Non uniform scaling does not correctly scale strokes. -// * Filling very large shapes (above 5000 points) is buggy. -// * Optimize. There is always room for speed improvements. - -// Only add this code if we do not already have a canvas implementation -if (!document.createElement('canvas').getContext) { - -(function() { - - // alias some functions to make (compiled) code shorter - var m = Math; - var mr = m.round; - var ms = m.sin; - var mc = m.cos; - var abs = m.abs; - var sqrt = m.sqrt; - - // this is used for sub pixel precision - var Z = 10; - var Z2 = Z / 2; - - /** - * This funtion is assigned to the elements as element.getContext(). - * @this {HTMLElement} - * @return {CanvasRenderingContext2D_} - */ - function getContext() { - return this.context_ || - (this.context_ = new CanvasRenderingContext2D_(this)); - } - - var slice = Array.prototype.slice; - - /** - * Binds a function to an object. The returned function will always use the - * passed in {@code obj} as {@code this}. - * - * Example: - * - * g = bind(f, obj, a, b) - * g(c, d) // will do f.call(obj, a, b, c, d) - * - * @param {Function} f The function to bind the object to - * @param {Object} obj The object that should act as this when the function - * is called - * @param {*} var_args Rest arguments that will be used as the initial - * arguments when the function is called - * @return {Function} A new function that has bound this - */ - function bind(f, obj, var_args) { - var a = slice.call(arguments, 2); - return function() { - return f.apply(obj, a.concat(slice.call(arguments))); - }; - } - - function encodeHtmlAttribute(s) { - return String(s).replace(/&/g, '&').replace(/"/g, '"'); - } - - function addNamespacesAndStylesheet(doc) { - // create xmlns - if (!doc.namespaces['g_vml_']) { - doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', - '#default#VML'); - - } - if (!doc.namespaces['g_o_']) { - doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', - '#default#VML'); - } - - // Setup default CSS. Only add one style sheet per document - if (!doc.styleSheets['ex_canvas_']) { - var ss = doc.createStyleSheet(); - ss.owningElement.id = 'ex_canvas_'; - ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + - // default size is 300x150 in Gecko and Opera - 'text-align:left;width:300px;height:150px}'; - } - } - - // Add namespaces and stylesheet at startup. - addNamespacesAndStylesheet(document); - - var G_vmlCanvasManager_ = { - init: function(opt_doc) { - if (/MSIE/.test(navigator.userAgent) && !window.opera) { - var doc = opt_doc || document; - // Create a dummy element so that IE will allow canvas elements to be - // recognized. - doc.createElement('canvas'); - doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); - } - }, - - init_: function(doc) { - // find all canvas elements - var els = doc.getElementsByTagName('canvas'); - for (var i = 0; i < els.length; i++) { - this.initElement(els[i]); - } - }, - - /** - * Public initializes a canvas element so that it can be used as canvas - * element from now on. This is called automatically before the page is - * loaded but if you are creating elements using createElement you need to - * make sure this is called on the element. - * @param {HTMLElement} el The canvas element to initialize. - * @return {HTMLElement} the element that was created. - */ - initElement: function(el) { - if (!el.getContext) { - el.getContext = getContext; - - // Add namespaces and stylesheet to document of the element. - addNamespacesAndStylesheet(el.ownerDocument); - - // Remove fallback content. There is no way to hide text nodes so we - // just remove all childNodes. We could hide all elements and remove - // text nodes but who really cares about the fallback content. - el.innerHTML = ''; - - // do not use inline function because that will leak memory - el.attachEvent('onpropertychange', onPropertyChange); - el.attachEvent('onresize', onResize); - - var attrs = el.attributes; - if (attrs.width && attrs.width.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setWidth_(attrs.width.nodeValue); - el.style.width = attrs.width.nodeValue + 'px'; - } else { - el.width = el.clientWidth; - } - if (attrs.height && attrs.height.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setHeight_(attrs.height.nodeValue); - el.style.height = attrs.height.nodeValue + 'px'; - } else { - el.height = el.clientHeight; - } - //el.getContext().setCoordsize_() - } - return el; - } - }; - - function onPropertyChange(e) { - var el = e.srcElement; - - switch (e.propertyName) { - case 'width': - el.getContext().clearRect(); - el.style.width = el.attributes.width.nodeValue + 'px'; - // In IE8 this does not trigger onresize. - el.firstChild.style.width = el.clientWidth + 'px'; - break; - case 'height': - el.getContext().clearRect(); - el.style.height = el.attributes.height.nodeValue + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - break; - } - } - - function onResize(e) { - var el = e.srcElement; - if (el.firstChild) { - el.firstChild.style.width = el.clientWidth + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - } - } - - G_vmlCanvasManager_.init(); - - // precompute "00" to "FF" - var decToHex = []; - for (var i = 0; i < 16; i++) { - for (var j = 0; j < 16; j++) { - decToHex[i * 16 + j] = i.toString(16) + j.toString(16); - } - } - - function createMatrixIdentity() { - return [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1] - ]; - } - - function matrixMultiply(m1, m2) { - var result = createMatrixIdentity(); - - for (var x = 0; x < 3; x++) { - for (var y = 0; y < 3; y++) { - var sum = 0; - - for (var z = 0; z < 3; z++) { - sum += m1[x][z] * m2[z][y]; - } - - result[x][y] = sum; - } - } - return result; - } - - function copyState(o1, o2) { - o2.fillStyle = o1.fillStyle; - o2.lineCap = o1.lineCap; - o2.lineJoin = o1.lineJoin; - o2.lineWidth = o1.lineWidth; - o2.miterLimit = o1.miterLimit; - o2.shadowBlur = o1.shadowBlur; - o2.shadowColor = o1.shadowColor; - o2.shadowOffsetX = o1.shadowOffsetX; - o2.shadowOffsetY = o1.shadowOffsetY; - o2.strokeStyle = o1.strokeStyle; - o2.globalAlpha = o1.globalAlpha; - o2.font = o1.font; - o2.textAlign = o1.textAlign; - o2.textBaseline = o1.textBaseline; - o2.arcScaleX_ = o1.arcScaleX_; - o2.arcScaleY_ = o1.arcScaleY_; - o2.lineScale_ = o1.lineScale_; - } - - var colorData = { - aliceblue: '#F0F8FF', - antiquewhite: '#FAEBD7', - aquamarine: '#7FFFD4', - azure: '#F0FFFF', - beige: '#F5F5DC', - bisque: '#FFE4C4', - black: '#000000', - blanchedalmond: '#FFEBCD', - blueviolet: '#8A2BE2', - brown: '#A52A2A', - burlywood: '#DEB887', - cadetblue: '#5F9EA0', - chartreuse: '#7FFF00', - chocolate: '#D2691E', - coral: '#FF7F50', - cornflowerblue: '#6495ED', - cornsilk: '#FFF8DC', - crimson: '#DC143C', - cyan: '#00FFFF', - darkblue: '#00008B', - darkcyan: '#008B8B', - darkgoldenrod: '#B8860B', - darkgray: '#A9A9A9', - darkgreen: '#006400', - darkgrey: '#A9A9A9', - darkkhaki: '#BDB76B', - darkmagenta: '#8B008B', - darkolivegreen: '#556B2F', - darkorange: '#FF8C00', - darkorchid: '#9932CC', - darkred: '#8B0000', - darksalmon: '#E9967A', - darkseagreen: '#8FBC8F', - darkslateblue: '#483D8B', - darkslategray: '#2F4F4F', - darkslategrey: '#2F4F4F', - darkturquoise: '#00CED1', - darkviolet: '#9400D3', - deeppink: '#FF1493', - deepskyblue: '#00BFFF', - dimgray: '#696969', - dimgrey: '#696969', - dodgerblue: '#1E90FF', - firebrick: '#B22222', - floralwhite: '#FFFAF0', - forestgreen: '#228B22', - gainsboro: '#DCDCDC', - ghostwhite: '#F8F8FF', - gold: '#FFD700', - goldenrod: '#DAA520', - grey: '#808080', - greenyellow: '#ADFF2F', - honeydew: '#F0FFF0', - hotpink: '#FF69B4', - indianred: '#CD5C5C', - indigo: '#4B0082', - ivory: '#FFFFF0', - khaki: '#F0E68C', - lavender: '#E6E6FA', - lavenderblush: '#FFF0F5', - lawngreen: '#7CFC00', - lemonchiffon: '#FFFACD', - lightblue: '#ADD8E6', - lightcoral: '#F08080', - lightcyan: '#E0FFFF', - lightgoldenrodyellow: '#FAFAD2', - lightgreen: '#90EE90', - lightgrey: '#D3D3D3', - lightpink: '#FFB6C1', - lightsalmon: '#FFA07A', - lightseagreen: '#20B2AA', - lightskyblue: '#87CEFA', - lightslategray: '#778899', - lightslategrey: '#778899', - lightsteelblue: '#B0C4DE', - lightyellow: '#FFFFE0', - limegreen: '#32CD32', - linen: '#FAF0E6', - magenta: '#FF00FF', - mediumaquamarine: '#66CDAA', - mediumblue: '#0000CD', - mediumorchid: '#BA55D3', - mediumpurple: '#9370DB', - mediumseagreen: '#3CB371', - mediumslateblue: '#7B68EE', - mediumspringgreen: '#00FA9A', - mediumturquoise: '#48D1CC', - mediumvioletred: '#C71585', - midnightblue: '#191970', - mintcream: '#F5FFFA', - mistyrose: '#FFE4E1', - moccasin: '#FFE4B5', - navajowhite: '#FFDEAD', - oldlace: '#FDF5E6', - olivedrab: '#6B8E23', - orange: '#FFA500', - orangered: '#FF4500', - orchid: '#DA70D6', - palegoldenrod: '#EEE8AA', - palegreen: '#98FB98', - paleturquoise: '#AFEEEE', - palevioletred: '#DB7093', - papayawhip: '#FFEFD5', - peachpuff: '#FFDAB9', - peru: '#CD853F', - pink: '#FFC0CB', - plum: '#DDA0DD', - powderblue: '#B0E0E6', - rosybrown: '#BC8F8F', - royalblue: '#4169E1', - saddlebrown: '#8B4513', - salmon: '#FA8072', - sandybrown: '#F4A460', - seagreen: '#2E8B57', - seashell: '#FFF5EE', - sienna: '#A0522D', - skyblue: '#87CEEB', - slateblue: '#6A5ACD', - slategray: '#708090', - slategrey: '#708090', - snow: '#FFFAFA', - springgreen: '#00FF7F', - steelblue: '#4682B4', - tan: '#D2B48C', - thistle: '#D8BFD8', - tomato: '#FF6347', - turquoise: '#40E0D0', - violet: '#EE82EE', - wheat: '#F5DEB3', - whitesmoke: '#F5F5F5', - yellowgreen: '#9ACD32' - }; - - - function getRgbHslContent(styleString) { - var start = styleString.indexOf('(', 3); - var end = styleString.indexOf(')', start + 1); - var parts = styleString.substring(start + 1, end).split(','); - // add alpha if needed - if (parts.length == 4 && styleString.substr(3, 1) == 'a') { - alpha = Number(parts[3]); - } else { - parts[3] = 1; - } - return parts; - } - - function percent(s) { - return parseFloat(s) / 100; - } - - function clamp(v, min, max) { - return Math.min(max, Math.max(min, v)); - } - - function hslToRgb(parts){ - var r, g, b; - h = parseFloat(parts[0]) / 360 % 360; - if (h < 0) - h++; - s = clamp(percent(parts[1]), 0, 1); - l = clamp(percent(parts[2]), 0, 1); - if (s == 0) { - r = g = b = l; // achromatic - } else { - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hueToRgb(p, q, h + 1 / 3); - g = hueToRgb(p, q, h); - b = hueToRgb(p, q, h - 1 / 3); - } - - return '#' + decToHex[Math.floor(r * 255)] + - decToHex[Math.floor(g * 255)] + - decToHex[Math.floor(b * 255)]; - } - - function hueToRgb(m1, m2, h) { - if (h < 0) - h++; - if (h > 1) - h--; - - if (6 * h < 1) - return m1 + (m2 - m1) * 6 * h; - else if (2 * h < 1) - return m2; - else if (3 * h < 2) - return m1 + (m2 - m1) * (2 / 3 - h) * 6; - else - return m1; - } - - function processStyle(styleString) { - var str, alpha = 1; - - styleString = String(styleString); - if (styleString.charAt(0) == '#') { - str = styleString; - } else if (/^rgb/.test(styleString)) { - var parts = getRgbHslContent(styleString); - var str = '#', n; - for (var i = 0; i < 3; i++) { - if (parts[i].indexOf('%') != -1) { - n = Math.floor(percent(parts[i]) * 255); - } else { - n = Number(parts[i]); - } - str += decToHex[clamp(n, 0, 255)]; - } - alpha = parts[3]; - } else if (/^hsl/.test(styleString)) { - var parts = getRgbHslContent(styleString); - str = hslToRgb(parts); - alpha = parts[3]; - } else { - str = colorData[styleString] || styleString; - } - return {color: str, alpha: alpha}; - } - - var DEFAULT_STYLE = { - style: 'normal', - variant: 'normal', - weight: 'normal', - size: 10, - family: 'sans-serif' - }; - - // Internal text style cache - var fontStyleCache = {}; - - function processFontStyle(styleString) { - if (fontStyleCache[styleString]) { - return fontStyleCache[styleString]; - } - - var el = document.createElement('div'); - var style = el.style; - try { - style.font = styleString; - } catch (ex) { - // Ignore failures to set to invalid font. - } - - return fontStyleCache[styleString] = { - style: style.fontStyle || DEFAULT_STYLE.style, - variant: style.fontVariant || DEFAULT_STYLE.variant, - weight: style.fontWeight || DEFAULT_STYLE.weight, - size: style.fontSize || DEFAULT_STYLE.size, - family: style.fontFamily || DEFAULT_STYLE.family - }; - } - - function getComputedStyle(style, element) { - var computedStyle = {}; - - for (var p in style) { - computedStyle[p] = style[p]; - } - - // Compute the size - var canvasFontSize = parseFloat(element.currentStyle.fontSize), - fontSize = parseFloat(style.size); - - if (typeof style.size == 'number') { - computedStyle.size = style.size; - } else if (style.size.indexOf('px') != -1) { - computedStyle.size = fontSize; - } else if (style.size.indexOf('em') != -1) { - computedStyle.size = canvasFontSize * fontSize; - } else if(style.size.indexOf('%') != -1) { - computedStyle.size = (canvasFontSize / 100) * fontSize; - } else if (style.size.indexOf('pt') != -1) { - computedStyle.size = fontSize / .75; - } else { - computedStyle.size = canvasFontSize; - } - - // Different scaling between normal text and VML text. This was found using - // trial and error to get the same size as non VML text. - computedStyle.size *= 0.981; - - return computedStyle; - } - - function buildStyle(style) { - return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + - style.size + 'px ' + style.family; - } - - function processLineCap(lineCap) { - switch (lineCap) { - case 'butt': - return 'flat'; - case 'round': - return 'round'; - case 'square': - default: - return 'square'; - } - } - - /** - * This class implements CanvasRenderingContext2D interface as described by - * the WHATWG. - * @param {HTMLElement} surfaceElement The element that the 2D context should - * be associated with - */ - function CanvasRenderingContext2D_(surfaceElement) { - this.m_ = createMatrixIdentity(); - - this.mStack_ = []; - this.aStack_ = []; - this.currentPath_ = []; - - // Canvas context properties - this.strokeStyle = '#000'; - this.fillStyle = '#000'; - - this.lineWidth = 1; - this.lineJoin = 'miter'; - this.lineCap = 'butt'; - this.miterLimit = Z * 1; - this.globalAlpha = 1; - this.font = '10px sans-serif'; - this.textAlign = 'left'; - this.textBaseline = 'alphabetic'; - this.canvas = surfaceElement; - - var el = surfaceElement.ownerDocument.createElement('div'); - el.style.width = surfaceElement.clientWidth + 'px'; - el.style.height = surfaceElement.clientHeight + 'px'; - el.style.overflow = 'hidden'; - el.style.position = 'absolute'; - surfaceElement.appendChild(el); - - this.element_ = el; - this.arcScaleX_ = 1; - this.arcScaleY_ = 1; - this.lineScale_ = 1; - } - - var contextPrototype = CanvasRenderingContext2D_.prototype; - contextPrototype.clearRect = function() { - if (this.textMeasureEl_) { - this.textMeasureEl_.removeNode(true); - this.textMeasureEl_ = null; - } - this.element_.innerHTML = ''; - }; - - contextPrototype.beginPath = function() { - // TODO: Branch current matrix so that save/restore has no effect - // as per safari docs. - this.currentPath_ = []; - }; - - contextPrototype.moveTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.lineTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); - - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY) { - var p = this.getCoords_(aX, aY); - var cp1 = this.getCoords_(aCP1x, aCP1y); - var cp2 = this.getCoords_(aCP2x, aCP2y); - bezierCurveTo(this, cp1, cp2, p); - }; - - // Helper function that takes the already fixed cordinates. - function bezierCurveTo(self, cp1, cp2, p) { - self.currentPath_.push({ - type: 'bezierCurveTo', - cp1x: cp1.x, - cp1y: cp1.y, - cp2x: cp2.x, - cp2y: cp2.y, - x: p.x, - y: p.y - }); - self.currentX_ = p.x; - self.currentY_ = p.y; - } - - contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { - // the following is lifted almost directly from - // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes - - var cp = this.getCoords_(aCPx, aCPy); - var p = this.getCoords_(aX, aY); - - var cp1 = { - x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), - y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) - }; - var cp2 = { - x: cp1.x + (p.x - this.currentX_) / 3.0, - y: cp1.y + (p.y - this.currentY_) / 3.0 - }; - - bezierCurveTo(this, cp1, cp2, p); - }; - - contextPrototype.arc = function(aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise) { - aRadius *= Z; - var arcType = aClockwise ? 'at' : 'wa'; - - var xStart = aX + mc(aStartAngle) * aRadius - Z2; - var yStart = aY + ms(aStartAngle) * aRadius - Z2; - - var xEnd = aX + mc(aEndAngle) * aRadius - Z2; - var yEnd = aY + ms(aEndAngle) * aRadius - Z2; - - // IE won't render arches drawn counter clockwise if xStart == xEnd. - if (xStart == xEnd && !aClockwise) { - xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something - // that can be represented in binary - } - - var p = this.getCoords_(aX, aY); - var pStart = this.getCoords_(xStart, yStart); - var pEnd = this.getCoords_(xEnd, yEnd); - - this.currentPath_.push({type: arcType, - x: p.x, - y: p.y, - radius: aRadius, - xStart: pStart.x, - yStart: pStart.y, - xEnd: pEnd.x, - yEnd: pEnd.y}); - - }; - - contextPrototype.rect = function(aX, aY, aWidth, aHeight) { - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - }; - - contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.stroke(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.fill(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { - var gradient = new CanvasGradient_('gradient'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - return gradient; - }; - - contextPrototype.createRadialGradient = function(aX0, aY0, aR0, - aX1, aY1, aR1) { - var gradient = new CanvasGradient_('gradientradial'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.r0_ = aR0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - gradient.r1_ = aR1; - return gradient; - }; - - contextPrototype.drawImage = function(image, var_args) { - var dx, dy, dw, dh, sx, sy, sw, sh; - - // to find the original width we overide the width and height - var oldRuntimeWidth = image.runtimeStyle.width; - var oldRuntimeHeight = image.runtimeStyle.height; - image.runtimeStyle.width = 'auto'; - image.runtimeStyle.height = 'auto'; - - // get the original size - var w = image.width; - var h = image.height; - - // and remove overides - image.runtimeStyle.width = oldRuntimeWidth; - image.runtimeStyle.height = oldRuntimeHeight; - - if (arguments.length == 3) { - dx = arguments[1]; - dy = arguments[2]; - sx = sy = 0; - sw = dw = w; - sh = dh = h; - } else if (arguments.length == 5) { - dx = arguments[1]; - dy = arguments[2]; - dw = arguments[3]; - dh = arguments[4]; - sx = sy = 0; - sw = w; - sh = h; - } else if (arguments.length == 9) { - sx = arguments[1]; - sy = arguments[2]; - sw = arguments[3]; - sh = arguments[4]; - dx = arguments[5]; - dy = arguments[6]; - dw = arguments[7]; - dh = arguments[8]; - } else { - throw Error('Invalid number of arguments'); - } - - var d = this.getCoords_(dx, dy); - - var w2 = sw / 2; - var h2 = sh / 2; - - var vmlStr = []; - - var W = 10; - var H = 10; - - // For some reason that I've now forgotten, using divs didn't work - vmlStr.push(' ' , - '', - ''); - - this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); - }; - - contextPrototype.stroke = function(aFill) { - var W = 10; - var H = 10; - // Divide the shape into chunks if it's too long because IE has a limit - // somewhere for how long a VML shape can be. This simple division does - // not work with fills, only strokes, unfortunately. - var chunkSize = 5000; - - var min = {x: null, y: null}; - var max = {x: null, y: null}; - - for (var j = 0; j < this.currentPath_.length; j += chunkSize) { - var lineStr = []; - var lineOpen = false; - - lineStr.push(''); - - if (!aFill) { - appendStroke(this, lineStr); - } else { - appendFill(this, lineStr, min, max); - } - - lineStr.push(''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - } - }; - - function appendStroke(ctx, lineStr) { - var a = processStyle(ctx.strokeStyle); - var color = a.color; - var opacity = a.alpha * ctx.globalAlpha; - var lineWidth = ctx.lineScale_ * ctx.lineWidth; - - // VML cannot correctly render a line if the width is less than 1px. - // In that case, we dilute the color to make the line look thinner. - if (lineWidth < 1) { - opacity *= lineWidth; - } - - lineStr.push( - '' - ); - } - - function appendFill(ctx, lineStr, min, max) { - var fillStyle = ctx.fillStyle; - var arcScaleX = ctx.arcScaleX_; - var arcScaleY = ctx.arcScaleY_; - var width = max.x - min.x; - var height = max.y - min.y; - if (fillStyle instanceof CanvasGradient_) { - // TODO: Gradients transformed with the transformation matrix. - var angle = 0; - var focus = {x: 0, y: 0}; - - // additional offset - var shift = 0; - // scale factor for offset - var expansion = 1; - - if (fillStyle.type_ == 'gradient') { - var x0 = fillStyle.x0_ / arcScaleX; - var y0 = fillStyle.y0_ / arcScaleY; - var x1 = fillStyle.x1_ / arcScaleX; - var y1 = fillStyle.y1_ / arcScaleY; - var p0 = ctx.getCoords_(x0, y0); - var p1 = ctx.getCoords_(x1, y1); - var dx = p1.x - p0.x; - var dy = p1.y - p0.y; - angle = Math.atan2(dx, dy) * 180 / Math.PI; - - // The angle should be a non-negative number. - if (angle < 0) { - angle += 360; - } - - // Very small angles produce an unexpected result because they are - // converted to a scientific notation string. - if (angle < 1e-6) { - angle = 0; - } - } else { - var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_); - focus = { - x: (p0.x - min.x) / width, - y: (p0.y - min.y) / height - }; - - width /= arcScaleX * Z; - height /= arcScaleY * Z; - var dimension = m.max(width, height); - shift = 2 * fillStyle.r0_ / dimension; - expansion = 2 * fillStyle.r1_ / dimension - shift; - } - - // We need to sort the color stops in ascending order by offset, - // otherwise IE won't interpret it correctly. - var stops = fillStyle.colors_; - stops.sort(function(cs1, cs2) { - return cs1.offset - cs2.offset; - }); - - var length = stops.length; - var color1 = stops[0].color; - var color2 = stops[length - 1].color; - var opacity1 = stops[0].alpha * ctx.globalAlpha; - var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; - - var colors = []; - for (var i = 0; i < length; i++) { - var stop = stops[i]; - colors.push(stop.offset * expansion + shift + ' ' + stop.color); - } - - // When colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - lineStr.push(''); - } else if (fillStyle instanceof CanvasPattern_) { - if (width && height) { - var deltaLeft = -min.x; - var deltaTop = -min.y; - lineStr.push(''); - } - } else { - var a = processStyle(ctx.fillStyle); - var color = a.color; - var opacity = a.alpha * ctx.globalAlpha; - lineStr.push(''); - } - } - - contextPrototype.fill = function() { - this.stroke(true); - }; - - contextPrototype.closePath = function() { - this.currentPath_.push({type: 'close'}); - }; - - /** - * @private - */ - contextPrototype.getCoords_ = function(aX, aY) { - var m = this.m_; - return { - x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, - y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 - }; - }; - - contextPrototype.save = function() { - var o = {}; - copyState(this, o); - this.aStack_.push(o); - this.mStack_.push(this.m_); - this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); - }; - - contextPrototype.restore = function() { - if (this.aStack_.length) { - copyState(this.aStack_.pop(), this); - this.m_ = this.mStack_.pop(); - } - }; - - function matrixIsFinite(m) { - return isFinite(m[0][0]) && isFinite(m[0][1]) && - isFinite(m[1][0]) && isFinite(m[1][1]) && - isFinite(m[2][0]) && isFinite(m[2][1]); - } - - function setM(ctx, m, updateLineScale) { - if (!matrixIsFinite(m)) { - return; - } - ctx.m_ = m; - - if (updateLineScale) { - // Get the line scale. - // Determinant of this.m_ means how much the area is enlarged by the - // transformation. So its square root can be used as a scale factor - // for width. - var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; - ctx.lineScale_ = sqrt(abs(det)); - } - } - - contextPrototype.translate = function(aX, aY) { - var m1 = [ - [1, 0, 0], - [0, 1, 0], - [aX, aY, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), false); - }; - - contextPrototype.rotate = function(aRot) { - var c = mc(aRot); - var s = ms(aRot); - - var m1 = [ - [c, s, 0], - [-s, c, 0], - [0, 0, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), false); - }; - - contextPrototype.scale = function(aX, aY) { - this.arcScaleX_ *= aX; - this.arcScaleY_ *= aY; - var m1 = [ - [aX, 0, 0], - [0, aY, 0], - [0, 0, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), true); - }; - - contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { - var m1 = [ - [m11, m12, 0], - [m21, m22, 0], - [dx, dy, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), true); - }; - - contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { - var m = [ - [m11, m12, 0], - [m21, m22, 0], - [dx, dy, 1] - ]; - - setM(this, m, true); - }; - - /** - * The text drawing function. - * The maxWidth argument isn't taken in account, since no browser supports - * it yet. - */ - contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { - var m = this.m_, - delta = 1000, - left = 0, - right = delta, - offset = {x: 0, y: 0}, - lineStr = []; - - var fontStyle = getComputedStyle(processFontStyle(this.font), - this.element_); - - var fontStyleString = buildStyle(fontStyle); - - var elementStyle = this.element_.currentStyle; - var textAlign = this.textAlign.toLowerCase(); - switch (textAlign) { - case 'left': - case 'center': - case 'right': - break; - case 'end': - textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; - break; - case 'start': - textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; - break; - default: - textAlign = 'left'; - } - - // 1.75 is an arbitrary number, as there is no info about the text baseline - switch (this.textBaseline) { - case 'hanging': - case 'top': - offset.y = fontStyle.size / 1.75; - break; - case 'middle': - break; - default: - case null: - case 'alphabetic': - case 'ideographic': - case 'bottom': - offset.y = -fontStyle.size / 2.25; - break; - } - - switch(textAlign) { - case 'right': - left = delta; - right = 0.05; - break; - case 'center': - left = right = delta / 2; - break; - } - - var d = this.getCoords_(x + offset.x, y + offset.y); - - lineStr.push(''); - - if (stroke) { - appendStroke(this, lineStr); - } else { - // TODO: Fix the min and max params. - appendFill(this, lineStr, {x: -left, y: 0}, - {x: right, y: fontStyle.size}); - } - - var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + - m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; - - var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z); - - lineStr.push('', - '', - ''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - }; - - contextPrototype.fillText = function(text, x, y, maxWidth) { - this.drawText_(text, x, y, maxWidth, false); - }; - - contextPrototype.strokeText = function(text, x, y, maxWidth) { - this.drawText_(text, x, y, maxWidth, true); - }; - - contextPrototype.measureText = function(text) { - if (!this.textMeasureEl_) { - var s = ''; - this.element_.insertAdjacentHTML('beforeEnd', s); - this.textMeasureEl_ = this.element_.lastChild; - } - var doc = this.element_.ownerDocument; - this.textMeasureEl_.innerHTML = ''; - this.textMeasureEl_.style.font = this.font; - // Don't use innerHTML or innerText because they allow markup/whitespace. - this.textMeasureEl_.appendChild(doc.createTextNode(text)); - return {width: this.textMeasureEl_.offsetWidth}; - }; - - /******** STUBS ********/ - contextPrototype.clip = function() { - // TODO: Implement - }; - - contextPrototype.arcTo = function() { - // TODO: Implement - }; - - contextPrototype.createPattern = function(image, repetition) { - return new CanvasPattern_(image, repetition); - }; - - // Gradient / Pattern Stubs - function CanvasGradient_(aType) { - this.type_ = aType; - this.x0_ = 0; - this.y0_ = 0; - this.r0_ = 0; - this.x1_ = 0; - this.y1_ = 0; - this.r1_ = 0; - this.colors_ = []; - } - - CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { - aColor = processStyle(aColor); - this.colors_.push({offset: aOffset, - color: aColor.color, - alpha: aColor.alpha}); - }; - - function CanvasPattern_(image, repetition) { - assertImageIsValid(image); - switch (repetition) { - case 'repeat': - case null: - case '': - this.repetition_ = 'repeat'; - break - case 'repeat-x': - case 'repeat-y': - case 'no-repeat': - this.repetition_ = repetition; - break; - default: - throwException('SYNTAX_ERR'); - } - - this.src_ = image.src; - this.width_ = image.width; - this.height_ = image.height; - } - - function throwException(s) { - throw new DOMException_(s); - } - - function assertImageIsValid(img) { - if (!img || img.nodeType != 1 || img.tagName != 'IMG') { - throwException('TYPE_MISMATCH_ERR'); - } - if (img.readyState != 'complete') { - throwException('INVALID_STATE_ERR'); - } - } - - function DOMException_(s) { - this.code = this[s]; - this.message = s +': DOM Exception ' + this.code; - } - var p = DOMException_.prototype = new Error; - p.INDEX_SIZE_ERR = 1; - p.DOMSTRING_SIZE_ERR = 2; - p.HIERARCHY_REQUEST_ERR = 3; - p.WRONG_DOCUMENT_ERR = 4; - p.INVALID_CHARACTER_ERR = 5; - p.NO_DATA_ALLOWED_ERR = 6; - p.NO_MODIFICATION_ALLOWED_ERR = 7; - p.NOT_FOUND_ERR = 8; - p.NOT_SUPPORTED_ERR = 9; - p.INUSE_ATTRIBUTE_ERR = 10; - p.INVALID_STATE_ERR = 11; - p.SYNTAX_ERR = 12; - p.INVALID_MODIFICATION_ERR = 13; - p.NAMESPACE_ERR = 14; - p.INVALID_ACCESS_ERR = 15; - p.VALIDATION_ERR = 16; - p.TYPE_MISMATCH_ERR = 17; - - // set up externs - G_vmlCanvasManager = G_vmlCanvasManager_; - CanvasRenderingContext2D = CanvasRenderingContext2D_; - CanvasGradient = CanvasGradient_; - CanvasPattern = CanvasPattern_; - DOMException = DOMException_; -})(); - -} // if diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.min.js deleted file mode 100644 index 12c74f7bea..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/excanvas.min.js +++ /dev/null @@ -1 +0,0 @@ -if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.js deleted file mode 100644 index d3524d786f..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.js +++ /dev/null @@ -1,179 +0,0 @@ -/* Plugin for jQuery for working with colors. - * - * Version 1.1. - * - * Inspiration from jQuery color animation plugin by John Resig. - * - * Released under the MIT license by Ole Laursen, October 2009. - * - * Examples: - * - * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() - * var c = $.color.extract($("#mydiv"), 'background-color'); - * console.log(c.r, c.g, c.b, c.a); - * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" - * - * Note that .scale() and .add() return the same modified object - * instead of making a new one. - * - * V. 1.1: Fix error handling so e.g. parsing an empty string does - * produce a color rather than just crashing. - */ - -(function($) { - $.color = {}; - - // construct color object with some convenient chainable helpers - $.color.make = function (r, g, b, a) { - var o = {}; - o.r = r || 0; - o.g = g || 0; - o.b = b || 0; - o.a = a != null ? a : 1; - - o.add = function (c, d) { - for (var i = 0; i < c.length; ++i) - o[c.charAt(i)] += d; - return o.normalize(); - }; - - o.scale = function (c, f) { - for (var i = 0; i < c.length; ++i) - o[c.charAt(i)] *= f; - return o.normalize(); - }; - - o.toString = function () { - if (o.a >= 1.0) { - return "rgb("+[o.r, o.g, o.b].join(",")+")"; - } else { - return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")"; - } - }; - - o.normalize = function () { - function clamp(min, value, max) { - return value < min ? min: (value > max ? max: value); - } - - o.r = clamp(0, parseInt(o.r), 255); - o.g = clamp(0, parseInt(o.g), 255); - o.b = clamp(0, parseInt(o.b), 255); - o.a = clamp(0, o.a, 1); - return o; - }; - - o.clone = function () { - return $.color.make(o.r, o.b, o.g, o.a); - }; - - return o.normalize(); - } - - // extract CSS color property from element, going up in the DOM - // if it's "transparent" - $.color.extract = function (elem, css) { - var c; - do { - c = elem.css(css).toLowerCase(); - // keep going until we find an element that has color, or - // we hit the body - if (c != '' && c != 'transparent') - break; - elem = elem.parent(); - } while (!$.nodeName(elem.get(0), "body")); - - // catch Safari's way of signalling transparent - if (c == "rgba(0, 0, 0, 0)") - c = "transparent"; - - return $.color.parse(c); - } - - // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), - // returns color object, if parsing failed, you get black (0, 0, - // 0) out - $.color.parse = function (str) { - var res, m = $.color.make; - - // Look for rgb(num,num,num) - if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); - - // Look for rgba(num,num,num,num) - if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); - - // Look for rgb(num%,num%,num%) - if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) - return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55); - - // Look for rgba(num%,num%,num%,num) - if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) - return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4])); - - // Look for #a0b1c2 - if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) - return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); - - // Look for #fff - if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) - return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16)); - - // Otherwise, we're most likely dealing with a named color - var name = $.trim(str).toLowerCase(); - if (name == "transparent") - return m(255, 255, 255, 0); - else { - // default to black - res = lookupColors[name] || [0, 0, 0]; - return m(res[0], res[1], res[2]); - } - } - - var lookupColors = { - aqua:[0,255,255], - azure:[240,255,255], - beige:[245,245,220], - black:[0,0,0], - blue:[0,0,255], - brown:[165,42,42], - cyan:[0,255,255], - darkblue:[0,0,139], - darkcyan:[0,139,139], - darkgrey:[169,169,169], - darkgreen:[0,100,0], - darkkhaki:[189,183,107], - darkmagenta:[139,0,139], - darkolivegreen:[85,107,47], - darkorange:[255,140,0], - darkorchid:[153,50,204], - darkred:[139,0,0], - darksalmon:[233,150,122], - darkviolet:[148,0,211], - fuchsia:[255,0,255], - gold:[255,215,0], - green:[0,128,0], - indigo:[75,0,130], - khaki:[240,230,140], - lightblue:[173,216,230], - lightcyan:[224,255,255], - lightgreen:[144,238,144], - lightgrey:[211,211,211], - lightpink:[255,182,193], - lightyellow:[255,255,224], - lime:[0,255,0], - magenta:[255,0,255], - maroon:[128,0,0], - navy:[0,0,128], - olive:[128,128,0], - orange:[255,165,0], - pink:[255,192,203], - purple:[128,0,128], - violet:[128,0,128], - red:[255,0,0], - silver:[192,192,192], - white:[255,255,255], - yellow:[255,255,0] - }; -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.min.js deleted file mode 100644 index 7f44c57b56..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.colorhelpers.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){b.color={};b.color.make=function(f,e,c,d){var h={};h.r=f||0;h.g=e||0;h.b=c||0;h.a=d!=null?d:1;h.add=function(k,j){for(var g=0;g=1){return"rgb("+[h.r,h.g,h.b].join(",")+")"}else{return"rgba("+[h.r,h.g,h.b,h.a].join(",")+")"}};h.normalize=function(){function g(j,k,i){return ki?i:k)}h.r=g(0,parseInt(h.r),255);h.g=g(0,parseInt(h.g),255);h.b=g(0,parseInt(h.b),255);h.a=g(0,h.a,1);return h};h.clone=function(){return b.color.make(h.r,h.b,h.g,h.a)};return h.normalize()};b.color.extract=function(e,d){var f;do{f=e.css(d).toLowerCase();if(f!=""&&f!="transparent"){break}e=e.parent()}while(!b.nodeName(e.get(0),"body"));if(f=="rgba(0, 0, 0, 0)"){f="transparent"}return b.color.parse(f)};b.color.parse=function(f){var e,c=b.color.make;if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10))}if(e=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseFloat(e[4]))}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55)}if(e=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55,parseFloat(e[4]))}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return c(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return c(parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16))}var d=b.trim(f).toLowerCase();if(d=="transparent"){return c(255,255,255,0)}else{e=a[d]||[0,0,0];return c(e[0],e[1],e[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.js deleted file mode 100644 index 1d433f0074..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.js +++ /dev/null @@ -1,167 +0,0 @@ -/* -Flot plugin for showing crosshairs, thin lines, when the mouse hovers -over the plot. - - crosshair: { - mode: null or "x" or "y" or "xy" - color: color - lineWidth: number - } - -Set the mode to one of "x", "y" or "xy". The "x" mode enables a -vertical crosshair that lets you trace the values on the x axis, "y" -enables a horizontal crosshair and "xy" enables them both. "color" is -the color of the crosshair (default is "rgba(170, 0, 0, 0.80)"), -"lineWidth" is the width of the drawn lines (default is 1). - -The plugin also adds four public methods: - - - setCrosshair(pos) - - Set the position of the crosshair. Note that this is cleared if - the user moves the mouse. "pos" is in coordinates of the plot and - should be on the form { x: xpos, y: ypos } (you can use x2/x3/... - if you're using multiple axes), which is coincidentally the same - format as what you get from a "plothover" event. If "pos" is null, - the crosshair is cleared. - - - clearCrosshair() - - Clear the crosshair. - - - lockCrosshair(pos) - - Cause the crosshair to lock to the current location, no longer - updating if the user moves the mouse. Optionally supply a position - (passed on to setCrosshair()) to move it to. - - Example usage: - var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; - $("#graph").bind("plothover", function (evt, position, item) { - if (item) { - // Lock the crosshair to the data point being hovered - myFlot.lockCrosshair({ x: item.datapoint[0], y: item.datapoint[1] }); - } - else { - // Return normal crosshair operation - myFlot.unlockCrosshair(); - } - }); - - - unlockCrosshair() - - Free the crosshair to move again after locking it. -*/ - -(function ($) { - var options = { - crosshair: { - mode: null, // one of null, "x", "y" or "xy", - color: "rgba(170, 0, 0, 0.80)", - lineWidth: 1 - } - }; - - function init(plot) { - // position of crosshair in pixels - var crosshair = { x: -1, y: -1, locked: false }; - - plot.setCrosshair = function setCrosshair(pos) { - if (!pos) - crosshair.x = -1; - else { - var o = plot.p2c(pos); - crosshair.x = Math.max(0, Math.min(o.left, plot.width())); - crosshair.y = Math.max(0, Math.min(o.top, plot.height())); - } - - plot.triggerRedrawOverlay(); - }; - - plot.clearCrosshair = plot.setCrosshair; // passes null for pos - - plot.lockCrosshair = function lockCrosshair(pos) { - if (pos) - plot.setCrosshair(pos); - crosshair.locked = true; - } - - plot.unlockCrosshair = function unlockCrosshair() { - crosshair.locked = false; - } - - function onMouseOut(e) { - if (crosshair.locked) - return; - - if (crosshair.x != -1) { - crosshair.x = -1; - plot.triggerRedrawOverlay(); - } - } - - function onMouseMove(e) { - if (crosshair.locked) - return; - - if (plot.getSelection && plot.getSelection()) { - crosshair.x = -1; // hide the crosshair while selecting - return; - } - - var offset = plot.offset(); - crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); - crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); - plot.triggerRedrawOverlay(); - } - - plot.hooks.bindEvents.push(function (plot, eventHolder) { - if (!plot.getOptions().crosshair.mode) - return; - - eventHolder.mouseout(onMouseOut); - eventHolder.mousemove(onMouseMove); - }); - - plot.hooks.drawOverlay.push(function (plot, ctx) { - var c = plot.getOptions().crosshair; - if (!c.mode) - return; - - var plotOffset = plot.getPlotOffset(); - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - if (crosshair.x != -1) { - ctx.strokeStyle = c.color; - ctx.lineWidth = c.lineWidth; - ctx.lineJoin = "round"; - - ctx.beginPath(); - if (c.mode.indexOf("x") != -1) { - ctx.moveTo(crosshair.x, 0); - ctx.lineTo(crosshair.x, plot.height()); - } - if (c.mode.indexOf("y") != -1) { - ctx.moveTo(0, crosshair.y); - ctx.lineTo(plot.width(), crosshair.y); - } - ctx.stroke(); - } - ctx.restore(); - }); - - plot.hooks.shutdown.push(function (plot, eventHolder) { - eventHolder.unbind("mouseout", onMouseOut); - eventHolder.unbind("mousemove", onMouseMove); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'crosshair', - version: '1.0' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.min.js deleted file mode 100644 index ccaf240366..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.crosshair.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){var a={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function c(h){var j={x:-1,y:-1,locked:false};h.setCrosshair=function e(l){if(!l){j.x=-1}else{var k=h.p2c(l);j.x=Math.max(0,Math.min(k.left,h.width()));j.y=Math.max(0,Math.min(k.top,h.height()))}h.triggerRedrawOverlay()};h.clearCrosshair=h.setCrosshair;h.lockCrosshair=function f(k){if(k){h.setCrosshair(k)}j.locked=true};h.unlockCrosshair=function g(){j.locked=false};function d(k){if(j.locked){return}if(j.x!=-1){j.x=-1;h.triggerRedrawOverlay()}}function i(k){if(j.locked){return}if(h.getSelection&&h.getSelection()){j.x=-1;return}var l=h.offset();j.x=Math.max(0,Math.min(k.pageX-l.left,h.width()));j.y=Math.max(0,Math.min(k.pageY-l.top,h.height()));h.triggerRedrawOverlay()}h.hooks.bindEvents.push(function(l,k){if(!l.getOptions().crosshair.mode){return}k.mouseout(d);k.mousemove(i)});h.hooks.drawOverlay.push(function(m,k){var n=m.getOptions().crosshair;if(!n.mode){return}var l=m.getPlotOffset();k.save();k.translate(l.left,l.top);if(j.x!=-1){k.strokeStyle=n.color;k.lineWidth=n.lineWidth;k.lineJoin="round";k.beginPath();if(n.mode.indexOf("x")!=-1){k.moveTo(j.x,0);k.lineTo(j.x,m.height())}if(n.mode.indexOf("y")!=-1){k.moveTo(0,j.y);k.lineTo(m.width(),j.y)}k.stroke()}k.restore()});h.hooks.shutdown.push(function(l,k){k.unbind("mouseout",d);k.unbind("mousemove",i)})}b.plot.plugins.push({init:c,options:a,name:"crosshair",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.js deleted file mode 100644 index 69700e79ce..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.js +++ /dev/null @@ -1,183 +0,0 @@ -/* -Flot plugin for computing bottoms for filled line and bar charts. - -The case: you've got two series that you want to fill the area -between. In Flot terms, you need to use one as the fill bottom of the -other. You can specify the bottom of each data point as the third -coordinate manually, or you can use this plugin to compute it for you. - -In order to name the other series, you need to give it an id, like this - - var dataset = [ - { data: [ ... ], id: "foo" } , // use default bottom - { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom - ]; - - $.plot($("#placeholder"), dataset, { line: { show: true, fill: true }}); - -As a convenience, if the id given is a number that doesn't appear as -an id in the series, it is interpreted as the index in the array -instead (so fillBetween: 0 can also mean the first series). - -Internally, the plugin modifies the datapoints in each series. For -line series, extra data points might be inserted through -interpolation. Note that at points where the bottom line is not -defined (due to a null point or start/end of line), the current line -will show a gap too. The algorithm comes from the jquery.flot.stack.js -plugin, possibly some code could be shared. -*/ - -(function ($) { - var options = { - series: { fillBetween: null } // or number - }; - - function init(plot) { - function findBottomSeries(s, allseries) { - var i; - for (i = 0; i < allseries.length; ++i) { - if (allseries[i].id == s.fillBetween) - return allseries[i]; - } - - if (typeof s.fillBetween == "number") { - i = s.fillBetween; - - if (i < 0 || i >= allseries.length) - return null; - - return allseries[i]; - } - - return null; - } - - function computeFillBottoms(plot, s, datapoints) { - if (s.fillBetween == null) - return; - - var other = findBottomSeries(s, plot.getData()); - if (!other) - return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - withbottom = ps > 2 && datapoints.format[2].y, - withsteps = withlines && s.lines.steps, - fromgap = true, - i = 0, j = 0, l; - - while (true) { - if (i >= points.length) - break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i]; - py = points[i + 1]; - qx = otherpoints[j]; - qy = otherpoints[j + 1]; - bottom = 0; - - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - //newpoints[l + 1] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + 1] - py) * (qx - px) / (points[i - ps] - px); - newpoints.push(qx); - newpoints.push(intery) - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } - - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + 1] - qy) * (px - qx) / (otherpoints[j - otherps] - qx); - - //newpoints[l + 1] += bottom; - - i += ps; - } - - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] = bottom; - } - - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(computeFillBottoms); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'fillbetween', - version: '1.0' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.min.js deleted file mode 100644 index 47f3dfb6de..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.fillbetween.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){var a={series:{fillBetween:null}};function c(f){function d(j,h){var g;for(g=0;g=h.length){return null}return h[g]}return null}function e(B,u,g){if(u.fillBetween==null){return}var p=d(u,B.getData());if(!p){return}var y=g.pointsize,E=g.points,h=p.datapoints.pointsize,x=p.datapoints.points,r=[],w,v,k,G,F,q,t=u.lines.show,o=y>2&&g.format[2].y,n=t&&u.lines.steps,D=true,C=0,A=0,z;while(true){if(C>=E.length){break}z=r.length;if(E[C]==null){for(m=0;m=x.length){if(!t){for(m=0;mG){if(t&&C>0&&E[C-y]!=null){k=v+(E[C-y+1]-v)*(G-w)/(E[C-y]-w);r.push(G);r.push(k);for(m=2;m0&&x[A-h]!=null){q=F+(x[A-h+1]-F)*(w-G)/(x[A-h]-G)}C+=y}}D=false;if(z!=r.length&&o){r[z+2]=q}}}}if(n&&z!=r.length&&z>0&&r[z]!=null&&r[z]!=r[z-y]&&r[z+1]!=r[z-y+1]){for(m=0;m').load(handler).error(handler).attr('src', url); - }); - } - - function drawSeries(plot, ctx, series) { - var plotOffset = plot.getPlotOffset(); - - if (!series.images || !series.images.show) - return; - - var points = series.datapoints.points, - ps = series.datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - var img = points[i], - x1 = points[i + 1], y1 = points[i + 2], - x2 = points[i + 3], y2 = points[i + 4], - xaxis = series.xaxis, yaxis = series.yaxis, - tmp; - - // actually we should check img.complete, but it - // appears to be a somewhat unreliable indicator in - // IE6 (false even after load event) - if (!img || img.width <= 0 || img.height <= 0) - continue; - - if (x1 > x2) { - tmp = x2; - x2 = x1; - x1 = tmp; - } - if (y1 > y2) { - tmp = y2; - y2 = y1; - y1 = tmp; - } - - // if the anchor is at the center of the pixel, expand the - // image by 1/2 pixel in each direction - if (series.images.anchor == "center") { - tmp = 0.5 * (x2-x1) / (img.width - 1); - x1 -= tmp; - x2 += tmp; - tmp = 0.5 * (y2-y1) / (img.height - 1); - y1 -= tmp; - y2 += tmp; - } - - // clip - if (x1 == x2 || y1 == y2 || - x1 >= xaxis.max || x2 <= xaxis.min || - y1 >= yaxis.max || y2 <= yaxis.min) - continue; - - var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height; - if (x1 < xaxis.min) { - sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1); - x1 = xaxis.min; - } - - if (x2 > xaxis.max) { - sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1); - x2 = xaxis.max; - } - - if (y1 < yaxis.min) { - sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1); - y1 = yaxis.min; - } - - if (y2 > yaxis.max) { - sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1); - y2 = yaxis.max; - } - - x1 = xaxis.p2c(x1); - x2 = xaxis.p2c(x2); - y1 = yaxis.p2c(y1); - y2 = yaxis.p2c(y2); - - // the transformation may have swapped us - if (x1 > x2) { - tmp = x2; - x2 = x1; - x1 = tmp; - } - if (y1 > y2) { - tmp = y2; - y2 = y1; - y1 = tmp; - } - - tmp = ctx.globalAlpha; - ctx.globalAlpha *= series.images.alpha; - ctx.drawImage(img, - sx1, sy1, sx2 - sx1, sy2 - sy1, - x1 + plotOffset.left, y1 + plotOffset.top, - x2 - x1, y2 - y1); - ctx.globalAlpha = tmp; - } - } - - function processRawData(plot, series, data, datapoints) { - if (!series.images.show) - return; - - // format is Image, x1, y1, x2, y2 (opposite corners) - datapoints.format = [ - { required: true }, - { x: true, number: true, required: true }, - { y: true, number: true, required: true }, - { x: true, number: true, required: true }, - { y: true, number: true, required: true } - ]; - } - - function init(plot) { - plot.hooks.processRawData.push(processRawData); - plot.hooks.drawSeries.push(drawSeries); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'image', - version: '1.1' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.image.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.image.min.js deleted file mode 100644 index 9480c1e7a3..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.image.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(c){var a={series:{images:{show:false,alpha:1,anchor:"corner"}}};c.plot.image={};c.plot.image.loadDataImages=function(g,f,k){var j=[],h=[];var i=f.series.images.show;c.each(g,function(l,m){if(!(i||m.images.show)){return}if(m.data){m=m.data}c.each(m,function(n,o){if(typeof o[0]=="string"){j.push(o[0]);h.push(o)}})});c.plot.image.load(j,function(l){c.each(h,function(n,o){var m=o[0];if(l[m]){o[0]=l[m]}});k()})};c.plot.image.load=function(h,i){var g=h.length,f={};if(g==0){i({})}c.each(h,function(k,j){var l=function(){--g;f[j]=this;if(g==0){i(f)}};c("").load(l).error(l).attr("src",j)})};function d(q,o,l){var m=q.getPlotOffset();if(!l.images||!l.images.show){return}var r=l.datapoints.points,n=l.datapoints.pointsize;for(var t=0;tv){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}if(l.images.anchor=="center"){x=0.5*(v-w)/(y.width-1);w-=x;v+=x;x=0.5*(f-g)/(y.height-1);g-=x;f+=x}if(w==v||g==f||w>=h.max||v<=h.min||g>=u.max||f<=u.min){continue}var k=0,s=0,j=y.width,p=y.height;if(wh.max){j+=(j-k)*(h.max-v)/(v-w);v=h.max}if(gu.max){s+=(s-p)*(u.max-f)/(f-g);f=u.max}w=h.p2c(w);v=h.p2c(v);g=u.p2c(g);f=u.p2c(f);if(w>v){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}x=o.globalAlpha;o.globalAlpha*=l.images.alpha;o.drawImage(y,k,s,j-k,p-s,w+m.left,g+m.top,v-w,f-g);o.globalAlpha=x}}function b(i,f,g,h){if(!f.images.show){return}h.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function e(f){f.hooks.processRawData.push(b);f.hooks.drawSeries.push(d)}c.plot.plugins.push({init:e,options:a,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.js deleted file mode 100644 index aabc544e9a..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.js +++ /dev/null @@ -1,2599 +0,0 @@ -/*! Javascript plotting library for jQuery, v. 0.7. - * - * Released under the MIT license by IOLA, December 2007. - * - */ - -// first an inline dependency, jquery.colorhelpers.js, we inline it here -// for convenience - -/* Plugin for jQuery for working with colors. - * - * Version 1.1. - * - * Inspiration from jQuery color animation plugin by John Resig. - * - * Released under the MIT license by Ole Laursen, October 2009. - * - * Examples: - * - * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() - * var c = $.color.extract($("#mydiv"), 'background-color'); - * console.log(c.r, c.g, c.b, c.a); - * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" - * - * Note that .scale() and .add() return the same modified object - * instead of making a new one. - * - * V. 1.1: Fix error handling so e.g. parsing an empty string does - * produce a color rather than just crashing. - */ -(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return KI?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); - -// the actual Flot code -(function($) { - function Plot(placeholder, data_, options_, plugins) { - // data is on the form: - // [ series1, series2 ... ] - // where series is either just the data as [ [x1, y1], [x2, y2], ... ] - // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } - - var series = [], - options = { - // the color theme used for graphs - colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], - legend: { - show: true, - noColumns: 1, // number of colums in legend table - labelFormatter: null, // fn: string -> string - labelBoxBorderColor: "#ccc", // border color for the little label boxes - container: null, // container (as jQuery object) to put legend in, null means default on top of graph - position: "ne", // position of default legend container within plot - margin: 5, // distance from grid edge to default legend container within plot - backgroundColor: null, // null means auto-detect - backgroundOpacity: 0.85 // set to 0 to avoid background - }, - xaxis: { - show: null, // null = auto-detect, true = always, false = never - position: "bottom", // or "top" - mode: null, // null or "time" - color: null, // base color, labels, ticks - tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" - transform: null, // null or f: number -> number to transform axis - inverseTransform: null, // if transform is set, this should be the inverse function - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoscaleMargin: null, // margin in % to add if auto-setting min/max - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickFormatter: null, // fn: number -> string - labelWidth: null, // size of tick labels in pixels - labelHeight: null, - reserveSpace: null, // whether to reserve space even if axis isn't shown - tickLength: null, // size in pixels of ticks, or "full" for whole line - alignTicksWithAxis: null, // axis number or null for no sync - - // mode specific options - tickDecimals: null, // no. of decimals, null means auto - tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - monthNames: null, // list of names of months - timeformat: null, // format string to use - twelveHourClock: false // 12 or 24 time in time mode - }, - yaxis: { - autoscaleMargin: 0.02, - position: "left" // or "right" - }, - xaxes: [], - yaxes: [], - series: { - points: { - show: false, - radius: 3, - lineWidth: 2, // in pixels - fill: true, - fillColor: "#ffffff", - symbol: "circle" // or callback - }, - lines: { - // we don't put in show: false so we can see - // whether lines were actively disabled - lineWidth: 2, // in pixels - fill: false, - fillColor: null, - steps: false - }, - bars: { - show: false, - lineWidth: 2, // in pixels - barWidth: 1, // in units of the x axis - fill: true, - fillColor: null, - align: "left", // or "center" - horizontal: false - }, - shadowSize: 3 - }, - grid: { - show: true, - aboveData: false, - color: "#545454", // primary color used for outline and labels - backgroundColor: null, // null for transparent, else color - borderColor: null, // set if different from the grid color - tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" - labelMargin: 5, // in pixels - axisMargin: 8, // in pixels - borderWidth: 2, // in pixels - minBorderMargin: null, // in pixels, null means taken from points radius - markings: null, // array of ranges or fn: axes -> array of ranges - markingsColor: "#f4f4f4", - markingsLineWidth: 2, - // interactive stuff - clickable: false, - hoverable: false, - autoHighlight: true, // highlight in case mouse is near - mouseActiveRadius: 10 // how far the mouse can be away to activate an item - }, - hooks: {} - }, - canvas = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, octx = null, - xaxes = [], yaxes = [], - plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - canvasWidth = 0, canvasHeight = 0, - plotWidth = 0, plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - drawSeries: [], - draw: [], - bindEvents: [], - drawOverlay: [], - shutdown: [] - }, - plot = this; - - // public functions - plot.setData = setData; - plot.setupGrid = setupGrid; - plot.draw = draw; - plot.getPlaceholder = function() { return placeholder; }; - plot.getCanvas = function() { return canvas; }; - plot.getPlotOffset = function() { return plotOffset; }; - plot.width = function () { return plotWidth; }; - plot.height = function () { return plotHeight; }; - plot.offset = function () { - var o = eventHolder.offset(); - o.left += plotOffset.left; - o.top += plotOffset.top; - return o; - }; - plot.getData = function () { return series; }; - plot.getAxes = function () { - var res = {}, i; - $.each(xaxes.concat(yaxes), function (_, axis) { - if (axis) - res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; - }); - return res; - }; - plot.getXAxes = function () { return xaxes; }; - plot.getYAxes = function () { return yaxes; }; - plot.c2p = canvasToAxisCoords; - plot.p2c = axisToCanvasCoords; - plot.getOptions = function () { return options; }; - plot.highlight = highlight; - plot.unhighlight = unhighlight; - plot.triggerRedrawOverlay = triggerRedrawOverlay; - plot.pointOffset = function(point) { - return { - left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), - top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) - }; - }; - plot.shutdown = shutdown; - plot.resize = function () { - getCanvasDimensions(); - resizeCanvas(canvas); - resizeCanvas(overlay); - }; - - // public attributes - plot.hooks = hooks; - - // initialize - initPlugins(plot); - parseOptions(options_); - setupCanvases(); - setData(data_); - setupGrid(); - draw(); - bindEvents(); - - - function executeHooks(hook, args) { - args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) - hook[i].apply(this, args); - } - - function initPlugins() { - for (var i = 0; i < plugins.length; ++i) { - var p = plugins[i]; - p.init(plot); - if (p.options) - $.extend(true, options, p.options); - } - } - - function parseOptions(opts) { - var i; - - $.extend(true, options, opts); - - if (options.xaxis.color == null) - options.xaxis.color = options.grid.color; - if (options.yaxis.color == null) - options.yaxis.color = options.grid.color; - - if (options.xaxis.tickColor == null) // backwards-compatibility - options.xaxis.tickColor = options.grid.tickColor; - if (options.yaxis.tickColor == null) // backwards-compatibility - options.yaxis.tickColor = options.grid.tickColor; - - if (options.grid.borderColor == null) - options.grid.borderColor = options.grid.color; - if (options.grid.tickColor == null) - options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - - // fill in defaults in axes, copy at least always the - // first as the rest of the code assumes it'll be there - for (i = 0; i < Math.max(1, options.xaxes.length); ++i) - options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); - for (i = 0; i < Math.max(1, options.yaxes.length); ++i) - options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); - - // backwards compatibility, to be removed in future - if (options.xaxis.noTicks && options.xaxis.ticks == null) - options.xaxis.ticks = options.xaxis.noTicks; - if (options.yaxis.noTicks && options.yaxis.ticks == null) - options.yaxis.ticks = options.yaxis.noTicks; - if (options.x2axis) { - options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); - options.xaxes[1].position = "top"; - } - if (options.y2axis) { - options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); - options.yaxes[1].position = "right"; - } - if (options.grid.coloredAreas) - options.grid.markings = options.grid.coloredAreas; - if (options.grid.coloredAreasColor) - options.grid.markingsColor = options.grid.coloredAreasColor; - if (options.lines) - $.extend(true, options.series.lines, options.lines); - if (options.points) - $.extend(true, options.series.points, options.points); - if (options.bars) - $.extend(true, options.series.bars, options.bars); - if (options.shadowSize != null) - options.series.shadowSize = options.shadowSize; - - // save options on axes for future reference - for (i = 0; i < options.xaxes.length; ++i) - getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; - for (i = 0; i < options.yaxes.length; ++i) - getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; - - // add hooks from options - for (var n in hooks) - if (options.hooks[n] && options.hooks[n].length) - hooks[n] = hooks[n].concat(options.hooks[n]); - - executeHooks(hooks.processOptions, [options]); - } - - function setData(d) { - series = parseData(d); - fillInSeriesOptions(); - processData(); - } - - function parseData(d) { - var res = []; - for (var i = 0; i < d.length; ++i) { - var s = $.extend(true, {}, options.series); - - if (d[i].data != null) { - s.data = d[i].data; // move the data instead of deep-copy - delete d[i].data; - - $.extend(true, s, d[i]); - - d[i].data = s.data; - } - else - s.data = d[i]; - res.push(s); - } - - return res; - } - - function axisNumber(obj, coord) { - var a = obj[coord + "axis"]; - if (typeof a == "object") // if we got a real axis, extract number - a = a.n; - if (typeof a != "number") - a = 1; // default to first axis - return a; - } - - function allAxes() { - // return flat array without annoying null entries - return $.grep(xaxes.concat(yaxes), function (a) { return a; }); - } - - function canvasToAxisCoords(pos) { - // return an object with x/y corresponding to all used axes - var res = {}, i, axis; - for (i = 0; i < xaxes.length; ++i) { - axis = xaxes[i]; - if (axis && axis.used) - res["x" + axis.n] = axis.c2p(pos.left); - } - - for (i = 0; i < yaxes.length; ++i) { - axis = yaxes[i]; - if (axis && axis.used) - res["y" + axis.n] = axis.c2p(pos.top); - } - - if (res.x1 !== undefined) - res.x = res.x1; - if (res.y1 !== undefined) - res.y = res.y1; - - return res; - } - - function axisToCanvasCoords(pos) { - // get canvas coords from the first pair of x/y found in pos - var res = {}, i, axis, key; - - for (i = 0; i < xaxes.length; ++i) { - axis = xaxes[i]; - if (axis && axis.used) { - key = "x" + axis.n; - if (pos[key] == null && axis.n == 1) - key = "x"; - - if (pos[key] != null) { - res.left = axis.p2c(pos[key]); - break; - } - } - } - - for (i = 0; i < yaxes.length; ++i) { - axis = yaxes[i]; - if (axis && axis.used) { - key = "y" + axis.n; - if (pos[key] == null && axis.n == 1) - key = "y"; - - if (pos[key] != null) { - res.top = axis.p2c(pos[key]); - break; - } - } - } - - return res; - } - - function getOrCreateAxis(axes, number) { - if (!axes[number - 1]) - axes[number - 1] = { - n: number, // save the number for future reference - direction: axes == xaxes ? "x" : "y", - options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) - }; - - return axes[number - 1]; - } - - function fillInSeriesOptions() { - var i; - - // collect what we already got of colors - var neededColors = series.length, - usedColors = [], - assignedColors = []; - for (i = 0; i < series.length; ++i) { - var sc = series[i].color; - if (sc != null) { - --neededColors; - if (typeof sc == "number") - assignedColors.push(sc); - else - usedColors.push($.color.parse(series[i].color)); - } - } - - // we might need to generate more colors if higher indices - // are assigned - for (i = 0; i < assignedColors.length; ++i) { - neededColors = Math.max(neededColors, assignedColors[i] + 1); - } - - // produce colors as needed - var colors = [], variation = 0; - i = 0; - while (colors.length < neededColors) { - var c; - if (options.colors.length == i) // check degenerate case - c = $.color.make(100, 100, 100); - else - c = $.color.parse(options.colors[i]); - - // vary color if needed - var sign = variation % 2 == 1 ? -1 : 1; - c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) - - // FIXME: if we're getting to close to something else, - // we should probably skip this one - colors.push(c); - - ++i; - if (i >= options.colors.length) { - i = 0; - ++variation; - } - } - - // fill in the options - var colori = 0, s; - for (i = 0; i < series.length; ++i) { - s = series[i]; - - // assign colors - if (s.color == null) { - s.color = colors[colori].toString(); - ++colori; - } - else if (typeof s.color == "number") - s.color = colors[s.color].toString(); - - // turn on lines automatically in case nothing is set - if (s.lines.show == null) { - var v, show = true; - for (v in s) - if (s[v] && s[v].show) { - show = false; - break; - } - if (show) - s.lines.show = true; - } - - // setup axes - s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); - s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); - } - } - - function processData() { - var topSentry = Number.POSITIVE_INFINITY, - bottomSentry = Number.NEGATIVE_INFINITY, - fakeInfinity = Number.MAX_VALUE, - i, j, k, m, length, - s, points, ps, x, y, axis, val, f, p; - - function updateAxis(axis, min, max) { - if (min < axis.datamin && min != -fakeInfinity) - axis.datamin = min; - if (max > axis.datamax && max != fakeInfinity) - axis.datamax = max; - } - - $.each(allAxes(), function (_, axis) { - // init axis - axis.datamin = topSentry; - axis.datamax = bottomSentry; - axis.used = false; - }); - - for (i = 0; i < series.length; ++i) { - s = series[i]; - s.datapoints = { points: [] }; - - executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); - } - - // first pass: clean and copy data - for (i = 0; i < series.length; ++i) { - s = series[i]; - - var data = s.data, format = s.datapoints.format; - - if (!format) { - format = []; - // find out how to copy - format.push({ x: true, number: true, required: true }); - format.push({ y: true, number: true, required: true }); - - if (s.bars.show || (s.lines.show && s.lines.fill)) { - format.push({ y: true, number: true, required: false, defaultValue: 0 }); - if (s.bars.horizontal) { - delete format[format.length - 1].y; - format[format.length - 1].x = true; - } - } - - s.datapoints.format = format; - } - - if (s.datapoints.pointsize != null) - continue; // already filled in - - s.datapoints.pointsize = format.length; - - ps = s.datapoints.pointsize; - points = s.datapoints.points; - - insertSteps = s.lines.show && s.lines.steps; - s.xaxis.used = s.yaxis.used = true; - - for (j = k = 0; j < data.length; ++j, k += ps) { - p = data[j]; - - var nullify = p == null; - if (!nullify) { - for (m = 0; m < ps; ++m) { - val = p[m]; - f = format[m]; - - if (f) { - if (f.number && val != null) { - val = +val; // convert to number - if (isNaN(val)) - val = null; - else if (val == Infinity) - val = fakeInfinity; - else if (val == -Infinity) - val = -fakeInfinity; - } - - if (val == null) { - if (f.required) - nullify = true; - - if (f.defaultValue != null) - val = f.defaultValue; - } - } - - points[k + m] = val; - } - } - - if (nullify) { - for (m = 0; m < ps; ++m) { - val = points[k + m]; - if (val != null) { - f = format[m]; - // extract min/max info - if (f.x) - updateAxis(s.xaxis, val, val); - if (f.y) - updateAxis(s.yaxis, val, val); - } - points[k + m] = null; - } - } - else { - // a little bit of line specific stuff that - // perhaps shouldn't be here, but lacking - // better means... - if (insertSteps && k > 0 - && points[k - ps] != null - && points[k - ps] != points[k] - && points[k - ps + 1] != points[k + 1]) { - // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) - points[k + ps + m] = points[k + m]; - - // middle point has same y - points[k + 1] = points[k - ps + 1]; - - // we've added a point, better reflect that - k += ps; - } - } - } - } - - // give the hooks a chance to run - for (i = 0; i < series.length; ++i) { - s = series[i]; - - executeHooks(hooks.processDatapoints, [ s, s.datapoints]); - } - - // second pass: find datamax/datamin for auto-scaling - for (i = 0; i < series.length; ++i) { - s = series[i]; - points = s.datapoints.points, - ps = s.datapoints.pointsize; - - var xmin = topSentry, ymin = topSentry, - xmax = bottomSentry, ymax = bottomSentry; - - for (j = 0; j < points.length; j += ps) { - if (points[j] == null) - continue; - - for (m = 0; m < ps; ++m) { - val = points[j + m]; - f = format[m]; - if (!f || val == fakeInfinity || val == -fakeInfinity) - continue; - - if (f.x) { - if (val < xmin) - xmin = val; - if (val > xmax) - xmax = val; - } - if (f.y) { - if (val < ymin) - ymin = val; - if (val > ymax) - ymax = val; - } - } - } - - if (s.bars.show) { - // make sure we got room for the bar on the dancing floor - var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; - if (s.bars.horizontal) { - ymin += delta; - ymax += delta + s.bars.barWidth; - } - else { - xmin += delta; - xmax += delta + s.bars.barWidth; - } - } - - updateAxis(s.xaxis, xmin, xmax); - updateAxis(s.yaxis, ymin, ymax); - } - - $.each(allAxes(), function (_, axis) { - if (axis.datamin == topSentry) - axis.datamin = null; - if (axis.datamax == bottomSentry) - axis.datamax = null; - }); - } - - function makeCanvas(skipPositioning, cls) { - var c = document.createElement('canvas'); - c.className = cls; - c.width = canvasWidth; - c.height = canvasHeight; - - if (!skipPositioning) - $(c).css({ position: 'absolute', left: 0, top: 0 }); - - $(c).appendTo(placeholder); - - if (!c.getContext) // excanvas hack - c = window.G_vmlCanvasManager.initElement(c); - - // used for resetting in case we get replotted - c.getContext("2d").save(); - - return c; - } - - function getCanvasDimensions() { - canvasWidth = placeholder.width(); - canvasHeight = placeholder.height(); - - if (canvasWidth <= 0 || canvasHeight <= 0) - throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; - } - - function resizeCanvas(c) { - // resizing should reset the state (excanvas seems to be - // buggy though) - if (c.width != canvasWidth) - c.width = canvasWidth; - - if (c.height != canvasHeight) - c.height = canvasHeight; - - // so try to get back to the initial state (even if it's - // gone now, this should be safe according to the spec) - var cctx = c.getContext("2d"); - cctx.restore(); - - // and save again - cctx.save(); - } - - function setupCanvases() { - var reused, - existingCanvas = placeholder.children("canvas.base"), - existingOverlay = placeholder.children("canvas.overlay"); - - if (existingCanvas.length == 0 || existingOverlay == 0) { - // init everything - - placeholder.html(""); // make sure placeholder is clear - - placeholder.css({ padding: 0 }); // padding messes up the positioning - - if (placeholder.css("position") == 'static') - placeholder.css("position", "relative"); // for positioning labels and overlay - - getCanvasDimensions(); - - canvas = makeCanvas(true, "base"); - overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features - - reused = false; - } - else { - // reuse existing elements - - canvas = existingCanvas.get(0); - overlay = existingOverlay.get(0); - - reused = true; - } - - ctx = canvas.getContext("2d"); - octx = overlay.getContext("2d"); - - // we include the canvas in the event holder too, because IE 7 - // sometimes has trouble with the stacking order - eventHolder = $([overlay, canvas]); - - if (reused) { - // run shutdown in the old plot object - placeholder.data("plot").shutdown(); - - // reset reused canvases - plot.resize(); - - // make sure overlay pixels are cleared (canvas is cleared when we redraw) - octx.clearRect(0, 0, canvasWidth, canvasHeight); - - // then whack any remaining obvious garbage left - eventHolder.unbind(); - placeholder.children().not([canvas, overlay]).remove(); - } - - // save in case we get replotted - placeholder.data("plot", plot); - } - - function bindEvents() { - // bind events - if (options.grid.hoverable) { - eventHolder.mousemove(onMouseMove); - eventHolder.mouseleave(onMouseLeave); - } - - if (options.grid.clickable) - eventHolder.click(onClick); - - executeHooks(hooks.bindEvents, [eventHolder]); - } - - function shutdown() { - if (redrawTimeout) - clearTimeout(redrawTimeout); - - eventHolder.unbind("mousemove", onMouseMove); - eventHolder.unbind("mouseleave", onMouseLeave); - eventHolder.unbind("click", onClick); - - executeHooks(hooks.shutdown, [eventHolder]); - } - - function setTransformationHelpers(axis) { - // set helper functions on the axis, assumes plot area - // has been computed already - - function identity(x) { return x; } - - var s, m, t = axis.options.transform || identity, - it = axis.options.inverseTransform; - - // precompute how much the axis is scaling a point - // in canvas space - if (axis.direction == "x") { - s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); - m = Math.min(t(axis.max), t(axis.min)); - } - else { - s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); - s = -s; - m = Math.max(t(axis.max), t(axis.min)); - } - - // data point to canvas coordinate - if (t == identity) // slight optimization - axis.p2c = function (p) { return (p - m) * s; }; - else - axis.p2c = function (p) { return (t(p) - m) * s; }; - // canvas coordinate to data point - if (!it) - axis.c2p = function (c) { return m + c / s; }; - else - axis.c2p = function (c) { return it(m + c / s); }; - } - - function measureTickLabels(axis) { - var opts = axis.options, i, ticks = axis.ticks || [], labels = [], - l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; - - function makeDummyDiv(labels, width) { - return $('
' + - '
' - + labels.join("") + '
') - .appendTo(placeholder); - } - - if (axis.direction == "x") { - // to avoid measuring the widths of the labels (it's slow), we - // construct fixed-size boxes and put the labels inside - // them, we don't need the exact figures and the - // fixed-size box content is easy to center - if (w == null) - w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); - - // measure x label heights - if (h == null) { - labels = []; - for (i = 0; i < ticks.length; ++i) { - l = ticks[i].label; - if (l) - labels.push('
' + l + '
'); - } - - if (labels.length > 0) { - // stick them all in the same div and measure - // collective height - labels.push('
'); - dummyDiv = makeDummyDiv(labels, "width:10000px;"); - h = dummyDiv.height(); - dummyDiv.remove(); - } - } - } - else if (w == null || h == null) { - // calculate y label dimensions - for (i = 0; i < ticks.length; ++i) { - l = ticks[i].label; - if (l) - labels.push('
' + l + '
'); - } - - if (labels.length > 0) { - dummyDiv = makeDummyDiv(labels, ""); - if (w == null) - w = dummyDiv.children().width(); - if (h == null) - h = dummyDiv.find("div.tickLabel").height(); - dummyDiv.remove(); - } - } - - if (w == null) - w = 0; - if (h == null) - h = 0; - - axis.labelWidth = w; - axis.labelHeight = h; - } - - function allocateAxisBoxFirstPhase(axis) { - // find the bounding box of the axis by looking at label - // widths/heights and ticks, make room by diminishing the - // plotOffset - - var lw = axis.labelWidth, - lh = axis.labelHeight, - pos = axis.options.position, - tickLength = axis.options.tickLength, - axismargin = options.grid.axisMargin, - padding = options.grid.labelMargin, - all = axis.direction == "x" ? xaxes : yaxes, - index; - - // determine axis margin - var samePosition = $.grep(all, function (a) { - return a && a.options.position == pos && a.reserveSpace; - }); - if ($.inArray(axis, samePosition) == samePosition.length - 1) - axismargin = 0; // outermost - - // determine tick length - if we're innermost, we can use "full" - if (tickLength == null) - tickLength = "full"; - - var sameDirection = $.grep(all, function (a) { - return a && a.reserveSpace; - }); - - var innermost = $.inArray(axis, sameDirection) == 0; - if (!innermost && tickLength == "full") - tickLength = 5; - - if (!isNaN(+tickLength)) - padding += +tickLength; - - // compute box - if (axis.direction == "x") { - lh += padding; - - if (pos == "bottom") { - plotOffset.bottom += lh + axismargin; - axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; - } - else { - axis.box = { top: plotOffset.top + axismargin, height: lh }; - plotOffset.top += lh + axismargin; - } - } - else { - lw += padding; - - if (pos == "left") { - axis.box = { left: plotOffset.left + axismargin, width: lw }; - plotOffset.left += lw + axismargin; - } - else { - plotOffset.right += lw + axismargin; - axis.box = { left: canvasWidth - plotOffset.right, width: lw }; - } - } - - // save for future reference - axis.position = pos; - axis.tickLength = tickLength; - axis.box.padding = padding; - axis.innermost = innermost; - } - - function allocateAxisBoxSecondPhase(axis) { - // set remaining bounding box coordinates - if (axis.direction == "x") { - axis.box.left = plotOffset.left; - axis.box.width = plotWidth; - } - else { - axis.box.top = plotOffset.top; - axis.box.height = plotHeight; - } - } - - function setupGrid() { - var i, axes = allAxes(); - - // first calculate the plot and axis box dimensions - - $.each(axes, function (_, axis) { - axis.show = axis.options.show; - if (axis.show == null) - axis.show = axis.used; // by default an axis is visible if it's got data - - axis.reserveSpace = axis.show || axis.options.reserveSpace; - - setRange(axis); - }); - - allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); - - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; - if (options.grid.show) { - $.each(allocatedAxes, function (_, axis) { - // make the ticks - setupTickGeneration(axis); - setTicks(axis); - snapRangeToTicks(axis, axis.ticks); - - // find labelWidth/Height for axis - measureTickLabels(axis); - }); - - // with all dimensions in house, we can compute the - // axis boxes, start from the outside (reverse order) - for (i = allocatedAxes.length - 1; i >= 0; --i) - allocateAxisBoxFirstPhase(allocatedAxes[i]); - - // make sure we've got enough space for things that - // might stick out - var minMargin = options.grid.minBorderMargin; - if (minMargin == null) { - minMargin = 0; - for (i = 0; i < series.length; ++i) - minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); - } - - for (var a in plotOffset) { - plotOffset[a] += options.grid.borderWidth; - plotOffset[a] = Math.max(minMargin, plotOffset[a]); - } - } - - plotWidth = canvasWidth - plotOffset.left - plotOffset.right; - plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; - - // now we got the proper plotWidth/Height, we can compute the scaling - $.each(axes, function (_, axis) { - setTransformationHelpers(axis); - }); - - if (options.grid.show) { - $.each(allocatedAxes, function (_, axis) { - allocateAxisBoxSecondPhase(axis); - }); - - insertAxisLabels(); - } - - insertLegend(); - } - - function setRange(axis) { - var opts = axis.options, - min = +(opts.min != null ? opts.min : axis.datamin), - max = +(opts.max != null ? opts.max : axis.datamax), - delta = max - min; - - if (delta == 0.0) { - // degenerate case - var widen = max == 0 ? 1 : 0.01; - - if (opts.min == null) - min -= widen; - // always widen max if we couldn't widen min to ensure we - // don't fall into min == max which doesn't work - if (opts.max == null || opts.min != null) - max += widen; - } - else { - // consider autoscaling - var margin = opts.autoscaleMargin; - if (margin != null) { - if (opts.min == null) { - min -= delta * margin; - // make sure we don't go below zero if all values - // are positive - if (min < 0 && axis.datamin != null && axis.datamin >= 0) - min = 0; - } - if (opts.max == null) { - max += delta * margin; - if (max > 0 && axis.datamax != null && axis.datamax <= 0) - max = 0; - } - } - } - axis.min = min; - axis.max = max; - } - - function setupTickGeneration(axis) { - var opts = axis.options; - - // estimate number of ticks - var noTicks; - if (typeof opts.ticks == "number" && opts.ticks > 0) - noTicks = opts.ticks; - else - // heuristic based on the model a*sqrt(x) fitted to - // some data points that seemed reasonable - noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); - - var delta = (axis.max - axis.min) / noTicks, - size, generator, unit, formatter, i, magn, norm; - - if (opts.mode == "time") { - // pretty handling of time - - // map of app. size of time units in milliseconds - var timeUnitSize = { - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }; - - - // the allowed tick sizes, after 1 year we use - // an integer algorithm - var spec = [ - [1, "second"], [2, "second"], [5, "second"], [10, "second"], - [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], - [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], - [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], - [2, "month"], [3, "month"], [6, "month"], - [1, "year"] - ]; - - var minSize = 0; - if (opts.minTickSize != null) { - if (typeof opts.tickSize == "number") - minSize = opts.tickSize; - else - minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; - } - - for (var i = 0; i < spec.length - 1; ++i) - if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] - + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 - && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) - break; - size = spec[i][0]; - unit = spec[i][1]; - - // special-case the possibility of several years - if (unit == "year") { - magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); - norm = (delta / timeUnitSize.year) / magn; - if (norm < 1.5) - size = 1; - else if (norm < 3) - size = 2; - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - } - - axis.tickSize = opts.tickSize || [size, unit]; - - generator = function(axis) { - var ticks = [], - tickSize = axis.tickSize[0], unit = axis.tickSize[1], - d = new Date(axis.min); - - var step = tickSize * timeUnitSize[unit]; - - if (unit == "second") - d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); - if (unit == "minute") - d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); - if (unit == "hour") - d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); - if (unit == "month") - d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); - if (unit == "year") - d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); - - // reset smaller components - d.setUTCMilliseconds(0); - if (step >= timeUnitSize.minute) - d.setUTCSeconds(0); - if (step >= timeUnitSize.hour) - d.setUTCMinutes(0); - if (step >= timeUnitSize.day) - d.setUTCHours(0); - if (step >= timeUnitSize.day * 4) - d.setUTCDate(1); - if (step >= timeUnitSize.year) - d.setUTCMonth(0); - - - var carry = 0, v = Number.NaN, prev; - do { - prev = v; - v = d.getTime(); - ticks.push(v); - if (unit == "month") { - if (tickSize < 1) { - // a bit complicated - we'll divide the month - // up but we need to take care of fractions - // so we don't end up in the middle of a day - d.setUTCDate(1); - var start = d.getTime(); - d.setUTCMonth(d.getUTCMonth() + 1); - var end = d.getTime(); - d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); - carry = d.getUTCHours(); - d.setUTCHours(0); - } - else - d.setUTCMonth(d.getUTCMonth() + tickSize); - } - else if (unit == "year") { - d.setUTCFullYear(d.getUTCFullYear() + tickSize); - } - else - d.setTime(v + step); - } while (v < axis.max && v != prev); - - return ticks; - }; - - formatter = function (v, axis) { - var d = new Date(v); - - // first check global format - if (opts.timeformat != null) - return $.plot.formatDate(d, opts.timeformat, opts.monthNames); - - var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; - var span = axis.max - axis.min; - var suffix = (opts.twelveHourClock) ? " %p" : ""; - - if (t < timeUnitSize.minute) - fmt = "%h:%M:%S" + suffix; - else if (t < timeUnitSize.day) { - if (span < 2 * timeUnitSize.day) - fmt = "%h:%M" + suffix; - else - fmt = "%b %d %h:%M" + suffix; - } - else if (t < timeUnitSize.month) - fmt = "%b %d"; - else if (t < timeUnitSize.year) { - if (span < timeUnitSize.year) - fmt = "%b"; - else - fmt = "%b %y"; - } - else - fmt = "%y"; - - return $.plot.formatDate(d, fmt, opts.monthNames); - }; - } - else { - // pretty rounding of base-10 numbers - var maxDec = opts.tickDecimals; - var dec = -Math.floor(Math.log(delta) / Math.LN10); - if (maxDec != null && dec > maxDec) - dec = maxDec; - - magn = Math.pow(10, -dec); - norm = delta / magn; // norm is between 1.0 and 10.0 - - if (norm < 1.5) - size = 1; - else if (norm < 3) { - size = 2; - // special case for 2.5, requires an extra decimal - if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { - size = 2.5; - ++dec; - } - } - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - - if (opts.minTickSize != null && size < opts.minTickSize) - size = opts.minTickSize; - - axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); - axis.tickSize = opts.tickSize || size; - - generator = function (axis) { - var ticks = []; - - // spew out all possible ticks - var start = floorInBase(axis.min, axis.tickSize), - i = 0, v = Number.NaN, prev; - do { - prev = v; - v = start + i * axis.tickSize; - ticks.push(v); - ++i; - } while (v < axis.max && v != prev); - return ticks; - }; - - formatter = function (v, axis) { - return v.toFixed(axis.tickDecimals); - }; - } - - if (opts.alignTicksWithAxis != null) { - var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; - if (otherAxis && otherAxis.used && otherAxis != axis) { - // consider snapping min/max to outermost nice ticks - var niceTicks = generator(axis); - if (niceTicks.length > 0) { - if (opts.min == null) - axis.min = Math.min(axis.min, niceTicks[0]); - if (opts.max == null && niceTicks.length > 1) - axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); - } - - generator = function (axis) { - // copy ticks, scaled to this axis - var ticks = [], v, i; - for (i = 0; i < otherAxis.ticks.length; ++i) { - v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); - v = axis.min + v * (axis.max - axis.min); - ticks.push(v); - } - return ticks; - }; - - // we might need an extra decimal since forced - // ticks don't necessarily fit naturally - if (axis.mode != "time" && opts.tickDecimals == null) { - var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), - ts = generator(axis); - - // only proceed if the tick interval rounded - // with an extra decimal doesn't give us a - // zero at end - if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) - axis.tickDecimals = extraDec; - } - } - } - - axis.tickGenerator = generator; - if ($.isFunction(opts.tickFormatter)) - axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; - else - axis.tickFormatter = formatter; - } - - function setTicks(axis) { - var oticks = axis.options.ticks, ticks = []; - if (oticks == null || (typeof oticks == "number" && oticks > 0)) - ticks = axis.tickGenerator(axis); - else if (oticks) { - if ($.isFunction(oticks)) - // generate the ticks - ticks = oticks({ min: axis.min, max: axis.max }); - else - ticks = oticks; - } - - // clean up/labelify the supplied ticks, copy them over - var i, v; - axis.ticks = []; - for (i = 0; i < ticks.length; ++i) { - var label = null; - var t = ticks[i]; - if (typeof t == "object") { - v = +t[0]; - if (t.length > 1) - label = t[1]; - } - else - v = +t; - if (label == null) - label = axis.tickFormatter(v, axis); - if (!isNaN(v)) - axis.ticks.push({ v: v, label: label }); - } - } - - function snapRangeToTicks(axis, ticks) { - if (axis.options.autoscaleMargin && ticks.length > 0) { - // snap to ticks - if (axis.options.min == null) - axis.min = Math.min(axis.min, ticks[0].v); - if (axis.options.max == null && ticks.length > 1) - axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); - } - } - - function draw() { - ctx.clearRect(0, 0, canvasWidth, canvasHeight); - - var grid = options.grid; - - // draw background, if any - if (grid.show && grid.backgroundColor) - drawBackground(); - - if (grid.show && !grid.aboveData) - drawGrid(); - - for (var i = 0; i < series.length; ++i) { - executeHooks(hooks.drawSeries, [ctx, series[i]]); - drawSeries(series[i]); - } - - executeHooks(hooks.draw, [ctx]); - - if (grid.show && grid.aboveData) - drawGrid(); - } - - function extractRange(ranges, coord) { - var axis, from, to, key, axes = allAxes(); - - for (i = 0; i < axes.length; ++i) { - axis = axes[i]; - if (axis.direction == coord) { - key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n == 1) - key = coord + "axis"; // support x1axis as xaxis - if (ranges[key]) { - from = ranges[key].from; - to = ranges[key].to; - break; - } - } - } - - // backwards-compat stuff - to be removed in future - if (!ranges[key]) { - axis = coord == "x" ? xaxes[0] : yaxes[0]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) { - var tmp = from; - from = to; - to = tmp; - } - - return { from: from, to: to, axis: axis }; - } - - function drawBackground() { - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); - ctx.fillRect(0, 0, plotWidth, plotHeight); - ctx.restore(); - } - - function drawGrid() { - var i; - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // draw markings - var markings = options.grid.markings; - if (markings) { - if ($.isFunction(markings)) { - var axes = plot.getAxes(); - // xmin etc. is backwards compatibility, to be - // removed in the future - axes.xmin = axes.xaxis.min; - axes.xmax = axes.xaxis.max; - axes.ymin = axes.yaxis.min; - axes.ymax = axes.yaxis.max; - - markings = markings(axes); - } - - for (i = 0; i < markings.length; ++i) { - var m = markings[i], - xrange = extractRange(m, "x"), - yrange = extractRange(m, "y"); - - // fill in missing - if (xrange.from == null) - xrange.from = xrange.axis.min; - if (xrange.to == null) - xrange.to = xrange.axis.max; - if (yrange.from == null) - yrange.from = yrange.axis.min; - if (yrange.to == null) - yrange.to = yrange.axis.max; - - // clip - if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) - continue; - - xrange.from = Math.max(xrange.from, xrange.axis.min); - xrange.to = Math.min(xrange.to, xrange.axis.max); - yrange.from = Math.max(yrange.from, yrange.axis.min); - yrange.to = Math.min(yrange.to, yrange.axis.max); - - if (xrange.from == xrange.to && yrange.from == yrange.to) - continue; - - // then draw - xrange.from = xrange.axis.p2c(xrange.from); - xrange.to = xrange.axis.p2c(xrange.to); - yrange.from = yrange.axis.p2c(yrange.from); - yrange.to = yrange.axis.p2c(yrange.to); - - if (xrange.from == xrange.to || yrange.from == yrange.to) { - // draw line - ctx.beginPath(); - ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; - ctx.moveTo(xrange.from, yrange.from); - ctx.lineTo(xrange.to, yrange.to); - ctx.stroke(); - } - else { - // fill area - ctx.fillStyle = m.color || options.grid.markingsColor; - ctx.fillRect(xrange.from, yrange.to, - xrange.to - xrange.from, - yrange.from - yrange.to); - } - } - } - - // draw the ticks - var axes = allAxes(), bw = options.grid.borderWidth; - - for (var j = 0; j < axes.length; ++j) { - var axis = axes[j], box = axis.box, - t = axis.tickLength, x, y, xoff, yoff; - if (!axis.show || axis.ticks.length == 0) - continue - - ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); - ctx.lineWidth = 1; - - // find the edges - if (axis.direction == "x") { - x = 0; - if (t == "full") - y = (axis.position == "top" ? 0 : plotHeight); - else - y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); - } - else { - y = 0; - if (t == "full") - x = (axis.position == "left" ? 0 : plotWidth); - else - x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); - } - - // draw tick bar - if (!axis.innermost) { - ctx.beginPath(); - xoff = yoff = 0; - if (axis.direction == "x") - xoff = plotWidth; - else - yoff = plotHeight; - - if (ctx.lineWidth == 1) { - x = Math.floor(x) + 0.5; - y = Math.floor(y) + 0.5; - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xoff, y + yoff); - ctx.stroke(); - } - - // draw ticks - ctx.beginPath(); - for (i = 0; i < axis.ticks.length; ++i) { - var v = axis.ticks[i].v; - - xoff = yoff = 0; - - if (v < axis.min || v > axis.max - // skip those lying on the axes if we got a border - || (t == "full" && bw > 0 - && (v == axis.min || v == axis.max))) - continue; - - if (axis.direction == "x") { - x = axis.p2c(v); - yoff = t == "full" ? -plotHeight : t; - - if (axis.position == "top") - yoff = -yoff; - } - else { - y = axis.p2c(v); - xoff = t == "full" ? -plotWidth : t; - - if (axis.position == "left") - xoff = -xoff; - } - - if (ctx.lineWidth == 1) { - if (axis.direction == "x") - x = Math.floor(x) + 0.5; - else - y = Math.floor(y) + 0.5; - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xoff, y + yoff); - } - - ctx.stroke(); - } - - - // draw border - if (bw) { - ctx.lineWidth = bw; - ctx.strokeStyle = options.grid.borderColor; - ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); - } - - ctx.restore(); - } - - function insertAxisLabels() { - placeholder.find(".tickLabels").remove(); - - var html = ['
']; - - var axes = allAxes(); - for (var j = 0; j < axes.length; ++j) { - var axis = axes[j], box = axis.box; - if (!axis.show) - continue; - //debug: html.push('
') - html.push('
'); - for (var i = 0; i < axis.ticks.length; ++i) { - var tick = axis.ticks[i]; - if (!tick.label || tick.v < axis.min || tick.v > axis.max) - continue; - - var pos = {}, align; - - if (axis.direction == "x") { - align = "center"; - pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); - if (axis.position == "bottom") - pos.top = box.top + box.padding; - else - pos.bottom = canvasHeight - (box.top + box.height - box.padding); - } - else { - pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); - if (axis.position == "left") { - pos.right = canvasWidth - (box.left + box.width - box.padding) - align = "right"; - } - else { - pos.left = box.left + box.padding; - align = "left"; - } - } - - pos.width = axis.labelWidth; - - var style = ["position:absolute", "text-align:" + align ]; - for (var a in pos) - style.push(a + ":" + pos[a] + "px") - - html.push('
' + tick.label + '
'); - } - html.push('
'); - } - - html.push('
'); - - placeholder.append(html.join("")); - } - - function drawSeries(series) { - if (series.lines.show) - drawSeriesLines(series); - if (series.bars.show) - drawSeriesBars(series); - if (series.points.show) - drawSeriesPoints(series); - } - - function drawSeriesLines(series) { - function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - prevx = null, prevy = null; - - ctx.beginPath(); - for (var i = ps; i < points.length; i += ps) { - var x1 = points[i - ps], y1 = points[i - ps + 1], - x2 = points[i], y2 = points[i + 1]; - - if (x1 == null || x2 == null) - continue; - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) - continue; // line segment is outside - // compute new intersection point - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) - continue; - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) - continue; - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) - continue; - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (x1 != prevx || y1 != prevy) - ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - - prevx = x2; - prevy = y2; - ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); - } - ctx.stroke(); - } - - function plotLineArea(datapoints, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - bottom = Math.min(Math.max(0, axisy.min), axisy.max), - i = 0, top, areaOpen = false, - ypos = 1, segmentStart = 0, segmentEnd = 0; - - // we process each segment in two turns, first forward - // direction to sketch out top, then once we hit the - // end we go backwards to sketch the bottom - while (true) { - if (ps > 0 && i > points.length + ps) - break; - - i += ps; // ps is negative if going backwards - - var x1 = points[i - ps], - y1 = points[i - ps + ypos], - x2 = points[i], y2 = points[i + ypos]; - - if (areaOpen) { - if (ps > 0 && x1 != null && x2 == null) { - // at turning point - segmentEnd = i; - ps = -ps; - ypos = 2; - continue; - } - - if (ps < 0 && i == segmentStart + ps) { - // done with the reverse sweep - ctx.fill(); - areaOpen = false; - ps = -ps; - ypos = 1; - i = segmentStart = segmentEnd + ps; - continue; - } - } - - if (x1 == null || x2 == null) - continue; - - // clip x values - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (!areaOpen) { - // open area - ctx.beginPath(); - ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); - areaOpen = true; - } - - // now first check the case where both is outside - if (y1 >= axisy.max && y2 >= axisy.max) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); - continue; - } - else if (y1 <= axisy.min && y2 <= axisy.min) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); - continue; - } - - // else it's a bit more complicated, there might - // be a flat maxed out rectangle first, then a - // triangular cutout or reverse; to find these - // keep track of the current x values - var x1old = x1, x2old = x2; - - // clip the y values, without shortcutting, we - // go through all cases in turn - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // if the x value was changed we got a rectangle - // to fill - if (x1 != x1old) { - ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); - // it goes to (x1, y1), but we fill that below - } - - // fill triangular section, this sometimes result - // in redundant points if (x1, y1) hasn't changed - // from previous line to, but we just ignore that - ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - - // fill the other rectangle if it's there - if (x2 != x2old) { - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); - } - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - ctx.lineJoin = "round"; - - var lw = series.lines.lineWidth, - sw = series.shadowSize; - // FIXME: consider another form of shadow when filling is turned on - if (lw > 0 && sw > 0) { - // draw shadow as a thick and thin line with transparency - ctx.lineWidth = sw; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - // position shadow at angle from the mid of line - var angle = Math.PI/18; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); - ctx.lineWidth = sw/2; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); - if (fillStyle) { - ctx.fillStyle = fillStyle; - plotLineArea(series.datapoints, series.xaxis, series.yaxis); - } - - if (lw > 0) - plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); - ctx.restore(); - } - - function drawSeriesPoints(series) { - function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - var x = points[i], y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - continue; - - ctx.beginPath(); - x = axisx.p2c(x); - y = axisy.p2c(y) + offset; - if (symbol == "circle") - ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); - else - symbol(ctx, x, y, radius, shadow); - ctx.closePath(); - - if (fillStyle) { - ctx.fillStyle = fillStyle; - ctx.fill(); - } - ctx.stroke(); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var lw = series.points.lineWidth, - sw = series.shadowSize, - radius = series.points.radius, - symbol = series.points.symbol; - if (lw > 0 && sw > 0) { - // draw shadow in two steps - var w = sw / 2; - ctx.lineWidth = w; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - plotPoints(series.datapoints, radius, null, w + w/2, true, - series.xaxis, series.yaxis, symbol); - - ctx.strokeStyle = "rgba(0,0,0,0.2)"; - plotPoints(series.datapoints, radius, null, w/2, true, - series.xaxis, series.yaxis, symbol); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - plotPoints(series.datapoints, radius, - getFillStyle(series.points, series.color), 0, false, - series.xaxis, series.yaxis, symbol); - ctx.restore(); - } - - function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { - var left, right, bottom, top, - drawLeft, drawRight, drawTop, drawBottom, - tmp; - - // in horizontal mode, we start the bar from the left - // instead of from the bottom so it appears to be - // horizontal rather than vertical - if (horizontal) { - drawBottom = drawRight = drawTop = true; - drawLeft = false; - left = b; - right = x; - top = y + barLeft; - bottom = y + barRight; - - // account for negative bars - if (right < left) { - tmp = right; - right = left; - left = tmp; - drawLeft = true; - drawRight = false; - } - } - else { - drawLeft = drawRight = drawTop = true; - drawBottom = false; - left = x + barLeft; - right = x + barRight; - bottom = b; - top = y; - - // account for negative bars - if (top < bottom) { - tmp = top; - top = bottom; - bottom = tmp; - drawBottom = true; - drawTop = false; - } - } - - // clip - if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) - return; - - if (left < axisx.min) { - left = axisx.min; - drawLeft = false; - } - - if (right > axisx.max) { - right = axisx.max; - drawRight = false; - } - - if (bottom < axisy.min) { - bottom = axisy.min; - drawBottom = false; - } - - if (top > axisy.max) { - top = axisy.max; - drawTop = false; - } - - left = axisx.p2c(left); - bottom = axisy.p2c(bottom); - right = axisx.p2c(right); - top = axisy.p2c(top); - - // fill the bar - if (fillStyleCallback) { - c.beginPath(); - c.moveTo(left, bottom); - c.lineTo(left, top); - c.lineTo(right, top); - c.lineTo(right, bottom); - c.fillStyle = fillStyleCallback(bottom, top); - c.fill(); - } - - // draw outline - if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { - c.beginPath(); - - // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom + offset); - if (drawLeft) - c.lineTo(left, top + offset); - else - c.moveTo(left, top + offset); - if (drawTop) - c.lineTo(right, top + offset); - else - c.moveTo(right, top + offset); - if (drawRight) - c.lineTo(right, bottom + offset); - else - c.moveTo(right, bottom + offset); - if (drawBottom) - c.lineTo(left, bottom + offset); - else - c.moveTo(left, bottom + offset); - c.stroke(); - } - } - - function drawSeriesBars(series) { - function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) - continue; - drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // FIXME: figure out a way to add shadows (for instance along the right edge) - ctx.lineWidth = series.bars.lineWidth; - ctx.strokeStyle = series.color; - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; - plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); - ctx.restore(); - } - - function getFillStyle(filloptions, seriesColor, bottom, top) { - var fill = filloptions.fill; - if (!fill) - return null; - - if (filloptions.fillColor) - return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - - var c = $.color.parse(seriesColor); - c.a = typeof fill == "number" ? fill : 0.4; - c.normalize(); - return c.toString(); - } - - function insertLegend() { - placeholder.find(".legend").remove(); - - if (!options.legend.show) - return; - - var fragments = [], rowStarted = false, - lf = options.legend.labelFormatter, s, label; - for (var i = 0; i < series.length; ++i) { - s = series[i]; - label = s.label; - if (!label) - continue; - - if (i % options.legend.noColumns == 0) { - if (rowStarted) - fragments.push(''); - fragments.push(''); - rowStarted = true; - } - - if (lf) - label = lf(label, s); - - fragments.push( - '
' + - '' + label + ''); - } - if (rowStarted) - fragments.push(''); - - if (fragments.length == 0) - return; - - var table = '' + fragments.join("") + '
'; - if (options.legend.container != null) - $(options.legend.container).html(table); - else { - var pos = "", - p = options.legend.position, - m = options.legend.margin; - if (m[0] == null) - m = [m, m]; - if (p.charAt(0) == "n") - pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; - else if (p.charAt(0) == "s") - pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; - if (p.charAt(1) == "e") - pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; - else if (p.charAt(1) == "w") - pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; - var legend = $('
' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
').appendTo(placeholder); - if (options.legend.backgroundOpacity != 0.0) { - // put in the transparent background - // separately to avoid blended labels and - // label boxes - var c = options.legend.backgroundColor; - if (c == null) { - c = options.grid.backgroundColor; - if (c && typeof c == "string") - c = $.color.parse(c); - else - c = $.color.extract(legend, 'background-color'); - c.a = 1; - c = c.toString(); - } - var div = legend.children(); - $('
').prependTo(legend).css('opacity', options.legend.backgroundOpacity); - } - } - } - - - // interactive features - - var highlights = [], - redrawTimeout = null; - - // returns the data item the mouse is over, or null if none is found - function findNearbyItem(mouseX, mouseY, seriesFilter) { - var maxDistance = options.grid.mouseActiveRadius, - smallestDistance = maxDistance * maxDistance + 1, - item = null, foundPoint = false, i, j; - - for (i = series.length - 1; i >= 0; --i) { - if (!seriesFilter(series[i])) - continue; - - var s = series[i], - axisx = s.xaxis, - axisy = s.yaxis, - points = s.datapoints.points, - ps = s.datapoints.pointsize, - mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster - my = axisy.c2p(mouseY), - maxx = maxDistance / axisx.scale, - maxy = maxDistance / axisy.scale; - - // with inverse transforms, we can't use the maxx/maxy - // optimization, sadly - if (axisx.options.inverseTransform) - maxx = Number.MAX_VALUE; - if (axisy.options.inverseTransform) - maxy = Number.MAX_VALUE; - - if (s.lines.show || s.points.show) { - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1]; - if (x == null) - continue; - - // For points and lines, the cursor must be within a - // certain distance to the data point - if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) - continue; - - // We have to calculate distances in pixels, not in - // data units, because the scales of the axes may be different - var dx = Math.abs(axisx.p2c(x) - mouseX), - dy = Math.abs(axisy.p2c(y) - mouseY), - dist = dx * dx + dy * dy; // we save the sqrt - - // use <= to ensure last point takes precedence - // (last generally means on top of) - if (dist < smallestDistance) { - smallestDistance = dist; - item = [i, j / ps]; - } - } - } - - if (s.bars.show && !item) { // no other point can be nearby - var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, - barRight = barLeft + s.bars.barWidth; - - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1], b = points[j + 2]; - if (x == null) - continue; - - // for a bar graph, the cursor must be inside the bar - if (series[i].bars.horizontal ? - (mx <= Math.max(b, x) && mx >= Math.min(b, x) && - my >= y + barLeft && my <= y + barRight) : - (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(b, y) && my <= Math.max(b, y))) - item = [i, j / ps]; - } - } - } - - if (item) { - i = item[0]; - j = item[1]; - ps = series[i].datapoints.pointsize; - - return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), - dataIndex: j, - series: series[i], - seriesIndex: i }; - } - - return null; - } - - function onMouseMove(e) { - if (options.grid.hoverable) - triggerClickHoverEvent("plothover", e, - function (s) { return s["hoverable"] != false; }); - } - - function onMouseLeave(e) { - if (options.grid.hoverable) - triggerClickHoverEvent("plothover", e, - function (s) { return false; }); - } - - function onClick(e) { - triggerClickHoverEvent("plotclick", e, - function (s) { return s["clickable"] != false; }); - } - - // trigger click or hover event (they send the same parameters - // so we share their code) - function triggerClickHoverEvent(eventname, event, seriesFilter) { - var offset = eventHolder.offset(), - canvasX = event.pageX - offset.left - plotOffset.left, - canvasY = event.pageY - offset.top - plotOffset.top, - pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); - - pos.pageX = event.pageX; - pos.pageY = event.pageY; - - var item = findNearbyItem(canvasX, canvasY, seriesFilter); - - if (item) { - // fill in mouse pos for any listeners out there - item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); - item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); - } - - if (options.grid.autoHighlight) { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.auto == eventname && - !(item && h.series == item.series && - h.point[0] == item.datapoint[0] && - h.point[1] == item.datapoint[1])) - unhighlight(h.series, h.point); - } - - if (item) - highlight(item.series, item.datapoint, eventname); - } - - placeholder.trigger(eventname, [ pos, item ]); - } - - function triggerRedrawOverlay() { - if (!redrawTimeout) - redrawTimeout = setTimeout(drawOverlay, 30); - } - - function drawOverlay() { - redrawTimeout = null; - - // draw highlights - octx.save(); - octx.clearRect(0, 0, canvasWidth, canvasHeight); - octx.translate(plotOffset.left, plotOffset.top); - - var i, hi; - for (i = 0; i < highlights.length; ++i) { - hi = highlights[i]; - - if (hi.series.bars.show) - drawBarHighlight(hi.series, hi.point); - else - drawPointHighlight(hi.series, hi.point); - } - octx.restore(); - - executeHooks(hooks.drawOverlay, [octx]); - } - - function highlight(s, point, auto) { - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") { - var ps = s.datapoints.pointsize; - point = s.datapoints.points.slice(ps * point, ps * (point + 1)); - } - - var i = indexOfHighlight(s, point); - if (i == -1) { - highlights.push({ series: s, point: point, auto: auto }); - - triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s, point) { - if (s == null && point == null) { - highlights = []; - triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") - point = s.data[point]; - - var i = indexOfHighlight(s, point); - if (i != -1) { - highlights.splice(i, 1); - - triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s, p) { - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.series == s && h.point[0] == p[0] - && h.point[1] == p[1]) - return i; - } - return -1; - } - - function drawPointHighlight(series, point) { - var x = point[0], y = point[1], - axisx = series.xaxis, axisy = series.yaxis; - - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - return; - - var pointRadius = series.points.radius + series.points.lineWidth / 2; - octx.lineWidth = pointRadius; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var radius = 1.5 * pointRadius, - x = axisx.p2c(x), - y = axisy.p2c(y); - - octx.beginPath(); - if (series.points.symbol == "circle") - octx.arc(x, y, radius, 0, 2 * Math.PI, false); - else - series.points.symbol(octx, x, y, radius, false); - octx.closePath(); - octx.stroke(); - } - - function drawBarHighlight(series, point) { - octx.lineWidth = series.bars.lineWidth; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, - 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); - } - - function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec == "string") - return spec; - else { - // assume this is a gradient spec; IE currently only - // supports a simple vertical gradient properly, so that's - // what we support too - var gradient = ctx.createLinearGradient(0, top, 0, bottom); - - for (var i = 0, l = spec.colors.length; i < l; ++i) { - var c = spec.colors[i]; - if (typeof c != "string") { - var co = $.color.parse(defaultColor); - if (c.brightness != null) - co = co.scale('rgb', c.brightness) - if (c.opacity != null) - co.a *= c.opacity; - c = co.toString(); - } - gradient.addColorStop(i / (l - 1), c); - } - - return gradient; - } - } - } - - $.plot = function(placeholder, data, options) { - //var t0 = new Date(); - var plot = new Plot($(placeholder), data, options, $.plot.plugins); - //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); - return plot; - }; - - $.plot.version = "0.7"; - - $.plot.plugins = []; - - // returns a string with the date d formatted according to fmt - $.plot.formatDate = function(d, fmt, monthNames) { - var leftPad = function(n) { - n = "" + n; - return n.length == 1 ? "0" + n : n; - }; - - var r = []; - var escape = false, padNext = false; - var hours = d.getUTCHours(); - var isAM = hours < 12; - if (monthNames == null) - monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - if (fmt.search(/%p|%P/) != -1) { - if (hours > 12) { - hours = hours - 12; - } else if (hours == 0) { - hours = 12; - } - } - for (var i = 0; i < fmt.length; ++i) { - var c = fmt.charAt(i); - - if (escape) { - switch (c) { - case 'h': c = "" + hours; break; - case 'H': c = leftPad(hours); break; - case 'M': c = leftPad(d.getUTCMinutes()); break; - case 'S': c = leftPad(d.getUTCSeconds()); break; - case 'd': c = "" + d.getUTCDate(); break; - case 'm': c = "" + (d.getUTCMonth() + 1); break; - case 'y': c = "" + d.getUTCFullYear(); break; - case 'b': c = "" + monthNames[d.getUTCMonth()]; break; - case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; - case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; - case '0': c = ""; padNext = true; break; - } - if (c && padNext) { - c = leftPad(c); - padNext = false; - } - r.push(c); - if (!padNext) - escape = false; - } - else { - if (c == "%") - escape = true; - else - r.push(c); - } - } - return r.join(""); - }; - - // round to nearby lower multiple of base - function floorInBase(n, base) { - return base * Math.floor(n / base); - } - -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.min.js deleted file mode 100644 index 4467fc5d8c..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/* Javascript plotting library for jQuery, v. 0.7. - * - * Released under the MIT license by IOLA, December 2007. - * - */ -(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return jl?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aGa3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aNaM){aM=a0}}if(aX.y){if(a0aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('
'+aM.join("")+"
").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF'+aE+"")}}if(aI.length>0){aI.push('
');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF'+aE+"")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aBaG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aFaC.axis.max||aI.toaI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aEaB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['
'];var aJ=m();for(var aD=0;aD');for(var aE=0;aEaC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('
'+aH.label+"
")}aG.push("
")}aG.push("");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aLaT.max||aOaQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aTaL.max||aPaK.max){return}if(aEaL.max){aT=aL.max;aB=false}if(aJaK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH")}aH.push("");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('
'+aJ+"")}if(aF){aH.push("")}if(aH.length==0){return}var aL=''+aH.join("")+"
";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('
'+aL.replace('style="','style="position:absolute;'+aI+";")+"
").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('
').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aUaC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aGaH.max||aIaG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY) max) { - // make sure min < max - var tmp = min; - min = max; - max = tmp; - } - - var range = max - min; - if (zr && - ((zr[0] != null && range < zr[0]) || - (zr[1] != null && range > zr[1]))) - return; - - opts.min = min; - opts.max = max; - }); - - plot.setupGrid(); - plot.draw(); - - if (!args.preventEvent) - plot.getPlaceholder().trigger("plotzoom", [ plot ]); - } - - plot.pan = function (args) { - var delta = { - x: +args.left, - y: +args.top - }; - - if (isNaN(delta.x)) - delta.x = 0; - if (isNaN(delta.y)) - delta.y = 0; - - $.each(plot.getAxes(), function (_, axis) { - var opts = axis.options, - min, max, d = delta[axis.direction]; - - min = axis.c2p(axis.p2c(axis.min) + d), - max = axis.c2p(axis.p2c(axis.max) + d); - - var pr = opts.panRange; - if (pr === false) // no panning on this axis - return; - - if (pr) { - // check whether we hit the wall - if (pr[0] != null && pr[0] > min) { - d = pr[0] - min; - min += d; - max += d; - } - - if (pr[1] != null && pr[1] < max) { - d = pr[1] - max; - min += d; - max += d; - } - } - - opts.min = min; - opts.max = max; - }); - - plot.setupGrid(); - plot.draw(); - - if (!args.preventEvent) - plot.getPlaceholder().trigger("plotpan", [ plot ]); - } - - function shutdown(plot, eventHolder) { - eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick); - eventHolder.unbind("mousewheel", onMouseWheel); - eventHolder.unbind("dragstart", onDragStart); - eventHolder.unbind("drag", onDrag); - eventHolder.unbind("dragend", onDragEnd); - if (panTimeout) - clearTimeout(panTimeout); - } - - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'navigate', - version: '1.3' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.navigate.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.navigate.min.js deleted file mode 100644 index ecf63c93ba..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.navigate.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(i){i.fn.drag=function(j,k,l){if(k){this.bind("dragstart",j)}if(l){this.bind("dragend",l)}return !j?this.trigger("drag"):this.bind("drag",k?k:j)};var d=i.event,c=d.special,h=c.drag={not:":input",distance:0,which:1,dragging:false,setup:function(j){j=i.extend({distance:h.distance,which:h.which,not:h.not},j||{});j.distance=e(j.distance);d.add(this,"mousedown",f,j);if(this.attachEvent){this.attachEvent("ondragstart",a)}},teardown:function(){d.remove(this,"mousedown",f);if(this===h.dragging){h.dragging=h.proxy=false}g(this,true);if(this.detachEvent){this.detachEvent("ondragstart",a)}}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}};function f(j){var k=this,l,m=j.data||{};if(m.elem){k=j.dragTarget=m.elem;j.dragProxy=h.proxy||k;j.cursorOffsetX=m.pageX-m.left;j.cursorOffsetY=m.pageY-m.top;j.offsetX=j.pageX-j.cursorOffsetX;j.offsetY=j.pageY-j.cursorOffsetY}else{if(h.dragging||(m.which>0&&j.which!=m.which)||i(j.target).is(m.not)){return}}switch(j.type){case"mousedown":i.extend(m,i(k).offset(),{elem:k,target:j.target,pageX:j.pageX,pageY:j.pageY});d.add(document,"mousemove mouseup",f,m);g(k,false);h.dragging=null;return false;case !h.dragging&&"mousemove":if(e(j.pageX-m.pageX)+e(j.pageY-m.pageY)w){var A=B;B=w;w=A}var y=w-B;if(E&&((E[0]!=null&&yE[1]))){return}D.min=B;D.max=w});o.setupGrid();o.draw();if(!q.preventEvent){o.getPlaceholder().trigger("plotzoom",[o])}};o.pan=function(p){var q={x:+p.left,y:+p.top};if(isNaN(q.x)){q.x=0}if(isNaN(q.y)){q.y=0}b.each(o.getAxes(),function(s,u){var v=u.options,t,r,w=q[u.direction];t=u.c2p(u.p2c(u.min)+w),r=u.c2p(u.p2c(u.max)+w);var x=v.panRange;if(x===false){return}if(x){if(x[0]!=null&&x[0]>t){w=x[0]-t;t+=w;r+=w}if(x[1]!=null&&x[1]1) - options.series.pie.tilt=1; - if (options.series.pie.tilt<0) - options.series.pie.tilt=0; - - // add processData hook to do transformations on the data - plot.hooks.processDatapoints.push(processDatapoints); - plot.hooks.drawOverlay.push(drawOverlay); - - // add draw hook - plot.hooks.draw.push(draw); - } - } - - // bind hoverable events - function bindEvents(plot, eventHolder) - { - var options = plot.getOptions(); - - if (options.series.pie.show && options.grid.hoverable) - eventHolder.unbind('mousemove').mousemove(onMouseMove); - - if (options.series.pie.show && options.grid.clickable) - eventHolder.unbind('click').click(onClick); - } - - - // debugging function that prints out an object - function alertObject(obj) - { - var msg = ''; - function traverse(obj, depth) - { - if (!depth) - depth = 0; - for (var i = 0; i < obj.length; ++i) - { - for (var j=0; jcanvas.width-maxRadius) - centerLeft = canvas.width-maxRadius; - } - - function fixData(data) - { - for (var i = 0; i < data.length; ++i) - { - if (typeof(data[i].data)=='number') - data[i].data = [[1,data[i].data]]; - else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') - { - if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') - data[i].label = data[i].data.label; // fix weirdness coming from flot - data[i].data = [[1,0]]; - - } - } - return data; - } - - function combine(data) - { - data = fixData(data); - calcTotal(data); - var combined = 0; - var numCombined = 0; - var color = options.series.pie.combine.color; - - var newdata = []; - for (var i = 0; i < data.length; ++i) - { - // make sure its a number - data[i].data[0][1] = parseFloat(data[i].data[0][1]); - if (!data[i].data[0][1]) - data[i].data[0][1] = 0; - - if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) - { - combined += data[i].data[0][1]; - numCombined++; - if (!color) - color = data[i].color; - } - else - { - newdata.push({ - data: [[1,data[i].data[0][1]]], - color: data[i].color, - label: data[i].label, - angle: (data[i].data[0][1]*(Math.PI*2))/total, - percent: (data[i].data[0][1]/total*100) - }); - } - } - if (numCombined>0) - newdata.push({ - data: [[1,combined]], - color: color, - label: options.series.pie.combine.label, - angle: (combined*(Math.PI*2))/total, - percent: (combined/total*100) - }); - return newdata; - } - - function draw(plot, newCtx) - { - if (!target) return; // if no series were passed - ctx = newCtx; - - setupPie(); - var slices = plot.getData(); - - var attempts = 0; - while (redraw && attempts0) - maxRadius *= shrink; - attempts += 1; - clear(); - if (options.series.pie.tilt<=0.8) - drawShadow(); - drawPie(); - } - if (attempts >= redrawAttempts) { - clear(); - target.prepend('
Could not draw pie with labels contained inside canvas
'); - } - - if ( plot.setSeries && plot.insertLegend ) - { - plot.setSeries(slices); - plot.insertLegend(); - } - - // we're actually done at this point, just defining internal functions at this point - - function clear() - { - ctx.clearRect(0,0,canvas.width,canvas.height); - target.children().filter('.pieLabel, .pieLabelBackground').remove(); - } - - function drawShadow() - { - var shadowLeft = 5; - var shadowTop = 15; - var edge = 10; - var alpha = 0.02; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) - return; // shadow would be outside canvas, so don't draw it - - ctx.save(); - ctx.translate(shadowLeft,shadowTop); - ctx.globalAlpha = alpha; - ctx.fillStyle = '#000'; - - // center and rotate to starting position - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - - //radius -= edge; - for (var i=1; i<=edge; i++) - { - ctx.beginPath(); - ctx.arc(0,0,radius,0,Math.PI*2,false); - ctx.fill(); - radius -= i; - } - - ctx.restore(); - } - - function drawPie() - { - startAngle = Math.PI*options.series.pie.startAngle; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - // center and rotate to starting position - ctx.save(); - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - - // draw slices - ctx.save(); - var currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - { - slices[i].startAngle = currentAngle; - drawSlice(slices[i].angle, slices[i].color, true); - } - ctx.restore(); - - // draw slice outlines - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - ctx.restore(); - - // draw donut hole - drawDonutHole(ctx); - - // draw labels - if (options.series.pie.label.show) - drawLabels(); - - // restore to original state - ctx.restore(); - - function drawSlice(angle, color, fill) - { - if (angle<=0) - return; - - if (fill) - ctx.fillStyle = color; - else - { - ctx.strokeStyle = color; - ctx.lineJoin = 'round'; - } - - ctx.beginPath(); - if (Math.abs(angle - Math.PI*2) > 0.000000001) - ctx.moveTo(0,0); // Center of the pie - else if ($.browser.msie) - angle -= 0.0001; - //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera - ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); - ctx.closePath(); - //ctx.rotate(angle); // This doesn't work properly in Opera - currentAngle += angle; - - if (fill) - ctx.fill(); - else - ctx.stroke(); - } - - function drawLabels() - { - var currentAngle = startAngle; - - // set radius - if (options.series.pie.label.radius>1) - var radius = options.series.pie.label.radius; - else - var radius = maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) - { - if (slices[i].percent >= options.series.pie.label.threshold*100) - drawLabel(slices[i], currentAngle, i); - currentAngle += slices[i].angle; - } - - function drawLabel(slice, startAngle, index) - { - if (slice.data[0][1]==0) - return; - - // format label text - var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - if (lf) - text = lf(slice.label, slice); - else - text = slice.label; - if (plf) - text = plf(text, slice); - - var halfAngle = ((startAngle+slice.angle) + startAngle)/2; - var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); - var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = '' + text + ""; - target.append(html); - var label = target.children('#pieLabel'+index); - var labelTop = (y - label.height()/2); - var labelLeft = (x - label.width()/2); - label.css('top', labelTop); - label.css('left', labelLeft); - - // check to make sure that the label is not outside the canvas - if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) - redraw = true; - - if (options.series.pie.label.background.opacity != 0) { - // put in the transparent background separately to avoid blended labels and label boxes - var c = options.series.pie.label.background.color; - if (c == null) { - c = slice.color; - } - var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; - $('
').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); - } - } // end individual label function - } // end drawLabels function - } // end drawPie function - } // end draw function - - // Placed here because it needs to be accessed from multiple locations - function drawDonutHole(layer) - { - // draw donut hole - if(options.series.pie.innerRadius > 0) - { - // subtract the center - layer.save(); - innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color - layer.beginPath(); - layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.fill(); - layer.closePath(); - layer.restore(); - - // add inner stroke - layer.save(); - layer.beginPath(); - layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.stroke(); - layer.closePath(); - layer.restore(); - // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. - } - } - - //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) - { - for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) - ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) - && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) - && (c = !c); - return c; - } - - function findNearbySlice(mouseX, mouseY) - { - var slices = plot.getData(), - options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - for (var i = 0; i < slices.length; ++i) - { - var s = slices[i]; - - if(s.pie.show) - { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0,0); // Center of the pie - //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); - ctx.closePath(); - x = mouseX-centerLeft; - y = mouseY-centerTop; - if(ctx.isPointInPath) - { - if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) - { - //alert('found slice!'); - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - else - { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - p1X = (radius * Math.cos(s.startAngle)); - p1Y = (radius * Math.sin(s.startAngle)); - p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); - p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); - p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); - p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); - p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); - p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); - p5X = (radius * Math.cos(s.startAngle+s.angle)); - p5Y = (radius * Math.sin(s.startAngle+s.angle)); - arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; - arrPoint = [x,y]; - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - if(isPointInPoly(arrPoly, arrPoint)) - { - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - ctx.restore(); - } - } - - return null; - } - - function onMouseMove(e) - { - triggerClickHoverEvent('plothover', e); - } - - function onClick(e) - { - triggerClickHoverEvent('plotclick', e); - } - - // trigger click or hover event (they send the same parameters so we share their code) - function triggerClickHoverEvent(eventname, e) - { - var offset = plot.offset(), - canvasX = parseInt(e.pageX - offset.left), - canvasY = parseInt(e.pageY - offset.top), - item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) - { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.auto == eventname && !(item && h.series == item.series)) - unhighlight(h.series); - } - } - - // highlight the slice - if (item) - highlight(item.series, eventname); - - // trigger any hover bind events - var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [ pos, item ]); - } - - function highlight(s, auto) - { - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i == -1) - { - highlights.push({ series: s, auto: auto }); - plot.triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s) - { - if (s == null) - { - highlights = []; - plot.triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i != -1) - { - highlights.splice(i, 1); - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s) - { - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.series == s) - return i; - } - return -1; - } - - function drawOverlay(plot, octx) - { - //alert(options.series.pie.radius); - var options = plot.getOptions(); - //alert(options.series.pie.radius); - - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - octx.save(); - octx.translate(centerLeft, centerTop); - octx.scale(1, options.series.pie.tilt); - - for (i = 0; i < highlights.length; ++i) - drawHighlight(highlights[i].series); - - drawDonutHole(octx); - - octx.restore(); - - function drawHighlight(series) - { - if (series.angle < 0) return; - - //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor - - octx.beginPath(); - if (Math.abs(series.angle - Math.PI*2) > 0.000000001) - octx.moveTo(0,0); // Center of the pie - octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); - octx.closePath(); - octx.fill(); - } - - } - - } // end init (plugin body) - - // define pie specific options and their default values - var options = { - series: { - pie: { - show: false, - radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius:0, /* for donut */ - startAngle: 3/2, - tilt: 1, - offset: { - top: 0, - left: 'auto' - }, - stroke: { - color: '#FFF', - width: 1 - }, - label: { - show: 'auto', - formatter: function(label, slice){ - return '
'+label+'
'+Math.round(slice.percent)+'%
'; - }, // formatter function - radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) - background: { - color: null, - opacity: 0 - }, - threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) - }, - combine: { - threshold: -1, // percentage at which to combine little slices into one larger slice - color: null, // color to give the new slice (auto-generated if null) - label: 'Other' // label to give the new slice - }, - highlight: { - //color: '#FFF', // will add this functionality once parseColor is available - opacity: 0.5 - } - } - } - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "pie", - version: "1.0" - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.pie.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.pie.min.js deleted file mode 100644 index b7bf870d75..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.pie.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){function c(D){var h=null;var L=null;var n=null;var B=null;var p=null;var M=0;var F=true;var o=10;var w=0.95;var A=0;var d=false;var z=false;var j=[];D.hooks.processOptions.push(g);D.hooks.bindEvents.push(e);function g(O,N){if(N.series.pie.show){N.grid.show=false;if(N.series.pie.label.show=="auto"){if(N.legend.show){N.series.pie.label.show=false}else{N.series.pie.label.show=true}}if(N.series.pie.radius=="auto"){if(N.series.pie.label.show){N.series.pie.radius=3/4}else{N.series.pie.radius=1}}if(N.series.pie.tilt>1){N.series.pie.tilt=1}if(N.series.pie.tilt<0){N.series.pie.tilt=0}O.hooks.processDatapoints.push(E);O.hooks.drawOverlay.push(H);O.hooks.draw.push(r)}}function e(P,N){var O=P.getOptions();if(O.series.pie.show&&O.grid.hoverable){N.unbind("mousemove").mousemove(t)}if(O.series.pie.show&&O.grid.clickable){N.unbind("click").click(l)}}function G(O){var P="";function N(S,T){if(!T){T=0}for(var R=0;Rh.width-n){B=h.width-n}}}function v(O){for(var N=0;N0){R.push({data:[[1,P]],color:N,label:a.series.pie.combine.label,angle:(P*(Math.PI*2))/M,percent:(P/M*100)})}return R}function r(S,Q){if(!L){return}ctx=Q;I();var T=S.getData();var P=0;while(F&&P0){n*=w}P+=1;N();if(a.series.pie.tilt<=0.8){O()}R()}if(P>=o){N();L.prepend('
Could not draw pie with labels contained inside canvas
')}if(S.setSeries&&S.insertLegend){S.setSeries(T);S.insertLegend()}function N(){ctx.clearRect(0,0,h.width,h.height);L.children().filter(".pieLabel, .pieLabelBackground").remove()}function O(){var Z=5;var Y=15;var W=10;var X=0.02;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}if(U>=(h.width/2)-Z||U*a.series.pie.tilt>=(h.height/2)-Y||U<=W){return}ctx.save();ctx.translate(Z,Y);ctx.globalAlpha=X;ctx.fillStyle="#000";ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);for(var V=1;V<=W;V++){ctx.beginPath();ctx.arc(0,0,U,0,Math.PI*2,false);ctx.fill();U-=V}ctx.restore()}function R(){startAngle=Math.PI*a.series.pie.startAngle;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}ctx.save();ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);ctx.save();var Y=startAngle;for(var W=0;W1e-9){ctx.moveTo(0,0)}else{if(b.browser.msie){ab-=0.0001}}ctx.arc(0,0,U,Y,Y+ab,false);ctx.closePath();Y+=ab;if(aa){ctx.fill()}else{ctx.stroke()}}function V(){var ac=startAngle;if(a.series.pie.label.radius>1){var Z=a.series.pie.label.radius}else{var Z=n*a.series.pie.label.radius}for(var ab=0;ab=a.series.pie.label.threshold*100){aa(T[ab],ac,ab)}ac+=T[ab].angle}function aa(ap,ai,ag){if(ap.data[0][1]==0){return}var ar=a.legend.labelFormatter,aq,ae=a.series.pie.label.formatter;if(ar){aq=ar(ap.label,ap)}else{aq=ap.label}if(ae){aq=ae(aq,ap)}var aj=((ai+ap.angle)+ai)/2;var ao=B+Math.round(Math.cos(aj)*Z);var am=p+Math.round(Math.sin(aj)*Z)*a.series.pie.tilt;var af=''+aq+"";L.append(af);var an=L.children("#pieLabel"+ag);var ad=(am-an.height()/2);var ah=(ao-an.width()/2);an.css("top",ad);an.css("left",ah);if(0-ad>0||0-ah>0||h.height-(ad+an.height())<0||h.width-(ah+an.width())<0){F=true}if(a.series.pie.label.background.opacity!=0){var ak=a.series.pie.label.background.color;if(ak==null){ak=ap.color}var al="top:"+ad+"px;left:"+ah+"px;";b('
').insertBefore(an).css("opacity",a.series.pie.label.background.opacity)}}}}}function J(N){if(a.series.pie.innerRadius>0){N.save();innerRadius=a.series.pie.innerRadius>1?a.series.pie.innerRadius:n*a.series.pie.innerRadius;N.globalCompositeOperation="destination-out";N.beginPath();N.fillStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.fill();N.closePath();N.restore();N.save();N.beginPath();N.strokeStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.stroke();N.closePath();N.restore()}}function s(Q,R){for(var S=false,P=-1,N=Q.length,O=N-1;++P1?O.series.pie.radius:n*O.series.pie.radius;for(var Q=0;Q1?P.series.pie.radius:n*P.series.pie.radius;R.save();R.translate(B,p);R.scale(1,P.series.pie.tilt);for(i=0;i1e-9){R.moveTo(0,0)}R.arc(0,0,N,S.startAngle,S.startAngle+S.angle,false);R.closePath();R.fill()}}}var a={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,offset:{top:0,left:"auto"},stroke:{color:"#FFF",width:1},label:{show:"auto",formatter:function(d,e){return'
'+d+"
"+Math.round(e.percent)+"%
"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:0.5}}}};b.plot.plugins.push({init:c,options:a,name:"pie",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.js deleted file mode 100644 index 69dfb24f38..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.js +++ /dev/null @@ -1,60 +0,0 @@ -/* -Flot plugin for automatically redrawing plots when the placeholder -size changes, e.g. on window resizes. - -It works by listening for changes on the placeholder div (through the -jQuery resize event plugin) - if the size changes, it will redraw the -plot. - -There are no options. If you need to disable the plugin for some -plots, you can just fix the size of their placeholders. -*/ - - -/* Inline dependency: - * jQuery resize event - v1.1 - 3/14/2010 - * http://benalman.com/projects/jquery-resize-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); - - -(function ($) { - var options = { }; // no options - - function init(plot) { - function onResize() { - var placeholder = plot.getPlaceholder(); - - // somebody might have hidden us and we can't plot - // when we don't have the dimensions - if (placeholder.width() == 0 || placeholder.height() == 0) - return; - - plot.resize(); - plot.setupGrid(); - plot.draw(); - } - - function bindEvents(plot, eventHolder) { - plot.getPlaceholder().resize(onResize); - } - - function shutdown(plot, eventHolder) { - plot.getPlaceholder().unbind("resize", onResize); - } - - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'resize', - version: '1.0' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.min.js deleted file mode 100644 index 1fa0771f57..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.resize.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(n,p,u){var w=n([]),s=n.resize=n.extend(n.resize,{}),o,l="setTimeout",m="resize",t=m+"-special-event",v="delay",r="throttleWindow";s[v]=250;s[r]=true;n.event.special[m]={setup:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.add(a);n.data(this,t,{w:a.width(),h:a.height()});if(w.length===1){q()}},teardown:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.not(a);a.removeData(t);if(!w.length){clearTimeout(o)}},add:function(b){if(!s[r]&&this[l]){return false}var c;function a(d,h,g){var f=n(this),e=n.data(this,t);e.w=h!==u?h:f.width();e.h=g!==u?g:f.height();c.apply(this,arguments)}if(n.isFunction(b)){c=b;return a}else{c=b.handler;b.handler=a}}};function q(){o=p[l](function(){w.each(function(){var d=n(this),a=d.width(),b=d.height(),c=n.data(this,t);if(a!==c.w||b!==c.h){d.trigger(m,[c.w=a,c.h=b])}});q()},s[v])}})(jQuery,this);(function(b){var a={};function c(f){function e(){var h=f.getPlaceholder();if(h.width()==0||h.height()==0){return}f.resize();f.setupGrid();f.draw()}function g(i,h){i.getPlaceholder().resize(e)}function d(i,h){i.getPlaceholder().unbind("resize",e)}f.hooks.bindEvents.push(g);f.hooks.shutdown.push(d)}b.plot.plugins.push({init:c,options:a,name:"resize",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.js deleted file mode 100644 index 7f7b32694b..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.js +++ /dev/null @@ -1,344 +0,0 @@ -/* -Flot plugin for selecting regions. - -The plugin defines the following options: - - selection: { - mode: null or "x" or "y" or "xy", - color: color - } - -Selection support is enabled by setting the mode to one of "x", "y" or -"xy". In "x" mode, the user will only be able to specify the x range, -similarly for "y" mode. For "xy", the selection becomes a rectangle -where both ranges can be specified. "color" is color of the selection -(if you need to change the color later on, you can get to it with -plot.getOptions().selection.color). - -When selection support is enabled, a "plotselected" event will be -emitted on the DOM element you passed into the plot function. The -event handler gets a parameter with the ranges selected on the axes, -like this: - - placeholder.bind("plotselected", function(event, ranges) { - alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) - // similar for yaxis - with multiple axes, the extra ones are in - // x2axis, x3axis, ... - }); - -The "plotselected" event is only fired when the user has finished -making the selection. A "plotselecting" event is fired during the -process with the same parameters as the "plotselected" event, in case -you want to know what's happening while it's happening, - -A "plotunselected" event with no arguments is emitted when the user -clicks the mouse to remove the selection. - -The plugin allso adds the following methods to the plot object: - -- setSelection(ranges, preventEvent) - - Set the selection rectangle. The passed in ranges is on the same - form as returned in the "plotselected" event. If the selection mode - is "x", you should put in either an xaxis range, if the mode is "y" - you need to put in an yaxis range and both xaxis and yaxis if the - selection mode is "xy", like this: - - setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); - - setSelection will trigger the "plotselected" event when called. If - you don't want that to happen, e.g. if you're inside a - "plotselected" handler, pass true as the second parameter. If you - are using multiple axes, you can specify the ranges on any of those, - e.g. as x2axis/x3axis/... instead of xaxis, the plugin picks the - first one it sees. - -- clearSelection(preventEvent) - - Clear the selection rectangle. Pass in true to avoid getting a - "plotunselected" event. - -- getSelection() - - Returns the current selection in the same format as the - "plotselected" event. If there's currently no selection, the - function returns null. - -*/ - -(function ($) { - function init(plot) { - var selection = { - first: { x: -1, y: -1}, second: { x: -1, y: -1}, - show: false, - active: false - }; - - // FIXME: The drag handling implemented here should be - // abstracted out, there's some similar code from a library in - // the navigation plugin, this should be massaged a bit to fit - // the Flot cases here better and reused. Doing this would - // make this plugin much slimmer. - var savedhandlers = {}; - - var mouseUpHandler = null; - - function onMouseMove(e) { - if (selection.active) { - updateSelection(e); - - plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]); - } - } - - function onMouseDown(e) { - if (e.which != 1) // only accept left-click - return; - - // cancel out any text selections - document.body.focus(); - - // prevent text selection and drag in old-school browsers - if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) { - savedhandlers.onselectstart = document.onselectstart; - document.onselectstart = function () { return false; }; - } - if (document.ondrag !== undefined && savedhandlers.ondrag == null) { - savedhandlers.ondrag = document.ondrag; - document.ondrag = function () { return false; }; - } - - setSelectionPos(selection.first, e); - - selection.active = true; - - // this is a bit silly, but we have to use a closure to be - // able to whack the same handler again - mouseUpHandler = function (e) { onMouseUp(e); }; - - $(document).one("mouseup", mouseUpHandler); - } - - function onMouseUp(e) { - mouseUpHandler = null; - - // revert drag stuff for old-school browsers - if (document.onselectstart !== undefined) - document.onselectstart = savedhandlers.onselectstart; - if (document.ondrag !== undefined) - document.ondrag = savedhandlers.ondrag; - - // no more dragging - selection.active = false; - updateSelection(e); - - if (selectionIsSane()) - triggerSelectedEvent(); - else { - // this counts as a clear - plot.getPlaceholder().trigger("plotunselected", [ ]); - plot.getPlaceholder().trigger("plotselecting", [ null ]); - } - - return false; - } - - function getSelection() { - if (!selectionIsSane()) - return null; - - var r = {}, c1 = selection.first, c2 = selection.second; - $.each(plot.getAxes(), function (name, axis) { - if (axis.used) { - var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]); - r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) }; - } - }); - return r; - } - - function triggerSelectedEvent() { - var r = getSelection(); - - plot.getPlaceholder().trigger("plotselected", [ r ]); - - // backwards-compat stuff, to be removed in future - if (r.xaxis && r.yaxis) - plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]); - } - - function clamp(min, value, max) { - return value < min ? min: (value > max ? max: value); - } - - function setSelectionPos(pos, e) { - var o = plot.getOptions(); - var offset = plot.getPlaceholder().offset(); - var plotOffset = plot.getPlotOffset(); - pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width()); - pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height()); - - if (o.selection.mode == "y") - pos.x = pos == selection.first ? 0 : plot.width(); - - if (o.selection.mode == "x") - pos.y = pos == selection.first ? 0 : plot.height(); - } - - function updateSelection(pos) { - if (pos.pageX == null) - return; - - setSelectionPos(selection.second, pos); - if (selectionIsSane()) { - selection.show = true; - plot.triggerRedrawOverlay(); - } - else - clearSelection(true); - } - - function clearSelection(preventEvent) { - if (selection.show) { - selection.show = false; - plot.triggerRedrawOverlay(); - if (!preventEvent) - plot.getPlaceholder().trigger("plotunselected", [ ]); - } - } - - // function taken from markings support in Flot - function extractRange(ranges, coord) { - var axis, from, to, key, axes = plot.getAxes(); - - for (var k in axes) { - axis = axes[k]; - if (axis.direction == coord) { - key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n == 1) - key = coord + "axis"; // support x1axis as xaxis - if (ranges[key]) { - from = ranges[key].from; - to = ranges[key].to; - break; - } - } - } - - // backwards-compat stuff - to be removed in future - if (!ranges[key]) { - axis = coord == "x" ? plot.getXAxes()[0] : plot.getYAxes()[0]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) { - var tmp = from; - from = to; - to = tmp; - } - - return { from: from, to: to, axis: axis }; - } - - function setSelection(ranges, preventEvent) { - var axis, range, o = plot.getOptions(); - - if (o.selection.mode == "y") { - selection.first.x = 0; - selection.second.x = plot.width(); - } - else { - range = extractRange(ranges, "x"); - - selection.first.x = range.axis.p2c(range.from); - selection.second.x = range.axis.p2c(range.to); - } - - if (o.selection.mode == "x") { - selection.first.y = 0; - selection.second.y = plot.height(); - } - else { - range = extractRange(ranges, "y"); - - selection.first.y = range.axis.p2c(range.from); - selection.second.y = range.axis.p2c(range.to); - } - - selection.show = true; - plot.triggerRedrawOverlay(); - if (!preventEvent && selectionIsSane()) - triggerSelectedEvent(); - } - - function selectionIsSane() { - var minSize = 5; - return Math.abs(selection.second.x - selection.first.x) >= minSize && - Math.abs(selection.second.y - selection.first.y) >= minSize; - } - - plot.clearSelection = clearSelection; - plot.setSelection = setSelection; - plot.getSelection = getSelection; - - plot.hooks.bindEvents.push(function(plot, eventHolder) { - var o = plot.getOptions(); - if (o.selection.mode != null) { - eventHolder.mousemove(onMouseMove); - eventHolder.mousedown(onMouseDown); - } - }); - - - plot.hooks.drawOverlay.push(function (plot, ctx) { - // draw selection - if (selection.show && selectionIsSane()) { - var plotOffset = plot.getPlotOffset(); - var o = plot.getOptions(); - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var c = $.color.parse(o.selection.color); - - ctx.strokeStyle = c.scale('a', 0.8).toString(); - ctx.lineWidth = 1; - ctx.lineJoin = "round"; - ctx.fillStyle = c.scale('a', 0.4).toString(); - - var x = Math.min(selection.first.x, selection.second.x), - y = Math.min(selection.first.y, selection.second.y), - w = Math.abs(selection.second.x - selection.first.x), - h = Math.abs(selection.second.y - selection.first.y); - - ctx.fillRect(x, y, w, h); - ctx.strokeRect(x, y, w, h); - - ctx.restore(); - } - }); - - plot.hooks.shutdown.push(function (plot, eventHolder) { - eventHolder.unbind("mousemove", onMouseMove); - eventHolder.unbind("mousedown", onMouseDown); - - if (mouseUpHandler) - $(document).unbind("mouseup", mouseUpHandler); - }); - - } - - $.plot.plugins.push({ - init: init, - options: { - selection: { - mode: null, // one of null, "x", "y" or "xy" - color: "#e8cfac" - } - }, - name: 'selection', - version: '1.1' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.min.js deleted file mode 100644 index badc0052db..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.selection.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){function b(k){var p={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var m={};var r=null;function e(s){if(p.active){l(s);k.getPlaceholder().trigger("plotselecting",[g()])}}function n(s){if(s.which!=1){return}document.body.focus();if(document.onselectstart!==undefined&&m.onselectstart==null){m.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&m.ondrag==null){m.ondrag=document.ondrag;document.ondrag=function(){return false}}d(p.first,s);p.active=true;r=function(t){j(t)};a(document).one("mouseup",r)}function j(s){r=null;if(document.onselectstart!==undefined){document.onselectstart=m.onselectstart}if(document.ondrag!==undefined){document.ondrag=m.ondrag}p.active=false;l(s);if(f()){i()}else{k.getPlaceholder().trigger("plotunselected",[]);k.getPlaceholder().trigger("plotselecting",[null])}return false}function g(){if(!f()){return null}var u={},t=p.first,s=p.second;a.each(k.getAxes(),function(v,w){if(w.used){var y=w.c2p(t[w.direction]),x=w.c2p(s[w.direction]);u[v]={from:Math.min(y,x),to:Math.max(y,x)}}});return u}function i(){var s=g();k.getPlaceholder().trigger("plotselected",[s]);if(s.xaxis&&s.yaxis){k.getPlaceholder().trigger("selected",[{x1:s.xaxis.from,y1:s.yaxis.from,x2:s.xaxis.to,y2:s.yaxis.to}])}}function h(t,u,s){return us?s:u)}function d(w,t){var v=k.getOptions();var u=k.getPlaceholder().offset();var s=k.getPlotOffset();w.x=h(0,t.pageX-u.left-s.left,k.width());w.y=h(0,t.pageY-u.top-s.top,k.height());if(v.selection.mode=="y"){w.x=w==p.first?0:k.width()}if(v.selection.mode=="x"){w.y=w==p.first?0:k.height()}}function l(s){if(s.pageX==null){return}d(p.second,s);if(f()){p.show=true;k.triggerRedrawOverlay()}else{q(true)}}function q(s){if(p.show){p.show=false;k.triggerRedrawOverlay();if(!s){k.getPlaceholder().trigger("plotunselected",[])}}}function c(s,w){var t,y,z,A,x=k.getAxes();for(var u in x){t=x[u];if(t.direction==w){A=w+t.n+"axis";if(!s[A]&&t.n==1){A=w+"axis"}if(s[A]){y=s[A].from;z=s[A].to;break}}}if(!s[A]){t=w=="x"?k.getXAxes()[0]:k.getYAxes()[0];y=s[w+"1"];z=s[w+"2"]}if(y!=null&&z!=null&&y>z){var v=y;y=z;z=v}return{from:y,to:z,axis:t}}function o(t,s){var v,u,w=k.getOptions();if(w.selection.mode=="y"){p.first.x=0;p.second.x=k.width()}else{u=c(t,"x");p.first.x=u.axis.p2c(u.from);p.second.x=u.axis.p2c(u.to)}if(w.selection.mode=="x"){p.first.y=0;p.second.y=k.height()}else{u=c(t,"y");p.first.y=u.axis.p2c(u.from);p.second.y=u.axis.p2c(u.to)}p.show=true;k.triggerRedrawOverlay();if(!s&&f()){i()}}function f(){var s=5;return Math.abs(p.second.x-p.first.x)>=s&&Math.abs(p.second.y-p.first.y)>=s}k.clearSelection=q;k.setSelection=o;k.getSelection=g;k.hooks.bindEvents.push(function(t,s){var u=t.getOptions();if(u.selection.mode!=null){s.mousemove(e);s.mousedown(n)}});k.hooks.drawOverlay.push(function(v,D){if(p.show&&f()){var t=v.getPlotOffset();var s=v.getOptions();D.save();D.translate(t.left,t.top);var z=a.color.parse(s.selection.color);D.strokeStyle=z.scale("a",0.8).toString();D.lineWidth=1;D.lineJoin="round";D.fillStyle=z.scale("a",0.4).toString();var B=Math.min(p.first.x,p.second.x),A=Math.min(p.first.y,p.second.y),C=Math.abs(p.second.x-p.first.x),u=Math.abs(p.second.y-p.first.y);D.fillRect(B,A,C,u);D.strokeRect(B,A,C,u);D.restore()}});k.hooks.shutdown.push(function(t,s){s.unbind("mousemove",e);s.unbind("mousedown",n);if(r){a(document).unbind("mouseup",r)}})}a.plot.plugins.push({init:b,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.js deleted file mode 100644 index a31d5dc9b5..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.js +++ /dev/null @@ -1,184 +0,0 @@ -/* -Flot plugin for stacking data sets, i.e. putting them on top of each -other, for accumulative graphs. - -The plugin assumes the data is sorted on x (or y if stacking -horizontally). For line charts, it is assumed that if a line has an -undefined gap (from a null point), then the line above it should have -the same gap - insert zeros instead of "null" if you want another -behaviour. This also holds for the start and end of the chart. Note -that stacking a mix of positive and negative values in most instances -doesn't make sense (so it looks weird). - -Two or more series are stacked when their "stack" attribute is set to -the same key (which can be any number or string or just "true"). To -specify the default stack, you can set - - series: { - stack: null or true or key (number/string) - } - -or specify it for a specific series - - $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) - -The stacking order is determined by the order of the data series in -the array (later series end up on top of the previous). - -Internally, the plugin modifies the datapoints in each series, adding -an offset to the y value. For line series, extra data points are -inserted through interpolation. If there's a second y value, it's also -adjusted (e.g for bar charts or filled areas). -*/ - -(function ($) { - var options = { - series: { stack: null } // or number/string - }; - - function init(plot) { - function findMatchingSeries(s, allseries) { - var res = null - for (var i = 0; i < allseries.length; ++i) { - if (s == allseries[i]) - break; - - if (allseries[i].stack == s.stack) - res = allseries[i]; - } - - return res; - } - - function stackData(plot, s, datapoints) { - if (s.stack == null) - return; - - var other = findMatchingSeries(s, plot.getData()); - if (!other) - return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - horizontal = s.bars.horizontal, - withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), - withsteps = withlines && s.lines.steps, - fromgap = true, - keyOffset = horizontal ? 1 : 0, - accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l; - - while (true) { - if (i >= points.length) - break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i + keyOffset]; - py = points[i + accumulateOffset]; - qx = otherpoints[j + keyOffset]; - qy = otherpoints[j + accumulateOffset]; - bottom = 0; - - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - newpoints[l + accumulateOffset] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); - newpoints.push(qx); - newpoints.push(intery + qy); - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } - - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); - - newpoints[l + accumulateOffset] += bottom; - - i += ps; - } - - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] += bottom; - } - - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(stackData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'stack', - version: '1.2' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.min.js deleted file mode 100644 index bba2a0e5ff..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.stack.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){var a={series:{stack:null}};function c(f){function d(k,j){var h=null;for(var g=0;g2&&(G?g.format[2].x:g.format[2].y),n=u&&v.lines.steps,E=true,q=G?1:0,H=G?0:1,D=0,B=0,A;while(true){if(D>=F.length){break}A=t.length;if(F[D]==null){for(m=0;m=y.length){if(!u){for(m=0;mJ){if(u&&D>0&&F[D-z]!=null){k=w+(F[D-z+H]-w)*(J-x)/(F[D-z+q]-x);t.push(J);t.push(k+I);for(m=2;m0&&y[B-h]!=null){r=I+(y[B-h+H]-I)*(x-J)/(y[B-h+q]-J)}t[A+H]+=r;D+=z}}E=false;if(A!=t.length&&o){t[A+2]+=r}}}}if(n&&A!=t.length&&A>0&&t[A]!=null&&t[A]!=t[A-z]&&t[A+1]!=t[A-z+1]){for(m=0;m s = r * sqrt(pi)/2 - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.rect(x - size, y - size, size + size, size + size); - }, - diamond: function (ctx, x, y, radius, shadow) { - // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) - var size = radius * Math.sqrt(Math.PI / 2); - ctx.moveTo(x - size, y); - ctx.lineTo(x, y - size); - ctx.lineTo(x + size, y); - ctx.lineTo(x, y + size); - ctx.lineTo(x - size, y); - }, - triangle: function (ctx, x, y, radius, shadow) { - // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) - var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); - var height = size * Math.sin(Math.PI / 3); - ctx.moveTo(x - size/2, y + height/2); - ctx.lineTo(x + size/2, y + height/2); - if (!shadow) { - ctx.lineTo(x, y - height/2); - ctx.lineTo(x - size/2, y + height/2); - } - }, - cross: function (ctx, x, y, radius, shadow) { - // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.moveTo(x - size, y - size); - ctx.lineTo(x + size, y + size); - ctx.moveTo(x - size, y + size); - ctx.lineTo(x + size, y - size); - } - } - - var s = series.points.symbol; - if (handlers[s]) - series.points.symbol = handlers[s]; - } - - function init(plot) { - plot.hooks.processDatapoints.push(processRawData); - } - - $.plot.plugins.push({ - init: init, - name: 'symbols', - version: '1.0' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.symbol.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.symbol.min.js deleted file mode 100644 index 272e003ab4..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.symbol.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){function a(h,e,g){var d={square:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.rect(j-l,n-l,l+l,l+l)},diamond:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI/2);k.moveTo(j-l,n);k.lineTo(j,n-l);k.lineTo(j+l,n);k.lineTo(j,n+l);k.lineTo(j-l,n)},triangle:function(l,k,o,j,n){var m=j*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var i=m*Math.sin(Math.PI/3);l.moveTo(k-m/2,o+i/2);l.lineTo(k+m/2,o+i/2);if(!n){l.lineTo(k,o-i/2);l.lineTo(k-m/2,o+i/2)}},cross:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.moveTo(j-l,n-l);k.lineTo(j+l,n+l);k.moveTo(j-l,n+l);k.lineTo(j+l,n-l)}};var f=e.points.symbol;if(d[f]){e.points.symbol=d[f]}}function c(d){d.hooks.processDatapoints.push(a)}b.plot.plugins.push({init:c,name:"symbols",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.js deleted file mode 100644 index 0b2e7ac82a..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.js +++ /dev/null @@ -1,103 +0,0 @@ -/* -Flot plugin for thresholding data. Controlled through the option -"threshold" in either the global series options - - series: { - threshold: { - below: number - color: colorspec - } - } - -or in a specific series - - $.plot($("#placeholder"), [{ data: [ ... ], threshold: { ... }}]) - -The data points below "below" are drawn with the specified color. This -makes it easy to mark points below 0, e.g. for budget data. - -Internally, the plugin works by splitting the data into two series, -above and below the threshold. The extra series below the threshold -will have its label cleared and the special "originSeries" attribute -set to the original series. You may need to check for this in hover -events. -*/ - -(function ($) { - var options = { - series: { threshold: null } // or { below: number, color: color spec} - }; - - function init(plot) { - function thresholdData(plot, s, datapoints) { - if (!s.threshold) - return; - - var ps = datapoints.pointsize, i, x, y, p, prevp, - thresholded = $.extend({}, s); // note: shallow copy - - thresholded.datapoints = { points: [], pointsize: ps }; - thresholded.label = null; - thresholded.color = s.threshold.color; - thresholded.threshold = null; - thresholded.originSeries = s; - thresholded.data = []; - - var below = s.threshold.below, - origpoints = datapoints.points, - addCrossingPoints = s.lines.show; - - threspoints = []; - newpoints = []; - - for (i = 0; i < origpoints.length; i += ps) { - x = origpoints[i] - y = origpoints[i + 1]; - - prevp = p; - if (y < below) - p = threspoints; - else - p = newpoints; - - if (addCrossingPoints && prevp != p && x != null - && i > 0 && origpoints[i - ps] != null) { - var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x; - prevp.push(interx); - prevp.push(below); - for (m = 2; m < ps; ++m) - prevp.push(origpoints[i + m]); - - p.push(null); // start new segment - p.push(null); - for (m = 2; m < ps; ++m) - p.push(origpoints[i + m]); - p.push(interx); - p.push(below); - for (m = 2; m < ps; ++m) - p.push(origpoints[i + m]); - } - - p.push(x); - p.push(y); - } - - datapoints.points = newpoints; - thresholded.datapoints.points = threspoints; - - if (thresholded.datapoints.points.length > 0) - plot.getData().push(thresholded); - - // FIXME: there are probably some edge cases left in bars - } - - plot.hooks.processDatapoints.push(thresholdData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'threshold', - version: '1.0' - }); -})(jQuery); diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.min.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.min.js deleted file mode 100644 index d8b79dfc93..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.flot.threshold.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(B){var A={series:{threshold:null}};function C(D){function E(L,S,M){if(!S.threshold){return }var F=M.pointsize,I,O,N,G,K,H=B.extend({},S);H.datapoints={points:[],pointsize:F};H.label=null;H.color=S.threshold.color;H.threshold=null;H.originSeries=S;H.data=[];var P=S.threshold.below,Q=M.points,R=S.lines.show;threspoints=[];newpoints=[];for(I=0;I0&&Q[I-F]!=null){var J=(O-Q[I-F])/(N-Q[I-F+1])*(P-N)+O;K.push(J);K.push(P);for(m=2;m0){L.getData().push(H)}}D.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"threshold",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.js b/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.js deleted file mode 100644 index 78fcfa469b..0000000000 --- a/Subtrees/websocket/examples/broadcast_server_tls/vendor/flot/jquery.js +++ /dev/null @@ -1,8316 +0,0 @@ -/*! - * jQuery JavaScript Library v1.5.1 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Wed Feb 23 13:55:29 2011 -0500 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // Has the ready events already been bound? - readyBound = false, - - // The deferred used on DOM ready - readyList, - - // Promise methods - promiseMethods = "then done fail isResolved isRejected promise".split( " " ), - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = "body"; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - match = quickExpr.exec( selector ); - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return (context || rootjQuery).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.5.1", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( i ) { - return i === -1 ? - this.slice( i ) : - this.slice( i, +i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - window.$ = _$; - - if ( deep ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - // A third-party is pushing the ready event forwards - if ( wait === true ) { - jQuery.readyWait--; - } - - // Make sure that the DOM is not already loaded - if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyBound ) { - return; - } - - readyBound = true; - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", DOMContentLoaded); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test(data.replace(rvalidescape, "@") - .replace(rvalidtokens, "]") - .replace(rvalidbraces, "")) ) { - - // Try to use the native JSON parser first - return window.JSON && window.JSON.parse ? - window.JSON.parse( data ) : - (new Function("return " + data))(); - - } else { - jQuery.error( "Invalid JSON: " + data ); - } - }, - - // Cross-browser xml parsing - // (xml & tmp used internally) - parseXML: function( data , xml , tmp ) { - - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - - tmp = xml.documentElement; - - if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { - jQuery.error( "Invalid XML: " + data ); - } - - return xml; - }, - - noop: function() {}, - - // Evalulates a script in a global context - globalEval: function( data ) { - if ( data && rnotwhite.test(data) ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, - script = document.createElement( "script" ); - - if ( jQuery.support.scriptEval() ) { - script.appendChild( document.createTextNode( data ) ); - } else { - script.text = data; - } - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore( script, head.firstChild ); - head.removeChild( script ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction(object); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( var value = object[0]; - i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type(array); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var ret = [], value; - - // Go through the array, translating each of the items to their - // new value (or values). - for ( var i = 0, length = elems.length; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - proxy: function( fn, proxy, thisObject ) { - if ( arguments.length === 2 ) { - if ( typeof proxy === "string" ) { - thisObject = fn; - fn = thisObject[ proxy ]; - proxy = undefined; - - } else if ( proxy && !jQuery.isFunction( proxy ) ) { - thisObject = proxy; - proxy = undefined; - } - } - - if ( !proxy && fn ) { - proxy = function() { - return fn.apply( thisObject || this, arguments ); - }; - } - - // Set the guid of unique handler to the same of original handler, so it can be removed - if ( fn ) { - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - } - - // So proxy can be declared as an argument - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can be optionally by executed if its a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - // We have to add a catch block for - // IE prior to 8 or else the finally - // block will never get executed - catch (e) { - throw e; - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - } ); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( object ) { - var lastIndex = arguments.length, - deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? - object : - jQuery.Deferred(), - promise = deferred.promise(); - - if ( lastIndex > 1 ) { - var array = slice.call( arguments, 0 ), - count = lastIndex, - iCallback = function( index ) { - return function( value ) { - array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( promise, array ); - } - }; - }; - while( ( lastIndex-- ) ) { - object = array[ lastIndex ]; - if ( object && jQuery.isFunction( object.promise ) ) { - object.promise().then( iCallback(lastIndex), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( promise, array ); - } - } else if ( deferred !== object ) { - deferred.resolve( object ); - } - return promise; - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySubclass( selector, context ) { - return new jQuerySubclass.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySubclass, this ); - jQuerySubclass.superclass = this; - jQuerySubclass.fn = jQuerySubclass.prototype = this(); - jQuerySubclass.fn.constructor = jQuerySubclass; - jQuerySubclass.subclass = this.subclass; - jQuerySubclass.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { - context = jQuerySubclass(context); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); - }; - jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; - var rootjQuerySubclass = jQuerySubclass(document); - return jQuerySubclass; - }, - - browser: {} -}); - -// Create readyList deferred -readyList = jQuery._Deferred(); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -if ( indexOf ) { - jQuery.inArray = function( elem, array ) { - return indexOf.call( array, elem ); - }; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -// Expose jQuery to the global object -return jQuery; - -})(); - - -(function() { - - jQuery.support = {}; - - var div = document.createElement("div"); - - div.style.display = "none"; - div.innerHTML = "
a"; - - var all = div.getElementsByTagName("*"), - a = div.getElementsByTagName("a")[0], - select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ), - input = div.getElementsByTagName("input")[0]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return; - } - - jQuery.support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: div.firstChild.nodeType === 3, - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText insted) - style: /red/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: a.getAttribute("href") === "/a", - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55$/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: input.value === "on", - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Will be defined later - deleteExpando: true, - optDisabled: false, - checkClone: false, - noCloneEvent: true, - noCloneChecked: true, - boxModel: null, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableHiddenOffsets: true - }; - - input.checked = true; - jQuery.support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as diabled) - select.disabled = true; - jQuery.support.optDisabled = !opt.disabled; - - var _scriptEval = null; - jQuery.support.scriptEval = function() { - if ( _scriptEval === null ) { - var root = document.documentElement, - script = document.createElement("script"), - id = "script" + jQuery.now(); - - try { - script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); - } catch(e) {} - - root.insertBefore( script, root.firstChild ); - - // Make sure that the execution of code works by injecting a script - // tag with appendChild/createTextNode - // (IE doesn't support this, fails, and uses .text instead) - if ( window[ id ] ) { - _scriptEval = true; - delete window[ id ]; - } else { - _scriptEval = false; - } - - root.removeChild( script ); - // release memory in IE - root = script = id = null; - } - - return _scriptEval; - }; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - - } catch(e) { - jQuery.support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent("onclick", function click() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - jQuery.support.noCloneEvent = false; - div.detachEvent("onclick", click); - }); - div.cloneNode(true).fireEvent("onclick"); - } - - div = document.createElement("div"); - div.innerHTML = ""; - - var fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; - - // Figure out if the W3C box model works as expected - // document.body must exist before we can do this - jQuery(function() { - var div = document.createElement("div"), - body = document.getElementsByTagName("body")[0]; - - // Frameset documents with no body should not run this code - if ( !body ) { - return; - } - - div.style.width = div.style.paddingLeft = "1px"; - body.appendChild( div ); - jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
"; - jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; - } - - div.innerHTML = "
t
"; - var tds = div.getElementsByTagName("td"); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; - - tds[0].style.display = ""; - tds[1].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; - div.innerHTML = ""; - - body.removeChild( div ).style.display = "none"; - div = tds = null; - }); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - var eventSupported = function( eventName ) { - var el = document.createElement("div"); - eventName = "on" + eventName; - - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( !el.attachEvent ) { - return true; - } - - var isSupported = (eventName in el); - if ( !isSupported ) { - el.setAttribute(eventName, "return;"); - isSupported = typeof el[eventName] === "function"; - } - el = null; - - return isSupported; - }; - - jQuery.support.submitBubbles = eventSupported("submit"); - jQuery.support.changeBubbles = eventSupported("change"); - - // release memory in IE - div = all = a = null; -})(); - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ name ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - return getByName ? thisCache[ name ] : thisCache; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var internalKey = jQuery.expando, isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - if ( jQuery.support.deleteExpando || cache != window ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = name.substr( 5 ); - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - data = elem.getAttribute( "data-" + key ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -jQuery.extend({ - queue: function( elem, type, data ) { - if ( !elem ) { - return; - } - - type = (type || "fx") + "queue"; - var q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( !data ) { - return q || []; - } - - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - - } else { - q.push( data ); - } - - return q; - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(); - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift("inprogress"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function( i ) { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue( type, function() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspaces = /\s+/, - rreturn = /\r/g, - rspecialurl = /^(?:href|src|style)$/, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rradiocheck = /^(?:radio|checkbox)$/i; - -jQuery.props = { - "for": "htmlFor", - "class": "className", - readonly: "readOnly", - maxlength: "maxLength", - cellspacing: "cellSpacing", - rowspan: "rowSpan", - colspan: "colSpan", - tabindex: "tabIndex", - usemap: "useMap", - frameborder: "frameBorder" -}; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name, fn ) { - return this.each(function(){ - jQuery.attr( this, name, "" ); - if ( this.nodeType === 1 ) { - this.removeAttribute( name ); - } - }); - }, - - addClass: function( value ) { - if ( jQuery.isFunction(value) ) { - return this.each(function(i) { - var self = jQuery(this); - self.addClass( value.call(this, i, self.attr("class")) ); - }); - } - - if ( value && typeof value === "string" ) { - var classNames = (value || "").split( rspaces ); - - for ( var i = 0, l = this.length; i < l; i++ ) { - var elem = this[i]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className ) { - elem.className = value; - - } else { - var className = " " + elem.className + " ", - setClass = elem.className; - - for ( var c = 0, cl = classNames.length; c < cl; c++ ) { - if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { - setClass += " " + classNames[c]; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - if ( jQuery.isFunction(value) ) { - return this.each(function(i) { - var self = jQuery(this); - self.removeClass( value.call(this, i, self.attr("class")) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - var classNames = (value || "").split( rspaces ); - - for ( var i = 0, l = this.length; i < l; i++ ) { - var elem = this[i]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - var className = (" " + elem.className + " ").replace(rclass, " "); - for ( var c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[c] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function(i) { - var self = jQuery(this); - self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspaces ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - if ( !arguments.length ) { - var elem = this[0]; - - if ( elem ) { - if ( jQuery.nodeName( elem, "option" ) ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - } - - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { - return elem.getAttribute("value") === null ? "on" : elem.value; - } - - // Everything else, we just grab the value - return (elem.value || "").replace(rreturn, ""); - - } - - return undefined; - } - - var isFunction = jQuery.isFunction(value); - - return this.each(function(i) { - var self = jQuery(this), val = value; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call(this, i, self.val()); - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray(val) ) { - val = jQuery.map(val, function (value) { - return value == null ? "" : value + ""; - }); - } - - if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { - this.checked = jQuery.inArray( self.val(), val ) >= 0; - - } else if ( jQuery.nodeName( this, "select" ) ) { - var values = jQuery.makeArray(val); - - jQuery( "option", this ).each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - this.selectedIndex = -1; - } - - } else { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery(elem)[name](value); - } - - var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), - // Whether we are setting (or getting) - set = value !== undefined; - - // Try to normalize/fix the name - name = notxml && jQuery.props[ name ] || name; - - // Only do all the following if this is a node (faster for style) - if ( elem.nodeType === 1 ) { - // These attributes require special treatment - var special = rspecialurl.test( name ); - - // Safari mis-reports the default selected property of an option - // Accessing the parent's selectedIndex property fixes it - if ( name === "selected" && !jQuery.support.optSelected ) { - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - - // If applicable, access the attribute via the DOM 0 way - // 'in' checks fail in Blackberry 4.7 #6931 - if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { - if ( set ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } - - if ( value === null ) { - if ( elem.nodeType === 1 ) { - elem.removeAttribute( name ); - } - - } else { - elem[ name ] = value; - } - } - - // browsers index elements by id/name on forms, give priority to attributes. - if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { - return elem.getAttributeNode( name ).nodeValue; - } - - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - if ( name === "tabIndex" ) { - var attributeNode = elem.getAttributeNode( "tabIndex" ); - - return attributeNode && attributeNode.specified ? - attributeNode.value : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - - return elem[ name ]; - } - - if ( !jQuery.support.style && notxml && name === "style" ) { - if ( set ) { - elem.style.cssText = "" + value; - } - - return elem.style.cssText; - } - - if ( set ) { - // convert the value to a string (all browsers do this but IE) see #1070 - elem.setAttribute( name, "" + value ); - } - - // Ensure that missing attributes return undefined - // Blackberry 4.7 returns "" from getAttribute #6938 - if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { - return undefined; - } - - var attr = !jQuery.support.hrefNormalized && notxml && special ? - // Some attributes require a special call on IE - elem.getAttribute( name, 2 ) : - elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return attr === null ? undefined : attr; - } - // Handle everything which isn't a DOM element node - if ( set ) { - elem[ name ] = value; - } - return elem[ name ]; - } -}); - - - - -var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspace = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) - // Minor release fix for bug #8018 - try { - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { - elem = window; - } - } - catch ( e ) {} - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - if ( !eventHandle ) { - elemData.handle = eventHandle = function() { - // Handle the second event of a trigger and when - // an event is called after a page has unloaded - return typeof jQuery !== "undefined" && !jQuery.event.triggered ? - jQuery.event.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have been used, for global triggering - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, true ); - } - } - }, - - // bubbling is internal - trigger: function( event, data, elem /*, bubbling */ ) { - // Event object or event type - var type = event.type || event, - bubbling = arguments[3]; - - if ( !bubbling ) { - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - jQuery.extend( jQuery.Event(type), event ) : - // Just the event type (string) - jQuery.Event(type); - - if ( type.indexOf("!") >= 0 ) { - event.type = type = type.slice(0, -1); - event.exclusive = true; - } - - // Handle a global trigger - if ( !elem ) { - // Don't bubble custom events when global (to avoid too much overhead) - event.stopPropagation(); - - // Only trigger if we've ever bound an event for it - if ( jQuery.event.global[ type ] ) { - // XXX This code smells terrible. event.js should not be directly - // inspecting the data cache - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - } - } - - // Handle triggering a single element - - // don't do events on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { - return undefined; - } - - // Clean up in case it is reused - event.result = undefined; - event.target = elem; - - // Clone the incoming data, if any - data = jQuery.makeArray( data ); - data.unshift( event ); - } - - event.currentTarget = elem; - - // Trigger the event, it is assumed that "handle" is a function - var handle = jQuery._data( elem, "handle" ); - - if ( handle ) { - handle.apply( elem, data ); - } - - var parent = elem.parentNode || elem.ownerDocument; - - // Trigger an inline bound script - try { - if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { - if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { - event.result = false; - event.preventDefault(); - } - } - - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (inlineError) {} - - if ( !event.isPropagationStopped() && parent ) { - jQuery.event.trigger( event, data, parent, true ); - - } else if ( !event.isDefaultPrevented() ) { - var old, - target = event.target, - targetType = type.replace( rnamespaces, "" ), - isClick = jQuery.nodeName( target, "a" ) && targetType === "click", - special = jQuery.event.special[ targetType ] || {}; - - if ( (!special._default || special._default.call( elem, event ) === false) && - !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { - - try { - if ( target[ targetType ] ) { - // Make sure that we don't accidentally re-trigger the onFOO events - old = target[ "on" + targetType ]; - - if ( old ) { - target[ "on" + targetType ] = null; - } - - jQuery.event.triggered = true; - target[ targetType ](); - } - - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (triggerError) {} - - if ( old ) { - target[ "on" + targetType ] = old; - } - - jQuery.event.triggered = false; - } - } - }, - - handle: function( event ) { - var all, handlers, namespaces, namespace_re, events, - namespace_sort = [], - args = jQuery.makeArray( arguments ); - - event = args[0] = jQuery.event.fix( event || window.event ); - event.currentTarget = this; - - // Namespaced event handlers - all = event.type.indexOf(".") < 0 && !event.exclusive; - - if ( !all ) { - namespaces = event.type.split("."); - event.type = namespaces.shift(); - namespace_sort = namespaces.slice(0).sort(); - namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.namespace = event.namespace || namespace_sort.join("."); - - events = jQuery._data(this, "events"); - - handlers = (events || {})[ event.type ]; - - if ( events && handlers ) { - // Clone the handlers to prevent manipulation - handlers = handlers.slice(0); - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Filter the functions by class - if ( all || namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - } - - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var doc = document.documentElement, - body = document.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - return new jQuery.Event( src ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - // Check if mouse(over|out) are still within the same parent element - var parent = event.relatedTarget; - - // Firefox sometimes assigns relatedTarget a XUL element - // which we cannot access the parentNode property of - try { - - // Chrome does something similar, the parentNode property - // can be accessed but is null. - if ( parent !== document && !parent.parentNode ) { - return; - } - // Traverse up the tree - while ( parent && parent !== this ) { - parent = parent.parentNode; - } - - if ( parent !== this ) { - // set the correct event type - event.type = event.data; - - // handle event if we actually just moused on to a non sub-element - jQuery.event.handle.apply( this, arguments ); - } - - // assuming we've left the element since we most likely mousedover a xul element - } catch(e) { } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; -}); - -// submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - -} - -// change delegation, happens here so we have bind. -if ( !jQuery.support.changeBubbles ) { - - var changeFilters, - - getVal = function( elem ) { - var type = elem.type, val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( elem.nodeName.toLowerCase() === "select" ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = elem.type; - - if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = elem.type; - - if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } -} - -// Create "bubbling" focus and blur events -if ( document.addEventListener ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - jQuery.event.special[ fix ] = { - setup: function() { - this.addEventListener( orig, handler, true ); - }, - teardown: function() { - this.removeEventListener( orig, handler, true ); - } - }; - - function handler( e ) { - e = jQuery.event.fix( e ); - e.type = fix; - return jQuery.event.handle.call( this, e ); - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( jQuery.isFunction( data ) || data === false ) { - fn = data; - data = undefined; - } - - var handler = name === "one" ? jQuery.proxy( fn, function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }) : fn; - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); - -jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - - triggerHandler: function( type, data ) { - if ( this[0] ) { - var event = jQuery.Event( type ); - event.preventDefault(); - event.stopPropagation(); - jQuery.event.trigger( event, data, this[0] ); - return event.result; - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - i = 1; - - // link all the functions, so any of them can unbind this click handler - while ( i < args.length ) { - jQuery.proxy( fn, args[ i++ ] ); - } - - return this.click( jQuery.proxy( fn, function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - })); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - - return this; - } - - if ( jQuery.isFunction( data ) ) { - fn = data; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( type === "focus" || type === "blur" ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; -}); - -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); -} - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } -}); - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return "text" === elem.getAttribute( 'type' ); - }, - radio: function( elem ) { - return "radio" === elem.type; - }, - - checkbox: function( elem ) { - return "checkbox" === elem.type; - }, - - file: function( elem ) { - return "file" === elem.type; - }, - password: function( elem ) { - return "password" === elem.type; - }, - - submit: function( elem ) { - return "submit" === elem.type; - }, - - image: function( elem ) { - return "image" === elem.type; - }, - - reset: function( elem ) { - return "reset" === elem.type; - }, - - button: function( elem ) { - return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // If the nodes are siblings (or identical) we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - if ( matches ) { - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - return matches.call( node, expr ); - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
"; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var ret = this.pushStack( "", "find", selector ), - length = 0; - - for ( var i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( var n = length; n < ret.length; n++ ) { - for ( var r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && jQuery.filter( selector, this ).length > 0; - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[selector] ) { - matches[selector] = jQuery.expr.match.POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[selector]; - - if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - var pos = POS.test( selectors ) ? - jQuery( selectors, context || this.context ) : null; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique(ret) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - if ( !elem || typeof elem === "string" ) { - return jQuery.inArray( this[0], - // If it receives a string, the selector is used - // If it receives nothing, the siblings are used - elem ? jQuery( elem ) : this.parent().children() ); - } - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, args.join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return (elem === qualifier) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return (jQuery.inArray( elem, qualifier ) >= 0) === keep; - }); -} - - - - -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
", "
" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - col: [ 2, "", "
" ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - - - -
-
- - -
- -
-
-

Chat Participants

-
-
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/chat_client/chat_client_handler.cpp b/Subtrees/websocket/examples/chat_client/chat_client_handler.cpp deleted file mode 100644 index 27ef6bf000..0000000000 --- a/Subtrees/websocket/examples/chat_client/chat_client_handler.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "chat_client_handler.hpp" - -#include - -using websocketchat::chat_client_handler; -using websocketpp::client; - -void chat_client_handler::on_fail(connection_ptr con) { - std::cout << "Connection failed" << std::endl; -} - -void chat_client_handler::on_open(connection_ptr con) { - m_con = con; - - std::cout << "Successfully connected" << std::endl; -} - -void chat_client_handler::on_close(connection_ptr con) { - m_con = connection_ptr(); - - std::cout << "client was disconnected" << std::endl; -} - -void chat_client_handler::on_message(connection_ptr con,message_ptr msg) { - decode_server_msg(msg->get_payload()); -} - -// CLIENT API -// client api methods will be called from outside the io_service.run thread -// they need to be careful to not touch unsyncronized member variables. - -void chat_client_handler::send(const std::string &msg) { - if (!m_con) { - std::cerr << "Error: no connected session" << std::endl; - return; - } - - if (msg == "/list") { - std::cout << "list all participants" << std::endl; - } else if (msg == "/close") { - close(); - } else { - m_con->send(msg); - } -} - -void chat_client_handler::close() { - if (!m_con) { - std::cerr << "Error: no connected session" << std::endl; - return; - } - m_con->close(websocketpp::close::status::GOING_AWAY,""); -} - -// END CLIENT API - - -// {"type":"participants","value":[,...]} -// {"type":"msg","sender":"","value":"" } -void chat_client_handler::decode_server_msg(const std::string &msg) { - // for messages of type participants, erase and rebuild m_participants - // for messages of type msg, print out message - - // NOTE: The chat server was written with the intention of the client having a built in - // JSON parser. To keep external dependencies low for this demonstration chat client I am - // parsing the server messages by hand. - - std::string::size_type start = 9; - std::string::size_type end; - - if (msg.substr(0,start) != "{\"type\":\"") { - // ignore - std::cout << "invalid message" << std::endl; - return; - } - - - - if (msg.substr(start,15) == "msg\",\"sender\":\"") { - // parse message - std::string sender; - std::string message; - - start += 15; - - end = msg.find("\"",start); - while (end != std::string::npos) { - if (msg[end-1] == '\\') { - sender += msg.substr(start,end-start-1) + "\""; - start = end+1; - end = msg.find("\"",start); - } else { - sender += msg.substr(start,end-start); - start = end; - break; - } - } - - if (msg.substr(start,11) != "\",\"value\":\"") { - std::cout << "invalid message" << std::endl; - return; - } - - start += 11; - - end = msg.find("\"",start); - while (end != std::string::npos) { - if (msg[end-1] == '\\') { - message += msg.substr(start,end-start-1) + "\""; - start = end+1; - end = msg.find("\"",start); - } else { - message += msg.substr(start,end-start); - start = end; - break; - } - } - - std::cout << "[" << sender << "] " << message << std::endl; - } else if (msg.substr(start,23) == "participants\",\"value\":[") { - // parse participants - std::cout << "participants message" << std::endl; - } else { - // unknown message type - std::cout << "unknown message" << std::endl; - } -} diff --git a/Subtrees/websocket/examples/chat_client/chat_client_handler.hpp b/Subtrees/websocket/examples/chat_client/chat_client_handler.hpp deleted file mode 100644 index c13d3f06ba..0000000000 --- a/Subtrees/websocket/examples/chat_client/chat_client_handler.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 CHAT_CLIENT_HANDLER_HPP -#define CHAT_CLIENT_HANDLER_HPP - -// com.zaphoyd.websocketpp.chat protocol -// -// client messages: -// alias [UTF8 text, 16 characters max] -// msg [UTF8 text] -// -// server messages: -// {"type":"msg","sender":"","value":"" } -// {"type":"participants","value":[,...]} - -#include - -#include "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include -#include -#include - -using websocketpp::client; - -namespace websocketchat { - -class chat_client_handler : public client::handler { -public: - chat_client_handler() {} - virtual ~chat_client_handler() {} - - void on_fail(connection_ptr con); - - // connection to chat room complete - void on_open(connection_ptr con); - - // connection to chat room closed - void on_close(connection_ptr con); - - // got a new message from server - void on_message(connection_ptr con, message_ptr msg); - - // CLIENT API - void send(const std::string &msg); - void close(); - -private: - void decode_server_msg(const std::string &msg); - - // list of other chat participants - std::set m_participants; - std::queue m_msg_queue; - connection_ptr m_con; -}; - -typedef boost::shared_ptr chat_client_handler_ptr; - -} -#endif // CHAT_CLIENT_HANDLER_HPP diff --git a/Subtrees/websocket/examples/chat_client/vendor/jquery-1.6.3.min.js b/Subtrees/websocket/examples/chat_client/vendor/jquery-1.6.3.min.js deleted file mode 100644 index 20d7f61e39..0000000000 --- a/Subtrees/websocket/examples/chat_client/vendor/jquery-1.6.3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.6.3 http://jquery.com/ | http://jquery.org/license */ -(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.3",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/Subtrees/websocket/examples/chat_server/Makefile b/Subtrees/websocket/examples/chat_server/Makefile deleted file mode 100644 index 409b8ead24..0000000000 --- a/Subtrees/websocket/examples/chat_server/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_program_options boost_thread boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -chat_server: chat_server.o chat.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o chat_server diff --git a/Subtrees/websocket/examples/chat_server/SConscript b/Subtrees/websocket/examples/chat_server/SConscript deleted file mode 100644 index fe5bbd949d..0000000000 --- a/Subtrees/websocket/examples/chat_server/SConscript +++ /dev/null @@ -1,20 +0,0 @@ -## chat_server -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["chat_server.cpp","chat.cpp"] - -LIBS = [wslib, platform_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread']) - -prg = localenv.Program('chat_server', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/chat_server/chat.cpp b/Subtrees/websocket/examples/chat_server/chat.cpp deleted file mode 100644 index a734d96718..0000000000 --- a/Subtrees/websocket/examples/chat_server/chat.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "chat.hpp" - -#include - -using namespace websocketchat; -//using chat_server_handler::connection_ptr; - -void chat_server_handler::validate(connection_ptr con) { - std::stringstream err; - - // We only know about the chat resource - if (con->get_resource() != "/chat") { - err << "Request for unknown resource " << con->get_resource(); - throw(websocketpp::http::exception(err.str(),websocketpp::http::status_code::NOT_FOUND)); - } - - // Require specific origin example - if (con->get_origin() != "http://zaphoyd.com") { - err << "Request from unrecognized origin: " << con->get_origin(); - throw(websocketpp::http::exception(err.str(),websocketpp::http::status_code::FORBIDDEN)); - } -} - - -void chat_server_handler::on_open(connection_ptr con) { - std::cout << "client " << con << " joined the lobby." << std::endl; - m_connections.insert(std::pair(con,get_con_id(con))); - - // send user list and signon message to all clients - send_to_all(serialize_state()); - con->send(encode_message("server","Welcome, use the /alias command to set a name, /help for a list of other commands.")); - send_to_all(encode_message("server",m_connections[con]+" has joined the chat.")); -} - -void chat_server_handler::on_close(connection_ptr con) { - std::map::iterator it = m_connections.find(con); - - if (it == m_connections.end()) { - // this client has already disconnected, we can ignore this. - // this happens during certain types of disconnect where there is a - // deliberate "soft" disconnection preceeding the "hard" socket read - // fail or disconnect ack message. - return; - } - - std::cout << "client " << con << " left the lobby." << std::endl; - - const std::string alias = it->second; - m_connections.erase(it); - - // send user list and signoff message to all clients - send_to_all(serialize_state()); - send_to_all(encode_message("server",alias+" has left the chat.")); -} - -void chat_server_handler::on_message(connection_ptr con, message_ptr msg) { - if (msg->get_opcode() != websocketpp::frame::opcode::TEXT) { - return; - } - - std::cout << "message from client " << con << ": " << msg->get_payload() << std::endl; - - - - // check for special command messages - if (msg->get_payload() == "/help") { - // print command list - con->send(encode_message("server","avaliable commands:
    /help - show this help
    /alias foo - set alias to foo",false)); - return; - } - - if (msg->get_payload().substr(0,7) == "/alias ") { - std::string response; - std::string alias; - - if (msg->get_payload().size() == 7) { - response = "You must enter an alias."; - con->send(encode_message("server",response)); - return; - } else { - alias = msg->get_payload().substr(7); - } - - response = m_connections[con] + " is now known as "+alias; - - // store alias pre-escaped so we don't have to do this replacing every time this - // user sends a message - - // escape JSON characters - boost::algorithm::replace_all(alias,"\\","\\\\"); - boost::algorithm::replace_all(alias,"\"","\\\""); - - // escape HTML characters - boost::algorithm::replace_all(alias,"&","&"); - boost::algorithm::replace_all(alias,"<","<"); - boost::algorithm::replace_all(alias,">",">"); - - m_connections[con] = alias; - - // set alias - send_to_all(serialize_state()); - send_to_all(encode_message("server",response)); - return; - } - - // catch other slash commands - if ((msg->get_payload())[0] == '/') { - con->send(encode_message("server","unrecognized command")); - return; - } - - // create JSON message to send based on msg - send_to_all(encode_message(m_connections[con],msg->get_payload())); -} - -// {"type":"participants","value":[,...]} -std::string chat_server_handler::serialize_state() { - std::stringstream s; - - s << "{\"type\":\"participants\",\"value\":["; - - std::map::iterator it; - - for (it = m_connections.begin(); it != m_connections.end(); it++) { - s << "\"" << (*it).second << "\""; - if (++it != m_connections.end()) { - s << ","; - } - it--; - } - - s << "]}"; - - return s.str(); -} - -// {"type":"msg","sender":"","value":"" } -std::string chat_server_handler::encode_message(std::string sender,std::string msg,bool escape) { - std::stringstream s; - - // escape JSON characters - boost::algorithm::replace_all(msg,"\\","\\\\"); - boost::algorithm::replace_all(msg,"\"","\\\""); - - // escape HTML characters - if (escape) { - boost::algorithm::replace_all(msg,"&","&"); - boost::algorithm::replace_all(msg,"<","<"); - boost::algorithm::replace_all(msg,">",">"); - } - - s << "{\"type\":\"msg\",\"sender\":\"" << sender - << "\",\"value\":\"" << msg << "\"}"; - - return s.str(); -} - -std::string chat_server_handler::get_con_id(connection_ptr con) { - std::stringstream endpoint; - //endpoint << con->get_endpoint(); - endpoint << con; - return endpoint.str(); -} - -void chat_server_handler::send_to_all(std::string data) { - std::map::iterator it; - for (it = m_connections.begin(); it != m_connections.end(); it++) { - (*it).first->send(data); - } -} diff --git a/Subtrees/websocket/examples/chat_server/chat.hpp b/Subtrees/websocket/examples/chat_server/chat.hpp deleted file mode 100644 index b683daf338..0000000000 --- a/Subtrees/websocket/examples/chat_server/chat.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 CHAT_HPP -#define CHAT_HPP - -// com.zaphoyd.websocketpp.chat protocol -// -// client messages: -// alias [UTF8 text, 16 characters max] -// msg [UTF8 text] -// -// server messages: -// {"type":"msg","sender":"","value":"" } -// {"type":"participants","value":[,...]} - -#include "../../src/websocketpp.hpp" - -#include -#include -#include - -using websocketpp::server; - -namespace websocketchat { - -class chat_server_handler : public server::handler { -public: - void validate(connection_ptr con); - - // add new connection to the lobby - void on_open(connection_ptr con); - - // someone disconnected from the lobby, remove them - void on_close(connection_ptr con); - - void on_message(connection_ptr con, message_ptr msg); -private: - std::string serialize_state(); - std::string encode_message(std::string sender,std::string msg,bool escape = true); - std::string get_con_id(connection_ptr con); - - void send_to_all(std::string data); - - // list of outstanding connections - std::map m_connections; -}; - -typedef boost::shared_ptr chat_server_handler_ptr; - -} -#endif // CHAT_HPP diff --git a/Subtrees/websocket/examples/chat_server/chat_server.cpp b/Subtrees/websocket/examples/chat_server/chat_server.cpp deleted file mode 100644 index 85db01719e..0000000000 --- a/Subtrees/websocket/examples/chat_server/chat_server.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "chat.hpp" - -#include "../../src/websocketpp.hpp" -#include - -#include - -using namespace websocketchat; -using websocketpp::server; - -int main(int argc, char* argv[]) { - short port = 9003; - - if (argc == 2) { - // TODO: input validation? - port = atoi(argv[1]); - } - - try { - // create an instance of our handler - server::handler::ptr handler(new chat_server_handler()); - - // create a server that listens on port `port` and uses our handler - server endpoint(handler); - - endpoint.alog().set_level(websocketpp::log::alevel::CONNECT); - endpoint.alog().set_level(websocketpp::log::alevel::DISCONNECT); - - endpoint.elog().set_level(websocketpp::log::elevel::RERROR); - endpoint.elog().set_level(websocketpp::log::elevel::FATAL); - - // setup server settings - // Chat server should only be receiving small text messages, reduce max - // message size limit slightly to save memory, improve performance, and - // guard against DoS attacks. - //server->set_max_message_size(0xFFFF); // 64KiB - - std::cout << "Starting chat server on port " << port << std::endl; - - endpoint.listen(port); - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/common.mk b/Subtrees/websocket/examples/common.mk deleted file mode 100644 index 1e4810c6d7..0000000000 --- a/Subtrees/websocket/examples/common.mk +++ /dev/null @@ -1,19 +0,0 @@ -BOOST_PREFIX ?= /usr/local -BOOST_LIB_PATH ?= $(BOOST_PREFIX)/lib -BOOST_INCLUDE_PATH ?= $(BOOST_PREFIX)/include - -CPP11 ?= - -CFLAGS = -Wall -O2 $(CPP11) -I$(BOOST_INCLUDE_PATH) -LDFLAGS = -L$(BOOST_LIB_PATH) - -CXX ?= c++ -SHARED ?= 0 - -ifeq ($(SHARED), 1) - LDFLAGS := $(LDFLAGS) -lwebsocketpp - LDFLAGS := $(LDFLAGS) $(BOOST_LIBS:%=-l%) -else - LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a - LDFLAGS := $(LDFLAGS) $(BOOST_LIBS:%=$(BOOST_LIB_PATH)/lib%.a) -endif diff --git a/Subtrees/websocket/examples/concurrent_server/Makefile b/Subtrees/websocket/examples/concurrent_server/Makefile deleted file mode 100644 index 02c3518620..0000000000 --- a/Subtrees/websocket/examples/concurrent_server/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_program_options boost_thread boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -concurrent_server: concurrent_server.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o concurrent_server diff --git a/Subtrees/websocket/examples/concurrent_server/SConscript b/Subtrees/websocket/examples/concurrent_server/SConscript deleted file mode 100644 index 6e526bbcdf..0000000000 --- a/Subtrees/websocket/examples/concurrent_server/SConscript +++ /dev/null @@ -1,20 +0,0 @@ -## concurrent_server.cpp -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["concurrent_server.cpp"] - -LIBS = [wslib, platform_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread']) - -prg = localenv.Program('concurrent_server', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/concurrent_server/concurrent_client.html b/Subtrees/websocket/examples/concurrent_server/concurrent_client.html deleted file mode 100644 index dc36396a24..0000000000 --- a/Subtrees/websocket/examples/concurrent_server/concurrent_client.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - -
-
- - -
- -
-
-
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/concurrent_server/concurrent_server.cpp b/Subtrees/websocket/examples/concurrent_server/concurrent_server.cpp deleted file mode 100644 index d779f09c3d..0000000000 --- a/Subtrees/websocket/examples/concurrent_server/concurrent_server.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/websocketpp.hpp" - -#include -#include -#include - -#include -#include - -using websocketpp::server; - -// A request encapsulates all of the information necesssary to perform a request -// the coordinator will fill in this information from the websocket connection -// and add it to the processing queue. Sleeping in this example is a placeholder -// for any long serial task. -struct request { - server::handler::connection_ptr con; - int value; - - void process() { - std::stringstream response; - response << "Sleeping for " << value << " milliseconds!"; - con->send(response.str()); - - boost::this_thread::sleep(boost::posix_time::milliseconds(value)); - - response.str(""); - response << "Done sleeping for " << value << " milliseconds!"; - con->send(response.str()); - } -}; - -// The coordinator is a simple wrapper around an STL queue. add_request inserts -// a new request. get_request returns the next available request and blocks -// (using condition variables) in the case that the queue is empty. -class request_coordinator { -public: - void add_request(const request& r) { - boost::unique_lock lock(m_lock); - m_requests.push(r); - lock.unlock(); - m_cond.notify_one(); - } - - void get_request(request& value) { - boost::unique_lock lock(m_lock); - - while (m_requests.empty()) { - m_cond.wait(lock); - } - - value = m_requests.front(); - m_requests.pop(); - } -private: - std::queue m_requests; - boost::mutex m_lock; - boost::condition_variable m_cond; -}; - -// The WebSocket++ handler in this case reads numbers from connections and packs -// connection pointer + number into a request struct and passes it off to the -// coordinator. -class concurrent_server_handler : public server::handler { -public: - concurrent_server_handler(request_coordinator& c) : m_coordinator(c) {} - - void on_message(connection_ptr con,message_ptr msg) { - int value = atoi(msg->get_payload().c_str()); - - if (value == 0) { - con->send("Invalid sleep value."); - } else { - request r; - r.con = con; - r.value = value; - m_coordinator.add_request(r); - } - } -private: - request_coordinator& m_coordinator; -}; - -class server_handler : public server::handler { -public: - void on_message(connection_ptr con,message_ptr msg) { - int value = atoi(msg->get_payload().c_str()); - - if (value == 0) { - con->send("Invalid sleep value."); - } else { - request r; - r.con = con; - r.value = value; - r.process(); - } - } -}; - -// process_requests is the body function for a processing thread. It loops -// forever reading requests, processing them serially, then reading another -// request. -void process_requests(request_coordinator* coordinator); - -void process_requests(request_coordinator* coordinator) { - request r; - - while (1) { - coordinator->get_request(r); - - r.process(); - } -} - -// usage: -// -// port = port to listen on -// thread_pool_threads = number of threads in the pool running io_service.run() -// worker_threads = number of threads in the sleep work pool. -// -// thread_pool_threads determines the number of threads that process i/o handlers. This -// must be at least one. Handlers and callbacks for individual connections are always -// serially executed within that connection. An i/o thread pool will not improve -// performance in cases where number of connections < number of threads in pool. -// -// worker_threads=0 Standard non-threaded WebSocket++ mode. Handlers will block -// i/o operations within their own connection. -// worker_threads=1 A single work thread processes requests serially separate from the i/o -// thread(s). This allows new connections and requests to be made while the -// processing thread is busy, but does allow long jobs to -// monopolize the processor increasing request latency. -// worker_threads>1 Multiple work threads will work on the single queue of -// requests provided by the i/o thread(s). This enables out of order -// completion of requests. The number of threads can be tuned -// based on hardware concurrency available and expected load and -// job length. -int main(int argc, char* argv[]) { - unsigned short port = 9002; - size_t worker_threads = 2; - size_t pool_threads = 2; - - try { - if (argc >= 2) { - std::stringstream buffer(argv[1]); - buffer >> port; - } - - if (argc >= 3) { - std::stringstream buffer(argv[2]); - buffer >> pool_threads; - } - - if (argc >= 4) { - std::stringstream buffer(argv[3]); - buffer >> worker_threads; - } - - request_coordinator rc; - - server::handler::ptr h; - if (worker_threads == 0) { - h = server::handler::ptr(new server_handler()); - } else { - h = server::handler::ptr(new concurrent_server_handler(rc)); - } - - server echo_endpoint(h); - - echo_endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - echo_endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - echo_endpoint.elog().set_level(websocketpp::log::elevel::RERROR); - echo_endpoint.elog().set_level(websocketpp::log::elevel::FATAL); - - std::list > threads; - if (worker_threads > 0) { - for (size_t i = 0; i < worker_threads; i++) { - threads.push_back( - boost::shared_ptr( - new boost::thread(boost::bind(&process_requests, &rc)) - ) - ); - } - } - - std::cout << "Starting WebSocket sleep server on port " << port - << " with thread pool size " << pool_threads << " and " - << worker_threads << " worker threads." << std::endl; - echo_endpoint.listen(port,pool_threads); - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/echo_client/Makefile b/Subtrees/websocket/examples/echo_client/Makefile deleted file mode 100644 index 05a52a1f30..0000000000 --- a/Subtrees/websocket/examples/echo_client/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_program_options boost_thread boost_regex boost_random - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -echo_client: echo_client.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o echo_client diff --git a/Subtrees/websocket/examples/echo_client/SConscript b/Subtrees/websocket/examples/echo_client/SConscript deleted file mode 100644 index 84e56f1318..0000000000 --- a/Subtrees/websocket/examples/echo_client/SConscript +++ /dev/null @@ -1,21 +0,0 @@ -## echo_client -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["echo_client.cpp"] - -LIBS = [wslib, platform_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread', - 'random']) - -prg = localenv.Program('echo_client', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/echo_client/echo_client.cpp b/Subtrees/websocket/examples/echo_client/echo_client.cpp deleted file mode 100644 index b27b0922bd..0000000000 --- a/Subtrees/websocket/examples/echo_client/echo_client.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include - -using websocketpp::client; - -class echo_client_handler : public client::handler { -public: - void on_message(connection_ptr con, message_ptr msg) { - if (con->get_resource() == "/getCaseCount") { - std::cout << "Detected " << msg->get_payload() << " test cases." << std::endl; - m_case_count = atoi(msg->get_payload().c_str()); - } else { - con->send(msg->get_payload(),msg->get_opcode()); - } - } - - void on_fail(connection_ptr con) { - std::cout << "connection failed" << std::endl; - } - - int m_case_count; -}; - - -int main(int argc, char* argv[]) { - std::string uri = "ws://localhost:9001/"; - - if (argc == 2) { - uri = argv[1]; - - } else if (argc > 2) { - std::cout << "Usage: `echo_client test_url`" << std::endl; - } - - try { - client::handler::ptr handler(new echo_client_handler()); - client::connection_ptr con; - client endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - con = endpoint.connect(uri+"getCaseCount"); - - endpoint.run(); - - std::cout << "case count: " << boost::dynamic_pointer_cast(handler)->m_case_count << std::endl; - - for (int i = 1; i <= boost::dynamic_pointer_cast(handler)->m_case_count; i++) { - endpoint.reset(); - - std::stringstream url; - - url << uri << "runCase?case=" << i << "&agent=WebSocket++/0.2.0-dev"; - - con = endpoint.connect(url.str()); - - endpoint.run(); - } - - std::cout << "done" << std::endl; - - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/echo_server/Makefile b/Subtrees/websocket/examples/echo_server/Makefile deleted file mode 100644 index 79fe5f5afd..0000000000 --- a/Subtrees/websocket/examples/echo_server/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_program_options boost_thread boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -echo_server: echo_server.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o echo_server diff --git a/Subtrees/websocket/examples/echo_server/SConscript b/Subtrees/websocket/examples/echo_server/SConscript deleted file mode 100644 index f65aa91ab2..0000000000 --- a/Subtrees/websocket/examples/echo_server/SConscript +++ /dev/null @@ -1,20 +0,0 @@ -## echo_server -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["echo_server.cpp"] - -LIBS = [wslib, platform_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread']) - -prg = localenv.Program('echo_server', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/echo_server/echo_client.html b/Subtrees/websocket/examples/echo_server/echo_client.html deleted file mode 100644 index dc36396a24..0000000000 --- a/Subtrees/websocket/examples/echo_server/echo_client.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - -
-
- - -
- -
-
-
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/echo_server/echo_server.cpp b/Subtrees/websocket/examples/echo_server/echo_server.cpp deleted file mode 100644 index 98174411be..0000000000 --- a/Subtrees/websocket/examples/echo_server/echo_server.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/websocketpp.hpp" - -#include - -using websocketpp::server; - -class echo_server_handler : public server::handler { -public: - void on_message(connection_ptr con, message_ptr msg) { - con->send(msg->get_payload(),msg->get_opcode()); - } -}; - -int main(int argc, char* argv[]) { - unsigned short port = 9002; - - if (argc == 2) { - port = atoi(argv[1]); - - if (port == 0) { - std::cout << "Unable to parse port input " << argv[1] << std::endl; - return 1; - } - } - - try { - server::handler::ptr h(new echo_server_handler()); - server echo_endpoint(h); - - echo_endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - echo_endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - echo_endpoint.alog().set_level(websocketpp::log::alevel::CONNECT); - echo_endpoint.alog().set_level(websocketpp::log::alevel::DISCONNECT); - - echo_endpoint.elog().set_level(websocketpp::log::elevel::RERROR); - echo_endpoint.elog().set_level(websocketpp::log::elevel::FATAL); - - std::cout << "Starting WebSocket echo server on port " << port << std::endl; - echo_endpoint.listen(port); - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/echo_server_tls/Makefile b/Subtrees/websocket/examples/echo_server_tls/Makefile deleted file mode 100644 index 73221572e1..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_thread boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lcrypto -lssl -lpthread - -echo_server_tls: echo_server_tls.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o echo_server_tls diff --git a/Subtrees/websocket/examples/echo_server_tls/SConscript b/Subtrees/websocket/examples/echo_server_tls/SConscript deleted file mode 100644 index 6f2f5434a6..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/SConscript +++ /dev/null @@ -1,21 +0,0 @@ -## echo_server_tls -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') -Import('tls_libs') - -localenv = env.Clone () - -sources = ["echo_server_tls.cpp"] - -LIBS = [wslib, platform_libs, tls_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread']) - -prg = localenv.Program('echo_server_tls', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/echo_server_tls/echo.cpp b/Subtrees/websocket/examples/echo_server_tls/echo.cpp deleted file mode 100644 index d1001affb6..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/echo.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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/Subtrees/websocket/examples/echo_server_tls/echo.hpp b/Subtrees/websocket/examples/echo_server_tls/echo.hpp deleted file mode 100644 index a6aac7a373..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/echo.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 ECHO_SERVER_HANDLER_HPP -#define ECHO_SERVER_HANDLER_HPP - -#include "../../src/websocketpp.hpp" -#include "../../src/interfaces/session.hpp" -#include - -#include -#include - -using websocketpp::session::server_ptr; -using websocketpp::session::server_handler; - -namespace websocketecho { - -class echo_server_handler : public server_handler { -public: - // The echo server allows all domains is protocol free. - void validate(server_ptr session) {} - - // an echo server is stateless. - // The handler has no need to keep track of connected clients. - void on_fail(server_ptr session) {} - void on_open(server_ptr session) {} - void on_close(server_ptr session) {} - - // both text and binary messages are echoed back to the sending client. - void on_message(server_ptr session,websocketpp::utf8_string_ptr msg) { - std::cout << *msg << std::endl; - session->send(*msg); - } - void on_message(server_ptr session,websocketpp::binary_string_ptr data) { - session->send(*data); - } -}; - -} - -#endif // ECHO_SERVER_HANDLER_HPP diff --git a/Subtrees/websocket/examples/echo_server_tls/echo_client.html b/Subtrees/websocket/examples/echo_server_tls/echo_client.html deleted file mode 100644 index dc36396a24..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/echo_client.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - -
-
- - -
- -
-
-
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/echo_server_tls/echo_server_tls.cpp b/Subtrees/websocket/examples/echo_server_tls/echo_server_tls.cpp deleted file mode 100644 index dcff70f7b5..0000000000 --- a/Subtrees/websocket/examples/echo_server_tls/echo_server_tls.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include - -using websocketpp::server; -using websocketpp::server_tls; - -template -class echo_server_handler : public endpoint_type::handler { -public: - typedef echo_server_handler type; - typedef typename endpoint_type::handler::connection_ptr connection_ptr; - typedef typename endpoint_type::handler::message_ptr message_ptr; - - std::string get_password() const { - return "test"; - } - - boost::shared_ptr on_tls_init() { - // create a tls context, init, and return. - boost::shared_ptr context(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); - try { - context->set_options(boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::single_dh_use); - context->set_password_callback(boost::bind(&type::get_password, this)); - context->use_certificate_chain_file("../../src/ssl/server.pem"); - context->use_private_key_file("../../src/ssl/server.pem", boost::asio::ssl::context::pem); - context->use_tmp_dh_file("../../src/ssl/dh512.pem"); - } catch (std::exception& e) { - std::cout << e.what() << std::endl; - } - return context; - } - - void on_message(connection_ptr con,message_ptr msg) { - con->send(msg->get_payload(),msg->get_opcode()); - } - - void http(connection_ptr con) { - con->set_body("WebSocket++ TLS certificate test

WebSocket++ TLS certificate test

This is an HTTP(S) page served by a WebSocket++ server for the purposes of confirming that certificates are working since browsers normally silently ignore certificate issues.

"); - } -}; - -int main(int argc, char* argv[]) { - unsigned short port = 9002; - bool tls = false; - - if (argc >= 2) { - port = atoi(argv[1]); - - if (port == 0) { - std::cout << "Unable to parse port input " << argv[1] << std::endl; - return 1; - } - } - - if (argc == 3) { - tls = !strcmp(argv[2],"-tls"); - } - - try { - if (tls) { - server_tls::handler::ptr handler(new echo_server_handler()); - server_tls endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - std::cout << "Starting Secure WebSocket echo server on port " - << port << std::endl; - endpoint.listen(port); - } else { - server::handler::ptr handler(new echo_server_handler()); - server endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - std::cout << "Starting WebSocket echo server on port " - << port << std::endl; - endpoint.listen(port); - } - - - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/fuzzing_client/Makefile b/Subtrees/websocket/examples/fuzzing_client/Makefile deleted file mode 100644 index c757815aeb..0000000000 --- a/Subtrees/websocket/examples/fuzzing_client/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_thread boost_regex boost_random - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -fuzzing_client: fuzzing_client.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o fuzzing_client diff --git a/Subtrees/websocket/examples/fuzzing_client/fuzzing_client.cpp b/Subtrees/websocket/examples/fuzzing_client/fuzzing_client.cpp deleted file mode 100644 index fe57129cd6..0000000000 --- a/Subtrees/websocket/examples/fuzzing_client/fuzzing_client.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include -#include -#include - -using websocketpp::client; - -// base test case handler -class test_case_handler : public client::handler { -public: - typedef test_case_handler type; - - void start(connection_ptr con, int timeout) { - m_timer.reset(new boost::asio::deadline_timer( - con->get_io_service(), - boost::posix_time::seconds(0)) - ); - m_timer->expires_from_now(boost::posix_time::milliseconds(timeout)); - m_timer->async_wait(boost::bind(&type::on_timer, - this, - con, - boost::asio::placeholders::error)); - - m_start_time = boost::posix_time::microsec_clock::local_time(); - } - - virtual void end(connection_ptr con) { - // test is over, give control back to controlling handler - boost::posix_time::time_period len(m_start_time,m_end_time); - - switch (m_pass) { - case FAIL: - std::cout << " fails in " << len.length() << std::endl; - break; - case PASS: - std::cout << " passes in " << len.length(); - - if (m_iterations > 1) { - std::cout << " (avg: " - << (len.length().total_milliseconds())/m_iterations - << "ms)"; - } - - std::cout << std::endl; - - break; - case TIME_OUT: - std::cout << " times out in " << len.length() << std::endl; - break; - } - - con->close(websocketpp::close::status::NORMAL,""); - } - - // Just does random ascii right now. True random UTF8 with multi-byte stuff - // would probably be better - void fill_utf8(std::string& data,size_t size,bool random = true) { - if (random) { - uint32_t val; - for (size_t i = 0; i < size; i++) { - if (i%4 == 0) { - val = uint32_t(rand()); - } - - data.push_back(char(((reinterpret_cast(&val)[i%4])%95)+32)); - } - } else { - data.assign(size,'*'); - } - } - - void fill_binary(std::string& data,size_t size,bool random = true) { - if (random) { - int32_t val; - for (size_t i = 0; i < size; i++) { - if (i%4 == 0) { - val = rand(); - } - - data.push_back((reinterpret_cast(&val))[i%4]); - } - } else { - data.assign(size,'*'); - } - } - - void on_timer(connection_ptr con,const boost::system::error_code& error) { - if (error == boost::system::errc::operation_canceled) { - return; // timer was canceled because test finished - } - - // time out - m_end_time = boost::posix_time::microsec_clock::local_time(); - m_pass = TIME_OUT; - this->end(con); - } - - void on_close(connection_ptr con) { - //std::cout << " fails in " << len.length() << std::endl; - } - void on_fail(connection_ptr con) { - std::cout << " fails to connect." << std::endl; - } -protected: - enum status { - FAIL = 0, - PASS = 1, - TIME_OUT = 2 - }; - - status m_pass; - int m_iterations; - boost::posix_time::ptime m_start_time; - boost::posix_time::ptime m_end_time; - boost::shared_ptr m_timer; -}; - -// test class for 9.1.* and 9.2.* -class test_9_1_X : public test_case_handler { -public: - test_9_1_X(int minor, int subtest) - : m_minor(minor), - m_subtest(subtest) - { - // needs more C++11 intializer lists =( - m_test_sizes[0] = 65536; - m_test_sizes[1] = 262144; - m_test_sizes[2] = 1048576; - m_test_sizes[3] = 4194304; - m_test_sizes[4] = 8388608; - m_test_sizes[5] = 16777216; - - m_iterations = 1; - } - - void on_open(connection_ptr con) { - std::cout << "Test 9." << m_minor << "." << m_subtest; - - m_data.reserve(m_test_sizes[m_subtest-1]); - - int timeout = 10000; // 10 sec - - // extend timeout to 100 sec for the longer tests - if ((m_minor == 1 && m_subtest >= 3) || (m_minor == 2 && m_subtest >= 5)) { - timeout = 100000; - } - - if (m_minor == 1) { - fill_utf8(m_data,m_test_sizes[m_subtest-1],true); - start(con,timeout); - con->send(m_data,websocketpp::frame::opcode::TEXT); - } else if (m_minor == 2) { - fill_binary(m_data,m_test_sizes[m_subtest-1],true); - start(con,timeout); - con->send(m_data,websocketpp::frame::opcode::BINARY); - } else { - std::cout << " has unknown definition." << std::endl; - } - } - - void on_message(connection_ptr con,websocketpp::message::data_ptr msg) { - m_timer->cancel(); - m_end_time = boost::posix_time::microsec_clock::local_time(); - - // Check whether the echoed data matches exactly - m_pass = ((msg->get_payload() == m_data) ? PASS : FAIL); - this->end(con); - } -private: - int m_minor; - int m_subtest; - int m_test_sizes[6]; - std::string m_data; -}; - -// test class for 9.7.* and 9.8.* -class test_9_7_X : public test_case_handler { -public: - test_9_7_X(int minor, int subtest) - : m_minor(minor), - m_subtest(subtest), - m_acks(0) - { - // needs more C++11 intializer lists =( - m_test_sizes[0] = 0; - m_test_sizes[1] = 16; - m_test_sizes[2] = 64; - m_test_sizes[3] = 256; - m_test_sizes[4] = 1024; - m_test_sizes[5] = 4096; - - m_test_timeouts[0] = 60000; - m_test_timeouts[1] = 60000; - m_test_timeouts[2] = 60000; - m_test_timeouts[3] = 120000; - m_test_timeouts[4] = 240000; - m_test_timeouts[5] = 480000; - - m_iterations = 1000; - } - - void on_open(connection_ptr con) { - std::cout << "Test 9." << m_minor << "." << m_subtest; - - // Get a message buffer from the connection - m_msg = con->get_data_message(); - - // reserve space in our local data buffer - m_data.reserve(m_test_sizes[m_subtest-1]); - - // Reset message to appropriate opcode and fill local buffer with - // appropriate types of random data. - if (m_minor == 7) { - fill_utf8(m_data,m_test_sizes[m_subtest-1],true); - m_msg->reset(websocketpp::frame::opcode::TEXT); - } else if (m_minor == 8) { - fill_binary(m_data,m_test_sizes[m_subtest-1],true); - m_msg->reset(websocketpp::frame::opcode::BINARY); - } else { - std::cout << " has unknown definition." << std::endl; - return; - } - - m_msg->set_payload(m_data); - - // start test timer with 60-480 second timeout based on test length - start(con,m_test_timeouts[m_subtest-1]); - - con->send(m_msg); - - // send 1000 copies of prepared message - /*for (int i = 0; i < m_iterations; i++) { - con->send(msg); - }*/ - } - - void on_message(connection_ptr con, message_ptr msg) { - if (msg->get_payload() == m_data) { - m_acks++; - } else { - m_end_time = boost::posix_time::microsec_clock::local_time(); - m_timer->cancel(); - m_msg.reset(); - this->end(con); - } - - if (m_acks == m_iterations) { - m_pass = PASS; - m_end_time = boost::posix_time::microsec_clock::local_time(); - m_timer->cancel(); - m_msg.reset(); - this->end(con); - } else { - con->send(m_msg); - } - } -private: - int m_minor; - int m_subtest; - int m_test_timeouts[6]; - size_t m_test_sizes[6]; - std::string m_data; - int m_acks; - message_ptr m_msg; - -}; - -int main(int argc, char* argv[]) { - std::string uri; - - srand(time(NULL)); - - if (argc != 2) { - uri = "ws://localhost:9002/"; - } else { - uri = argv[1]; - } - - - - std::vector tests; - - // 9.1.x and 9.2.x tests - for (int i = 1; i <= 2; i++) { - for (int j = 1; j <= 6; j++) { - tests.push_back(client::handler_ptr(new test_9_1_X(i,j))); - } - } - - // 9.7.x and 9.8.x tests - for (int i = 7; i <= 8; i++) { - for (int j = 1; j <= 6; j++) { - tests.push_back(client::handler_ptr(new test_9_7_X(i,j))); - } - } - - try { - client endpoint(tests[0]); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - for (size_t i = 0; i < tests.size(); i++) { - if (i > 0) { - endpoint.reset(); - endpoint.set_handler(tests[i]); - } - - endpoint.connect(uri); - endpoint.run(); - } - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/fuzzing_server_tls/Makefile b/Subtrees/websocket/examples/fuzzing_server_tls/Makefile deleted file mode 100644 index 761cc10a0f..0000000000 --- a/Subtrees/websocket/examples/fuzzing_server_tls/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_regex boost_thread - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lcrypto -lssl -lpthread - -fuzzing_server: fuzzing_server_tls.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o fuzzing_server diff --git a/Subtrees/websocket/examples/fuzzing_server_tls/echo_client.html b/Subtrees/websocket/examples/fuzzing_server_tls/echo_client.html deleted file mode 100644 index dc36396a24..0000000000 --- a/Subtrees/websocket/examples/fuzzing_server_tls/echo_client.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - -
-
- - -
- -
-
-
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/fuzzing_server_tls/fuzzing_server_tls.cpp b/Subtrees/websocket/examples/fuzzing_server_tls/fuzzing_server_tls.cpp deleted file mode 100644 index e27bf65b1f..0000000000 --- a/Subtrees/websocket/examples/fuzzing_server_tls/fuzzing_server_tls.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/sockets/tls.hpp" -#include "../../src/websocketpp.hpp" - -#include - -#include - -using websocketpp::server; -using websocketpp::server_tls; - -template -class fuzzing_server_handler : public endpoint_type::handler { -public: - typedef fuzzing_server_handler type; - typedef typename endpoint_type::handler::connection_ptr connection_ptr; - typedef typename endpoint_type::handler::message_ptr message_ptr; - - std::string get_password() const { - return "test"; - } - - boost::shared_ptr on_tls_init() { - // create a tls context, init, and return. - boost::shared_ptr context(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); - try { - context->set_options(boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::single_dh_use); - context->set_password_callback(boost::bind(&type::get_password, this)); - context->use_certificate_chain_file("../../src/ssl/server.pem"); - context->use_private_key_file("../..p/src/ssl/server.pem", boost::asio::ssl::context::pem); - context->use_tmp_dh_file("../../src/ssl/dh512.pem"); - } catch (std::exception& e) { - std::cout << e.what() << std::endl; - } - return context; - } - - void validate(connection_ptr con) { - //std::cout << "state: " << connection->get_state() << std::endl; - } - - void on_open(connection_ptr con) { - if (con->get_resource() == "/getCaseCount") { - con->send("12"); - con->close(websocketpp::close::status::NORMAL); - return; - } - - if (con->get_resource().find("/runCase?case=") == 0) { - std::string foo = con->get_resource(); - - size_t a = foo.find("case="); - size_t b = foo.find("&"); - size_t c = foo.find("agent="); - - std::string case_no = foo.substr(a+5,b-(a+5)); - std::string agent = foo.substr(c+6,foo.size()-(c+6)); - - // /runCase?case=" << i << "&agent=\"WebSocket++/0.2.0\" - - m_case_no = std::atoi(case_no.c_str()); - - if (m_case_no == 1) { - std::cout << "Running tests for agent: " << agent << std::endl; - } - } else { - std::cout << "Running tests for agent: Unknown" << std::endl; - m_case_no = 12; - } - - - - //std::cout << "connection opened" << std::endl; - // extract user agent - // start timer - - // send message - - m_test_sizes[0] = 65536; - m_test_sizes[1] = 262144; - m_test_sizes[2] = 1048576; - m_test_sizes[3] = 4194304; - m_test_sizes[4] = 8388608; - m_test_sizes[5] = 16777216; - - m_data.clear(); - - websocketpp::frame::opcode::value mode; - if (m_case_no <= 6) { - fill_utf8(m_data,m_test_sizes[(m_case_no-1)%6]); - mode = websocketpp::frame::opcode::TEXT; - } else { - fill_binary(m_data,m_test_sizes[(m_case_no-1)%6]); - mode = websocketpp::frame::opcode::BINARY; - } - - start_time = boost::posix_time::microsec_clock::local_time(); - - con->send(m_data,mode); - // stop - } - - void on_close(connection_ptr con) { - //std::cout << "connection closed" << std::endl; - } - - void on_message(connection_ptr con,message_ptr msg) { - //std::cout << "got message: " << *msg << std::endl; - //connection->send(msg->get_payload(),(msg->get_opcode() == websocketpp::frame::opcode::BINARY)); - - end_time = boost::posix_time::microsec_clock::local_time(); - - boost::posix_time::time_period len(start_time,end_time); - - if (m_case_no <= 6) { - std::cout << "9.1." << (m_case_no); - } else { - std::cout << "9.2." << (m_case_no-6); - } - - if (msg->get_payload() == m_data) { - std::cout << " Pass in " << len.length() << std::endl; - } else { - std::cout << " Fail in " << len.length() << std::endl; - } - con->close(websocketpp::close::status::NORMAL); - // stop timer - // check if message was valid - } - - void http(connection_ptr connection) { - connection->set_body("HTTP Response!!"); - } - - void on_fail(connection_ptr connection) { - std::cout << "connection failed" << std::endl; - } - - void fill_utf8(std::string& data,size_t size,bool random = true) { - if (random) { - uint32_t val; - for (int i = 0; i < size; i++) { - if (i%4 == 0) { - val = uint32_t(rand()); - } - - data.push_back(char(((reinterpret_cast(&val)[i%4])%95)+32)); - } - } else { - data.assign(size,'*'); - } - } - - void fill_binary(std::string& data,size_t size,bool random = true) { - if (random) { - int32_t val; - for (int i = 0; i < size; i++) { - if (i%4 == 0) { - val = rand(); - } - - data.push_back((reinterpret_cast(&val))[i%4]); - } - } else { - data.assign(size,'*'); - } - } - - boost::posix_time::ptime start_time; - boost::posix_time::ptime end_time; - - int m_case_no; - int m_minor; - int m_subtest; - int m_test_sizes[6]; - std::string m_data; -}; - -int main(int argc, char* argv[]) { - unsigned short port = 9002; - bool tls = false; - - if (argc == 2) { - // TODO: input validation? - port = atoi(argv[1]); - } - - if (argc == 3) { - // TODO: input validation? - port = atoi(argv[1]); - tls = !strcmp(argv[2],"-tls"); - } - - try { - if (tls) { - server_tls::handler::ptr handler(new fuzzing_server_handler()); - server_tls endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - std::cout << "Starting Secure WebSocket fuzzing server on port " - << port << std::endl; - endpoint.listen(port); - } else { - server::handler::ptr handler(new fuzzing_server_handler()); - server endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - std::cout << "Starting WebSocket fuzzing server on port " - << port << std::endl; - endpoint.listen(port); - } - - - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/stress_client/Makefile b/Subtrees/websocket/examples/stress_client/Makefile deleted file mode 100644 index 79731a1940..0000000000 --- a/Subtrees/websocket/examples/stress_client/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_thread boost_random boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lcrypto -lssl -lpthread - -stress_client: stress_client.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o stress_client diff --git a/Subtrees/websocket/examples/stress_client/stress_client.cpp b/Subtrees/websocket/examples/stress_client/stress_client.cpp deleted file mode 100644 index 1df66f088d..0000000000 --- a/Subtrees/websocket/examples/stress_client/stress_client.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/endpoint.hpp" -#include "../../src/roles/client.hpp" -#include "../../src/md5/md5.hpp" - -#include - -#include - -// PLATFORM SPECIFIC STUFF -#include -#include -#include - -int msleep(unsigned long milisec); - -int msleep(unsigned long milisec) -{ - struct timespec req={0}; - time_t sec=(int)(milisec/1000); - milisec=milisec-(sec*1000); - req.tv_sec=sec; - req.tv_nsec=milisec*1000000L; - while(nanosleep(&req,&req)==-1) - continue; - return 1; -} -// END PLATFORM SPECIFIC STUFF - - -typedef websocketpp::endpoint plain_endpoint_type; -typedef plain_endpoint_type::handler_ptr plain_handler_ptr; -typedef plain_endpoint_type::connection_ptr connection_ptr; - -class stress_client_handler : public plain_endpoint_type::handler { -public: - typedef stress_client_handler type; - typedef plain_endpoint_type::connection_ptr connection_ptr; - - stress_client_handler(int num_connections) - : m_connections_max(num_connections), - m_connections_cur(0) { - - } - - void on_open(connection_ptr connection) { - if (!m_timer) { - m_timer.reset(new boost::asio::deadline_timer(connection->get_io_service(),boost::posix_time::seconds(0))); - m_timer->expires_from_now(boost::posix_time::milliseconds(250)); - m_timer->async_wait(boost::bind(&type::on_timer,this,connection,boost::asio::placeholders::error)); - } - - m_connections_cur++; - - if (m_connections_cur == m_connections_max) { - boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); - boost::posix_time::time_period period(m_start_time,now); - int ms = period.length().total_milliseconds(); - - std::cout << "Started " << m_connections_cur << " in " << ms << "ms" << " (" << m_connections_cur/(ms/1000.0) << "/s)" << std::endl; - } - } - - void on_message(connection_ptr connection, websocketpp::message::data::ptr msg) { - //std::cout << "got message of size: " << msg->get_payload().size() << std::endl; - m_msg_stats[websocketpp::md5_hash_hex(msg->get_payload())]++; - - if (m_msg_stats[websocketpp::md5_hash_hex(msg->get_payload())] == m_connections_max) { - send_stats_update(connection); - } - } - - void on_fail(connection_ptr connection) { - std::cout << "connection failed" << std::endl; - } - - void on_timer(connection_ptr connection,const boost::system::error_code& error) { - if (error) { - std::cout << "on_timer error" << std::endl; - return; - } - - send_stats_update(connection); - - m_timer->expires_from_now(boost::posix_time::milliseconds(250)); - m_timer->async_wait(boost::bind(&type::on_timer,this,connection,boost::asio::placeholders::error)); - } - - void on_close(connection_ptr connection) { - m_timer->cancel(); - } - - boost::posix_time::ptime m_start_time; -private: - void send_stats_update(connection_ptr connection) { - if (m_msg_stats.empty()) { - return; - } - // example: `ack:e3458d0aceff8b70a3e5c0afec632881=38;e3458d0aceff8b70a3e5c0afec632881=42;` - std::stringstream msg; - msg << "ack:"; - - std::map::iterator it; - - for (it = m_msg_stats.begin(); it != m_msg_stats.end(); it++) { - msg << (*it).first << "=" << (*it).second << ";"; - } - - std::cout << "sending " << msg.str() << std::endl; - connection->send(msg.str()); - - m_msg_stats.clear(); - } - - unsigned int m_connections_max; - unsigned int m_connections_cur; - std::map m_msg_stats; - boost::shared_ptr m_timer; -}; - - -int main(int argc, char* argv[]) { - std::string uri = "ws://localhost:9002/"; - int num_connections = 100; - int batch_size = 25; - int delay_ms = 16; - - if (argc > 1) { - if (argc != 5) { - std::cout << "Usage: `echo_client test_url num_connections batch_size delay_ms`" << std::endl; - } else { - uri = argv[1]; - num_connections = atoi(argv[2]); - batch_size = atoi(argv[3]); - delay_ms = atoi(argv[4]); - } - } - - // 12288 is max OS X limit without changing kernal settings - const rlim_t ideal_size = 200+num_connections; - rlim_t old_size; - rlim_t old_max; - - struct rlimit rl; - int result; - - result = getrlimit(RLIMIT_NOFILE, &rl); - if (result == 0) { - //std::cout << "System FD limits: " << rl.rlim_cur << " max: " << rl.rlim_max << std::endl; - - old_size = rl.rlim_cur; - old_max = rl.rlim_max; - - if (rl.rlim_cur < ideal_size) { - std::cout << "Attempting to raise system file descriptor limit from " << rl.rlim_cur << " to " << ideal_size << std::endl; - rl.rlim_cur = ideal_size; - - if (rl.rlim_max < ideal_size) { - rl.rlim_max = ideal_size; - } - - result = setrlimit(RLIMIT_NOFILE, &rl); - - if (result == 0) { - std::cout << "Success" << std::endl; - } else if (result == EPERM) { - std::cout << "Failed. This server will be limited to " << old_size << " concurrent connections. Error code: Insufficient permissions. Try running process as root. system max: " << old_max << std::endl; - } else { - std::cout << "Failed. This server will be limited to " << old_size << " concurrent connections. Error code: " << errno << " system max: " << old_max << std::endl; - } - } - } - - try { - plain_handler_ptr handler(new stress_client_handler(num_connections)); - plain_endpoint_type endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().set_level(websocketpp::log::elevel::ALL); - - //endpoint.alog().set_level(websocketpp::log::alevel::DEVEL); - //endpoint.alog().set_level(websocketpp::log::alevel::DEBUG_CLOSE); - - std::set connections; - - connections.insert(endpoint.connect(uri)); - - boost::thread t(boost::bind(&plain_endpoint_type::run, &endpoint, false)); - - std::cout << "launching " << num_connections << " connections to " << uri << " in batches of " << batch_size << std::endl; - - boost::dynamic_pointer_cast(handler)->m_start_time = boost::posix_time::microsec_clock::local_time(); - for (int i = 0; i < num_connections-1; i++) { - if (i % batch_size == 0) { - //sleep(1); - msleep(delay_ms); - } - connections.insert(endpoint.connect(uri)); - } - - std::cout << "complete" << std::endl; - - t.join(); - - std::cout << "done" << std::endl; - - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/telemetry_server/Makefile b/Subtrees/websocket/examples/telemetry_server/Makefile deleted file mode 100644 index abb603a20a..0000000000 --- a/Subtrees/websocket/examples/telemetry_server/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_program_options boost_thread boost_regex - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lpthread - -telemetry_server: telemetry_server.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o telemetry_server diff --git a/Subtrees/websocket/examples/telemetry_server/SConscript b/Subtrees/websocket/examples/telemetry_server/SConscript deleted file mode 100644 index 3f4d88aa1b..0000000000 --- a/Subtrees/websocket/examples/telemetry_server/SConscript +++ /dev/null @@ -1,20 +0,0 @@ -## telemetry_server -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["telemetry_server.cpp"] - -LIBS = [wslib, platform_libs] + boostlibs(['system', - 'date_time', - 'regex', - 'thread']) - -prg = localenv.Program('telemetry_server', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/telemetry_server/telemetry_server.cpp b/Subtrees/websocket/examples/telemetry_server/telemetry_server.cpp deleted file mode 100644 index 8ffcd1294b..0000000000 --- a/Subtrees/websocket/examples/telemetry_server/telemetry_server.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2012, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "../../src/websocketpp.hpp" - -#include -#include - -#include -#include - -using websocketpp::server; - -/// Thread body. Counts up indefinitely, one increment per second. After each -/// it calls the handler back asking it to broadcast the new value. The handler -/// callback returns whether or not the handler would like the telemetry thread -/// to stop. If callback returns true the telemetry loop ands end the thread -/// exits. -void generate_telemetry(boost::function callback) { - size_t value = 0; - - for (;;) { - // do some work - value++; - - // broadcast state - std::stringstream m; - m << value; - - if (callback(m.str())) { - break; - } - - // wait - boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); - } -} - -class telemetry_server_handler : public server::handler { -public: - typedef telemetry_server_handler type; - typedef boost::shared_ptr ptr; - - telemetry_server_handler() : m_done(false),m_value(0) { - boost::function callback = boost::bind(&type::on_tick,this,_1); - - // start a thread that will generate telemetry independently and call - // this handler back when it has new data to send. - m_telemetry_thread.reset(new boost::thread( - boost::bind( - &generate_telemetry, - callback - ) - )); - } - - // If the handler is going away set done to true and wait for the thread - // to exit. - ~telemetry_server_handler() { - { - boost::lock_guard guard(m_mutex); - m_done = true; - } - m_telemetry_thread->join(); - } - - /// Function that we pass to the telemetry thread to broadcast the new - /// state. It returns the global "are we done" value so we can control when - /// the thread stops running. - bool on_tick(const std::string& msg) { - boost::lock_guard guard(m_mutex); - - std::set::iterator it; - - for (it = m_connections.begin(); it != m_connections.end(); it++) { - (*it)->send(msg); - } - - return m_done; - } - - // register a new client - void on_open(connection_ptr con) { - boost::lock_guard guard(m_mutex); - m_connections.insert(con); - } - - // remove an exiting client - void on_close(connection_ptr con) { - boost::lock_guard guard(m_mutex); - m_connections.erase(con); - } -private: - bool m_done; - size_t m_value; - std::set m_connections; - - boost::mutex m_mutex; // guards m_connections - boost::shared_ptr m_telemetry_thread; -}; - -int main(int argc, char* argv[]) { - unsigned short port = 9007; - - if (argc == 2) { - port = atoi(argv[1]); - - if (port == 0) { - std::cout << "Unable to parse port input " << argv[1] << std::endl; - return 1; - } - } - - try { - server::handler::ptr handler(new telemetry_server_handler()); - server endpoint(handler); - - endpoint.alog().unset_level(websocketpp::log::alevel::ALL); - endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - - endpoint.alog().set_level(websocketpp::log::alevel::CONNECT); - endpoint.alog().set_level(websocketpp::log::alevel::DISCONNECT); - - endpoint.elog().set_level(websocketpp::log::elevel::RERROR); - endpoint.elog().set_level(websocketpp::log::elevel::FATAL); - - std::cout << "Starting WebSocket telemetry server on port " << port << std::endl; - endpoint.listen(port); - } catch (std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/Subtrees/websocket/examples/wsperf/Makefile b/Subtrees/websocket/examples/wsperf/Makefile deleted file mode 100644 index 5c11ec1666..0000000000 --- a/Subtrees/websocket/examples/wsperf/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -BOOST_LIBS=boost_system boost_date_time boost_regex boost_thread boost_random boost_chrono boost_program_options - -include ../common.mk - -LDFLAGS := $(LDFLAGS) -lcrypto -lssl -lpthread -CFLAGS := -Wall -O3 $(CFLAGS) - -OS=$(shell uname) - -ifneq ($(OS), Darwin) - LDFLAGS := $(LDFLAGS) -lrt -lpthread -endif - -wsperf: wsperf.o request.o case.o generic.o wscmd.o stress_aggregate.o stress_handler.o - $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) - -%.o: %.cpp - $(CXX) -c $(CFLAGS) -o $@ $^ - -# cleanup by removing generated files -# -.PHONY: clean -clean: - rm -f *.o wsperf wsperf_client diff --git a/Subtrees/websocket/examples/wsperf/SConscript b/Subtrees/websocket/examples/wsperf/SConscript deleted file mode 100644 index 7bde796aef..0000000000 --- a/Subtrees/websocket/examples/wsperf/SConscript +++ /dev/null @@ -1,29 +0,0 @@ -## wsperf -## - -Import('env') -Import('boostlibs') -Import('wslib') -Import('platform_libs') - -localenv = env.Clone () - -sources = ["wsperf.cpp", - "request.cpp", - "case.cpp", - "generic.cpp", - "stress_handler.cpp", - "stress_aggregate.cpp", - "wscmd.cpp"] - -LIBS = [wslib] + boostlibs(['system', - 'date_time', - 'regex', - 'thread', - 'random', - 'chrono', - 'program_options']) + [platform_libs] - -prg = localenv.Program('wsperf', sources, LIBS = LIBS) - -Return('prg') diff --git a/Subtrees/websocket/examples/wsperf/case.cpp b/Subtrees/websocket/examples/wsperf/case.cpp deleted file mode 100644 index f255297d09..0000000000 --- a/Subtrees/websocket/examples/wsperf/case.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "case.hpp" - -using wsperf::case_handler; - -// Construct a message_test from a wscmd command -/* Reads values from the wscmd object into member variables. The cmd object is - * passed to the parent constructor for extracting values common to all test - * cases. - * - * Any of the constructors may throw a `case_exception` if required parameters - * are not found or default values don't make sense. - * - * Values that message_test checks for: - * - * uri=[string]; - * Example: uri=ws://localhost:9000; - * URI of the server to connect to - * - * token=[string]; - * Example: token=foo; - * String value that will be returned in the `token` field of all test related - * messages. A separate token should be sent for each unique test. - * - * quantile_count=[integer]; - * Example: quantile_count=10; - * How many histogram quantiles to return in the test results - * - * rtts=[bool]; - * Example: rtts:true; - * Whether or not to return the full list of round trip times for each message - * primarily useful for debugging. - */ -case_handler::case_handler(wscmd::cmd& cmd) - : m_uri(extract_string(cmd,"uri")), - m_token(extract_string(cmd,"token")), - m_quantile_count(extract_number(cmd,"quantile_count")), - m_rtts(extract_bool(cmd,"rtts")), - m_pass(RUNNING), - m_timeout(0), - m_bytes(0) {} - -/// Starts a test by starting the timeout timer and marking the start time -void case_handler::start(connection_ptr con, uint64_t timeout) { - if (timeout > 0) { - m_timer.reset(new boost::asio::deadline_timer( - con->get_io_service(), - boost::posix_time::seconds(0)) - ); - - m_timeout = timeout; - - m_timer->expires_from_now(boost::posix_time::milliseconds(m_timeout)); - m_timer->async_wait( - boost::bind( - &type::on_timer, - this, - con, - boost::asio::placeholders::error - ) - ); - } - - m_start = boost::chrono::steady_clock::now(); -} - -/// Marks an incremental time point -void case_handler::mark() { - m_end.push_back(boost::chrono::steady_clock::now()); -} - -/// Ends a test -/* Ends a test by canceling the timeout timer, marking the end time, generating - * statistics and closing the websocket connection. - */ -void case_handler::end(connection_ptr con) { - std::vector avgs; - avgs.resize(m_quantile_count, 0); - - std::vector quantiles; - quantiles.resize(m_quantile_count, 0); - - double avg = 0; - double stddev = 0; - double total = 0; - double seconds = 0; - - if (m_timeout > 0) { - m_timer->cancel(); - } - - // TODO: handle weird sizes and error conditions better - if (m_end.size() > m_quantile_count) { - boost::chrono::steady_clock::time_point last = m_start; - - // convert RTTs to microsecs - // - - std::vector::iterator it; - for (it = m_end.begin(); it != m_end.end(); ++it) { - boost::chrono::nanoseconds dur = *it - last; - m_times.push_back(static_cast (dur.count()) / 1000.); - last = *it; - } - - std::sort(m_times.begin(), m_times.end()); - - size_t samples_per_quantile = m_times.size() / m_quantile_count; - - // quantiles - for (size_t i = 0; i < m_quantile_count; ++i) { - quantiles[i] = m_times[((i + 1) * samples_per_quantile) - 1]; - } - - // total average and quantile averages - for (size_t i = 0; i < m_times.size(); ++i) { - avg += m_times[i]; - avgs[i / samples_per_quantile] - += m_times[i] / static_cast(samples_per_quantile); - } - - avg /= static_cast (m_times.size()); - - // standard dev corrected for estimation from sample - for (size_t i = 0; i < m_times.size(); ++i) { - stddev += (m_times[i] - avg) * (m_times[i] - avg); - } - - // Bessel's correction - stddev /= static_cast (m_times.size() - 1); - stddev = std::sqrt(stddev); - } else { - m_times.push_back(0); - } - - boost::chrono::nanoseconds total_dur = m_end[m_end.size()-1] - m_start; - total = static_cast (total_dur.count()) / 1000.; // microsec - seconds = total / 10000000.; - - std::stringstream s; - std::string outcome; - - switch (m_pass) { - case FAIL: - outcome = "fail"; - break; - case PASS: - outcome = "pass"; - break; - case TIME_OUT: - outcome = "time_out"; - break; - case RUNNING: - throw case_exception("end() called from RUNNING state"); - break; - } - - s << "{\"result\":\"" << outcome - << "\",\"min\":" << m_times[0] - << ",\"max\":" << m_times[m_times.size()-1] - << ",\"median\":" << m_times[(m_times.size()-1)/2] - << ",\"avg\":" << avg - << ",\"stddev\":" << stddev - << ",\"total\":" << total - << ",\"bytes\":" << m_bytes - << ",\"quantiles\":["; - - for (size_t i = 0; i < m_quantile_count; i++) { - s << (i > 0 ? "," : ""); - s << "["; - s << avgs[i] << "," << quantiles[i]; - s << "]"; - } - s << "]"; - - if (m_rtts) { - s << ",\"rtts\":["; - for (size_t i = 0; i < m_times.size(); i++) { - s << (i > 0 ? "," : "") << m_times[i]; - } - s << "]"; - }; - s << "}"; - - m_data = s.str(); - - con->close(websocketpp::close::status::NORMAL,""); -} - -/// Fills a buffer with utf8 bytes -void case_handler::fill_utf8(std::string& data,size_t size,bool random) { - if (random) { - uint32_t val; - for (size_t i = 0; i < size; i++) { - if (i%4 == 0) { - val = uint32_t(rand()); - } - - data.push_back(char(((reinterpret_cast(&val)[i%4])%95)+32)); - } - } else { - data.assign(size,'*'); - } -} - -/// Fills a buffer with bytes -void case_handler::fill_binary(std::string& data,size_t size,bool random) { - if (random) { - int32_t val; - for (size_t i = 0; i < size; i++) { - if (i%4 == 0) { - val = rand(); - } - - data.push_back((reinterpret_cast(&val))[i%4]); - } - } else { - data.assign(size,'*'); - } -} - -void case_handler::on_timer(connection_ptr con,const boost::system::error_code& error) { - if (error == boost::system::errc::operation_canceled) { - return; // timer was canceled because test finished - } - - // time out - mark(); - m_pass = TIME_OUT; - this->end(con); -} - -void case_handler::on_fail(connection_ptr con) { - m_data = "{\"result\":\"connection_failed\"}"; -} - -const std::string& case_handler::get_data() const { - return m_data; -} -const std::string& case_handler::get_token() const { - return m_token; -} -const std::string& case_handler::get_uri() const { - return m_uri; -} diff --git a/Subtrees/websocket/examples/wsperf/case.hpp b/Subtrees/websocket/examples/wsperf/case.hpp deleted file mode 100644 index 4bac10ddeb..0000000000 --- a/Subtrees/websocket/examples/wsperf/case.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WSPERF_CASE_HPP -#define WSPERF_CASE_HPP - -#include "wscmd.hpp" - -#include "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include - -#include - -using websocketpp::client; - -namespace wsperf { - -class case_exception : public std::exception { -public: - case_exception(const std::string& msg) : m_msg(msg) {} - ~case_exception() throw() {} - - virtual const char* what() const throw() { - return m_msg.c_str(); - } - - std::string m_msg; -}; - -class case_handler : public client::handler { -public: - typedef case_handler type; - - /// Construct a message test from a wscmd command - explicit case_handler(wscmd::cmd& cmd); - - void start(connection_ptr con, uint64_t timeout); - void end(connection_ptr con); - - void mark(); - - // Just does random ascii right now. True random UTF8 with multi-byte stuff - // would probably be better - void fill_utf8(std::string& data,size_t size,bool random = true); - void fill_binary(std::string& data,size_t size,bool random = true); - - void on_timer(connection_ptr con,const boost::system::error_code& error); - - void on_close(connection_ptr con) { - con->alog()->at(websocketpp::log::alevel::DEVEL) - << "case_handler::on_close" - << websocketpp::log::endl; - } - void on_fail(connection_ptr con); - - const std::string& get_data() const; - const std::string& get_token() const; - const std::string& get_uri() const; - - // TODO: refactor these three extract methods into wscmd - std::string extract_string(wscmd::cmd command,std::string key) { - if (command.args[key] != "") { - return command.args[key]; - } else { - throw case_exception("Invalid " + key + " parameter."); - } - } - - template - T extract_number(wscmd::cmd command,std::string key) { - if (command.args[key] != "") { - std::istringstream buf(command.args[key]); - T val; - - buf >> val; - - if (buf) {return val;} - } - throw case_exception("Invalid " + key + " parameter."); - } - - bool extract_bool(wscmd::cmd command,std::string key) { - if (command.args[key] != "") { - if (command.args[key] == "true") { - return true; - } else if (command.args[key] == "false") { - return false; - } - } - throw case_exception("Invalid " + key + " parameter."); - } -protected: - enum status { - FAIL = 0, - PASS = 1, - TIME_OUT = 2, - RUNNING = 3 - }; - - std::string m_uri; - std::string m_token; - size_t m_quantile_count; - bool m_rtts; - std::string m_data; - - status m_pass; - - uint64_t m_timeout; - boost::shared_ptr m_timer; - - boost::chrono::steady_clock::time_point m_start; - std::vector m_end; - std::vector m_times; - - uint64_t m_bytes; -}; - -typedef boost::shared_ptr case_handler_ptr; - -} // namespace wsperf - -#endif // WSPERF_CASE_HPP diff --git a/Subtrees/websocket/examples/wsperf/generic.cpp b/Subtrees/websocket/examples/wsperf/generic.cpp deleted file mode 100644 index 4400ae977c..0000000000 --- a/Subtrees/websocket/examples/wsperf/generic.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "generic.hpp" - -using wsperf::message_test; - -// Construct a message_test from a wscmd command -/* Reads values from the wscmd object into member variables. The cmd object is - * passed to the parent constructor for extracting values common to all test - * cases. - * - * Any of the constructors may throw a `case_exception` if required parameters - * are not found or default values don't make sense. - * - * Values that message_test checks for: - * - * size=[interger]; - * Example: size=4096; - * Size of messages to send in bytes. Valid values 0 - max size_t - * - * count=[integer]; - * Example: count=1000; - * Number of test messages to send. Valid values 0-2^64 - * - * timeout=[integer]; - * Example: timeout=10000; - * How long to wait (in ms) for a response before failing the test. - * - * binary=[bool]; - * Example: binary=true; - * Whether or not to use binary websocket frames. (true=binary, false=utf8) - * - * sync=[bool]; - * Example: sync=true; - * Syncronize messages. When sync is on wsperf will wait for a response before - * sending the next message. When sync is off, messages will be sent as quickly - * as possible. - * - * correctness=[string]; - * Example: correctness=exact; - * Example: correctness=length; - * How to evaluate the correctness of responses. Exact checks each response for - * exact correctness. Length checks only that the response has the correct - * length. Length mode is faster but won't catch invalid implimentations. Length - * mode can be used to test situations where you deliberately return incorrect - * bytes in order to compare performance (ex: performance with/without masking) - */ -message_test::message_test(wscmd::cmd& cmd) - : case_handler(cmd), - m_message_size(extract_number(cmd,"size")), - m_message_count(extract_number(cmd,"count")), - m_timeout(extract_number(cmd,"timeout")), - m_binary(extract_bool(cmd,"binary")), - m_sync(extract_bool(cmd,"sync")), - m_acks(0) -{ - if (cmd.args["correctness"] == "exact") { - m_mode = EXACT; - } else if (cmd.args["correctness"] == "length") { - m_mode = LENGTH; - } else { - throw case_exception("Invalid correctness parameter."); - } -} - -void message_test::on_open(connection_ptr con) { - con->alog()->at(websocketpp::log::alevel::DEVEL) - << "message_test::on_open" << websocketpp::log::endl; - - m_msg = con->get_data_message(); - - m_data.reserve(static_cast(m_message_size)); - - if (!m_binary) { - fill_utf8(m_data,static_cast(m_message_size),true); - m_msg->reset(websocketpp::frame::opcode::TEXT); - } else { - fill_binary(m_data,static_cast(m_message_size),true); - m_msg->reset(websocketpp::frame::opcode::BINARY); - } - - m_msg->set_payload(m_data); - - start(con,m_timeout); - - if (m_sync) { - con->send(m_msg); - } else { - for (uint64_t i = 0; i < m_message_count; i++) { - con->send(m_msg); - } - } -} - -void message_test::on_message(connection_ptr con,websocketpp::message::data_ptr msg) { - if ((m_mode == LENGTH && msg->get_payload().size() == m_data.size()) || - (m_mode == EXACT && msg->get_payload() == m_data)) - { - m_acks++; - m_bytes += m_message_size; - mark(); - } else { - mark(); - m_msg.reset(); - m_pass = FAIL; - - this->end(con); - } - - if (m_acks == m_message_count) { - m_pass = PASS; - m_msg.reset(); - this->end(con); - } else if (m_sync && m_pass == RUNNING) { - con->send(m_msg); - } -} diff --git a/Subtrees/websocket/examples/wsperf/generic.hpp b/Subtrees/websocket/examples/wsperf/generic.hpp deleted file mode 100644 index a9dff48429..0000000000 --- a/Subtrees/websocket/examples/wsperf/generic.hpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WSPERF_CASE_GENERIC_HPP -#define WSPERF_CASE_GENERIC_HPP - -#include "case.hpp" -#include "wscmd.hpp" - -namespace wsperf { - -enum correctness_mode { - EXACT = 0, - LENGTH = 1 -}; - -class message_test : public case_handler { -public: - /// Construct a message test from a wscmd command - explicit message_test(wscmd::cmd& cmd); - - void on_open(connection_ptr con); - void on_message(connection_ptr con,websocketpp::message::data_ptr msg); -private: - // Simulation Parameters - uint64_t m_message_size; - uint64_t m_message_count; - uint64_t m_timeout; - bool m_binary; - bool m_sync; - correctness_mode m_mode; - - // Simulation temporaries - std::string m_data; - message_ptr m_msg; - uint64_t m_acks; -}; - -} // namespace wsperf - -#endif // WSPERF_CASE_GENERIC_HPP diff --git a/Subtrees/websocket/examples/wsperf/message_test.html b/Subtrees/websocket/examples/wsperf/message_test.html deleted file mode 100644 index deac5b00fa..0000000000 --- a/Subtrees/websocket/examples/wsperf/message_test.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - -
-
- - - -
-
-

Run Test

-
-
- -
-

Test Results

-
-
- - - - - - - - - - - - - - - - - - - -
TokenStatusResultTime (µs)Size (bytes)MinMedianMeanMaxStddevMB/sec
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/wsperf/request.cpp b/Subtrees/websocket/examples/wsperf/request.cpp deleted file mode 100644 index 52f2ec2980..0000000000 --- a/Subtrees/websocket/examples/wsperf/request.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "request.hpp" -#include "stress_aggregate.hpp" - -#include -#include - -using wsperf::request; - -void request::process(unsigned int id) { - case_handler_ptr test; - stress_handler_ptr shandler; - std::string uri; - //size_t connections_opened = 0; - size_t connection_count; - - wscmd::cmd command = wscmd::parse(req); - - try { - if (command.command == "message_test") { - test = case_handler_ptr(new message_test(command)); - token = test->get_token(); - uri = test->get_uri(); - } else if (command.command == "stress_test") { - shandler = stress_handler_ptr(new stress_aggregate(command)); - - // todo make sure this isn't 0 - if(!wscmd::extract_number(command, "connection_count",connection_count)) { - connection_count = 1; - } - - if (command.args["token"] != "") { - token = command.args["token"]; - } else { - throw case_exception("Invalid token parameter."); - } - - if (command.args["uri"] != "") { - uri = command.args["uri"]; - } else { - throw case_exception("Invalid uri parameter."); - } - } else { - writer->write(prepare_response("error","Invalid Command")); - return; - } - - std::stringstream o; - o << "{\"worker_id\":" << id << "}"; - - writer->write(prepare_response_object("test_start",o.str())); - - if (command.command == "message_test") { - client e(test); - - e.alog().set_level(websocketpp::log::alevel::ALL); - e.elog().set_level(websocketpp::log::elevel::ALL); - - //e.alog().unset_level(websocketpp::log::alevel::ALL); - //e.elog().unset_level(websocketpp::log::elevel::ALL); - - //e.elog().set_level(websocketpp::log::elevel::RERROR); - //e.elog().set_level(websocketpp::log::elevel::FATAL); - - e.connect(uri); - e.run(); - - writer->write(prepare_response_object("test_data",test->get_data())); - } else if (command.command == "stress_test") { - client e(shandler); - - e.alog().unset_level(websocketpp::log::alevel::ALL); - e.elog().unset_level(websocketpp::log::elevel::ALL); - - /*client::connection_ptr con; - con = e.get_connection(uri); - shandler->on_connect(con); - e.connect(con);*/ - - boost::thread t(boost::bind(&client::run, &e, true)); - - size_t handshake_delay; - if(!wscmd::extract_number(command, "handshake_delay",handshake_delay)) { - handshake_delay = 10; - } - - // open n connections - for (size_t i = 0; i < connection_count; i++) { - client::connection_ptr con; - con = e.get_connection(uri); - shandler->on_connect(con); - e.connect(con); - - boost::this_thread::sleep(boost::posix_time::milliseconds(handshake_delay)); - } - - // start sending messages - shandler->start_message_test(); - - e.end_perpetual(); - - t.join(); - - std::cout << "writing data" << std::endl; - writer->write(prepare_response_object("test_data",shandler->get_data())); - - /*for (;;) { - // tell the handler to perform its event loop - - bool quit = false; - - if (connections_opened == connection_count) { - std::cout << "maintenance loop" << std::endl; - quit = shandler->maintenance(); - } - - // check for done-ness - if (quit) { - // send update to command - std::cout << "writing data" << std::endl; - writer->write(prepare_response_object("test_data",shandler->get_data())); - break; - } - - // unless we know we have something to do, sleep for a bit. - if (connections_opened < connection_count) { - continue; - } - - boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); - }*/ - //e.end_perpetual(); - - } - - writer->write(prepare_response("test_complete","")); - } catch (case_exception& e) { - std::cout << "case_exception: " << e.what() << std::endl; - writer->write(prepare_response("error",e.what())); - return; - } catch (websocketpp::exception& e) { - std::cout << "websocketpp::exception: " << e.what() << std::endl; - writer->write(prepare_response("error",e.what())); - return; - } catch (websocketpp::uri_exception& e) { - std::cout << "websocketpp::uri_exception: " << e.what() << std::endl; - writer->write(prepare_response("error",e.what())); - return; - } -} - -std::string request::prepare_response(std::string type,std::string data) { - return "{\"type\":\"" + type - + "\",\"token\":\"" + token + "\",\"data\":\"" + data + "\"}"; -} - -std::string request::prepare_response_object(std::string type,std::string data){ - return "{\"type\":\"" + type - + "\",\"token\":\"" + token + "\",\"data\":" + data + "}"; -} - -void wsperf::process_requests(request_coordinator* coordinator,unsigned int id) { - request r; - - while (1) { - coordinator->get_request(r); - - if (r.type == PERF_TEST) { - r.process(id); - } else { - break; - } - } -} \ No newline at end of file diff --git a/Subtrees/websocket/examples/wsperf/request.hpp b/Subtrees/websocket/examples/wsperf/request.hpp deleted file mode 100644 index 11617408bb..0000000000 --- a/Subtrees/websocket/examples/wsperf/request.hpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WSPERF_REQUEST_HPP -#define WSPERF_REQUEST_HPP - -#include "case.hpp" -#include "generic.hpp" -#include "wscmd.hpp" - -#include "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include -#include - -using websocketpp::client; -using websocketpp::server; - -namespace wsperf { - -enum request_type { - PERF_TEST = 0, - END_WORKER = 1 -}; - -class writer { -public: - virtual ~writer() {} - - virtual void write(std::string msg) = 0; -}; - -typedef boost::shared_ptr writer_ptr; - -template -class ws_writer : public writer { -public: - ws_writer(typename endpoint_type::handler::connection_ptr con) - : m_con(con) {} - - void write(std::string msg) { - m_con->send(msg); - } -private: - typename endpoint_type::handler::connection_ptr m_con; -}; - -// A request encapsulates all of the information necesssary to perform a request -// the coordinator will fill in this information from the websocket connection -// and add it to the processing queue. Sleeping in this example is a placeholder -// for any long serial task. -struct request { - writer_ptr writer; - - request_type type; - std::string req; // The raw request - std::string token; // Parsed test token. Return in all results - - /// Run a test and return JSON result - void process(unsigned int id); - - // Simple json generation - std::string prepare_response(std::string type,std::string data); - std::string prepare_response_object(std::string type,std::string data); -}; - -// The coordinator is a simple wrapper around an STL queue. add_request inserts -// a new request. get_request returns the next available request and blocks -// (using condition variables) in the case that the queue is empty. -class request_coordinator { -public: - void add_request(const request& r) { - { - boost::unique_lock lock(m_lock); - m_requests.push(r); - } - m_cond.notify_one(); - } - - void get_request(request& value) { - boost::unique_lock lock(m_lock); - - while (m_requests.empty()) { - m_cond.wait(lock); - } - - value = m_requests.front(); - m_requests.pop(); - } - - void reset() { - boost::unique_lock lock(m_lock); - - while (!m_requests.empty()) { - m_requests.pop(); - } - } -private: - std::queue m_requests; - boost::mutex m_lock; - boost::condition_variable m_cond; -}; - -/// Handler that reads requests off the wire and dispatches them to a request queue -template -class concurrent_handler : public endpoint_type::handler { -public: - typedef typename endpoint_type::handler::connection_ptr connection_ptr; - typedef typename endpoint_type::handler::message_ptr message_ptr; - - concurrent_handler(request_coordinator& c, - std::string ident, - std::string ua, - unsigned int num_workers) - : m_coordinator(c), - m_ident(ident), - m_ua(ua), - m_num_workers(num_workers), - m_blocking(num_workers == 0) {} - - void on_open(connection_ptr con) { - std::stringstream o; - - o << "{" - << "\"type\":\"test_welcome\"," - << "\"version\":\"" << m_ua << "\"," - << "\"ident\":\"" << m_ident << "\"," - << "\"num_workers\":" << m_num_workers - << "}"; - - con->send(o.str()); - } - - void on_message(connection_ptr con, message_ptr msg) { - request r; - r.type = PERF_TEST; - r.writer = writer_ptr(new ws_writer(con)); - r.req = msg->get_payload(); - - if (m_blocking) { - r.process(0); - } else { - m_coordinator.add_request(r); - } - } - - void on_fail(connection_ptr con) { - std::cout << "A command connection failed." << std::endl; - } - - void on_close(connection_ptr con) { - std::cout << "A command connection closed." << std::endl; - } -private: - request_coordinator& m_coordinator; - std::string m_ident; - std::string m_ua; - unsigned int m_num_workers; - bool m_blocking; -}; - -// process_requests is the body function for a processing thread. It loops -// forever reading requests, processing them serially, then reading another -// request. A request with type END_WORKER will stop the processing loop. -void process_requests(request_coordinator* coordinator, unsigned int id); - -} // namespace wsperf - -#endif // WSPERF_REQUEST_HPP diff --git a/Subtrees/websocket/examples/wsperf/stress_aggregate.cpp b/Subtrees/websocket/examples/wsperf/stress_aggregate.cpp deleted file mode 100644 index ea4bab8b3d..0000000000 --- a/Subtrees/websocket/examples/wsperf/stress_aggregate.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "stress_aggregate.hpp" - -using wsperf::stress_aggregate; - -// Construct a message_test from a wscmd command -/* Reads values from the wscmd object into member variables. The cmd object is - * passed to the parent constructor for extracting values common to all test - * cases. - * - * Any of the constructors may throw a `case_exception` if required parameters - * are not found or default values don't make sense. - * - * Values that message_test checks for: - * - * uri=[string]; - * Example: uri=ws://localhost:9000; - * URI of the server to connect to - * - * token=[string]; - * Example: token=foo; - * String value that will be returned in the `token` field of all test related - * messages. A separate token should be sent for each unique test. - * - * quantile_count=[integer]; - * Example: quantile_count=10; - * How many histogram quantiles to return in the test results - * - * rtts=[bool]; - * Example: rtts:true; - * Whether or not to return the full list of round trip times for each message - * primarily useful for debugging. - */ -stress_aggregate::stress_aggregate(wscmd::cmd& cmd) - : stress_handler(cmd) -{} - -void stress_aggregate::start(connection_ptr con) { - -} - -/*void stress_aggregate::on_message(connection_ptr con,websocketpp::message::data_ptr msg) { - std::string hash = websocketpp::md5_hash_hex(msg->get_payload()); - - boost::lock_guard lock(m_lock); - m_msg_stats[hash]++; -}*/ - -/*std::string stress_aggregate::get_data() const { - std::stringstream data; - - std::string sep = ""; - - data << "{"; - - std::map::iterator it; - - { - boost::lock_guard lock(m_lock); - for (it = m_msg_stats.begin(); it != m_msg_stats.end(); it++) { - data << sep << "\"" << (*it)->first << "\":" << (*it)->second; - sep = ","; - } - } - - data << "}"; - - return data; -}*/ - diff --git a/Subtrees/websocket/examples/wsperf/stress_aggregate.hpp b/Subtrees/websocket/examples/wsperf/stress_aggregate.hpp deleted file mode 100644 index 3778c8c443..0000000000 --- a/Subtrees/websocket/examples/wsperf/stress_aggregate.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WSPERF_STRESS_AGGREGATE_HPP -#define WSPERF_STRESS_AGGREGATE_HPP - -#include "stress_handler.hpp" - -namespace wsperf { - -class stress_aggregate : public stress_handler { -public: - typedef stress_aggregate type; - - - /// Construct a stress test from a wscmd command - explicit stress_aggregate(wscmd::cmd& cmd); - - //void on_message(connection_ptr con,websocketpp::message::data_ptr msg); - - void start(connection_ptr con); - void end(); - - const std::string get_data() const; -protected: - std::map m_msg_stats; - - -}; - -typedef boost::shared_ptr stress_aggregate_ptr; - -} // namespace wsperf - -#endif // WSPERF_STRESS_AGGREGATE_HPP diff --git a/Subtrees/websocket/examples/wsperf/stress_handler.cpp b/Subtrees/websocket/examples/wsperf/stress_handler.cpp deleted file mode 100644 index 1cb89d993a..0000000000 --- a/Subtrees/websocket/examples/wsperf/stress_handler.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 "stress_handler.hpp" - -using wsperf::stress_handler; - -// Construct a message_test from a wscmd command -/* Reads values from the wscmd object into member variables. The cmd object is - * passed to the parent constructor for extracting values common to all test - * cases. - * - * Any of the constructors may throw a `case_exception` if required parameters - * are not found or default values don't make sense. - * - * Values that message_test checks for: - * - * uri=[string]; - * Example: uri=ws://localhost:9000; - * URI of the server to connect to - * - * token=[string]; - * Example: token=foo; - * String value that will be returned in the `token` field of all test related - * messages. A separate token should be sent for each unique test. - * - * quantile_count=[integer]; - * Example: quantile_count=10; - * How many histogram quantiles to return in the test results - * - * rtts=[bool]; - * Example: rtts:true; - * Whether or not to return the full list of round trip times for each message - * primarily useful for debugging. - */ -stress_handler::stress_handler(wscmd::cmd& cmd) - : m_current_connections(0) - , m_max_connections(0) - , m_total_connections(0) - , m_failed_connections(0) - , m_next_con_id(0) - , m_init(boost::chrono::steady_clock::now()) - , m_next_msg_id(0) - , m_con_sync(false) -{ - if (!wscmd::extract_number(cmd,"msg_count",m_msg_count)) { - m_msg_count = 0; - } - - if (!wscmd::extract_number(cmd,"msg_size",m_msg_size)) { - m_msg_size = 0; - } - - std::string mode; - if (wscmd::extract_string(cmd,"msg_mode",mode)) { - if (mode == "fixed") { - m_msg_mode = msg_mode::FIXED; - } else if (mode == "infinite") { - m_msg_mode = msg_mode::UNLIMITED; - } else { - m_msg_mode = msg_mode::NONE; - } - } else { - m_msg_mode = msg_mode::NONE; - } - - if (wscmd::extract_string(cmd,"con_lifetime",mode)) { - if (mode == "random") { - m_con_lifetime = con_lifetime::RANDOM; - } else if (mode == "infinite") { - m_con_lifetime = con_lifetime::UNLIMITED; - } else { - m_con_lifetime = con_lifetime::FIXED; - } - } else { - m_con_lifetime = con_lifetime::FIXED; - } - - if (m_con_lifetime == con_lifetime::FIXED) { - if (!wscmd::extract_number(cmd,"con_duration",m_con_duration)) { - m_con_duration = 5000; - } - } else if (m_con_lifetime == con_lifetime::RANDOM) { - size_t max_dur; - if (!wscmd::extract_number(cmd,"con_duration",max_dur)) { - max_dur = 5000; - } - - // TODO: choose random number between 0 and max_dur - m_con_duration = max_dur; - } -} - -void stress_handler::on_connect(connection_ptr con) { - boost::lock_guard lock(m_lock); - - m_con_data[con] = con_data(m_next_con_id++, m_init); - m_con_data[con].start = boost::chrono::steady_clock::now(); -} - -void stress_handler::on_handshake_init(connection_ptr con) { - boost::lock_guard lock(m_lock); - - m_con_data[con].tcp_established = boost::chrono::steady_clock::now(); - - // TODO: log close reason? -} - -void stress_handler::start_message_test() { - m_msg.reset(new std::string()); - m_msg->assign(m_msg_size,'*'); - - // for each connection send the first message - std::map::iterator it; - for (it = m_con_data.begin(); it != m_con_data.end(); it++) { - connection_ptr con = (*it).first; - con_data& data = (*it).second; - - /*data.msg = con->get_data_message(); - std::string msg; - msg.assign(m_msg_size,'*'); - - data.msg->set_payload(msg); - - data.msg->reset(websocketpp::frame::opcode::BINARY);*/ - - boost::lock_guard lock(m_lock); - - msg_data foo; - - foo.msg_id = m_next_msg_id++; - foo.send_time = boost::chrono::steady_clock::now(); - data.messages.push_back(foo); - - con->send(*m_msg); - } -} - -void stress_handler::on_message(connection_ptr con,websocketpp::message::data_ptr msg) { - time_point mark = boost::chrono::steady_clock::now(); - - boost::lock_guard lock(m_lock); - - std::map::iterator element = m_con_data.find(con); - - if (element == m_con_data.end()) { - std::cout << "Bad Bad Bad" << std::endl; - return; - } - - con_data& data = (*element).second; - - data.messages.back().recv_time = mark; - - - if (data.messages.size() < m_msg_count) { - msg_data foo; - - foo.msg_id = m_next_msg_id++; - foo.send_time = boost::chrono::steady_clock::now(); - data.messages.push_back(foo); - - con->send(*m_msg); - } else { - close(con); - } -} - -void stress_handler::on_open(connection_ptr con) { - { - boost::lock_guard lock(m_lock); - - m_current_connections++; - m_total_connections++; - - if (m_current_connections > m_max_connections) { - m_max_connections = m_current_connections; - } - - m_con_data[con].on_open = boost::chrono::steady_clock::now(); - m_con_data[con].status = "Open"; - } - - start(con); -} - -void stress_handler::on_close(connection_ptr con) { - boost::lock_guard lock(m_lock); - - m_current_connections--; - - m_con_data[con].on_close = boost::chrono::steady_clock::now(); - m_con_data[con].status = "Closed"; - - // TODO: log close reason? -} - -void stress_handler::on_fail(connection_ptr con) { - boost::lock_guard lock(m_lock); - - m_failed_connections++; - - m_con_data[con].on_fail = boost::chrono::steady_clock::now(); - m_con_data[con].status = "Failed"; - - // TODO: log failure reason -} - -void stress_handler::start(connection_ptr con) { - //close(con); -} - -void stress_handler::close(connection_ptr con) { - //boost::lock_guard lock(m_lock); - - m_con_data[con].close_sent = boost::chrono::steady_clock::now(); - m_con_data[con].status = "Closing"; - - con->close(websocketpp::close::status::NORMAL); - // TODO: log close reason? -} - -std::string stress_handler::get_data() const { - std::stringstream data; - - - data << "{"; - - { - boost::lock_guard lock(m_lock); - - data << "\"current_connections\":" << m_current_connections; - data << ",\"max_connections\":" << m_max_connections; - data << ",\"total_connections\":" << m_total_connections; - data << ",\"failed_connections\":" << m_failed_connections; - - data << ",\"connection_data\":["; - - // for each item in m_dirty - std::string sep = ""; - std::map::const_iterator it; - for (it = m_con_data.begin(); it != m_con_data.end(); it++) { - data << sep << (*it).second.print(); - sep = ","; - } - - data << "]"; - } - - data << "}"; - - return data.str(); -} - -bool stress_handler::maintenance() { - std::cout << "locking..." << std::endl; - boost::lock_guard lock(m_lock); - - bool quit = true; - - time_point now = boost::chrono::steady_clock::now(); - - std::cout << "found " << m_con_data.size() << " connections" << std::endl; - - std::map::iterator it; - for (it = m_con_data.begin(); it != m_con_data.end(); it++) { - if ((*it).first->get_state() != websocketpp::session::state::CLOSED) { - quit = false; - } - - connection_ptr con = (*it).first; - con_data& data = (*it).second; - - std::cout << "processing " << data.id << "..."; - - // check the connection state - if (con->get_state() != websocketpp::session::state::OPEN) { - std::cout << "ignored" << std::endl; - continue; - } - - boost::chrono::nanoseconds dur = now - data.on_open; - size_t milliseconds = static_cast(dur.count()) / 1000000; - - if (milliseconds > m_con_duration) { - close(con); - } - std::cout << "closed" << std::endl; - } - - if (quit) { - return true; - } - - - /*std::cout << "found " << to_process.size() << " connections" << std::endl; - - - - - std::list::iterator it2; - for (it2 = to_process.begin(); it2 != to_process.end(); it++) { - connection_ptr con = (*it2); - std::map::iterator element; - - - - element = m_con_data.find(con); - - if (element == m_con_data.end()) { - continue; - } - - con_data& data = element->second; - - - - // check the connection state - if (con->get_state() != websocketpp::session::state::OPEN) { - std::cout << "ignored" << std::endl; - continue; - } - - boost::chrono::nanoseconds dur = now - data.on_open; - size_t milliseconds = static_cast(dur.count()) / 1000000; - - if (milliseconds > m_con_duration) { - close(con); - } - std::cout << "closed" << std::endl; - }*/ - - return false; -} \ No newline at end of file diff --git a/Subtrees/websocket/examples/wsperf/stress_handler.hpp b/Subtrees/websocket/examples/wsperf/stress_handler.hpp deleted file mode 100644 index 7fc4f98277..0000000000 --- a/Subtrees/websocket/examples/wsperf/stress_handler.hpp +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2011, Peter Thorson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the WebSocket++ Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON 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 WSPERF_STRESS_HANDLER_HPP -#define WSPERF_STRESS_HANDLER_HPP - -#include "wscmd.hpp" - -#include "../../src/roles/client.hpp" -#include "../../src/websocketpp.hpp" - -#include -#include - -#include - -using websocketpp::client; - -namespace wsperf { - -namespace con_lifetime { - enum value { - FIXED = 0, - RANDOM = 1, - UNLIMITED = 2 - }; -} - - - -namespace msg_mode { - enum value { - NONE = 0, - FIXED = 1, - UNLIMITED = 2 - }; -} - -struct msg_data { - typedef boost::chrono::steady_clock::time_point time_point; - - size_t msg_id; - time_point send_time; - time_point recv_time; - //size_t payload_len; -}; - -struct con_data { - typedef boost::chrono::steady_clock::time_point time_point; - - con_data() {} - - con_data(size_t id,time_point init) - : id(id) - , init(init) - , start(init) - , tcp_established(init) - , on_open(init) - , on_fail(init) - , close_sent(init) - , on_close(init) - , status("Connecting") - { - } - - std::string print() const { - std::stringstream o; - - o << "{"; - o << "\"id\":" << id; - o << ",\"status\":\"" << status << "\""; - o << ",\"start\":" << get_rel_microseconds(start); - o << ",\"tcp\":" << get_rel_microseconds(tcp_established); - o << ",\"open\":" << get_rel_microseconds(on_open); - o << ",\"fail\":" << get_rel_microseconds(on_fail); - o << ",\"close_sent\":" << get_rel_microseconds(close_sent); - o << ",\"close\":" << get_rel_microseconds(on_close); - - o << ",\"messages\":["; - std::string sep = ""; - std::vector::const_iterator it; - for (it = messages.begin(); it != messages.end(); it++) { - o << sep << "[" - << get_rel_microseconds((*it).send_time) << "," - << get_rel_microseconds((*it).recv_time) - << "]"; - sep = ","; - } - - o << "]"; - - o << "}"; - - return o.str(); - } - - double get_rel_microseconds(time_point t) const { - boost::chrono::nanoseconds dur = t - init; - return static_cast (dur.count()) / 1000.; - } - - size_t id; - time_point init; - time_point start; - time_point tcp_established; - time_point on_open; - time_point on_fail; - time_point close_sent; - time_point on_close; - std::string status; - std::vector messages; - //stress_handler::message_ptr msg; -}; - - - -class stress_handler : public client::handler { -public: - typedef stress_handler type; - typedef boost::chrono::steady_clock::time_point time_point; - typedef std::map time_map; - - /// Construct a stress test from a wscmd command - explicit stress_handler(wscmd::cmd& cmd); - - void on_connect(connection_ptr con); - - void on_message(connection_ptr con,websocketpp::message::data_ptr msg); - - void on_handshake_init(connection_ptr con); - void on_open(connection_ptr con); - void on_close(connection_ptr con); - void on_fail(connection_ptr con); - - void start(connection_ptr con); - void close(connection_ptr con); - void end(); - - std::string get_data() const; - virtual bool maintenance(); - - void start_message_test(); -protected: - size_t m_current_connections; - size_t m_max_connections; - size_t m_total_connections; - size_t m_failed_connections; - - size_t m_next_con_id; - time_point m_init; - - // connection related timestamps - std::map m_con_data; - mutable std::list m_dirty; - - // Stats update timer - size_t m_timeout; - boost::shared_ptr m_timer; - - size_t m_next_msg_id; - boost::shared_ptr m_msg; - - // test settings pulled from the command - con_lifetime::value m_con_lifetime; - size_t m_con_duration; - bool m_con_sync; - - msg_mode::value m_msg_mode; - size_t m_msg_count; - size_t m_msg_size; - - - mutable boost::mutex m_lock; -}; - -typedef boost::shared_ptr stress_handler_ptr; - -} // namespace wsperf - -#endif // WSPERF_STRESS_HANDLER_HPP diff --git a/Subtrees/websocket/examples/wsperf/stress_test.html b/Subtrees/websocket/examples/wsperf/stress_test.html deleted file mode 100644 index b984461e9d..0000000000 --- a/Subtrees/websocket/examples/wsperf/stress_test.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - - - - -
-
- - - -
-
-

Run Test

-
-
- -
-

Test Results

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TokenStatusConnectionsOpenMessagesClose
CurrentMaxTotalFailedMinMedianMeanMaxMinMedianMeanMaxMinMedianMeanMax
N/A
- - - - - - - - - - - - - - - -
IDStatusStartTCPOpen/FailClose sentClosed
-
- - - \ No newline at end of file diff --git a/Subtrees/websocket/examples/wsperf/vendor/backbone-localstorage.js b/Subtrees/websocket/examples/wsperf/vendor/backbone-localstorage.js deleted file mode 100644 index 091d7f3680..0000000000 --- a/Subtrees/websocket/examples/wsperf/vendor/backbone-localstorage.js +++ /dev/null @@ -1,84 +0,0 @@ -// A simple module to replace `Backbone.sync` with *localStorage*-based -// persistence. Models are given GUIDS, and saved into a JSON object. Simple -// as that. - -// Generate four random hex digits. -function S4() { - return (((1+Math.random())*0x10000)|0).toString(16).substring(1); -}; - -// Generate a pseudo-GUID by concatenating random hexadecimal. -function guid() { - return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); -}; - -// Our Store is represented by a single JS object in *localStorage*. Create it -// with a meaningful name, like the name you'd give a table. -var Store = function(name) { - this.name = name; - var store = localStorage.getItem(this.name); - this.data = (store && JSON.parse(store)) || {}; -}; - -_.extend(Store.prototype, { - - // Save the current state of the **Store** to *localStorage*. - save: function() { - localStorage.setItem(this.name, JSON.stringify(this.data)); - }, - - // Add a model, giving it a (hopefully)-unique GUID, if it doesn't already - // have an id of it's own. - create: function(model) { - if (!model.id) model.id = model.attributes.id = guid(); - this.data[model.id] = model; - this.save(); - return model; - }, - - // Update a model by replacing its copy in `this.data`. - update: function(model) { - this.data[model.id] = model; - this.save(); - return model; - }, - - // Retrieve a model from `this.data` by id. - find: function(model) { - return this.data[model.id]; - }, - - // Return the array of all models currently in storage. - findAll: function() { - return _.values(this.data); - }, - - // Delete a model from `this.data`, returning it. - destroy: function(model) { - delete this.data[model.id]; - this.save(); - return model; - } - -}); - -// Override `Backbone.sync` to use delegate to the model or collection's -// *localStorage* property, which should be an instance of `Store`. -Backbone.sync = function(method, model, options) { - - var resp; - var store = model.localStorage || model.collection.localStorage; - - switch (method) { - case "read": resp = model.id ? store.find(model) : store.findAll(); break; - case "create": resp = store.create(model); break; - case "update": resp = store.update(model); break; - case "delete": resp = store.destroy(model); break; - } - - if (resp) { - options.success(resp); - } else { - options.error("Record not found"); - } -}; \ No newline at end of file diff --git a/Subtrees/websocket/examples/wsperf/vendor/backbone.js b/Subtrees/websocket/examples/wsperf/vendor/backbone.js deleted file mode 100644 index 7c56f42363..0000000000 --- a/Subtrees/websocket/examples/wsperf/vendor/backbone.js +++ /dev/null @@ -1,1290 +0,0 @@ -// Backbone.js 0.9.1 - -// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://backbonejs.org - -(function(){ - - // Initial Setup - // ------------- - - // Save a reference to the global object (`window` in the browser, `global` - // on the server). - var root = this; - - // Save the previous value of the `Backbone` variable, so that it can be - // restored later on, if `noConflict` is used. - var previousBackbone = root.Backbone; - - // Create a local reference to slice/splice. - var slice = Array.prototype.slice; - var splice = Array.prototype.splice; - - // The top-level namespace. All public Backbone classes and modules will - // be attached to this. Exported for both CommonJS and the browser. - var Backbone; - if (typeof exports !== 'undefined') { - Backbone = exports; - } else { - Backbone = root.Backbone = {}; - } - - // Current version of the library. Keep in sync with `package.json`. - Backbone.VERSION = '0.9.1'; - - // Require Underscore, if we're on the server, and it's not already present. - var _ = root._; - if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); - - // For Backbone's purposes, jQuery, Zepto, or Ender owns the `$` variable. - var $ = root.jQuery || root.Zepto || root.ender; - - // Set the JavaScript library that will be used for DOM manipulation and - // Ajax calls (a.k.a. the `$` variable). By default Backbone will use: jQuery, - // Zepto, or Ender; but the `setDomLibrary()` method lets you inject an - // alternate JavaScript library (or a mock library for testing your views - // outside of a browser). - Backbone.setDomLibrary = function(lib) { - $ = lib; - }; - - // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable - // to its previous owner. Returns a reference to this Backbone object. - Backbone.noConflict = function() { - root.Backbone = previousBackbone; - return this; - }; - - // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option - // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and - // set a `X-Http-Method-Override` header. - Backbone.emulateHTTP = false; - - // Turn on `emulateJSON` to support legacy servers that can't deal with direct - // `application/json` requests ... will encode the body as - // `application/x-www-form-urlencoded` instead and will send the model in a - // form param named `model`. - Backbone.emulateJSON = false; - - // Backbone.Events - // ----------------- - - // A module that can be mixed in to *any object* in order to provide it with - // custom events. You may bind with `on` or remove with `off` callback functions - // to an event; trigger`-ing an event fires all callbacks in succession. - // - // var object = {}; - // _.extend(object, Backbone.Events); - // object.on('expand', function(){ alert('expanded'); }); - // object.trigger('expand'); - // - Backbone.Events = { - - // Bind an event, specified by a string name, `ev`, to a `callback` - // function. Passing `"all"` will bind the callback to all events fired. - on: function(events, callback, context) { - var ev; - events = events.split(/\s+/); - var calls = this._callbacks || (this._callbacks = {}); - while (ev = events.shift()) { - // Create an immutable callback list, allowing traversal during - // modification. The tail is an empty object that will always be used - // as the next node. - var list = calls[ev] || (calls[ev] = {}); - var tail = list.tail || (list.tail = list.next = {}); - tail.callback = callback; - tail.context = context; - list.tail = tail.next = {}; - } - return this; - }, - - // Remove one or many callbacks. If `context` is null, removes all callbacks - // with that function. If `callback` is null, removes all callbacks for the - // event. If `ev` is null, removes all bound callbacks for all events. - off: function(events, callback, context) { - var ev, calls, node; - if (!events) { - delete this._callbacks; - } else if (calls = this._callbacks) { - events = events.split(/\s+/); - while (ev = events.shift()) { - node = calls[ev]; - delete calls[ev]; - if (!callback || !node) continue; - // Create a new list, omitting the indicated event/context pairs. - while ((node = node.next) && node.next) { - if (node.callback === callback && - (!context || node.context === context)) continue; - this.on(ev, node.callback, node.context); - } - } - } - return this; - }, - - // Trigger an event, firing all bound callbacks. Callbacks are passed the - // same arguments as `trigger` is, apart from the event name. - // Listening for `"all"` passes the true event name as the first argument. - trigger: function(events) { - var event, node, calls, tail, args, all, rest; - if (!(calls = this._callbacks)) return this; - all = calls['all']; - (events = events.split(/\s+/)).push(null); - // Save references to the current heads & tails. - while (event = events.shift()) { - if (all) events.push({next: all.next, tail: all.tail, event: event}); - if (!(node = calls[event])) continue; - events.push({next: node.next, tail: node.tail}); - } - // Traverse each list, stopping when the saved tail is reached. - rest = slice.call(arguments, 1); - while (node = events.pop()) { - tail = node.tail; - args = node.event ? [node.event].concat(rest) : rest; - while ((node = node.next) !== tail) { - node.callback.apply(node.context || this, args); - } - } - return this; - } - - }; - - // Aliases for backwards compatibility. - Backbone.Events.bind = Backbone.Events.on; - Backbone.Events.unbind = Backbone.Events.off; - - // Backbone.Model - // -------------- - - // Create a new model, with defined attributes. A client id (`cid`) - // is automatically generated and assigned for you. - Backbone.Model = function(attributes, options) { - var defaults; - attributes || (attributes = {}); - if (options && options.parse) attributes = this.parse(attributes); - if (defaults = getValue(this, 'defaults')) { - attributes = _.extend({}, defaults, attributes); - } - if (options && options.collection) this.collection = options.collection; - this.attributes = {}; - this._escapedAttributes = {}; - this.cid = _.uniqueId('c'); - if (!this.set(attributes, {silent: true})) { - throw new Error("Can't create an invalid model"); - } - delete this._changed; - this._previousAttributes = _.clone(this.attributes); - this.initialize.apply(this, arguments); - }; - - // Attach all inheritable methods to the Model prototype. - _.extend(Backbone.Model.prototype, Backbone.Events, { - - // The default name for the JSON `id` attribute is `"id"`. MongoDB and - // CouchDB users may want to set this to `"_id"`. - idAttribute: 'id', - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Return a copy of the model's `attributes` object. - toJSON: function() { - return _.clone(this.attributes); - }, - - // Get the value of an attribute. - get: function(attr) { - return this.attributes[attr]; - }, - - // Get the HTML-escaped value of an attribute. - escape: function(attr) { - var html; - if (html = this._escapedAttributes[attr]) return html; - var val = this.attributes[attr]; - return this._escapedAttributes[attr] = _.escape(val == null ? '' : '' + val); - }, - - // Returns `true` if the attribute contains a value that is not null - // or undefined. - has: function(attr) { - return this.attributes[attr] != null; - }, - - // Set a hash of model attributes on the object, firing `"change"` unless - // you choose to silence it. - set: function(key, value, options) { - var attrs, attr, val; - if (_.isObject(key) || key == null) { - attrs = key; - options = value; - } else { - attrs = {}; - attrs[key] = value; - } - - // Extract attributes and options. - options || (options = {}); - if (!attrs) return this; - if (attrs instanceof Backbone.Model) attrs = attrs.attributes; - if (options.unset) for (attr in attrs) attrs[attr] = void 0; - - // Run validation. - if (!this._validate(attrs, options)) return false; - - // Check for changes of `id`. - if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; - - var now = this.attributes; - var escaped = this._escapedAttributes; - var prev = this._previousAttributes || {}; - var alreadySetting = this._setting; - this._changed || (this._changed = {}); - this._setting = true; - - // Update attributes. - for (attr in attrs) { - val = attrs[attr]; - if (!_.isEqual(now[attr], val)) delete escaped[attr]; - options.unset ? delete now[attr] : now[attr] = val; - if (this._changing && !_.isEqual(this._changed[attr], val)) { - this.trigger('change:' + attr, this, val, options); - this._moreChanges = true; - } - delete this._changed[attr]; - if (!_.isEqual(prev[attr], val) || (_.has(now, attr) != _.has(prev, attr))) { - this._changed[attr] = val; - } - } - - // Fire the `"change"` events, if the model has been changed. - if (!alreadySetting) { - if (!options.silent && this.hasChanged()) this.change(options); - this._setting = false; - } - return this; - }, - - // Remove an attribute from the model, firing `"change"` unless you choose - // to silence it. `unset` is a noop if the attribute doesn't exist. - unset: function(attr, options) { - (options || (options = {})).unset = true; - return this.set(attr, null, options); - }, - - // Clear all attributes on the model, firing `"change"` unless you choose - // to silence it. - clear: function(options) { - (options || (options = {})).unset = true; - return this.set(_.clone(this.attributes), options); - }, - - // Fetch the model from the server. If the server's representation of the - // model differs from its current attributes, they will be overriden, - // triggering a `"change"` event. - fetch: function(options) { - options = options ? _.clone(options) : {}; - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp); - }; - options.error = Backbone.wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Set a hash of model attributes, and sync the model to the server. - // If the server returns an attributes hash that differs, the model's - // state will be `set` again. - save: function(key, value, options) { - var attrs, current; - if (_.isObject(key) || key == null) { - attrs = key; - options = value; - } else { - attrs = {}; - attrs[key] = value; - } - - options = options ? _.clone(options) : {}; - if (options.wait) current = _.clone(this.attributes); - var silentOptions = _.extend({}, options, {silent: true}); - if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) { - return false; - } - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - var serverAttrs = model.parse(resp, xhr); - if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); - if (!model.set(serverAttrs, options)) return false; - if (success) { - success(model, resp); - } else { - model.trigger('sync', model, resp, options); - } - }; - options.error = Backbone.wrapError(options.error, model, options); - var method = this.isNew() ? 'create' : 'update'; - var xhr = (this.sync || Backbone.sync).call(this, method, this, options); - if (options.wait) this.set(current, silentOptions); - return xhr; - }, - - // Destroy this model on the server if it was already persisted. - // Optimistically removes the model from its collection, if it has one. - // If `wait: true` is passed, waits for the server to respond before removal. - destroy: function(options) { - options = options ? _.clone(options) : {}; - var model = this; - var success = options.success; - - var triggerDestroy = function() { - model.trigger('destroy', model, model.collection, options); - }; - - if (this.isNew()) return triggerDestroy(); - options.success = function(resp) { - if (options.wait) triggerDestroy(); - if (success) { - success(model, resp); - } else { - model.trigger('sync', model, resp, options); - } - }; - options.error = Backbone.wrapError(options.error, model, options); - var xhr = (this.sync || Backbone.sync).call(this, 'delete', this, options); - if (!options.wait) triggerDestroy(); - return xhr; - }, - - // Default URL for the model's representation on the server -- if you're - // using Backbone's restful methods, override this to change the endpoint - // that will be called. - url: function() { - var base = getValue(this.collection, 'url') || getValue(this, 'urlRoot') || urlError(); - if (this.isNew()) return base; - return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); - }, - - // **parse** converts a response into the hash of attributes to be `set` on - // the model. The default implementation is just to pass the response along. - parse: function(resp, xhr) { - return resp; - }, - - // Create a new model with identical attributes to this one. - clone: function() { - return new this.constructor(this.attributes); - }, - - // A model is new if it has never been saved to the server, and lacks an id. - isNew: function() { - return this.id == null; - }, - - // Call this method to manually fire a `"change"` event for this model and - // a `"change:attribute"` event for each changed attribute. - // Calling this will cause all objects observing the model to update. - change: function(options) { - if (this._changing || !this.hasChanged()) return this; - this._changing = true; - this._moreChanges = true; - for (var attr in this._changed) { - this.trigger('change:' + attr, this, this._changed[attr], options); - } - while (this._moreChanges) { - this._moreChanges = false; - this.trigger('change', this, options); - } - this._previousAttributes = _.clone(this.attributes); - delete this._changed; - this._changing = false; - return this; - }, - - // Determine if the model has changed since the last `"change"` event. - // If you specify an attribute name, determine if that attribute has changed. - hasChanged: function(attr) { - if (!arguments.length) return !_.isEmpty(this._changed); - return this._changed && _.has(this._changed, attr); - }, - - // Return an object containing all the attributes that have changed, or - // false if there are no changed attributes. Useful for determining what - // parts of a view need to be updated and/or what attributes need to be - // persisted to the server. Unset attributes will be set to undefined. - // You can also pass an attributes object to diff against the model, - // determining if there *would be* a change. - changedAttributes: function(diff) { - if (!diff) return this.hasChanged() ? _.clone(this._changed) : false; - var val, changed = false, old = this._previousAttributes; - for (var attr in diff) { - if (_.isEqual(old[attr], (val = diff[attr]))) continue; - (changed || (changed = {}))[attr] = val; - } - return changed; - }, - - // Get the previous value of an attribute, recorded at the time the last - // `"change"` event was fired. - previous: function(attr) { - if (!arguments.length || !this._previousAttributes) return null; - return this._previousAttributes[attr]; - }, - - // Get all of the attributes of the model at the time of the previous - // `"change"` event. - previousAttributes: function() { - return _.clone(this._previousAttributes); - }, - - // Check if the model is currently in a valid state. It's only possible to - // get into an *invalid* state if you're using silent changes. - isValid: function() { - return !this.validate(this.attributes); - }, - - // Run validation against a set of incoming attributes, returning `true` - // if all is well. If a specific `error` callback has been passed, - // call that instead of firing the general `"error"` event. - _validate: function(attrs, options) { - if (options.silent || !this.validate) return true; - attrs = _.extend({}, this.attributes, attrs); - var error = this.validate(attrs, options); - if (!error) return true; - if (options && options.error) { - options.error(this, error, options); - } else { - this.trigger('error', this, error, options); - } - return false; - } - - }); - - // Backbone.Collection - // ------------------- - - // Provides a standard collection class for our sets of models, ordered - // or unordered. If a `comparator` is specified, the Collection will maintain - // its models in sort order, as they're added and removed. - Backbone.Collection = function(models, options) { - options || (options = {}); - if (options.comparator) this.comparator = options.comparator; - this._reset(); - this.initialize.apply(this, arguments); - if (models) this.reset(models, {silent: true, parse: options.parse}); - }; - - // Define the Collection's inheritable methods. - _.extend(Backbone.Collection.prototype, Backbone.Events, { - - // The default model for a collection is just a **Backbone.Model**. - // This should be overridden in most cases. - model: Backbone.Model, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // The JSON representation of a Collection is an array of the - // models' attributes. - toJSON: function() { - return this.map(function(model){ return model.toJSON(); }); - }, - - // Add a model, or list of models to the set. Pass **silent** to avoid - // firing the `add` event for every new model. - add: function(models, options) { - var i, index, length, model, cid, id, cids = {}, ids = {}; - options || (options = {}); - models = _.isArray(models) ? models.slice() : [models]; - - // Begin by turning bare objects into model references, and preventing - // invalid models or duplicate models from being added. - for (i = 0, length = models.length; i < length; i++) { - if (!(model = models[i] = this._prepareModel(models[i], options))) { - throw new Error("Can't add an invalid model to a collection"); - } - if (cids[cid = model.cid] || this._byCid[cid] || - (((id = model.id) != null) && (ids[id] || this._byId[id]))) { - throw new Error("Can't add the same model to a collection twice"); - } - cids[cid] = ids[id] = model; - } - - // Listen to added models' events, and index models for lookup by - // `id` and by `cid`. - for (i = 0; i < length; i++) { - (model = models[i]).on('all', this._onModelEvent, this); - this._byCid[model.cid] = model; - if (model.id != null) this._byId[model.id] = model; - } - - // Insert models into the collection, re-sorting if needed, and triggering - // `add` events unless silenced. - this.length += length; - index = options.at != null ? options.at : this.models.length; - splice.apply(this.models, [index, 0].concat(models)); - if (this.comparator) this.sort({silent: true}); - if (options.silent) return this; - for (i = 0, length = this.models.length; i < length; i++) { - if (!cids[(model = this.models[i]).cid]) continue; - options.index = i; - model.trigger('add', model, this, options); - } - return this; - }, - - // Remove a model, or a list of models from the set. Pass silent to avoid - // firing the `remove` event for every model removed. - remove: function(models, options) { - var i, l, index, model; - options || (options = {}); - models = _.isArray(models) ? models.slice() : [models]; - for (i = 0, l = models.length; i < l; i++) { - model = this.getByCid(models[i]) || this.get(models[i]); - if (!model) continue; - delete this._byId[model.id]; - delete this._byCid[model.cid]; - index = this.indexOf(model); - this.models.splice(index, 1); - this.length--; - if (!options.silent) { - options.index = index; - model.trigger('remove', model, this, options); - } - this._removeReference(model); - } - return this; - }, - - // Get a model from the set by id. - get: function(id) { - if (id == null) return null; - return this._byId[id.id != null ? id.id : id]; - }, - - // Get a model from the set by client id. - getByCid: function(cid) { - return cid && this._byCid[cid.cid || cid]; - }, - - // Get the model at the given index. - at: function(index) { - return this.models[index]; - }, - - // Force the collection to re-sort itself. You don't need to call this under - // normal circumstances, as the set will maintain sort order as each item - // is added. - sort: function(options) { - options || (options = {}); - if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); - var boundComparator = _.bind(this.comparator, this); - if (this.comparator.length == 1) { - this.models = this.sortBy(boundComparator); - } else { - this.models.sort(boundComparator); - } - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Pluck an attribute from each model in the collection. - pluck: function(attr) { - return _.map(this.models, function(model){ return model.get(attr); }); - }, - - // When you have more items than you want to add or remove individually, - // you can reset the entire set with a new list of models, without firing - // any `add` or `remove` events. Fires `reset` when finished. - reset: function(models, options) { - models || (models = []); - options || (options = {}); - for (var i = 0, l = this.models.length; i < l; i++) { - this._removeReference(this.models[i]); - } - this._reset(); - this.add(models, {silent: true, parse: options.parse}); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Fetch the default set of models for this collection, resetting the - // collection when they arrive. If `add: true` is passed, appends the - // models to the collection instead of resetting. - fetch: function(options) { - options = options ? _.clone(options) : {}; - if (options.parse === undefined) options.parse = true; - var collection = this; - var success = options.success; - options.success = function(resp, status, xhr) { - collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); - if (success) success(collection, resp); - }; - options.error = Backbone.wrapError(options.error, collection, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Create a new instance of a model in this collection. Add the model to the - // collection immediately, unless `wait: true` is passed, in which case we - // wait for the server to agree. - create: function(model, options) { - var coll = this; - options = options ? _.clone(options) : {}; - model = this._prepareModel(model, options); - if (!model) return false; - if (!options.wait) coll.add(model, options); - var success = options.success; - options.success = function(nextModel, resp, xhr) { - if (options.wait) coll.add(nextModel, options); - if (success) { - success(nextModel, resp); - } else { - nextModel.trigger('sync', model, resp, options); - } - }; - model.save(null, options); - return model; - }, - - // **parse** converts a response into a list of models to be added to the - // collection. The default implementation is just to pass it through. - parse: function(resp, xhr) { - return resp; - }, - - // Proxy to _'s chain. Can't be proxied the same way the rest of the - // underscore methods are proxied because it relies on the underscore - // constructor. - chain: function () { - return _(this.models).chain(); - }, - - // Reset all internal state. Called when the collection is reset. - _reset: function(options) { - this.length = 0; - this.models = []; - this._byId = {}; - this._byCid = {}; - }, - - // Prepare a model or hash of attributes to be added to this collection. - _prepareModel: function(model, options) { - if (!(model instanceof Backbone.Model)) { - var attrs = model; - options.collection = this; - model = new this.model(attrs, options); - if (!model._validate(model.attributes, options)) model = false; - } else if (!model.collection) { - model.collection = this; - } - return model; - }, - - // Internal method to remove a model's ties to a collection. - _removeReference: function(model) { - if (this == model.collection) { - delete model.collection; - } - model.off('all', this._onModelEvent, this); - }, - - // Internal method called every time a model in the set fires an event. - // Sets need to update their indexes when models change ids. All other - // events simply proxy through. "add" and "remove" events that originate - // in other collections are ignored. - _onModelEvent: function(ev, model, collection, options) { - if ((ev == 'add' || ev == 'remove') && collection != this) return; - if (ev == 'destroy') { - this.remove(model, options); - } - if (model && ev === 'change:' + model.idAttribute) { - delete this._byId[model.previous(model.idAttribute)]; - this._byId[model.id] = model; - } - this.trigger.apply(this, arguments); - } - - }); - - // Underscore methods that we want to implement on the Collection. - var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', - 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', - 'include', 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', - 'toArray', 'size', 'first', 'initial', 'rest', 'last', 'without', 'indexOf', - 'shuffle', 'lastIndexOf', 'isEmpty', 'groupBy']; - - // Mix in each Underscore method as a proxy to `Collection#models`. - _.each(methods, function(method) { - Backbone.Collection.prototype[method] = function() { - return _[method].apply(_, [this.models].concat(_.toArray(arguments))); - }; - }); - - // Backbone.Router - // ------------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - Backbone.Router = function(options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this.initialize.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var namedParam = /:\w+/g; - var splatParam = /\*\w+/g; - var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; - - // Set up all inheritable **Backbone.Router** properties and methods. - _.extend(Backbone.Router.prototype, Backbone.Events, { - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route: function(route, name, callback) { - Backbone.history || (Backbone.history = new Backbone.History); - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - if (!callback) callback = this[name]; - Backbone.history.route(route, _.bind(function(fragment) { - var args = this._extractParameters(route, fragment); - callback && callback.apply(this, args); - this.trigger.apply(this, ['route:' + name].concat(args)); - Backbone.history.trigger('route', this, name, args); - }, this)); - return this; - }, - - // Simple proxy to `Backbone.history` to save a fragment into the history. - navigate: function(fragment, options) { - Backbone.history.navigate(fragment, options); - }, - - // Bind all defined routes to `Backbone.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes: function() { - if (!this.routes) return; - var routes = []; - for (var route in this.routes) { - routes.unshift([route, this.routes[route]]); - } - for (var i = 0, l = routes.length; i < l; i++) { - this.route(routes[i][0], routes[i][1], this[routes[i][1]]); - } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp: function(route) { - route = route.replace(escapeRegExp, '\\$&') - .replace(namedParam, '([^\/]+)') - .replace(splatParam, '(.*?)'); - return new RegExp('^' + route + '$'); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted parameters. - _extractParameters: function(route, fragment) { - return route.exec(fragment).slice(1); - } - - }); - - // Backbone.History - // ---------------- - - // Handles cross-browser history management, based on URL fragments. If the - // browser does not support `onhashchange`, falls back to polling. - Backbone.History = function() { - this.handlers = []; - _.bindAll(this, 'checkUrl'); - }; - - // Cached regex for cleaning leading hashes and slashes . - var routeStripper = /^[#\/]/; - - // Cached regex for detecting MSIE. - var isExplorer = /msie [\w.]+/; - - // Has the history handling already been started? - var historyStarted = false; - - // Set up all inheritable **Backbone.History** properties and methods. - _.extend(Backbone.History.prototype, Backbone.Events, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Get the cross-browser normalized URL fragment, either from the URL, - // the hash, or the override. - getFragment: function(fragment, forcePushState) { - if (fragment == null) { - if (this._hasPushState || forcePushState) { - fragment = window.location.pathname; - var search = window.location.search; - if (search) fragment += search; - } else { - fragment = window.location.hash; - } - } - fragment = decodeURIComponent(fragment); - if (!fragment.indexOf(this.options.root)) fragment = fragment.substr(this.options.root.length); - return fragment.replace(routeStripper, ''); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start: function(options) { - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - if (historyStarted) throw new Error("Backbone.history has already been started"); - this.options = _.extend({}, {root: '/'}, this.options, options); - this._wantsHashChange = this.options.hashChange !== false; - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); - var fragment = this.getFragment(); - var docMode = document.documentMode; - var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); - if (oldIE) { - this.iframe = $('